"use client"; import { useCallback, useEffect, useRef, useState } from "react"; import { useTranslations } from "next-intl"; import { Button } from "@/components/ui/button"; import { X, Loader2, Calendar as CalendarIcon } from "lucide-react"; import type { IJMAPClient } from "@/lib/jmap/client-interface"; import { useCalendarStore } from "@/stores/calendar-store"; import { CalendarColorPicker } from "@/components/settings/calendar-management-settings"; import { toast } from "@/stores/toast-store"; interface CreateCalendarModalProps { client: IJMAPClient; onClose: () => void; } export function CreateCalendarModal({ client, onClose }: CreateCalendarModalProps) { const t = useTranslations("calendar.management"); const tCommon = useTranslations("common"); const createCalendar = useCalendarStore((s) => s.createCalendar); const [name, setName] = useState(""); const [color, setColor] = useState("#3b82f6"); const [isSubmitting, setIsSubmitting] = useState(false); const modalRef = useRef(null); const isValid = name.trim().length > 0; const handleSubmit = useCallback(async () => { const trimmed = name.trim(); if (!trimmed) return; setIsSubmitting(true); try { const created = await createCalendar(client, { name: trimmed, color }); if (created) { toast.success(t("calendar_created")); onClose(); } else { toast.error(t("error_create")); } } catch { toast.error(t("error_create")); } finally { setIsSubmitting(false); } }, [name, color, client, createCalendar, onClose, t]); useEffect(() => { const handleKey = (e: KeyboardEvent) => { if (e.key === "Escape" && !isSubmitting) onClose(); }; window.addEventListener("keydown", handleKey); return () => window.removeEventListener("keydown", handleKey); }, [onClose, isSubmitting]); useEffect(() => { const modal = modalRef.current; if (!modal) return; const focusableEls = modal.querySelectorAll( 'input, select, textarea, button, [tabindex]:not([tabindex="-1"])' ); const firstEl = focusableEls[0]; const lastEl = focusableEls[focusableEls.length - 1]; const handler = (e: KeyboardEvent) => { if (e.key !== "Tab") return; if (e.shiftKey && document.activeElement === firstEl) { e.preventDefault(); lastEl?.focus(); } else if (!e.shiftKey && document.activeElement === lastEl) { e.preventDefault(); firstEl?.focus(); } }; modal.addEventListener("keydown", handler); firstEl?.focus(); return () => modal.removeEventListener("keydown", handler); }, []); return (
!isSubmitting && onClose()} aria-hidden="true" />

{t("add_calendar")}

setName(e.target.value)} placeholder={t("name_placeholder")} className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring" disabled={isSubmitting} onKeyDown={(e) => { if (e.key === "Enter" && isValid) handleSubmit(); }} />
); }