// "use client"; import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { useForm, Controller } from "react-hook-form"; import { cn } from "@/lib/utils"; import { format } from "date-fns"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Calendar } from "@/components/ui/calendar"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Loader2, CalendarIcon, ChevronUp, ChevronDown } from "lucide-react"; import DeleteConfirmationDialog from "@/components/delete-confirmation-dialog"; import { CalendarCategory } from "./data"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Textarea } from "@/components/ui/textarea"; import { error, loading } from "@/lib/swal"; import Cookies from "js-cookie"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { useRouter } from "next/navigation"; import { postSchedule } from "@/service/schedule/schedule"; import { saveAgendaSettings } from "@/service/agenda-setting/agenda-setting"; import { Checkbox } from "@/components/ui/checkbox"; import { getUserLevelForAssignments } from "@/service/task"; import { AudioRecorder } from "react-audio-voice-recorder"; const schema = z.object({ title: z.string().min(3, { message: "Required" }), description: z.string().min(3, { message: "Required" }), }); const EventModal = ({ open, onClose, categories, event, selectedDate, }: { open: boolean; onClose: () => void; categories: any; event: any; selectedDate: any; }) => { const [startDate, setStartDate] = useState(new Date()); const [endDate, setEndDate] = useState(new Date()); const [isPending, startTransition] = React.useTransition(); const [calendarProps, setCalendarProps] = React.useState( categories[0].value ); const [listDest, setListDest] = useState([]); const [deleteModalOpen, setDeleteModalOpen] = useState(false); const [eventIdToDelete, setEventIdToDelete] = useState(null); const MySwal = withReactContent(Swal); const router = useRouter(); const [isLoading, setIsLoading] = useState(false); const [checkedLevels, setCheckedLevels] = useState(new Set()); const [expandedPolda, setExpandedPolda] = useState([{}]); const [audioFile, setAudioFile] = useState(null); const [isRecording, setIsRecording] = useState(false); const [timer, setTimer] = useState(120); const { register, control, reset, setValue, formState: { errors }, handleSubmit, } = useForm({ resolver: zodResolver(schema), mode: "all", }); useEffect(() => { async function fetchPoldaPolres() { setIsLoading(true); try { const response = await getUserLevelForAssignments(); setListDest(response?.data?.data.list); const initialExpandedState = response?.data?.data.list.reduce( (acc: any, polda: any) => { acc[polda.id] = false; return acc; }, {} ); setExpandedPolda(initialExpandedState); console.log("polres", initialExpandedState); } catch (error) { console.error("Error fetching Polda/Polres data:", error); } finally { setIsLoading(false); } } fetchPoldaPolres(); }, []); const handleCheckboxChange = (levelId: number) => { setCheckedLevels((prev) => { const updatedLevels = new Set(prev); if (updatedLevels.has(levelId)) { updatedLevels.delete(levelId); } else { updatedLevels.add(levelId); } return updatedLevels; }); }; const save = async (data: any) => { if (!audioFile) return; const formData = new FormData(); formData.append("voiceNote", audioFile); const reqData = { title: data.title, description: data.description, agendaType: calendarProps, startDate: format(startDate, "yyyy-MM-dd"), endDate: format(endDate, "yyyy-MM-dd"), voiceNote: formData, }; console.log("Submitted Data:", reqData); const response = await saveAgendaSettings(reqData); if (response?.error) { error(response?.message); return false; } Cookies.set("AgendaSetting", response?.data?.data.id, { expires: 1, }); // Optional: Use Swal for success feedback MySwal.fire({ title: "Sukses", text: "Data berhasil disimpan.", icon: "success", confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then(() => { router.push("en/contributor/agenda-setting"); }); }; const onSubmit = (data: any) => { save(data); }; useEffect(() => { if (selectedDate) { setStartDate(selectedDate.date); setEndDate(selectedDate.date); } if (event) { setStartDate(event?.event?.start); setEndDate(event?.event?.end); const eventCalendar = event?.event?.extendedProps?.calendar; setCalendarProps(eventCalendar || categories[0].value); } setValue("title", event?.event?.title || ""); setValue("description", event?.event?.description || ""); }, [event, selectedDate, open, categories, setValue]); const onDeleteEventAction = async () => { try { } catch (error) {} }; const handleOpenDeleteModal = (eventId: string) => { setEventIdToDelete(eventId); setDeleteModalOpen(true); onClose(); }; const toggleExpand = (poldaId: any) => { setExpandedPolda((prev: any) => ({ ...prev, [poldaId]: !prev[poldaId], })); }; const onRecordingStart = () => { setIsRecording(true); // Start a timer that stops the recording after 2 minutes (120 seconds) const countdown = setInterval(() => { setTimer((prevTimer) => { if (prevTimer <= 1) { clearInterval(countdown); // Stop the timer when it reaches 0 return 0; } return prevTimer - 1; }); }, 1000); // Update every second // Automatically stop recording after 2 minutes setTimeout(() => { if (isRecording) { handleStopRecording(); } }, 120000); // Stop after 2 minutes (120,000 ms) }; const handleStopRecording = () => { setIsRecording(false); setTimer(120); // Reset the timer to 2 minutes for the next recording }; const addAudioElement = (blob: Blob) => { const url = URL.createObjectURL(blob); const audio = document.createElement("audio"); audio.src = url; audio.controls = true; document.body.appendChild(audio); // Convert Blob to File const file = new File([blob], "voiceNote.webm", { type: "audio/webm" }); setAudioFile(file); }; const handleDeleteAudio = () => { // Remove the audio file by setting state to null setAudioFile(null); const audioElements = document.querySelectorAll("audio"); audioElements.forEach((audio) => audio.remove()); }; return ( <> setDeleteModalOpen(false)} onConfirm={onDeleteEventAction} defaultToast={false} /> {event ? "Edit Agenda Setting" : "Create Agenda Setting"}{" "} {event?.title}
( )} /> {errors?.title?.message && (
{typeof errors?.title?.message === "string" ? errors?.title?.message : JSON.stringify(errors?.title?.message)}
)}
( setStartDate(date as Date)} initialFocus /> )} />
( setEndDate(date as Date)} initialFocus /> )} />
( )} />
{calendarProps === "polda" && (
Daftar Wilayah Polda dan Polres
{listDest.map((polda: any) => (
{expandedPolda[polda.id] && (
{polda?.subDestination?.map((polres: any) => ( ))}
)}
))}
)}
(