"use client"; import React, { useState, useEffect } from "react"; import { useForm, Controller } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { Card, CardHeader, CardTitle, CardContent, CardFooter, } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Checkbox } from "@/components/ui/checkbox"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { errorAutoClose, loading, successAutoClose } from "@/lib/swal"; import { close } from "@/config/swal"; import Image from "next/image"; // ✅ Zod Schema Validasi const companySchema = z.object({ companyName: z.string().trim().min(1, "Nama perusahaan wajib diisi"), address: z.string().trim().min(1, "Alamat perusahaan wajib diisi"), phone: z .string() .regex(/^[0-9+\-\s]+$/, "Nomor telepon tidak valid") .min(6, "Nomor telepon minimal 6 karakter"), website: z .string() .url("Masukkan URL website yang valid") .optional() .or(z.literal("")), description: z.string().trim().optional(), isActive: z.boolean().default(true), logo: z.any().optional(), }); type CompanySchema = z.infer; interface TenantCompanyUpdateFormProps { id: number; initialData?: any; onSuccess?: () => void; onCancel?: () => void; } export default function TenantCompanyUpdateForm({ id, initialData, onSuccess, onCancel, }: TenantCompanyUpdateFormProps) { const MySwal = withReactContent(Swal); const [previewLogo, setPreviewLogo] = useState(null); const [loadingData, setLoadingData] = useState(false); const { control, handleSubmit, setValue, formState: { errors }, watch, } = useForm({ resolver: zodResolver(companySchema), defaultValues: { companyName: "", address: "", phone: "", website: "", description: "", isActive: true, }, }); // ✅ Load data awal dari server useEffect(() => { async function fetchCompanyData() { setLoadingData(true); try { // TODO: ganti dengan service API kamu (misalnya getTenantCompanyDetail) const response = initialData; // simulasi if (response) { setValue("companyName", response.companyName || ""); setValue("address", response.address || ""); setValue("phone", response.phone || ""); setValue("website", response.website || ""); setValue("description", response.description || ""); setValue("isActive", response.isActive ?? true); setPreviewLogo(response.logoUrl || null); } } catch (err) { console.error("❌ Gagal memuat data perusahaan:", err); } finally { setLoadingData(false); } } fetchCompanyData(); }, [initialData, setValue]); // ✅ Fungsi Upload Logo const handleLogoChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; if (!file.type.startsWith("image/")) { MySwal.fire({ icon: "error", title: "Format tidak valid", text: "File harus berupa gambar (jpg, png, webp, dll)", }); return; } setValue("logo", file); setPreviewLogo(URL.createObjectURL(file)); }; // ✅ Submit Form const onSubmit = async (data: CompanySchema) => { try { loading(); const formData = new FormData(); formData.append("companyName", data.companyName); formData.append("address", data.address); formData.append("phone", data.phone); formData.append("website", data.website || ""); formData.append("description", data.description || ""); formData.append("isActive", data.isActive ? "true" : "false"); if (data.logo) formData.append("logo", data.logo); console.log("📦 Payload:", Object.fromEntries(formData.entries())); // TODO: Ganti dengan service API kamu → misalnya updateTenantCompany(formData) // const response = await updateTenantCompany(id, formData); await new Promise((resolve) => setTimeout(resolve, 1000)); // simulate close(); successAutoClose("Data perusahaan berhasil diperbarui."); setTimeout(() => { if (onSuccess) onSuccess(); }, 2000); } catch (err) { close(); console.error("❌ Gagal update perusahaan:", err); errorAutoClose("Terjadi kesalahan saat memperbarui data perusahaan."); } }; if (loadingData) { return (

Memuat data perusahaan...

); } return (
Update Informasi Perusahaan {/* Logo Upload */}
{previewLogo && (
Company Logo
)}
{/* Nama Perusahaan */}
( )} /> {errors.companyName && (

{errors.companyName.message}

)}
{/* Alamat */}
(