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}
))
)}
);
}