"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import dayjs from "@calcom/dayjs"; import { useTimePreferences } from "@calcom/features/bookings/lib"; import { TimezoneSelect } from "@calcom/features/components/timezone-select"; import { FULL_NAME_LENGTH_MAX_LIMIT } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { useTelemetry } from "@calcom/lib/hooks/useTelemetry"; import { telemetryEventTypes } from "@calcom/lib/telemetry"; import { trpc } from "@calcom/trpc/react"; import type { RouterOutputs } from "@calcom/trpc/react"; import { Button } from "@calcom/ui/components/button"; import { Input } from "@calcom/ui/components/form"; import { UsernameAvailabilityField } from "@components/ui/UsernameAvailability"; interface IUserSettingsProps { nextStep: () => void; hideUsername?: boolean; user: RouterOutputs["viewer"]["me"]["get"]; } const UserSettings = (props: IUserSettingsProps) => { const { nextStep, user } = props; const { t } = useLocale(); const { setTimezone: setSelectedTimeZone, timezone: selectedTimeZone } = useTimePreferences(); const telemetry = useTelemetry(); const userSettingsSchema = z.object({ name: z .string() .min(1) .max(FULL_NAME_LENGTH_MAX_LIMIT, { message: t("max_limit_allowed_hint", { limit: FULL_NAME_LENGTH_MAX_LIMIT }), }), }); const { register, handleSubmit, formState: { errors }, } = useForm>({ defaultValues: { name: user?.name || "", }, reValidateMode: "onChange", resolver: zodResolver(userSettingsSchema), }); useEffect(() => { telemetry.event(telemetryEventTypes.onboardingStarted); }, [telemetry]); const utils = trpc.useUtils(); const onSuccess = async () => { await utils.viewer.me.invalidate(); nextStep(); }; const mutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: onSuccess, }); const onSubmit = handleSubmit((data) => { mutation.mutate({ name: data.name, timeZone: selectedTimeZone, }); }); return (
{/* Username textfield: when not coming from signup */} {!props.hideUsername && } {/* Full name textfield */}
{errors.name && (

{errors.name.message}

)}
{/* Timezone select field */}
setSelectedTimeZone(value)} className="mt-2 w-full rounded-md text-sm" />

{t("current_time")} {dayjs().tz(selectedTimeZone).format("LT").toString().toLowerCase()}

); }; export { UserSettings };