import React, { useState } from 'react'; import { api, errorMessage } from '../../services/apiClient.ts'; import { useAuth } from '../../context/AuthContext.tsx'; import { useFarm } from '../../context/FarmContext.tsx'; import { AlertDialog, Banner, ConfirmDialog } from '../ui/Feedback.tsx'; import { formatDateId, resolveCycleStatus, todayIso } from '../../utils/format.ts'; type ConfirmKind = 'request_close' | 'cancel_request'; const DashboardCloseCycleControls: React.FC = () => { const { user } = useAuth(); const { selectedCycle, reload } = useFarm(); const [proposedCloseDate, setProposedCloseDate] = useState(todayIso()); const [confirmKind, setConfirmKind] = useState(null); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const [notice, setNotice] = useState(null); const canRequestClose = user?.status === 'active'; const status = selectedCycle ? resolveCycleStatus(selectedCycle) : null; const showControls = Boolean(canRequestClose && selectedCycle && status !== 'closed'); const run = async (action: () => Promise, successMessage: string) => { if (!selectedCycle) return; setBusy(true); setError(null); try { await action(); await reload(); setNotice(successMessage); setConfirmKind(null); } catch (err) { setConfirmKind(null); setError(errorMessage(err)); void reload(); } finally { setBusy(false); } }; if (!showControls && !error) return null; return (
{showControls && notice && {notice}} {showControls && status === 'active' && selectedCycle && (
)} {showControls && status === 'pending_close' && selectedCycle && (
{selectedCycle.proposed_end_date && (

Menunggu GM ยท usulan {formatDateId(selectedCycle.proposed_end_date)}

)}
)} Permintaan tutup akan dikirim ke pusat dengan tanggal usulan{' '} {formatDateId(proposedCloseDate)}. GM harus menyetujui sebelum siklus ditutup. Anda masih bisa membatalkan selama status menunggu GM.

} confirmLabel="Ya, ajukan tutup" busy={busy} onCancel={() => { if (!busy) setConfirmKind(null); }} onConfirm={() => { if (busy || !selectedCycle) return; void run( () => api.cycles .requestClose(selectedCycle.id, { proposed_end_date: proposedCloseDate, }) .then(() => undefined), 'Permintaan tutup dikirim ke pusat.' ); }} /> Permintaan tutup ke pusat akan dibatalkan. Siklus tetap aktif dan dapat diajukan tutup lagi nanti.

} confirmLabel="Ya, batalkan" busy={busy} onCancel={() => { if (!busy) setConfirmKind(null); }} onConfirm={() => { if (busy || !selectedCycle) return; void run( () => api.cycles.cancelCloseRequest(selectedCycle.id).then(() => undefined), 'Permintaan tutup dibatalkan.' ); }} /> {error}

} dismissLabel="Tutup" onDismiss={() => setError(null)} />
); }; export default DashboardCloseCycleControls;