Files
Mav-Mobile-UI/src/components/SettingForms/Sound/SoundSettingsFields.tsx

126 lines
4.3 KiB
TypeScript
Raw Normal View History

2025-09-30 13:25:11 +01:00
import { Field, FieldArray, Form, Formik } from "formik";
import FormGroup from "../components/FormGroup";
import type { FormValues, Hotlist } from "../../../types/types";
import { useSoundContext } from "../../../context/SoundContext";
import { useCameraBlackboard } from "../../../hooks/useCameraBlackboard";
import { toast } from "sonner";
2025-09-30 13:25:11 +01:00
const SoundSettingsFields = () => {
const { state, dispatch } = useSoundContext();
const { mutation } = useCameraBlackboard();
const hotlists: Hotlist[] = state.hotlists;
2025-09-30 13:25:11 +01:00
const soundOptions = state?.soundOptions?.map((soundOption) => ({
value: soundOption?.name,
label: soundOption?.name,
}));
2025-09-30 13:25:11 +01:00
const initialValues: FormValues = {
sightingSound: state.sightingSound ?? "switch",
NPEDsound: state.NPEDsound ?? "popup",
2025-09-30 13:25:11 +01:00
hotlists,
};
const handleSubmit = async (values: FormValues) => {
dispatch({ type: "UPDATE", payload: values });
const result = await mutation.mutateAsync({
operation: "INSERT",
path: "soundSettings",
value: values,
});
if (result.reason !== "OK") {
toast.error("Cannot update sound settings");
} else {
toast.success("Sound Settings successfully updated");
}
2025-09-30 13:25:11 +01:00
};
return (
<Formik initialValues={initialValues} onSubmit={handleSubmit}>
{({ values }) => (
<Form className="flex flex-col space-y-3">
<FormGroup>
<label htmlFor="sightingSound">Sighting Sound</label>
<Field
as="select"
name="sightingSound"
className="p-2 border border-gray-400 rounded-lg text-white bg-[#253445] w-full md:w-60"
>
{soundOptions?.map(({ value, label }) => {
2025-09-30 13:25:11 +01:00
return (
<option key={value} value={value}>
{label}
</option>
);
})}
</Field>
</FormGroup>
<FormGroup>
<label htmlFor="NPEDsound">NPED notification Sound</label>
<Field
as="select"
name="NPEDsound"
className="p-2 border border-gray-400 rounded-lg text-white bg-[#253445] w-full md:w-60"
>
{soundOptions?.map(({ value, label }) => (
2025-09-30 13:25:11 +01:00
<option key={value} value={value}>
{label}
</option>
))}
</Field>
</FormGroup>
<div>
<h3 className="text-lg font-semibold mb-2">Hotlist Sounds</h3>
<FormGroup>
<FieldArray
name="hotlists"
render={() => (
<div className="w-full m-2">
{values?.hotlists?.length > 0 ? (
values?.hotlists?.map((hotlist, index) => (
2025-09-30 13:25:11 +01:00
<div
key={hotlist.name}
className="flex items-center m-2 w-full justify-between"
2025-09-30 13:25:11 +01:00
>
<label
htmlFor={`hotlists.${index}.sound`}
className="w-32 shrink-0"
>
{hotlist.name}
</label>
<Field
as="select"
name={`hotlists.${index}.sound`}
id={`hotlists.${index}.sound`}
className="p-2 border border-gray-400 rounded-lg text-white bg-[#253445] w-full md:w-60"
>
{soundOptions?.map(({ value, label }) => (
2025-09-30 13:25:11 +01:00
<option key={value} value={value}>
{label}
</option>
))}
</Field>
</div>
))
) : (
<p>No hotlists yet, Add one</p>
2025-09-30 13:25:11 +01:00
)}
</div>
)}
/>
</FormGroup>
</div>
<button
type="submit"
className="w-1/4 text-white bg-green-700 hover:bg-green-800 font-small rounded-lg text-sm px-2 py-2.5"
>
Save Settings
</button>
</Form>
)}
</Formik>
);
};
export default SoundSettingsFields;