From c22d865283fe1fc737a025b4736e00c0731c411c Mon Sep 17 00:00:00 2001 From: nico Date: Wed, 20 Aug 2025 14:35:08 +0800 Subject: [PATCH] Sinkronisasi UI & API Admin - User Submenu Tips Keamanan, Menu Keamanan --- .../_state/keamanan/tips-keamanan.ts | 39 ++++- .../keamanan/tips-keamanan/page.tsx | 42 ++++-- .../_lib/keamanan/tips-keamanan/findMany.ts | 75 +++++++--- .../(pages)/keamanan/tips-keamanan/page.tsx | 135 ++++++++---------- 4 files changed, 176 insertions(+), 115 deletions(-) diff --git a/src/app/admin/(dashboard)/_state/keamanan/tips-keamanan.ts b/src/app/admin/(dashboard)/_state/keamanan/tips-keamanan.ts index 3925ae61..ad1ee158 100644 --- a/src/app/admin/(dashboard)/_state/keamanan/tips-keamanan.ts +++ b/src/app/admin/(dashboard)/_state/keamanan/tips-keamanan.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import ApiFetch from "@/lib/api-fetch"; import { Prisma } from "@prisma/client"; import { toast } from "react-toastify"; @@ -53,15 +54,39 @@ const tipsKeamananState = proxy({ findMany: { data: null as | Prisma.MenuTipsKeamananGetPayload<{ - include: { image: true }; + include: { + image: true; + }; }>[] | null, - async load() { - const res = await ApiFetch.api.keamanan.menutipskeamanan[ - "find-many" - ].get(); - if (res.status === 200) { - tipsKeamananState.findMany.data = res.data?.data ?? []; + page: 1, + totalPages: 1, + loading: false, + search: "", + load: async (page = 1, limit = 10, search = "") => { + tipsKeamananState.findMany.loading = true; // ✅ Akses langsung via nama path + tipsKeamananState.findMany.page = page; + tipsKeamananState.findMany.search = search; + + try { + const query: any = { page, limit }; + if (search) query.search = search; + + const res = await ApiFetch.api.keamanan.menutipskeamanan["find-many"].get({ query }); + + if (res.status === 200 && res.data?.success) { + tipsKeamananState.findMany.data = res.data.data ?? []; + tipsKeamananState.findMany.totalPages = res.data.totalPages ?? 1; + } else { + tipsKeamananState.findMany.data = []; + tipsKeamananState.findMany.totalPages = 1; + } + } catch (err) { + console.error("Gagal fetch menu tips keamanan paginated:", err); + tipsKeamananState.findMany.data = []; + tipsKeamananState.findMany.totalPages = 1; + } finally { + tipsKeamananState.findMany.loading = false; } }, }, diff --git a/src/app/admin/(dashboard)/keamanan/tips-keamanan/page.tsx b/src/app/admin/(dashboard)/keamanan/tips-keamanan/page.tsx index 94b9bd76..9c4f0570 100644 --- a/src/app/admin/(dashboard)/keamanan/tips-keamanan/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/tips-keamanan/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; +import { Box, Button, Center, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; import HeaderSearch from '../../_com/header'; import JudulList from '../../_com/judulList'; @@ -30,19 +30,21 @@ function ListTipsKeamanan({ search }: { search: string }) { const stateKeamanan = useProxy(tipsKeamananState) const router = useRouter(); + const { + data, + page, + totalPages, + loading, + load, + } = stateKeamanan.findMany + useShallowEffect(() => { - stateKeamanan.findMany.load() - }, []) + load(page, 10, search) + }, [page, search]) - const filteredData = (stateKeamanan.findMany.data || []).filter(item => { - const keyword = search.toLowerCase(); - return ( - item.judul.toLowerCase().includes(keyword) || - item.deskripsi.toLowerCase().includes(keyword) - ); - }); + const filteredData = data || [] - if (!stateKeamanan.findMany.data) { + if (loading || !data) { return ( @@ -67,9 +69,15 @@ function ListTipsKeamanan({ search }: { search: string }) { {filteredData.map((item) => ( - {item.judul} - + + {item.judul} + + + + + +