import React, { useMemo, useState } from 'react'; import { api, errorMessage } from '../services/apiClient.ts'; import { useAuth } from '../context/AuthContext.tsx'; import { useFarm } from '../context/FarmContext.tsx'; import { Banner } from './ui/Feedback.tsx'; import { formatDateId, resolveCycleStatus } from '../utils/format.ts'; /** GM queue: approve/reject pending cycle closes from city sites. */ const PendingCloseQueue: React.FC = () => { const { user } = useAuth(); const { cycles, sites, kandangs, reload } = useFarm(); const [error, setError] = useState(null); const [notice, setNotice] = useState(null); const [busyId, setBusyId] = useState(null); const isGm = user?.status === 'gm'; const pending = useMemo( () => cycles.filter((c) => resolveCycleStatus(c) === 'pending_close'), [cycles] ); if (pending.length === 0) return null; const siteName = (kandangId: number) => { const kandang = kandangs.find((k) => k.id === kandangId); const site = sites.find((s) => s.id === kandang?.site); return site?.site_name ?? '—'; }; const act = async (id: number, decision: 'approve' | 'reject') => { setBusyId(id); setError(null); try { const result = decision === 'approve' ? await api.cycles.approveClose(id) : await api.cycles.rejectClose(id); const siteError = result && typeof result === 'object' && 'site_error' in result ? (result as { site_error?: string }).site_error : undefined; setNotice( siteError ? `Keputusan tersimpan di pusat. ${siteError}` : decision === 'approve' ? 'Siklus ditutup.' : 'Permintaan ditolak.' ); await reload(); } catch (err) { setError(errorMessage(err)); } finally { setBusyId(null); } }; return (

Permintaan tutup siklus

Menunggu persetujuan GM

{error && {error}} {notice && {notice}}
    {pending.map((cycle) => (
  • {siteName(cycle.kandang)} · {cycle.kandang_name}

    Mulai {formatDateId(cycle.start_date)} {cycle.proposed_end_date ? ` · usulan tutup ${formatDateId(cycle.proposed_end_date)}` : ''}

    {isGm ? (
    ) : ( Hanya GM yang dapat menyetujui )}
  • ))}
); }; export default PendingCloseQueue;