import React, { useEffect, useState } from "react"; import { Edit2Icon, Settings } from "lucide-react"; import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem, } from "@/shared/common/ui/select"; import { useUnit } from "@/user-management/hooks/useUnit"; import { useAuth } from "@/shared/context/AuthContext"; import { useUnitConfiguration } from "@/shared/hooks/useUnitConfiguration"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/shared/common/ui/table"; import { prefixSuffixService, EEscalationNotificationType, EEscalationNotificationChannel, } from "@/user-management/services/api/prefixSuffixService"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/shared/common/ui/dialog"; import { Button } from "@/shared/common/ui/button"; import { Input } from "@/shared/common/ui/input"; import { t } from "i18next"; import { useLocalizedName } from "@/shared/common/localizedName"; const configurationCardShell = "relative overflow-hidden rounded-2xl border border-slate-200/80 bg-gradient-to-br from-white via-slate-50 to-slate-100/60 p-4 shadow-sm sm:p-6 dark:border-slate-700/80 dark:bg-gradient-to-br dark:from-slate-950 dark:via-slate-900 dark:to-slate-900"; type FormState = { escalationNotificationType: EEscalationNotificationType | ""; escalationNotificationChannel: EEscalationNotificationChannel | ""; escalationHour: number | undefined; urgentLetterEscalationHour: number | undefined; onReviewLetterEscalationHour: number | undefined; urgentOnReviewLetterEscalationHour: number | undefined; }; const emptyForm: FormState = { escalationNotificationType: "", escalationNotificationChannel: "", escalationHour: undefined, urgentLetterEscalationHour: undefined, onReviewLetterEscalationHour: undefined, urgentOnReviewLetterEscalationHour: undefined, }; const EscalationConfigurationPage = () => { const { user } = useAuth(); const queryClient = useQueryClient(); const organizationId = user?.employee?.[0]?.organizationId || ""; const localizedName = useLocalizedName(); const { getList: getUnitList } = useUnit(); const { data: units, isLoading: isLoadingUnits } = getUnitList( organizationId, { take: 1000 }, ); const [selectedUnitId, setSelectedUnitId] = useState(""); const [open, setOpen] = useState(false); const [fieldKey, setFieldKey] = useState(null); const [fieldValue, setFieldValue] = useState(0); const [form, setForm] = useState(emptyForm); useEffect(() => { if (units?.data?.items?.length > 0 && !selectedUnitId) { setSelectedUnitId(units?.data?.items[0].id); } }, [units]); const { data, isLoading, error } = useUnitConfiguration(selectedUnitId); const config = data?.data?.items?.[0]; // Sync local form from server data whenever the config or selected unit changes useEffect(() => { if (config) { setForm({ escalationNotificationType: config.escalationNotificationType ?? "", escalationNotificationChannel: config.escalationNotificationChannel ?? "", escalationHour: config.escalationHour, urgentLetterEscalationHour: config.urgentLetterEscalationHour, onReviewLetterEscalationHour: config.onReviewLetterEscalationHour, urgentOnReviewLetterEscalationHour: config.urgentOnReviewLetterEscalationHour, }); } else { setForm(emptyForm); } }, [config]); const { mutate: saveAll, isPending: isUpdating } = useMutation({ mutationFn: (id: string) => prefixSuffixService.updateInternalPrefixSuffix( { escalationNotificationType: form.escalationNotificationType || undefined, escalationNotificationChannel: form.escalationNotificationChannel || undefined, escalationHour: form.escalationHour, urgentLetterEscalationHour: form.urgentLetterEscalationHour, onReviewLetterEscalationHour: form.onReviewLetterEscalationHour, urgentOnReviewLetterEscalationHour: form.urgentOnReviewLetterEscalationHour, unitId: selectedUnitId, }, id, ), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["unitConfig", selectedUnitId], }); }, onError: (err) => { console.error("Failed to update escalation settings", err); }, }); const handleSaveAll = () => { if (!config?.id) return; saveAll(config.id); }; const handleEdit = (key: string, value: number | undefined) => { setFieldKey(key); setFieldValue(value); setOpen(true); }; // Applies the edited hour value to local form state (no API call yet) const handleDialogApply = () => { if (!fieldKey) return; setForm((prev) => ({ ...prev, [fieldKey]: fieldValue })); setOpen(false); setFieldKey(null); }; const fields = [ { key: "escalationHour", label: t("setting.escalationHour"), value: form.escalationHour, }, { key: "urgentLetterEscalationHour", label: t("setting.urgentLetterEscalationHour"), value: form.urgentLetterEscalationHour, }, { key: "onReviewLetterEscalationHour", label: t("setting.onReviewLetterEscalationHour"), value: form.onReviewLetterEscalationHour, }, { key: "urgentOnReviewLetterEscalationHour", label: t("setting.urgentOnReviewLetterEscalationHour"), value: form.urgentOnReviewLetterEscalationHour, }, ]; return (

{t("setting.escalationTitle")}

{t("setting.escalationDescription")}

{isLoading && (

{t("setting.loadingConfig")}

)} {error && (

{t("setting.loadError")}

)} {!config && !isLoading && !error && (

{t("setting.noConfigFound")}

)} {config && (
{/* Escalation Notification Type */}

{t("setting.escalationNotificationType")}

{/* Escalation Hours */}
{t("setting.Name")} {t("setting.Value")} {t("setting.Action")} {fields.map((field) => ( {field.label} {field.value ?? "-"} ))}
{/* Escalation Notification Channel */}

{t("setting.escalationNotificationChannel")}

{/* Single batch save */}
)}
{/* Modal for editing a single hour field — applies to local form only */} {t("setting.edit")} {fieldKey && t(`setting.${fieldKey}`)} {t("setting.updateEscalationMsg")}
setFieldValue(Number(e.target.value))} className="dark:border-slate-700 dark:bg-slate-900 dark:text-slate-100" />
); }; export default EscalationConfigurationPage;