"use client" import { RefreshCwIcon } from "lucide-react" import { useEffect, useState } from "react" import { useAuth } from "@/components/auth-provider" import { useConfirm } from "@/components/confirm-provider" import { DashboardPage, DashboardToolbar } from "@/components/dashboard-page" import { OptionCombobox } from "@/components/option-combobox" import { OperatorStatusControl } from "@/components/support-availability/operator-status" import { Button } from "@/components/ui/button" import { useI18n } from "@/i18n/provider" import { fetchAgentTeamsAll, type AdminAgentTeam } from "@/lib/api/admin" import { fetchSupportCalendar, type SupportCalendar } from "@/lib/api/support-availability" import { CalendarEditor } from "./_components/calendar-editor" // A scoped configuration editor, not a paginated CRUD resource. export default function SupportAvailabilityPage() { const { session } = useAuth() return } function SupportAvailabilityContent() { const t = useI18n() const { session } = useAuth() const confirm = useConfirm() const can = (permission: string) => Boolean(session?.permissions.includes(permission)) const canDefault = can("supportConfig.view") const canTeams = can("agentTeam.view") && can("agentTeamSchedule.view") const [teams, setTeams] = useState([]) const [teamId, setTeamId] = useState(canDefault ? 0 : null) const [calendar, setCalendar] = useState(null) const [error, setError] = useState("") const [teamError, setTeamError] = useState("") const [loading, setLoading] = useState(true) const [dirty, setDirty] = useState(false) const [busy, setBusy] = useState(false) const [revision, setRevision] = useState(0) useEffect(() => { if (!canTeams) return let active = true fetchAgentTeamsAll().then(data => { if (active) { setTeams(data); setTeamError(""); setTeamId(current => current ?? data[0]?.id ?? null); if (!data.length && !canDefault) setLoading(false) } }).catch(error => { if (active) { setTeamError(error instanceof Error ? error.message : t("supportAvailability.loadFailed")); if (!canDefault) setLoading(false) } }) return () => { active = false } }, [canTeams, canDefault, revision, t]) useEffect(() => { if (teamId === null) return let active = true fetchSupportCalendar(teamId).then(data => { if (active) { setCalendar(data); setError("") } }).catch(error => { if (active) { setCalendar(null); setError(error instanceof Error ? error.message : t("supportAvailability.loadFailed")) } }).finally(() => { if (active) setLoading(false) }) return () => { active = false } }, [teamId, revision, t]) async function changeScope(next: number) { if (busy) return if (dirty && !(await confirm({ title: t("supportAvailability.discardTitle"), description: t("supportAvailability.discardDescription"), confirmText: t("supportAvailability.discard") }))) return setDirty(false); setCalendar(null); setLoading(true); setTeamId(next) } const options = [...(canDefault ? [{ value: "0", label: t("supportAvailability.deploymentDefault") }] : []), ...teams.map(team => ({ value: String(team.id), label: team.name }))] return }>{t("supportAvailability.title")}{t("supportAvailability.description")} {!canDefault && !canTeams ? {t("supportAvailability.noPermission")} : <> void changeScope(Number(value))} ariaLabel={t("supportAvailability.selectScope")} placeholder={t("supportAvailability.selectScope")} /> { setLoading(true); setRevision(value => value + 1) }}> {teamError ? {teamError} : null} {error ? {error} { setLoading(true); setRevision(value => value + 1) }}>{t("supportAvailability.retry")} : calendar && calendar.teamId === teamId ? { setCalendar(value); setDirty(false); setRevision(revision => revision + 1) }} /> : {t(teamId === null && !loading ? "supportAvailability.noTeams" : "supportAvailability.loading")}} >} }
{t("supportAvailability.description")}
{t("supportAvailability.noPermission")}
{teamError}
{error}
{t(teamId === null && !loading ? "supportAvailability.noTeams" : "supportAvailability.loading")}