"use client"; import { useSession } from "next-auth/react"; import { useRouter } from "next/navigation"; import { useState, useEffect } from "react"; import { useForm } from "react-hook-form"; import { checkAdminOrOwner } from "@calcom/features/auth/lib/checkAdminOrOwner"; import BrandColorsForm from "~/ee/common/components/BrandColorsForm"; import { AppearanceSkeletonLoader } from "~/ee/common/components/CommonSkeletonLoaders"; import SectionBottomActions from "@calcom/features/settings/SectionBottomActions"; import ThemeLabel from "@calcom/features/settings/ThemeLabel"; import { DEFAULT_LIGHT_BRAND_COLOR, DEFAULT_DARK_BRAND_COLOR } from "@calcom/lib/constants"; import { APP_NAME } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import type { RouterOutputs } from "@calcom/trpc/react"; import { Button } from "@calcom/ui/components/button"; import { Form } from "@calcom/ui/components/form"; import { SettingsToggle } from "@calcom/ui/components/form"; import { showToast } from "@calcom/ui/components/toast"; type BrandColorsFormValues = { brandColor: string; darkBrandColor: string; }; const OrgAppearanceView = ({ currentOrg, }: { currentOrg: RouterOutputs["viewer"]["organizations"]["listCurrent"]; isAdminOrOwner: boolean; }) => { const { t } = useLocale(); const utils = trpc.useUtils(); const themeForm = useForm<{ theme: string | null | undefined }>({ defaultValues: { theme: currentOrg?.theme, }, }); const { formState: { isSubmitting: isOrgThemeSubmitting, isDirty: isOrgThemeDirty }, reset: resetOrgThemeReset, } = themeForm; const [hideBrandingValue, setHideBrandingValue] = useState(currentOrg?.hideBranding ?? false); const [allowSEOIndexingValue, setAllowSEOIndexingValue] = useState( currentOrg?.organizationSettings?.allowSEOIndexing ?? false ); const [orgProfileRedirectsToVerifiedDomainValue, setOrgProfileRedirectsToVerifiedDomainValue] = useState( currentOrg?.organizationSettings?.orgProfileRedirectsToVerifiedDomain ?? false ); const brandColorsFormMethods = useForm({ defaultValues: { brandColor: currentOrg?.brandColor || DEFAULT_LIGHT_BRAND_COLOR, darkBrandColor: currentOrg?.darkBrandColor || DEFAULT_DARK_BRAND_COLOR, }, }); const mutation = trpc.viewer.organizations.update.useMutation({ onError: (err) => { showToast(err.message, "error"); }, async onSuccess(res) { await utils.viewer.teams.get.invalidate(); await utils.viewer.organizations.listCurrent.invalidate(); showToast(t("your_team_updated_successfully"), "success"); if (res) { brandColorsFormMethods.reset({ brandColor: res.data.brandColor as string, darkBrandColor: res.data.darkBrandColor as string, }); resetOrgThemeReset({ theme: res.data.theme as string | undefined }); } }, }); const onBrandColorsFormSubmit = (values: BrandColorsFormValues) => { mutation.mutate(values); }; return (
{ if (theme === "light" || theme === "dark") { mutation.mutate({ theme, }); return; } mutation.mutate({ theme: null, }); }}>

{t("theme")}

{t("theme_applies_note")}

{ onBrandColorsFormSubmit(values); }}> { setHideBrandingValue(checked); mutation.mutate({ hideBranding: checked }); }} switchContainerClassName="mt-6" /> { setAllowSEOIndexingValue(checked); mutation.mutate({ allowSEOIndexing: checked }); }} switchContainerClassName="mt-6" /> { setOrgProfileRedirectsToVerifiedDomainValue(checked); mutation.mutate({ orgProfileRedirectsToVerifiedDomain: checked }); }} switchContainerClassName="mt-6" />
); }; const OrgAppearanceViewWrapper = () => { const router = useRouter(); const { data: currentOrg, isPending, error } = trpc.viewer.organizations.listCurrent.useQuery(); const session = useSession(); const isAdminOrOwner = checkAdminOrOwner(session.data?.user?.org?.role); useEffect( function refactorMeWithoutEffect() { if (error) { router.replace("/enterprise"); } }, [error] ); if (isPending) { return ; } if (!currentOrg) return null; return ; }; export default OrgAppearanceViewWrapper;