"use client" import { cn } from "@/lib/utils" import { AgendaCalendarsSettingsFields } from "@/components/agenda/agenda-calendars-settings" import { AgendaSettingsChipPicker } from "@/components/agenda/agenda-settings-chip-picker" import { AgendaVideoProviderSelectLabel } from "@/components/agenda/agenda-video-provider-select-label" import { ThemeModePreview } from "@/components/gmail/quick-settings/settings-preview-icons" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { AGENDA_DURATION_STEPS, AGENDA_QUICK_DURATION_OPTIONS, AGENDA_VIDEO_PROVIDERS, AGENDA_WEEK_START_OPTIONS, type AgendaDurationStep, type AgendaTimeFormat, type AgendaVideoProvider, type AgendaWeekStart, } from "@/lib/agenda/agenda-settings-types" import { formatDurationStepLabel, formatQuickDurationLabel, formatTimeFormatLabel, formatWeekStartLabel, videoProviderLabel, } from "@/lib/agenda/agenda-settings-labels" import { useAgendaSettingsStore } from "@/lib/agenda/agenda-store" import { useAgendaSettingsDestinationOptions, useAgendaSettingsIdentityOptions, } from "@/lib/agenda/use-agenda-invitation-suggestions" import { normalizeAutoImportInvitationSources, normalizeInvitationImportExclusions, } from "@/lib/agenda/agenda-destination-identities" import { useEffectiveAgendaSettings } from "@/lib/agenda/use-effective-agenda-settings" import { useIsDemoApp } from "@/lib/demo/use-is-demo-app" import { useThemeModeControls } from "@/lib/demo/use-theme-mode-controls" import { AutomationTabMasonry } from "@/components/gmail/settings/automation/automation-tab-masonry" import { MAIL_SETTINGS_PAGE_MASONRY_SECTION_CLASS, } from "@/lib/mail-chrome-classes" import type { MailThemeMode } from "@/lib/mail-settings/types" const THEME_OPTIONS: { id: MailThemeMode; label: string }[] = [ { id: "light", label: "Clair" }, { id: "dark", label: "Sombre" }, { id: "system", label: "Système" }, ] function SettingsSection({ title, description, action, children, variant = "panel", }: { title: string description?: string action?: React.ReactNode children: React.ReactNode variant?: "panel" | "page" }) { return (

{title}

{description ? (

{description}

) : null}
{action}
{children}
) } function PickerRow({ label, children, }: { label: string children: React.ReactNode }) { return (
{children}
) } function minutesToTimeValue(minutes: number): string { const h = Math.floor(minutes / 60) const m = minutes % 60 return `${String(h).padStart(2, "0")}:${String(m).padStart(2, "0")}` } function timeValueToMinutes(value: string): number { const [h, m] = value.split(":").map(Number) if (!Number.isFinite(h) || !Number.isFinite(m)) return 0 return h * 60 + m } export function AgendaSettingsFields({ variant = "panel", onOpenThemeDialog, }: { variant?: "panel" | "page" onOpenThemeDialog?: () => void }) { const { themeMode, setThemeMode } = useThemeModeControls() const defaultVideoProvider = useAgendaSettingsStore((s) => s.defaultVideoProvider) const setDefaultVideoProvider = useAgendaSettingsStore((s) => s.setDefaultVideoProvider) const videoProviderApiKeys = useAgendaSettingsStore((s) => s.videoProviderApiKeys) const setVideoProviderApiKey = useAgendaSettingsStore((s) => s.setVideoProviderApiKey) const defaultInvitationIdentityKey = useAgendaSettingsStore( (s) => s.defaultInvitationIdentityKey, ) const setDefaultInvitationIdentityKey = useAgendaSettingsStore( (s) => s.setDefaultInvitationIdentityKey, ) const autoImportInvitationSources = useAgendaSettingsStore( (s) => s.autoImportInvitationSources, ) const setAutoImportInvitationSources = useAgendaSettingsStore( (s) => s.setAutoImportInvitationSources, ) const invitationImportExclusions = useAgendaSettingsStore( (s) => s.invitationImportExclusions, ) const setInvitationImportExclusions = useAgendaSettingsStore( (s) => s.setInvitationImportExclusions, ) const weekStart = useAgendaSettingsStore((s) => s.weekStart) const setWeekStart = useAgendaSettingsStore((s) => s.setWeekStart) const defaultQuickDurationMinutes = useAgendaSettingsStore( (s) => s.defaultQuickDurationMinutes, ) const setDefaultQuickDurationMinutes = useAgendaSettingsStore( (s) => s.setDefaultQuickDurationMinutes, ) const visibleHoursStart = useAgendaSettingsStore((s) => s.visibleHoursStart) const visibleHoursEnd = useAgendaSettingsStore((s) => s.visibleHoursEnd) const setVisibleHoursStart = useAgendaSettingsStore((s) => s.setVisibleHoursStart) const setVisibleHoursEnd = useAgendaSettingsStore((s) => s.setVisibleHoursEnd) const timeFormat = useAgendaSettingsStore((s) => s.timeFormat) const setTimeFormat = useAgendaSettingsStore((s) => s.setTimeFormat) const dragSnapMinutes = useAgendaSettingsStore((s) => s.dragSnapMinutes) const setDragSnapMinutes = useAgendaSettingsStore((s) => s.setDragSnapMinutes) const buttonSnapMinutes = useAgendaSettingsStore((s) => s.buttonSnapMinutes) const setButtonSnapMinutes = useAgendaSettingsStore((s) => s.setButtonSnapMinutes) const identityOptions = useAgendaSettingsIdentityOptions() const destinationOptions = useAgendaSettingsDestinationOptions() const effective = useEffectiveAgendaSettings() const isDemo = useIsDemoApp() const activeProvider = effective.orgEnforcesVideoProvider ? effective.defaultVideoProvider : defaultVideoProvider const needsUserApiKey = !effective.orgEnforcesVideoProvider && activeProvider !== "ultimeet" && activeProvider !== "none" const autoImportItems = normalizeAutoImportInvitationSources( autoImportInvitationSources, destinationOptions, ) const exclusionItems = normalizeInvitationImportExclusions( invitationImportExclusions, destinationOptions, ) const isPage = variant === "page" const fields = ( <> {!isPage && !isDemo ? ( Arrière-plan ) : null } >
{THEME_OPTIONS.map((opt) => ( ))}
) : null}
setVisibleHoursStart(timeValueToMinutes(e.target.value))} /> setVisibleHoursEnd(timeValueToMinutes(e.target.value))} />
{needsUserApiKey ? (
setVideoProviderApiKey(activeProvider, e.target.value)} />
) : null}
setAutoImportInvitationSources( normalizeAutoImportInvitationSources(items, destinationOptions), ) } />
setInvitationImportExclusions( normalizeInvitationImportExclusions(items, destinationOptions), ) } />
) if (isPage) { return {fields} } return fields }