diff --git a/prisma/data/landing-page/profile/mediaSosial.json b/prisma/data/landing-page/profile/mediaSosial.json index e6df4799..9af092a0 100644 --- a/prisma/data/landing-page/profile/mediaSosial.json +++ b/prisma/data/landing-page/profile/mediaSosial.json @@ -1,16 +1,4 @@ [ - { - "id": "cmds8w2q60002vnbe6i8qhkuo", - "name": "Telephone Desa Darmasaba", - "iconUrl": "081239580000", - "imageId": "cmff3nv180003vn6h5jvedidq" - }, - { - "id": "cmds8z7u20005vnbegyyvnbk0", - "name": "Email Desa Darmasaba", - "iconUrl": "desadarmasaba@badungkab.go.id", - "imageId": "cmff3ll130001vn6hkhls3f5y" - }, { "id": "cmds9023u0008vnbe3oxmhwyf", "name": "Desa Darmasaba", diff --git a/public/perbekel.png b/public/perbekel.png index 7da92111..a940365b 100644 Binary files a/public/perbekel.png and b/public/perbekel.png differ diff --git a/src/app/darmasaba/(pages)/desa/galery/foto/Content.tsx b/src/app/darmasaba/(pages)/desa/galery/foto/Content.tsx index 97d8cb08..6daa122e 100644 --- a/src/app/darmasaba/(pages)/desa/galery/foto/Content.tsx +++ b/src/app/darmasaba/(pages)/desa/galery/foto/Content.tsx @@ -6,122 +6,83 @@ import { useCallback, useEffect, useState } from 'react'; import ApiFetch from '@/lib/api-fetch'; interface FileItem { - id: string; - name: string; - link: string; - realName: string; - createdAt: string | Date; - category: string; - path: string; - mimeType: string; - } - - export default function FotoContent() { - const [files, setFiles] = useState([]); - const [loading, setLoading] = useState(true); - const [search, setSearch] = useState(''); - const [page, setPage] = useState(1); - const [totalPages, setTotalPages] = useState(1); - - // Handle search and pagination changes - const loadData = useCallback((pageNum: number, searchTerm: string) => { + id: string; + name: string; + link: string; + realName: string; + createdAt: string | Date; + category: string; + path: string; + mimeType: string; +} + +export default function FotoContent() { + const [files, setFiles] = useState([]); + const [loading, setLoading] = useState(true); + const [search, setSearch] = useState(''); + const [page, setPage] = useState(1); + const [totalPages, setTotalPages] = useState(1); + const limit = 9; // ✅ ambil 12 data per page + + const loadData = useCallback(async (pageNum: number, searchTerm: string) => { setLoading(true); - // Using the load function from the component's scope - const loadFn = async () => { - try { - const response = await ApiFetch.api.fileStorage.findMany.get({ - query: { - category: 'image', - page: pageNum.toString(), - limit: '10', - ...(searchTerm && { search: searchTerm }) - } - }); + try { + const query: Record = { + category: 'image', + page: pageNum.toString(), + limit: limit.toString(), + }; + if (searchTerm) query.search = searchTerm; - if (response.status === 200 && response.data) { - setFiles(response.data.data || []); - setTotalPages(response.data.meta?.totalPages || 1); - } else { - setFiles([]); - } - } catch (err) { - console.error('Load error:', err); + const response = await ApiFetch.api.fileStorage.findMany.get({ query }); + + if (response.status === 200 && response.data) { + setFiles(response.data.data || []); + setTotalPages(response.data.meta?.totalPages || 1); + } else { setFiles([]); - } finally { - setLoading(false); } - }; - - loadFn(); + } catch (err) { + console.error('Load error:', err); + setFiles([]); + } finally { + setLoading(false); + } }, []); - // Initial load and URL change handler + // ✅ Initial load + update when URL/search changes useEffect(() => { const handleRouteChange = () => { const urlParams = new URLSearchParams(window.location.search); const urlSearch = urlParams.get('search') || ''; const urlPage = parseInt(urlParams.get('page') || '1'); - setSearch(urlSearch); setPage(urlPage); loadData(urlPage, urlSearch); }; - // Handle search updates from the search bar const handleSearchUpdate = (e: Event) => { const { search } = (e as CustomEvent).detail; - setSearch(search); - setPage(1); // Reset to first page on new search + setPage(1); loadData(1, search); }; - // Initial load handleRouteChange(); - - // Set up event listeners window.addEventListener('popstate', handleRouteChange); window.addEventListener('searchUpdate', handleSearchUpdate as EventListener); - - // Cleanup + return () => { window.removeEventListener('popstate', handleRouteChange); window.removeEventListener('searchUpdate', handleSearchUpdate as EventListener); }; }, [loadData]); - // ✅ Fetch data + // ✅ Update when page/search changes useEffect(() => { - const fetchFiles = async () => { - setLoading(true); - try { - const query: Record = { - category: 'image', - page: page.toString(), - limit: '10', - }; - if (search) query.search = search; + loadData(page, search); + }, [page, search, loadData]); - const response = await ApiFetch.api.fileStorage.findMany.get({ query }); - - if (response.status === 200 && response.data) { - setFiles(response.data.data || []); - setTotalPages(response.data.meta?.totalPages || 1); - } else { - setFiles([]); - } - } catch (err) { - console.error('Fetch error:', err); - setFiles([]); - } finally { - setLoading(false); - } - }; - - if (page > 0) fetchFiles(); // jangan fetch jika page belum valid - }, [search, page]); - - // ✅ Update URL const updateURL = (newSearch: string, newPage: number) => { const url = new URL(window.location.href); if (newSearch) url.searchParams.set('search', newSearch); @@ -148,7 +109,14 @@ interface FileItem { {files.map((file) => ( - + - - - - {file.realName || file.name} - - - {new Date(file.createdAt).toLocaleDateString('id-ID', { - day: 'numeric', - month: 'long', - year: 'numeric', - })} - - - + + + {file.realName || file.name} + + + {new Date(file.createdAt).toLocaleDateString('id-ID', { + day: 'numeric', + month: 'long', + year: 'numeric', + })} + + ))} @@ -181,4 +147,4 @@ interface FileItem { ); -} \ No newline at end of file +} diff --git a/src/app/darmasaba/(pages)/desa/layanan/[id]/page.tsx b/src/app/darmasaba/(pages)/desa/layanan/[id]/page.tsx index c654bbb5..bb24c934 100644 --- a/src/app/darmasaba/(pages)/desa/layanan/[id]/page.tsx +++ b/src/app/darmasaba/(pages)/desa/layanan/[id]/page.tsx @@ -146,24 +146,24 @@ function Page() { Ajukan Permohonan Nama} - placeholder="masukkan nama" + placeholder="Masukkan nama" onChange={(val) => (stateCreate.create.form.nama = val.target.value)} /> NIK} - placeholder="masukkan NIK" + placeholder="Masukkan NIK" onChange={(val) => (stateCreate.create.form.nik = val.target.value)} /> Alamat} - placeholder="masukkan alamat" + placeholder="Masukkan alamat" onChange={(val) => (stateCreate.create.form.alamat = val.target.value)} /> Nomor KK} - placeholder="masukkan Nomor KK" + placeholder="Masukkan Nomor KK" onChange={(val) => (stateCreate.create.form.nomorKk = val.target.value)} />