ultisuite-client/lib/agenda/use-effective-agenda-settings.ts
R3D347HR4Y d6d18f911b
Some checks failed
E2E / Playwright e2e (push) Has been cancelled
Lots of stuff and mobile app
2026-06-17 00:13:28 +02:00

139 lines
4.7 KiB
TypeScript

"use client"
import { useMemo } from "react"
import { useCurrentUser } from "@/lib/api/hooks/use-current-user"
import {
DEFAULT_AGENDA_ORG_SETTINGS,
DEFAULT_AGENDA_USER_SETTINGS,
} from "@/lib/agenda/agenda-settings-defaults"
import type {
AgendaOrgAgendaPublic,
AgendaUserSettings,
AgendaVideoProvider,
} from "@/lib/agenda/agenda-settings-types"
import {
migrateAutoImportIdentityKeys,
normalizeAutoImportInvitationSources,
} from "@/lib/agenda/agenda-destination-identities"
import { useAgendaSettingsStore } from "@/lib/agenda/agenda-store"
import {
DEMO_AGENDA_VISIBLE_HOURS_END,
DEMO_AGENDA_VISIBLE_HOURS_START,
} from "@/lib/demo/demo-agenda-settings"
import { useIsDemoAgenda } from "@/lib/demo/demo-agenda-context"
export type EffectiveAgendaSettings = AgendaUserSettings & {
orgEnforcesVideoProvider: boolean
}
const DEFAULT_ORG_AGENDA_PUBLIC: AgendaOrgAgendaPublic = {
default_theme_mode: DEFAULT_AGENDA_ORG_SETTINGS.default_theme_mode,
enforce_org_theme: false,
default_video_provider: DEFAULT_AGENDA_ORG_SETTINGS.default_video_provider,
enforce_org_video_provider: false,
configured_video_providers: ["ultimeet"],
}
function normalizeUserSettings(raw: Partial<AgendaUserSettings> & {
autoImportInvitationIdentityKeys?: string[]
}): AgendaUserSettings {
const base = { ...DEFAULT_AGENDA_USER_SETTINGS, ...raw }
const autoImportInvitationSources =
base.autoImportInvitationSources ??
(raw.autoImportInvitationIdentityKeys
? migrateAutoImportIdentityKeys(raw.autoImportInvitationIdentityKeys)
: DEFAULT_AGENDA_USER_SETTINGS.autoImportInvitationSources)
const start = clampMinutes(base.visibleHoursStart, 0, 23 * 60 + 59)
let end = clampMinutes(base.visibleHoursEnd, 0, 23 * 60 + 59)
if (end < start) end = start
return {
...base,
autoImportInvitationSources: normalizeAutoImportInvitationSources(
autoImportInvitationSources,
),
visibleHoursStart: start,
visibleHoursEnd: end,
defaultQuickDurationMinutes: Math.max(5, base.defaultQuickDurationMinutes),
}
}
function clampMinutes(value: number, min: number, max: number): number {
if (!Number.isFinite(value)) return min
return Math.min(max, Math.max(min, Math.round(value)))
}
export function useEffectiveAgendaSettings(): EffectiveAgendaSettings {
const isDemoAgenda = useIsDemoAgenda()
const defaultVideoProvider = useAgendaSettingsStore((s) => s.defaultVideoProvider)
const videoProviderApiKeys = useAgendaSettingsStore((s) => s.videoProviderApiKeys)
const defaultInvitationIdentityKey = useAgendaSettingsStore(
(s) => s.defaultInvitationIdentityKey,
)
const autoImportInvitationSources = useAgendaSettingsStore(
(s) => s.autoImportInvitationSources,
)
const invitationImportExclusions = useAgendaSettingsStore(
(s) => s.invitationImportExclusions,
)
const weekStart = useAgendaSettingsStore((s) => s.weekStart)
const defaultQuickDurationMinutes = useAgendaSettingsStore(
(s) => s.defaultQuickDurationMinutes,
)
const visibleHoursStart = useAgendaSettingsStore((s) => s.visibleHoursStart)
const visibleHoursEnd = useAgendaSettingsStore((s) => s.visibleHoursEnd)
const timeFormat = useAgendaSettingsStore((s) => s.timeFormat)
const dragSnapMinutes = useAgendaSettingsStore((s) => s.dragSnapMinutes)
const buttonSnapMinutes = useAgendaSettingsStore((s) => s.buttonSnapMinutes)
const { data: user } = useCurrentUser()
const org = user?.org_agenda ?? DEFAULT_ORG_AGENDA_PUBLIC
const orgEnforcesVideoProvider = org.enforce_org_video_provider
const orgDefaultVideoProvider = org.default_video_provider
return useMemo(() => {
const normalized = normalizeUserSettings({
defaultVideoProvider,
videoProviderApiKeys,
defaultInvitationIdentityKey,
autoImportInvitationSources,
invitationImportExclusions,
weekStart,
defaultQuickDurationMinutes,
visibleHoursStart: isDemoAgenda
? DEMO_AGENDA_VISIBLE_HOURS_START
: visibleHoursStart,
visibleHoursEnd: isDemoAgenda
? DEMO_AGENDA_VISIBLE_HOURS_END
: visibleHoursEnd,
timeFormat,
dragSnapMinutes,
buttonSnapMinutes,
})
const provider: AgendaVideoProvider = orgEnforcesVideoProvider
? orgDefaultVideoProvider
: normalized.defaultVideoProvider
return {
...normalized,
defaultVideoProvider: provider,
orgEnforcesVideoProvider,
}
}, [
defaultVideoProvider,
videoProviderApiKeys,
defaultInvitationIdentityKey,
autoImportInvitationSources,
invitationImportExclusions,
weekStart,
defaultQuickDurationMinutes,
visibleHoursStart,
visibleHoursEnd,
isDemoAgenda,
timeFormat,
dragSnapMinutes,
buttonSnapMinutes,
orgEnforcesVideoProvider,
orgDefaultVideoProvider,
])
}