"use client"; import { useEffect } from "react"; import { useClientConfig } from "@/lib/clientConfig"; import { useTranslation } from "@/lib/i18n/client"; import { useInterfaceLang } from "@/lib/userLocalSettings/bookmarksLayout"; import { updateInterfaceLang } from "@/lib/userLocalSettings/userLocalSettings"; import { useUserSettings } from "@/lib/userSettings"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { useUpdateUserSettings } from "@karakeep/shared-react/hooks/users"; import { langNameMappings } from "@karakeep/shared/langs"; import { ZUserSettings, zUserSettingsSchema, } from "@karakeep/shared/types/users"; import { Form, FormField } from "../ui/form"; import { Label } from "../ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "../ui/select"; import { toast } from "../ui/use-toast"; const LanguageSelect = () => { const lang = useInterfaceLang(); return ( { await updateInterfaceLang(val); }} > {Object.entries(langNameMappings).map(([lang, name]) => ( {name} ))} ); }; export default function UserSettings() { const { t } = useTranslation(); const clientConfig = useClientConfig(); const data = useUserSettings(); const { mutate } = useUpdateUserSettings({ onSuccess: () => { toast({ description: t("settings.info.user_settings.user_settings_updated"), }); }, onError: () => { toast({ description: t("common.something_went_wrong"), variant: "destructive", }); }, }); const bookmarkClickActionTranslation: Record< ZUserSettings["bookmarkClickAction"], string > = { open_original_link: t("settings.info.user_settings.open_external_url"), expand_bookmark_preview: t( "settings.info.user_settings.open_bookmark_details", ), }; const form = useForm>({ resolver: zodResolver(zUserSettingsSchema), defaultValues: data, }); // When the actual user setting is loaded, reset the form to the current value useEffect(() => { form.reset(data); }, [data]); return ( ( {t("settings.info.user_settings.boomark_click_action")} { mutate({ bookmarkClickAction: value as ZUserSettings["bookmarkClickAction"], }); }} > {bookmarkClickActionTranslation[field.value]} {Object.entries(bookmarkClickActionTranslation).map( ([value, label]) => ( {label} ), )} )} /> ); } export function UserOptions() { const { t } = useTranslation(); return ( {t("settings.info.options")} {t("settings.info.interface_lang")} ); }