"use client"; import { useEffect, useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "../ui/card"; import { Label } from "../ui/label"; import { Button } from "../ui/button"; import { Input } from "../ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "../ui/select"; import { useLanguage } from "../../lib/languageContext"; import { translations } from "../../lib/translations"; import { fetchSheikhAvailability, type AvailabilitySlotDto, } from "../../lib/api/sheikhApi"; import sheikhApi from "../../lib/api/sheikhApi"; const updateSheikhAvailability = sheikhApi.updateSheikhAvailability; const DAY_ORDER: Record = { SATURDAY: 0, SUNDAY: 1, MONDAY: 2, TUESDAY: 3, WEDNESDAY: 4, THURSDAY: 5, FRIDAY: 6, }; function sortSlots(arr: T[]): T[] { return [...arr].sort( (a, b) => (DAY_ORDER[a.dayOfWeek.toUpperCase()] ?? 99) - (DAY_ORDER[b.dayOfWeek.toUpperCase()] ?? 99) ); } const ALL_DAYS = [ "SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", ] as const; type DayKey = (typeof ALL_DAYS)[number]; // "HH:mm:ss" or "HH:mm" → "HH:mm" function fmt(time: string): string { return time.slice(0, 5); } function capitalise(day: string): string { return day.charAt(0).toUpperCase() + day.slice(1).toLowerCase(); } interface RowState extends AvailabilitySlotDto { editing: boolean; editStart: string; editEnd: string; } interface NewRow { day: DayKey | ""; startTime: string; endTime: string; } export default function SheikhAvailabilityForm() { const { language, isRTL } = useLanguage(); const t = translations[language].availability; const [rows, setRows] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [successMsg, setSuccessMsg] = useState(null); // new-row form const [adding, setAdding] = useState(false); const [newRow, setNewRow] = useState({ day: "", startTime: "", endTime: "" }); useEffect(() => { fetchSheikhAvailability() .then((data) => setRows( sortSlots(data).map((s) => ({ ...s, editing: false, editStart: fmt(s.startTime), editEnd: fmt(s.endTime), })) ) ) .catch((e) => setError(e.message ?? "Failed to load availability")) .finally(() => setLoading(false)); }, []); // days already taken → exclude from "add" dropdown const takenDays = rows.map((r) => r.dayOfWeek.toUpperCase() as DayKey); const availableDays = ALL_DAYS.filter((d) => !takenDays.includes(d)); // ── helpers ────────────────────────────────────────────────────────────── function flash(msg: string) { setSuccessMsg(msg); setTimeout(() => setSuccessMsg(null), 3000); } async function putAll(updated: AvailabilitySlotDto[]) { setSaving(true); setError(null); const payload = updated.map((s) => ({ dayOfWeek: s.dayOfWeek, startTime: s.startTime, endTime: s.endTime, })); console.log("[availability] PUT payload:", JSON.stringify({ slots: payload }, null, 2)); try { await updateSheikhAvailability(payload); flash("Availability saved."); } catch (e: any) { console.error("[availability] PUT failed:", e); setError(e.message ?? "Failed to save"); } finally { setSaving(false); } } // ── edit ───────────────────────────────────────────────────────────────── function startEdit(id: number) { setRows((prev) => prev.map((r) => (r.id === id ? { ...r, editing: true } : r)) ); } function cancelEdit(id: number) { setRows((prev) => prev.map((r) => r.id === id ? { ...r, editing: false, editStart: fmt(r.startTime), editEnd: fmt(r.endTime) } : r ) ); } async function saveEdit(id: number) { const row = rows.find((r) => r.id === id)!; const updated = rows.map((r) => r.id === id ? { ...r, startTime: row.editStart + ":00", endTime: row.editEnd + ":00", editing: false } : r ); setRows(updated); await putAll(updated); } // ── delete ──────────────────────────────────────────────────────────────── async function deleteRow(id: number) { const updated = rows.filter((r) => r.id !== id); setRows(updated); await putAll(updated); } // ── add ─────────────────────────────────────────────────────────────────── async function confirmAdd() { if (!newRow.day || !newRow.startTime || !newRow.endTime) return; const fakeId = Date.now(); // temporary local id const newSlot: AvailabilitySlotDto = { id: fakeId, dayOfWeek: newRow.day, startTime: newRow.startTime + ":00", endTime: newRow.endTime + ":00", }; const updated = [ ...rows.map((r) => ({ id: r.id, dayOfWeek: r.dayOfWeek, startTime: r.startTime, endTime: r.endTime, })), newSlot, ]; setSaving(true); setError(null); try { await updateSheikhAvailability( updated.map((s) => ({ dayOfWeek: s.dayOfWeek, startTime: s.startTime, endTime: s.endTime, })) ); // re-fetch to get real ids from backend const fresh = await fetchSheikhAvailability(); setRows( sortSlots(fresh).map((s) => ({ ...s, editing: false, editStart: fmt(s.startTime), editEnd: fmt(s.endTime), })) ); flash("Availability saved."); } catch (e: any) { setError(e.message ?? "Failed to save"); } finally { setSaving(false); setAdding(false); setNewRow({ day: "", startTime: "", endTime: "" }); } } // ───────────────────────────────────────────────────────────────────────── return (
{t.title} {/* feedback */} {error &&

{error}

} {successMsg &&

{successMsg}

} {loading && (

Loading…

)} {!loading && rows.length === 0 && !adding && (

No availability set yet.

)} {/* existing rows */} {rows.map((row) => (
{/* day label */}

{capitalise(row.dayOfWeek)}

{/* from */}
{row.editing ? ( setRows((prev) => prev.map((r) => r.id === row.id ? { ...r, editStart: e.target.value } : r ) ) } /> ) : (

{fmt(row.startTime)}

)}
{/* to */}
{row.editing ? ( setRows((prev) => prev.map((r) => r.id === row.id ? { ...r, editEnd: e.target.value } : r ) ) } /> ) : (

{fmt(row.endTime)}

)}
{/* actions */}
{row.editing ? ( <> ) : ( <> )}
))} {/* new row form */} {adding && (
{/* day select */}
{/* from */}
setNewRow((p) => ({ ...p, startTime: e.target.value }))} />
{/* to */}
setNewRow((p) => ({ ...p, endTime: e.target.value }))} />
)} {/* add day button */} {!adding && availableDays.length > 0 && ( )}
); }