From a65529cb2314fa43fa279e081d8a83ab3760010e Mon Sep 17 00:00:00 2001 From: nico Date: Fri, 8 Aug 2025 14:31:28 +0800 Subject: [PATCH] Sinkronisasi UI & API Admin - User Submenu Berita --- .../admin/(dashboard)/_state/desa/berita.ts | 24 +++--- .../desa/berita/list-berita/[id]/page.tsx | 2 +- .../desa/berita/[kategori]/Content.tsx | 6 +- .../desa/berita/[kategori]/[id]/page.tsx | 78 +++++++++++++++++++ 4 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx diff --git a/src/app/admin/(dashboard)/_state/desa/berita.ts b/src/app/admin/(dashboard)/_state/desa/berita.ts index 62a88d67..a2b7df23 100644 --- a/src/app/admin/(dashboard)/_state/desa/berita.ts +++ b/src/app/admin/(dashboard)/_state/desa/berita.ts @@ -74,9 +74,11 @@ const berita = proxy({ totalPages: 1, loading: false, search: "", - async load(page = 1, limit = 10, search = "", kategori = "") { - this.loading = true; - this.page = page; + load: async (page = 1, limit = 10, search = "", kategori = "") => { + berita.findMany.loading = true; // ✅ Akses langsung via nama path + berita.findMany.page = page; + berita.findMany.search = search; + try { const query: any = { page, limit }; if (search) query.search = search; @@ -85,20 +87,20 @@ const berita = proxy({ const res = await ApiFetch.api.desa.berita["find-many"].get({ query }); if (res.status === 200 && res.data?.success) { - this.data = res.data.data ?? []; - this.totalPages = res.data.totalPages ?? 1; + berita.findMany.data = res.data.data ?? []; + berita.findMany.totalPages = res.data.totalPages ?? 1; } else { - this.data = []; - this.totalPages = 1; + berita.findMany.data = []; + berita.findMany.totalPages = 1; } } catch (err) { console.error("Gagal fetch berita paginated:", err); - this.data = []; - this.totalPages = 1; + berita.findMany.data = []; + berita.findMany.totalPages = 1; } finally { - this.loading = false; + berita.findMany.loading = false; } - } + }, }, findUnique: { diff --git a/src/app/admin/(dashboard)/desa/berita/list-berita/[id]/page.tsx b/src/app/admin/(dashboard)/desa/berita/list-berita/[id]/page.tsx index e703fc82..eddfcf02 100644 --- a/src/app/admin/(dashboard)/desa/berita/list-berita/[id]/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/list-berita/[id]/page.tsx @@ -89,7 +89,7 @@ function DetailBerita() { @@ -104,7 +104,7 @@ export default function Content({ kategori }: { kategori: string }) { {/* === Daftar Berita === */} - Berita {kategori} + Daftar Berita {state.findMany.loading ? ( diff --git a/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx b/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx new file mode 100644 index 00000000..0552714b --- /dev/null +++ b/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx @@ -0,0 +1,78 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +'use client' +import stateDashboardBerita from '@/app/admin/(dashboard)/_state/desa/berita'; +import colors from '@/con/colors'; +import { Box, Center, Container, Image, Skeleton, Stack, Text } from '@mantine/core'; +import { useParams } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { useProxy } from 'valtio/utils'; +import BackButton from '../../../layanan/_com/BackButto'; + + + +function Page() { + const params = useParams<{ id: string }>(); + const id = Array.isArray(params.id) ? params.id[0] : params.id; + const state = useProxy(stateDashboardBerita.berita) + const [loading, setLoading] = useState(true) + + useEffect(() => { + const loadData = async () => { + if (!id) return; + try { + setLoading(true); + await state.findUnique.load(id); + } catch (error) { + console.error('Error loading data:', error); + } finally { + setLoading(false); + } + } + loadData() + }, [id]) + + if (loading) { + return ( +
+ +
+ ); + } + + if (!state.findUnique.data) { + return ( +
+ Data tidak ditemukan +
+ ); + } + + + return ( + + + + + + {state.findUnique.data?.judul} + + + Informasi dan Pelayanan Administrasi Digital + + + + + + + + + + + ); +} + +export default Page;