'use client' import { useState, useEffect } from 'react' import { portalAPI } from '@/lib/api/portal' import Modal from '@/components/Modal' import LoadingSpinner from '@/components/LoadingSpinner' import { toast } from 'react-hot-toast' import { Plus } from 'lucide-react' const TIME_OPTIONS = Array.from({ length: 48 }, (_, i) => { const hour = Math.floor(i / 2).toString().padStart(2, '0') const minute = i % 2 === 0 ? '00' : '30' return `${hour}:${minute}` }) const LEAVE_TYPES = [ { value: 'ANNUAL', label: 'إجازة سنوية' }, { value: 'HOURLY', label: 'إجازة ساعية' }, ] const STATUS_MAP: Record = { PENDING: { label: 'قيد المراجعة', color: 'bg-amber-100 text-amber-800' }, APPROVED: { label: 'معتمدة', color: 'bg-green-100 text-green-800' }, REJECTED: { label: 'مرفوضة', color: 'bg-red-100 text-red-800' }, } export default function PortalLeavePage() { const [leaveBalance, setLeaveBalance] = useState([]) const [leaves, setLeaves] = useState([]) const [loading, setLoading] = useState(true) const [showModal, setShowModal] = useState(false) const [submitting, setSubmitting] = useState(false) const [form, setForm] = useState({ leaveType: 'ANNUAL', startDate: '', endDate: '', leaveDate: '', startTime: '', endTime: '', reason: '', }) const load = () => { setLoading(true) Promise.all([portalAPI.getLeaveBalance(), portalAPI.getLeaves()]) .then(([balance, list]) => { setLeaveBalance(balance) setLeaves(list) }) .catch(() => toast.error('فشل تحميل البيانات')) .finally(() => setLoading(false)) } useEffect(() => load(), []) const toCompanyDateTime = (date: string, time: string) => { return `${date}T${time}:00+03:00` } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() let payload: any = { leaveType: form.leaveType, reason: form.reason || undefined, } if (form.leaveType === 'ANNUAL') { if (!form.startDate || !form.endDate) { toast.error('أدخل تاريخ البداية والنهاية') return } if (new Date(form.endDate) < new Date(form.startDate)) { toast.error('تاريخ النهاية يجب أن يكون بعد البداية') return } payload.startDate = form.startDate payload.endDate = form.endDate } else { if (!form.leaveDate || !form.startTime || !form.endTime) { toast.error('أدخل التاريخ والوقت للإجازة الساعية') return } if (form.startTime >= form.endTime) { toast.error('وقت النهاية يجب أن يكون بعد البداية') return } payload.startDate = `${form.leaveDate}T${form.startTime}:00+03:00` payload.endDate = `${form.leaveDate}T${form.endTime}:00+03:00` } setSubmitting(true) portalAPI.submitLeaveRequest(payload) .then(() => { setShowModal(false) setForm({ leaveType: 'ANNUAL', startDate: '', endDate: '', leaveDate: '', startTime: '', endTime: '', reason: '', }) toast.success('تم إرسال طلب الإجازة') load() }) .catch(() => toast.error('فشل إرسال الطلب')) .finally(() => setSubmitting(false)) } if (loading) return return (
{/* HEADER */}

إجازاتي

{/* الرصيد */} {leaveBalance.length > 0 && (

رصيد الإجازات

{leaveBalance.map((b) => (

{b.leaveType === 'ANNUAL' ? 'سنوية' : b.leaveType}

{b.available} يوم

))}
)} {/* الطلبات */}

طلباتي

{leaves.length === 0 ? (

لا توجد طلبات

) : (
{leaves.map((l) => { const statusInfo = STATUS_MAP[l.status] || { label: l.status, color: 'bg-gray-100' } return (

{l.leaveType === 'ANNUAL' ? 'سنوية' : 'ساعية'} -{' '} {l.leaveType === 'HOURLY' ? `${new Date(l.startDate).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} - ${new Date(l.endDate).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}` : `${l.days} يوم`}

{new Date(l.startDate).toLocaleDateString('ar-SA')} - {new Date(l.endDate).toLocaleDateString('ar-SA')}

{statusInfo.label}
) })}
)}
{/* الفورم */} setShowModal(false)} title="طلب إجازة جديد">
{/* نوع الإجازة */} {/* سنوية */} {form.leaveType === 'ANNUAL' ? (
setForm(p => ({ ...p, startDate: e.target.value }))} className="border p-2 rounded w-full" />
setForm(p => ({ ...p, endDate: e.target.value }))} className="border p-2 rounded w-full" />
) : ( /* ساعية */
setForm(p => ({ ...p, leaveDate: e.target.value }))} className="border p-2 rounded w-full" />
)} {/* السبب */}