"use client"; import React, { useEffect, useRef, useState } from "react"; import { useForm, Controller } from "react-hook-form"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Card } from "@/components/ui/card"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { useParams, useRouter } from "next/navigation"; import { Switch } from "@/components/ui/switch"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { cn, getCookiesDecrypt } from "@/lib/utils"; import { CalendarIcon, Clock1, Locate, MapPin, User2 } from "lucide-react"; import { Calendar } from "@/components/ui/calendar"; import { addDays, format, parseISO, setDate } from "date-fns"; import { DateRange } from "react-day-picker"; import TimePicker from "react-time-picker"; import "react-time-picker/dist/TimePicker.css"; import "react-clock/dist/Clock.css"; import MapHome from "@/components/maps/MapHome"; import { Textarea } from "@/components/ui/textarea"; import { error, loading } from "@/lib/swal"; import Cookies from "js-cookie"; import { detailSchedule, listScheduleNext, listScheduleToday, postApprovalSchedule, postSchedule, } from "@/service/schedule/schedule"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { formatDateToIndonesian } from "@/utils/globals"; import { formatDate } from "@fullcalendar/core/index.js"; import { Icon } from "@iconify/react/dist/iconify.js"; import { useTranslations } from "next-intl"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Badge } from "@/components/ui/badge"; import { close } from "@/config/swal"; import { Checkbox } from "@/components/ui/checkbox"; const taskSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), level: z.string().min(1, { message: "Judul diperlukan" }), name: z.string().min(1, { message: "Judul diperlukan" }), location: z.string().min(1, { message: "Judul diperlukan" }), }); interface Detail { id: number; title: string; address: string; speakerTitle: string; speakerName: string; addressLat: number; addressLong: number; isYoutube: boolean; youtubeUrl: string; needApprovalFrom: number; uploadedById: number; statusId?: number; } export default function FormDetailLiveReport() { const { id } = useParams() as { id: string }; const router = useRouter(); type TaskSchema = z.infer; const userId = getCookiesDecrypt("uie"); const userLevelId = getCookiesDecrypt("ulie"); const roleId = getCookiesDecrypt("urie"); const userLevelNumber = getCookiesDecrypt("ulne"); const [startTime, setStartTime] = useState("08:00"); const [endTime, setEndTime] = useState("09:00"); const [date, setDate] = useState(); const [todayList, setTodayList] = useState([]); const [nextDayList, setNextDayList] = useState([]); const [detail, setDetail] = useState(); const [refresh, setRefresh] = useState(false); const t = useTranslations("Form"); const [status, setStatus] = useState(""); const [description, setDescription] = useState(""); const [modalOpen, setModalOpen] = useState(false); const { control, handleSubmit, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(taskSchema), }); async function getDataByDate() { const resToday = await listScheduleToday(); const today = resToday?.data?.data; setTodayList(today); const resNext = await listScheduleNext(); const next = resNext?.data?.data; setNextDayList(next); } useEffect(() => { initState(); }, [refresh]); async function initState() { if (id) { loading(); const response = await detailSchedule(id); close(); const details = response?.data?.data; setDetail(details); if (details) { setDate({ from: parseISO(details.startDate), to: parseISO(details.endDate), }); } if (details) { setStartTime(details.startTime); setEndTime(details.endTime); } getDataByDate(); } } const handleStartTime = (e: React.ChangeEvent) => { setStartTime(e.target.value); }; const handleEndTime = (e: React.ChangeEvent) => { setEndTime(e.target.value); }; const actionApproval = (e: string) => { setStatus(e); setDescription(""); setModalOpen(true); }; const submit = async () => { if ( description?.length > 1 && (Number(status) == 3 || Number(status) == 2 || Number(status) == 4) ) { save(); } }; async function save() { const data = { scheduleId: Number(id), statusId: Number(status), message: description, isPublish: status === "2", placements: schedulePlacements?.filter((val) => val !== "all")?.join(","), }; loading(); const response = await postApprovalSchedule(data); close(); setModalOpen(false); if (response?.error) { error(response?.message || "Gagal menyimpan data"); return; } // ✅ update UI lokal (optimistic) setDetail((prev) => prev ? { ...prev, statusId: Number(status), } : prev, ); Swal.fire({ icon: "success", title: "Berhasil", text: status === "2" ? "Jadwal berhasil disetujui" : status === "3" ? "Jadwal dikembalikan untuk revisi" : "Jadwal berhasil ditolak", confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { router.push("/contributor/schedule/live-report"); } }); } // async function save() { // const data = { // scheduleId: Number(id), // statusId: Number(status), // message: description, // isPublish: status === "2", // placements: schedulePlacements?.filter((val) => val != "all")?.join(","), // }; // loading(); // const response = await postApprovalSchedule(data); // close(); // setModalOpen(false); // if (response?.error) { // error(response?.message); // return false; // } // initState(); // return false; // } const [schedulePlacements, setSchedulePlacements] = useState([]); const setupPlacement = (placement: string, checked: boolean) => { let temp = [...schedulePlacements]; if (checked) { if (placement === "all") { temp = ["all", "mabes", "polda", "international"]; } else { const now = temp; now.push(placement); if (now.length === 3 && !now.includes("all")) { now.push("all"); } temp = now; } } else { if (placement === "all") { temp = []; } else { const now = temp.filter((a) => a !== placement); console.log("now", now); temp = now; if (now.length === 3 && now.includes("all")) { const newData = now.filter((b) => b !== "all"); temp = newData; } } } console.log("temp"); setSchedulePlacements(temp); }; const isCreator = Number(detail?.uploadedById) === Number(userId); const isApprover = Number(detail?.needApprovalFrom) === Number(userLevelId) && Number(userLevelNumber) < 2; const isAlreadyProcessed = detail?.statusId === 2 || detail?.statusId === 3 || detail?.statusId === 4; return (

Form Konferensi Pers

{detail !== undefined ? (
{/* Input Title */}
( )} /> {errors.title?.message && (

{errors.title.message}

)}

Aktifkan fitur live streaming

{detail.isYoutube && (
)}
{/* Kirim setValue ke MapHome */} setValue("location", location)} />
(