'use client' import { useState, useEffect } from 'react' import { X, Save, Building2, MapPin, Phone, User, Map as MapIcon, Loader2, Info, Plus, Trash2, Briefcase } from 'lucide-react' import { supabase } from '@/lib/supabase' import { useRouter } from 'next/navigation' import { showSwal } from '@/lib/swal' interface PetugasInput { id?: string nama_petugas: string nomor_hp: string jabatan: string } interface PosyanduFormModalProps { isOpen: boolean onClose: () => void selectedData?: any | null } export function PosyanduFormModal({ isOpen, onClose, selectedData }: PosyanduFormModalProps) { const router = useRouter() const [loading, setLoading] = useState(false) const [formData, setFormData] = useState({ nama_posyandu: '', alamat: '', kontak: '', // This stays as the Posyandu general contact if needed, but we'll prioritize petugas contacts link_google_maps: '' }) const [petugas, setPetugas] = useState([ { nama_petugas: '', nomor_hp: '', jabatan: 'Koordinator' } ]) useEffect(() => { if (selectedData) { setFormData({ nama_posyandu: selectedData.nama_posyandu || '', alamat: selectedData.alamat || '', kontak: selectedData.kontak || '', link_google_maps: selectedData.link_google_maps || '' }) if (selectedData.petugas && selectedData.petugas.length > 0) { setPetugas(selectedData.petugas.map((p: any) => ({ id: p.id, nama_petugas: p.nama_petugas || '', nomor_hp: p.nomor_hp || '', jabatan: p.jabatan || '' }))) } else { setPetugas([{ nama_petugas: '', nomor_hp: '', jabatan: 'Koordinator' }]) } } else { setFormData({ nama_posyandu: '', alamat: '', kontak: '', link_google_maps: '' }) setPetugas([{ nama_petugas: '', nomor_hp: '', jabatan: 'Koordinator' }]) } }, [selectedData]) const handleAddPetugas = () => { setPetugas([...petugas, { nama_petugas: '', nomor_hp: '', jabatan: '' }]) } const handleRemovePetugas = (index: number) => { if (petugas.length === 1) { setPetugas([{ nama_petugas: '', nomor_hp: '', jabatan: 'Koordinator' }]) } else { setPetugas(petugas.filter((_, i) => i !== index)) } } const handlePetugasChange = (index: number, field: keyof PetugasInput, value: string) => { const updatedPetugas = [...petugas] updatedPetugas[index] = { ...updatedPetugas[index], [field]: value } setPetugas(updatedPetugas) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setLoading(true) try { const payload = { nama_posyandu: formData.nama_posyandu, alamat: formData.alamat, kontak: formData.kontak, link_google_maps: formData.link_google_maps } let posyanduId = selectedData?.id if (selectedData) { // Update Posyandu const { error } = await supabase.from('detail_posyandu').update(payload).eq('id', selectedData.id) if (error) throw error } else { // Insert Posyandu const { data, error } = await supabase.from('detail_posyandu').insert(payload).select().single() if (error) throw error posyanduId = data.id } // ... [Officer sync logic remains same] ... // Sync Petugas // 1. Get current IDs in DB for this Posyandu const { data: existingInDB } = await supabase .from('petugas_posyandu_lokal') .select('id') .eq('posyandu_id', posyanduId) const dbIds = existingInDB?.map(p => p.id) || [] const currentFormIds = petugas.map(p => p.id).filter(Boolean) as string[] // 2. Identify deleted ones const idsToDelete = dbIds.filter(id => !currentFormIds.includes(id)) if (idsToDelete.length > 0) { await supabase.from('petugas_posyandu_lokal').delete().in('id', idsToDelete) } // 3. Update or Insert for (const p of petugas) { // Skip if entirely empty if (!p.nama_petugas && !p.nomor_hp) continue const petugasPayload = { posyandu_id: posyanduId, nama_petugas: p.nama_petugas, nomor_hp: p.nomor_hp, jabatan: p.jabatan } if (p.id) { // Update await supabase.from('petugas_posyandu_lokal').update(petugasPayload).eq('id', p.id) } else { // Insert await supabase.from('petugas_posyandu_lokal').insert(petugasPayload) } } await showSwal.success('Berhasil!', 'Data Posyandu telah disimpan.') router.refresh() onClose() } catch (err: any) { showSwal.error('Gagal!', err.message) } finally { setLoading(false) } } if (!isOpen) return null return (
{/* Header */}

{selectedData ? 'Edit Data Posyandu' : 'Tambah Posyandu Baru'}

OPERASIONAL POSYANDU

{/* Form Body */}
{/* Informasi Dasar */}

Informasi Dasar

setFormData({ ...formData, nama_posyandu: e.target.value })} className="w-full px-4 py-3 bg-gray-50 border-2 border-gray-100 focus:border-black rounded-xl text-sm font-bold outline-none transition-all" />