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 type { Cycle } from '../types/api.ts'; import { Banner, PageHeader } from './ui/Feedback.tsx'; import { addDaysIso, formatDateId, inclusiveDayCount, resolveCycleStatus, todayIso } from '../utils/format.ts'; const inputClass = 'border border-gray-300 rounded-md px-3 py-2 text-sm w-full focus:ring-red-500 focus:border-red-500'; const defaultCycleForm = () => ({ startDate: todayIso(), endDate: addDaysIso(todayIso(), 34), docInCount: 20000, chickInWeight: 35, }); const cycleToForm = (cycle: Cycle) => ({ startDate: cycle.start_date, endDate: cycle.end_date, docInCount: cycle.doc_in_count, chickInWeight: cycle.chick_in_weight, }); const SettingsPage: React.FC = () => { const { user } = useAuth(); const { sites, kandangs, flocks, cycles, selectedSiteId, selectedKandangId, reload, setSelectedSiteId, setSelectedKandangId, setSelectedCycleId, } = useFarm(); const [error, setError] = useState(null); const [notice, setNotice] = useState(null); const [saving, setSaving] = useState(false); const [siteName, setSiteName] = useState(''); const [kandangName, setKandangName] = useState(''); const [flockName, setFlockName] = useState(''); const [editingCycleId, setEditingCycleId] = useState(null); const [startDate, setStartDate] = useState(defaultCycleForm().startDate); const [endDate, setEndDate] = useState(defaultCycleForm().endDate); const [docInCount, setDocInCount] = useState(defaultCycleForm().docInCount); const [chickInWeight, setChickInWeight] = useState(defaultCycleForm().chickInWeight); const resetCycleForm = () => { const defaults = defaultCycleForm(); setEditingCycleId(null); setStartDate(defaults.startDate); setEndDate(defaults.endDate); setDocInCount(defaults.docInCount); setChickInWeight(defaults.chickInWeight); }; const beginCycleEdit = (cycle: Cycle) => { const form = cycleToForm(cycle); setEditingCycleId(cycle.id); setStartDate(form.startDate); setEndDate(form.endDate); setDocInCount(form.docInCount); setChickInWeight(form.chickInWeight); setSelectedCycleId(cycle.id); }; const buildCyclePayload = () => ({ kandang: selectedKandangId!, total_days: inclusiveDayCount(startDate, endDate), start_date: startDate, end_date: endDate, chick_in_weight: chickInWeight, doc_in_count: docInCount, }); const flash = (msg: string) => { setNotice(msg); setError(null); }; const isSuperAdmin = user?.status === 'superadmin'; const wrap = async (fn: () => Promise) => { setSaving(true); setError(null); try { await fn(); await reload(); } catch (err) { setError(errorMessage(err)); } finally { setSaving(false); } }; return (
{error && (
{error}
)} {notice && (
{notice}
)}

Sites

{isSuperAdmin ? (
{ e.preventDefault(); if (!user) return; void wrap(async () => { const created = await api.sites.create({ site_name: siteName, user: user.id }); setSiteName(''); setSelectedSiteId(created.id); flash(`Site ${created.site_name} dibuat.`); }); }} > setSiteName(e.target.value)} required />
) : (

Hanya admin yang dapat membuat site.

)}
    {sites.map((site) => (
  • {isSuperAdmin && ( )}
  • ))}

Kandang

{isSuperAdmin ? (
{ e.preventDefault(); if (!selectedSiteId) return; void wrap(async () => { const created = await api.kandangs.create({ kandang_name: kandangName, site: selectedSiteId, }); setKandangName(''); setSelectedKandangId(created.id); flash(`Kandang ${created.kandang_name} dibuat.`); }); }} > setKandangName(e.target.value)} required />
) : (

Hanya admin yang dapat membuat kandang.

)}
    {kandangs.map((kandang) => (
  • {isSuperAdmin && ( )}
  • ))}

Flock

Flock tetap untuk kandang ini (dipakai Panel IoT). Tidak terikat ke siklus.

{isSuperAdmin ? (
{ e.preventDefault(); if (!selectedKandangId) return; void wrap(async () => { const created = await api.flocks.create({ flock_name: flockName, kandang: selectedKandangId, }); setFlockName(''); flash(`Flock ${created.flock_name} dibuat.`); }); }} > setFlockName(e.target.value)} required />
) : (

Hanya admin yang dapat membuat flock.

)} {!selectedKandangId ? (

Pilih kandang terlebih dahulu.

) : (
    {flocks.map((flock) => (
  • {flock.flock_name} {isSuperAdmin && ( )}
  • ))}
)}

Siklus

{ e.preventDefault(); if (!selectedKandangId) return; void wrap(async () => { const payload = buildCyclePayload(); if (editingCycleId) { await api.cycles.update(editingCycleId, payload); flash('Siklus diperbarui.'); resetCycleForm(); } else { await api.cycles.create({ ...payload, current_day: 1 }); flash('Siklus dibuat.'); resetCycleForm(); } }); }} > {editingCycleId && (

Mengedit siklus {formatDateId(startDate)} – {formatDateId(endDate)}

)}
{editingCycleId && ( )}
    {cycles.map((cycle) => (
  • ))}
); }; export default SettingsPage;