import { useRouter } from "next/router"; import { useMemo } from "react"; import { Controller, useForm } from "react-hook-form"; import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { nameOfDay } from "@calcom/lib/weekday"; import type { RouterOutputs } from "@calcom/trpc/react"; import { trpc } from "@calcom/trpc/react"; import { Button, Form, Label, Meta, Select, SettingsToggle, showToast, SkeletonButton, SkeletonContainer, SkeletonText, TimezoneSelect, } from "@calcom/ui"; import { withQuery } from "@lib/QueryCell"; import PageWrapper from "@components/PageWrapper"; const SkeletonLoader = ({ title, description }: { title: string; description: string }) => { return ( ); }; interface GeneralViewProps { localeProp: string; user: RouterOutputs["viewer"]["me"]; } // eslint-disable-next-line @typescript-eslint/no-explicit-any const WithQuery = withQuery(trpc.viewer.public.i18n as any, undefined, { trpc: { context: { skipBatch: true } }, }); const GeneralQueryView = () => { const { t } = useLocale(); const { data: user, isLoading } = trpc.viewer.me.useQuery(); if (isLoading) return ; if (!user) { throw new Error(t("something_went_wrong")); } return ( } customLoader={} /> ); }; const GeneralView = ({ localeProp, user }: GeneralViewProps) => { const router = useRouter(); const utils = trpc.useContext(); const { t } = useLocale(); const mutation = trpc.viewer.updateProfile.useMutation({ onSuccess: async () => { // Invalidate our previous i18n cache await utils.viewer.public.i18n.invalidate(); reset(getValues()); showToast(t("settings_updated_successfully"), "success"); }, onError: () => { showToast(t("error_updating_settings"), "error"); }, onSettled: async () => { await utils.viewer.public.i18n.invalidate(); }, }); const localeOptions = useMemo(() => { return (router.locales || []).map((locale) => ({ value: locale, label: new Intl.DisplayNames(locale, { type: "language" }).of(locale) || "", })); }, [router.locales]); const timeFormatOptions = [ { value: 12, label: t("12_hour") }, { value: 24, label: t("24_hour") }, ]; const weekStartOptions = [ { value: "Sunday", label: nameOfDay(localeProp, 0) }, { value: "Monday", label: nameOfDay(localeProp, 1) }, { value: "Tuesday", label: nameOfDay(localeProp, 2) }, { value: "Wednesday", label: nameOfDay(localeProp, 3) }, { value: "Thursday", label: nameOfDay(localeProp, 4) }, { value: "Friday", label: nameOfDay(localeProp, 5) }, { value: "Saturday", label: nameOfDay(localeProp, 6) }, ]; const formMethods = useForm({ defaultValues: { locale: { value: localeProp || "", label: localeOptions.find((option) => option.value === localeProp)?.label || "", }, timeZone: user.timeZone || "", timeFormat: { value: user.timeFormat || 12, label: timeFormatOptions.find((option) => option.value === user.timeFormat)?.label || 12, }, weekStart: { value: user.weekStart, label: nameOfDay(localeProp, user.weekStart === "Sunday" ? 0 : 1), }, allowDynamicBooking: user.allowDynamicBooking ?? true, }, }); const { formState: { isDirty, isSubmitting }, reset, getValues, } = formMethods; const isDisabled = isSubmitting || !isDirty; return ( { mutation.mutate({ ...values, locale: values.locale.value, timeFormat: values.timeFormat.value, weekStart: values.weekStart.value, }); }}> ( <> <>{t("language")}> className="capitalize" options={localeOptions} value={value} onChange={onChange} /> > )} /> ( <> <>{t("timezone")}> { if (event) formMethods.setValue("timeZone", event.value, { shouldDirty: true }); }} /> > )} /> ( <> <>{t("time_format")}> { if (event) formMethods.setValue("timeFormat", { ...event }, { shouldDirty: true }); }} /> > )} /> {t("timeformat_profile_hint")} ( <> <>{t("start_of_week")}> { if (event) formMethods.setValue("weekStart", { ...event }, { shouldDirty: true }); }} /> > )} /> ( { formMethods.setValue("allowDynamicBooking", checked, { shouldDirty: true }); }} /> )} /> <>{t("update")}> ); }; GeneralQueryView.getLayout = getLayout; GeneralQueryView.PageWrapper = PageWrapper; export default GeneralQueryView;