// components/TambahIklanModal.tsx "use client"; import * as React from "react"; import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { ChevronDown, ChevronUp, Plus } from "lucide-react"; import { Card } from "@/components/ui/card"; import Image from "next/image"; import { Upload } from "tus-js-client"; import { getCsrfToken } from "@/service/auth"; import { error, loading } from "@/lib/swal"; import { format, parseISO } from "date-fns"; import { getUserLevelForAssignments } from "@/service/task"; import { zodResolver } from "@hookform/resolvers/zod"; import { Controller, useForm } from "react-hook-form"; import withReactContent from "sweetalert2-react-content"; import { useTranslations } from "next-intl"; import Swal from "sweetalert2"; import { z } from "zod"; import { DateRange } from "react-day-picker"; import { postCalendar } from "@/service/schedule/schedule"; import { id } from "date-fns/locale"; import router from "next/router"; import { detailAdvertisements, postAdvertisements, } from "@/service/settings/settings"; import Cookies from "js-cookie"; import { Label } from "@/components/ui/label"; import FileUploader from "../shared/file-uploader"; import { Icon } from "@/components/ui/icon"; import { useParams } from "next/navigation"; import Link from "next/link"; import { listDataAdvertisements } from "@/service/broadcast/broadcast"; import { close } from "@/config/swal"; import { useRouter } from "@/i18n/routing"; const calendarSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), description: z.string().min(1, { message: "Judul diperlukan" }), }); interface FileWithPreview extends File { preview: string; } interface FileUploaded { id: number; url: string; } interface Detail { id: number; title: string; description: string; } export function TambahIklanUpdate() { const [open, setOpen] = React.useState(false); const router = useRouter(); const MySwal = withReactContent(Swal); const t = useTranslations("Schedule"); const { id } = useParams() as { id: string }; type CalendarSchema = z.infer; const [eventDate, setEventDate] = React.useState(new Date()); const [listDest, setListDest] = React.useState([]); const [checkedLevels, setCheckedLevels] = React.useState(new Set()); const [expandedPolda, setExpandedPolda] = React.useState([{}]); const [isLoading, setIsLoading] = React.useState(false); const [isImageUploadFinish, setIsImageUploadFinish] = React.useState(false); const [files, setFiles] = React.useState([]); const [selectedPlacement, setSelectedPlacement] = React.useState(""); const [imageUploadedFiles, setImageUploadedFiles] = React.useState< FileUploaded[] >([]); const [detail, setDetail] = React.useState(); const [refresh, setRefresh] = React.useState(false); const [imageFiles, setImageFiles] = React.useState([]); const [date, setDate] = React.useState({ from: new Date(2025, 0, 1), }); const [unitSelection, setUnitSelection] = React.useState({ semua: false, mabes: false, polda: false, satker: false, internasional: false, }); const { control, handleSubmit, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(calendarSchema), defaultValues: { description: "", }, }); const handlePlacementSelect = (value: string) => { setSelectedPlacement(value); }; React.useEffect(() => { async function initState() { if (id) { const response = await detailAdvertisements(id); const details = response?.data?.data; setDetail(details); if (details?.assignedToLevel) { const levelIds = details.assignedToLevel .split(",") .map((id: string) => parseInt(id)); setCheckedLevels(new Set(levelIds)); } setValue("title", details.title); setValue("description", details.description); if (details?.placements) { setSelectedPlacement(details.placements); } } } initState(); }, [refresh, setValue]); React.useEffect(() => { async function fetchPoldaPolres() { setIsLoading(true); try { const response = await getUserLevelForAssignments(); setListDest(response?.data?.data.list); console.log("polda", 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 handlePoldaPolresChange = () => { return Array.from(checkedLevels).join(","); }; const handleUnitChange = ( key: keyof typeof unitSelection, value: boolean ) => { if (key === "semua") { const newState = { semua: value, mabes: value, polda: value, satker: value, internasional: value, }; setUnitSelection(newState); } else { const updatedSelection = { ...unitSelection, [key]: value, }; const allChecked = ["mabes", "polda", "satker", "internasional"].every( (k) => updatedSelection[k as keyof typeof unitSelection] ); updatedSelection.semua = allChecked; setUnitSelection(updatedSelection); } }; const toggleExpand = (poldaId: any) => { setExpandedPolda((prev: any) => ({ ...prev, [poldaId]: !prev[poldaId], })); }; async function fetchExistingImageAsFile( url: string, filename = "existing-image.jpg" ) { const response = await fetch(url); const blob = await response.blob(); const contentType = blob.type || "image/jpeg"; return new File([blob], filename, { type: contentType }); } // const save = async (data: CalendarSchema) => { // const unitMapping = { // allUnit: "0", // mabes: "1", // polda: "2", // satker: "4", // internasional: "5", // }; // const assignmentToString = Object.keys(unitSelection) // .filter((key) => unitSelection[key as keyof typeof unitSelection]) // .map((key) => unitMapping[key as keyof typeof unitMapping]) // .join(","); // const formMedia = new FormData(); // if (detail?.id) { // formMedia.append("id", detail.id.toString()); // } // formMedia.append("title", data.title); // formMedia.append("placements", selectedPlacement); // formMedia.append("description", data.description); // formMedia.append("redirectLink", "https://new.netidhub.com"); // formMedia.append("assignedToLevel", handlePoldaPolresChange()); // if (imageFiles.length > 0) { // formMedia.append("file", imageFiles[0]); // } // console.log("Form Data Submitted:", formMedia); // loading(); // const response = await postAdvertisements(formMedia); // if (response?.error) { // error(response?.message); // return false; // } // close(); // Cookies.set("scheduleId", response?.data?.data.id, { // expires: 1, // }); // }; // Ini fungsi save (dalam component TambahIklanUpdate) const save = async (data: CalendarSchema) => { const unitMapping = { allUnit: "0", mabes: "1", polda: "2", satker: "4", internasional: "5", }; const assignmentToString = Object.keys(unitSelection) .filter((key) => unitSelection[key as keyof typeof unitSelection]) .map((key) => unitMapping[key as keyof typeof unitMapping]) .join(","); const formMedia = new FormData(); if (detail?.id) { formMedia.append("id", detail.id.toString()); } formMedia.append("title", data.title); formMedia.append("placements", selectedPlacement); formMedia.append("description", data.description); formMedia.append("redirectLink", "https://new.netidhub.com"); formMedia.append("assignedToLevel", handlePoldaPolresChange()); if (imageFiles.length > 0) { formMedia.append("file", imageFiles[0]); } else if (detail?.id) { const existingFile = await fetchExistingImageAsFile( `https://new.netidhub.com/api/advertisements/viewer/${detail.id}`, "existing-image.jpg" ); formMedia.append("file", existingFile); } loading(); const response = await postAdvertisements(formMedia); if (response?.error) { error(response?.message); return false; } close(); MySwal.fire({ icon: "success", title: "Berhasil", text: "Iklan berhasil ditambahkan.", confirmButtonText: "OK", }).then(() => { window.location.href = "/in/admin/settings/iklan"; }); Cookies.set("scheduleId", response?.data?.data.id, { expires: 1, }); Cookies.set("scheduleId", response?.data?.data.id, { expires: 1 }); }; React.useEffect(() => { successTodo(); }, [isImageUploadFinish]); function successTodo() { if (isImageUploadFinish) { successSubmit("/in/admin/settings/iklan"); } } const successSubmit = (redirect: string) => { MySwal.fire({ title: "Sukses", text: "Data berhasil disimpan.", icon: "success", confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then(() => { router.push(redirect); }); }; const onSubmit = (data: CalendarSchema) => { MySwal.fire({ title: "Simpan Data", text: "Apakah Anda yakin ingin menyimpan data ini?", icon: "warning", showCancelButton: true, cancelButtonColor: "#d33", confirmButtonColor: "#3085d6", confirmButtonText: "Simpan", }).then((result) => { if (result.isConfirmed) { save(data); } }); }; const renderFilePreview = (url: string) => { return ( {"file ); }; const handleRemoveFile = (id: number) => {}; React.useEffect(() => { fetchData(); // setPagination({ // pageIndex: 0, // pageSize: Number(showData), // }); }, []); const [disabledCheckbox, setDisabledCheckbox] = React.useState([]); async function fetchData() { try { loading(); const res = await listDataAdvertisements(0, "10", ""); const data = res?.data?.data?.content; // const contentData = data?.content; const temp = data.map((a: any) => { if (a.placements == "left-top" && a.id !== Number(id)) { return "0"; } if (a.placements == "left-bottom" && a.id !== Number(id)) { return "1"; } if (a.placements == "right-top" && a.id !== Number(id)) { return "2"; } if (a.placements == "right-bottom" && a.id !== Number(id)) { return "3"; } }); console.log("contentData : ", data); setDisabledCheckbox(temp); close(); } catch (error) { console.error("Error fetching tasks:", error); } } return (
{detail !== undefined ? (

Target Area

{[ { label: "Kiri - 1", value: "left-top" }, { label: "Kiri - 2", value: "left-bottom" }, { label: "Kanan - 1", value: "right-top" }, { label: "Kanan - 2", value: "right-bottom" }, ].map(({ label, value }, index) => ( ))}
{/*

Publish Area

{Object.keys(unitSelection).map((key) => (
handleUnitChange( key as keyof typeof unitSelection, value as boolean ) } />
))}
Daftar Wilayah Polda dan Polres
{listDest.map((polda: any) => (
{expandedPolda[polda.id] && (
{polda?.subDestination?.map((polres: any) => ( ))}
)}
))}
*/}

Nama Iklan

( )} /> {errors.title?.message && (

{errors.title.message}

)}

(Warning: Foto yang di upload adalah Foto Potrait)

setImageFiles(files)} /> {imageFiles?.map((file: any, index: number) => (
Thumbnail Gambar Utama
{renderFilePreview(file.url)}
{file.fileName}
))} Thumbnail Gambar Utama

Deskripsi

(