'use client' import { useActionState, useEffect, useState, useCallback, useRef } from 'react' import { X, Calendar, Clock, Loader2, Save, AlertCircle, CheckCircle2 } from 'lucide-react' import { updateJadwal, getOccupiedSlots } from './action-jadwal' import { showSwal } from '@/lib/swal' interface JadwalData { id: string posyandu_id: string tanggal: string jam_mulai: string jam_selesai: string detail_posyandu: { nama_posyandu: string } } interface Props { isOpen: boolean onClose: () => void data: JadwalData | null adminName: string } const SESSIONS = [ { start: '08:00', end: '10:00' }, { start: '11:00', end: '13:00' }, { start: '14:00', end: '16:00' }, ] export function JadwalFormModal({ isOpen, onClose, data, adminName }: Props) { const [state, formAction, isPending] = useActionState(updateJadwal, null) const [selectedDate, setSelectedDate] = useState('') const [occupiedSlots, setOccupiedSlots] = useState<{ start: string; end: string; posyandu_id: string }[]>([]) const [isLoadingSlots, setIsLoadingSlots] = useState(false) const [selectedSession, setSelectedSession] = useState<{ start: string; end: string } | null>(null) const processedStateRef = useRef(null) const fetchSlots = useCallback(async (date: string) => { setIsLoadingSlots(true) const res = await getOccupiedSlots(date) if (res.success) { setOccupiedSlots(res.slots) } setIsLoadingSlots(false) }, []) useEffect(() => { if (data && isOpen) { setSelectedDate(data.tanggal) setSelectedSession({ start: data.jam_mulai.slice(0, 5), end: data.jam_selesai.slice(0, 5) }) fetchSlots(data.tanggal) } }, [data, isOpen, fetchSlots]) useEffect(() => { if (state && state !== processedStateRef.current) { onClose() if (state.success) { showSwal.success('Berhasil!', state.message) } else { showSwal.error('Gagal!', state.message) } processedStateRef.current = state } }, [state, onClose]) useEffect(() => { if (isOpen) { processedStateRef.current = null } }, [isOpen]) if (!isOpen || !data) return null const allSlotsFull = SESSIONS.every(session => occupiedSlots.some(occ => occ.start === session.start && occ.end === session.end && occ.posyandu_id !== data.posyandu_id ) ) return (
{/* Header */}

Atur Ulang Jadwal

{data.detail_posyandu.nama_posyandu}

{/* Tanggal */}
{ setSelectedDate(e.target.value) fetchSlots(e.target.value) }} required className="w-full p-3 border-2 border-black rounded-xl font-bold text-sm focus:outline-none focus:ring-4 focus:ring-black/5 transition-all" />
{/* Sesi Section */}
{allSlotsFull && (

Maaf, seluruh jadwal di hari ini sudah penuh.

)}
{SESSIONS.map((session, i) => { const isOccupied = occupiedSlots.some(occ => occ.start === session.start && occ.end === session.end && occ.posyandu_id !== data.posyandu_id ) const isSelected = selectedSession?.start === session.start const isCurrent = data.jam_mulai.slice(0, 5) === session.start && data.tanggal === selectedDate return ( ) })}
) }