"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 (
)
}
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 effective = useEffectiveAgendaSettings()
const isDemo = useIsDemoApp()
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 activeTheme = effective.orgEnforcesTheme ? effective.themeMode : themeMode
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
}
>
{effective.orgEnforcesTheme ? (
Thème imposé par votre organisation.
) : 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
}