"use client"; import { CloudUploadIcon, CreateIconIon, DeleteIcon, DotsYIcon, SearchIcon, TimesIcon, } from "@/components/icons"; import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, } from "@/components/ui/dropdown-menu"; import { close, error, loading, success } from "@/config/swal"; import { Article } from "@/types/globals"; import Link from "next/link"; import { Fragment, Key, useCallback, useEffect, useState } from "react"; import * as z from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Controller, useForm } from "react-hook-form"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { useDropzone } from "react-dropzone"; import Image from "next/image"; import { Switch } from "@/components/ui/switch"; import useDisclosure from "@/components/useDisclosure"; import { createMediaFileAdvertise, deleteAdvertise, editAdvertise, editAdvertiseIsActive, getAdvertise, getAdvertiseById, } from "@/service/advertisement"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem, } from "@/components/ui/select"; import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell, } from "@/components/ui/table"; import CustomPagination from "@/components/layout/custom-pagination"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Textarea } from "@/components/ui/textarea"; const columns = [ { name: "No", uid: "no" }, { name: "Judul", uid: "title" }, { name: "Deskripsi", uid: "description" }, { name: "Penempatan", uid: "placement" }, { name: "Link", uid: "redirectLink" }, { name: "Aktif", uid: "isActive" }, { name: "Aksi", uid: "actions" }, ]; const createArticleSchema = z.object({ id: z.string().optional(), title: z.string().min(2, { message: "Judul harus diisi", }), url: z.string().min(1, { message: "Url harus diisi", }), description: z.string().min(2, { message: "Deskripsi harus diisi", }), file: z.string().optional(), }); export default function AdvertiseTable(props: { triggerRefresh: boolean }) { const MySwal = withReactContent(Swal); const { isOpen, onOpen, onOpenChange, onClose } = useDisclosure(); const [page, setPage] = useState(1); const [totalPage, setTotalPage] = useState(1); const [article, setArticle] = useState([]); const [showData, setShowData] = useState("10"); const [search, setSearch] = useState(""); const [placement, setPlacement] = useState("banner"); const [refresh, setRefresh] = useState(false); const [files, setFiles] = useState([]); const formOptions = { resolver: zodResolver(createArticleSchema), defaultValues: { title: "", description: "", url: "", file: "" }, }; const { getRootProps, getInputProps } = useDropzone({ onDrop: (acceptedFiles) => { setFiles(acceptedFiles.map((file) => Object.assign(file))); }, maxFiles: 1, accept: { "image/*": [], }, }); type UserSettingSchema = z.infer; const { control, handleSubmit, setValue, formState: { errors }, } = useForm(formOptions); useEffect(() => { initState(); }, [page, showData, props.triggerRefresh, refresh]); const handleRemoveFile = (file: File) => { const uploadedFiles = files; const filtered = uploadedFiles.filter((i) => i.name !== file.name); setFiles([...filtered]); }; async function initState() { const req = { limit: showData, page: page, search: search, sort: "desc", sortBy: "created_at", }; const res = await getAdvertise(req); getTableNumber(parseInt(showData), res.data?.data); setTotalPage(res?.data?.meta?.totalPage); } const getTableNumber = (limit: number, data: Article[]) => { if (data) { const startIndex = limit * (page - 1); let iterate = 0; const newData = data.map((value: any) => { iterate++; value.no = startIndex + iterate; return value; }); setArticle(newData); } }; async function doDelete(id: any) { loading(); const resDelete = await deleteAdvertise(id); if (resDelete?.error) { error(resDelete.message); return false; } close(); success("Berhasil Hapus"); setRefresh(!refresh); } const handleDelete = (id: any) => { MySwal.fire({ title: "Hapus Data", icon: "warning", showCancelButton: true, cancelButtonColor: "#3085d6", confirmButtonColor: "#d33", confirmButtonText: "Hapus", }).then((result) => { if (result.isConfirmed) { doDelete(id); } }); }; const onSubmit = async (values: z.infer) => { loading(); const formData = { id: Number(values.id), title: values.title, description: values.description, placement: placement, redirectLink: values.url, }; const res = await editAdvertise(formData); if (res?.error) { error(res?.message); return false; } if (files.length > 0) { const formFiles = new FormData(); formFiles.append("file", files[0]); const resFile = await createMediaFileAdvertise( Number(values.id), formFiles ); } close(); MySwal.fire({ title: "Sukses", icon: "success", confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { setRefresh(!refresh); } }); }; const openModal = async (id: number) => { const res = await getAdvertiseById(Number(id)); const data = res?.data?.data; setValue("id", String(data?.id)); setValue("title", data?.title); setValue("description", data?.description); setValue("url", data?.redirectLink); setPlacement(data?.placement); // setValue("file", data?.thumbnailUrl); onOpen(); }; const handleAdvertise = async (e: boolean, id: number) => { const res = await editAdvertiseIsActive({ id, isActive: e }); if (res?.error) { error(res?.message); return false; } setRefresh(!refresh); }; const renderCell = useCallback( (advertise: any, columnKey: Key) => { const cellValue = advertise[columnKey as keyof any]; switch (columnKey) { case "redirectLink": return cellValue.includes("https") ? ( {cellValue} ) : (

{cellValue}

); case "placement": return

{cellValue}

; case "isActive": return (
handleAdvertise(e, advertise?.id)} /> {advertise?.isPublish ? "Ya" : "Tidak"}
); case "actions": return (
{/* Detail */} openModal(advertise.id)}> Edit handleDelete(advertise.id)}> Delete
); default: return cellValue; } }, [article, props.triggerRefresh, refresh] ); let typingTimer: NodeJS.Timeout; const doneTypingInterval = 1500; const handleKeyUp = () => { clearTimeout(typingTimer); typingTimer = setTimeout(doneTyping, doneTypingInterval); }; const handleKeyDown = () => { clearTimeout(typingTimer); }; async function doneTyping() { initState(); } return ( <>

Pencarian

setSearch(e.target.value)} onKeyUp={handleKeyUp} onKeyDown={handleKeyDown} />

Data

{columns.map((column) => ( {column.name} ))} {article.length === 0 ? ( No data to display. ) : ( article.map((item: any) => ( {columns.map((column) => ( {renderCell(item, column.uid)} ))} )) )}
{/* setPage(page)} /> */} setPage(data)} />
Advertise

Judul

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

{errors.title?.message}

)}

Deskripsi

(