File size: 1,593 Bytes
f1dd159 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import { zodResolver } from "@hookform/resolvers/zod";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { useEffect } from "react";
import { useForm } from "react-hook-form";
import { useTranslation } from "react-i18next";
import { toast } from "sonner";
import { getSettings, updateSettings } from "@/features/settings/settings-api";
import { settingsSchema, toSettingsDTO, toSettingsForm, type SettingsForm } from "@/features/settings/settings-model";
export function useSettings() {
const { t } = useTranslation();
const queryClient = useQueryClient();
const settingsQuery = useQuery({ queryKey: ["settings"], queryFn: getSettings });
const form = useForm<SettingsForm>({ resolver: zodResolver(settingsSchema) });
const updateMutation = useMutation({
mutationFn: (config: SettingsForm) => updateSettings(settingsQuery.data?.revision ?? "0", toSettingsDTO(config)),
onSuccess: (snapshot) => {
queryClient.setQueryData(["settings"], snapshot);
void queryClient.invalidateQueries({ queryKey: ["system-info"] });
form.reset(toSettingsForm(snapshot.config));
toast.success(t("settings.saved"));
},
onError: (error) => toast.error(error instanceof Error ? error.message : t("errors.generic")),
});
useEffect(() => {
if (settingsQuery.data) form.reset(toSettingsForm(settingsQuery.data.config));
}, [form, settingsQuery.data]);
return {
form,
settingsQuery,
updateMutation,
reset: () => { if (settingsQuery.data) form.reset(toSettingsForm(settingsQuery.data.config)); },
};
}
|