import apiFetch from "@/lib/apiFetch"; import { Badge, Card, CloseButton, Container, Divider, Flex, Grid, Group, Input, Pagination, Stack, Tabs, Text, Title, } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { IconAlignJustified, IconClockHour3, IconFileSad, IconMapPin, IconSearch, } from "@tabler/icons-react"; import { useState } from "react"; import { useLocation, useNavigate } from "react-router-dom"; import useSwr from "swr"; import { proxy, subscribe } from "valtio"; const state = proxy({ reload: "" }); function reloadState() { state.reload = Math.random().toString(); } export default function PengaduanListPage() { const { search } = useLocation(); const query = new URLSearchParams(search); const status = query.get("status") as StatusKey; return ( ); } function TabListPengaduan({ status }: { status: string }) { const navigate = useNavigate(); const { data, mutate, isLoading } = useSwr("/pengaduan/count", () => apiFetch.api.pengaduan.count.get().then((res) => res.data), ); useShallowEffect(() => { mutate(); }, []); return ( { navigate("?status=semua"); }} > Semua ({data?.semua || 0}) { navigate("?status=antrian"); }} > Antrian ({data?.antrian || 0}) { navigate("?status=diterima"); }} > Diterima ({data?.diterima || 0}) { navigate("?status=dikerjakan"); }} > Dikerjakan ({data?.dikerjakan || 0}) { navigate("?status=selesai"); }} > Selesai ({data?.selesai || 0}) { navigate("?status=ditolak"); }} > Ditolak ({data?.ditolak || 0}) ); } type StatusKey = | "antrian" | "diterima" | "dikerjakan" | "ditolak" | "selesai" | "semua"; function ListPengaduan({ status }: { status: StatusKey }) { const navigate = useNavigate(); const [page, setPage] = useState(1); const [value, setValue] = useState(""); const { data, mutate, isLoading } = useSwr("/", async () => apiFetch.api.pengaduan.list.get({ query: { status, search: value, take: "", page: page.toString(), }, }), ); useShallowEffect(() => { setPage(1); mutate(); }, [status, value]); useShallowEffect(() => { mutate(); }, [page]); useShallowEffect(() => { const unsubscribe = subscribe(state, () => mutate()); return () => unsubscribe(); }, []); if (isLoading) return ( Loading pengaduan... ); const list = data?.data?.data || []; const total = data?.data?.total || 0; const totalPage = data?.data?.totalPages || 1; const pageSize = data?.data?.pageSize || 10; const pageNow = data?.data?.page || 1; const toDate = (d: any) => new Date(d); return ( setValue(event.currentTarget.value)} leftSection={} rightSectionPointerEvents="all" rightSection={ setValue("")} style={{ display: value ? undefined : "none" }} /> } /> {`${pageSize * (page - 1) + 1} – ${Math.min(total, pageSize * page)} of ${total}`} {Array.isArray(list) && list.length === 0 ? ( No pengaduan have been added yet. ) : ( Array.isArray(list) && list?.map((v: any) => ( navigate(`/scr/dashboard/pengaduan/detail?id=${v.id}`) } > {v.title} #{v.noPengaduan} {String(v.updatedAt)} {v.status} Tanggal Aduan {toDate(v.createdAt).toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric", })} Lokasi {v.location} Detail {v.detail} )) )} ); }