From 6ccdbf9763c1ce8443a6a691b24817d6b80265c6 Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Fri, 13 Jun 2025 11:23:15 +0800 Subject: [PATCH] fix: admin donasi deskripsi: - fix perubahan use server menjadi API src/app/api/admin/donasi/[id]/count/route.ts src/app/api/admin/donasi/[id]/pencairan/route.ts src/app/dev/admin/donasi/detail/publish/[id]/page.tsx src/app_modules/admin/_admin_global/comp_preview_image_admin.tsx src/app_modules/admin/donasi/detail/publish/detail_list_donatur.tsx src/app_modules/admin/donasi/detail/publish/detail_list_pencairan.tsx src/app_modules/admin/donasi/detail/publish/detail_publish.tsx src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts src/app_modules/admin/donasi/sub-detail/bukti_transfer_pencairan.tsx No Issue --- src/app/api/admin/donasi/[id]/count/route.ts | 29 ++ .../api/admin/donasi/[id]/pencairan/route.ts | 80 +++- .../admin/donasi/detail/publish/[id]/page.tsx | 12 +- .../comp_preview_image_admin.tsx | 21 +- .../detail/publish/detail_list_donatur.tsx | 1 - .../detail/publish/detail_list_pencairan.tsx | 255 ++++++++----- .../donasi/detail/publish/detail_publish.tsx | 56 +-- .../donasi/lib/api_fetch_admin_donasi.ts | 358 +++++++++++------- .../sub-detail/bukti_transfer_pencairan.tsx | 36 +- 9 files changed, 511 insertions(+), 337 deletions(-) create mode 100644 src/app/api/admin/donasi/[id]/count/route.ts diff --git a/src/app/api/admin/donasi/[id]/count/route.ts b/src/app/api/admin/donasi/[id]/count/route.ts new file mode 100644 index 00000000..f9e3f9a1 --- /dev/null +++ b/src/app/api/admin/donasi/[id]/count/route.ts @@ -0,0 +1,29 @@ +import { NextResponse } from "next/server"; +import prisma from "@/lib/prisma"; +export async function GET( + req: Request, + { params }: { params: { id: string } } +) { + const { id } = params; + try { + const data = await prisma.donasi_Invoice.count({ + where: { + donasiId: id, + donasiMaster_StatusInvoiceId: "1", + }, + }); + + return NextResponse.json({ + success: true, + message: "Data berhasil diambil", + data: data, + }); + } catch (error) { + console.error("Error get count donasi ", error); + return NextResponse.json({ + success: false, + message: "Error get count donasi", + reason: (error as Error).message, + }); + } +} diff --git a/src/app/api/admin/donasi/[id]/pencairan/route.ts b/src/app/api/admin/donasi/[id]/pencairan/route.ts index faca959e..f933f133 100644 --- a/src/app/api/admin/donasi/[id]/pencairan/route.ts +++ b/src/app/api/admin/donasi/[id]/pencairan/route.ts @@ -1,24 +1,64 @@ import prisma from "@/lib/prisma"; import backendLogger from "@/util/backendLogger"; +import _ from "lodash"; import { NextResponse } from "next/server"; -export async function GET(req: Request, { params }: { params: { id: string } }) { - const donasiId = params.id - try { - const data = await prisma.donasi_PencairanDana.findMany({ - orderBy: { - createdAt: "desc", - }, - where: { - donasiId: donasiId, - } - }) - - } catch (error) { - backendLogger.error("Error get pencairan donasi >>", error); - return NextResponse.json({ - success: false, - message: "Error get pencairan donasi", - reason: (error as Error).message - }) +export async function GET( + req: Request, + { params }: { params: { id: string } } +) { + + let fixData; + const donasiId = params.id; + const { searchParams } = new URL(req.url); + const page = searchParams.get("page"); + const takeData = 10 + const skipData = Number(page) * takeData - takeData; + + try { + if (!page) { + fixData = await prisma.donasi_PencairanDana.findMany({ + orderBy: { + createdAt: "desc", + }, + where: { + donasiId: donasiId, + }, + }); + } else { + const data = await prisma.donasi_PencairanDana.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc", + }, + where: { + donasiId: donasiId, + }, + }); + + const nCount = await prisma.donasi_PencairanDana.count({ + where: { + donasiId: donasiId, + }, + }); + + fixData = { + data: data, + nPage: _.ceil(nCount / takeData), + }; } -} \ No newline at end of file + + return NextResponse.json({ + success: true, + message: "Data berhasil diambil", + data: fixData, + }); + } catch (error) { + backendLogger.error("Error get pencairan donasi >>", error); + return NextResponse.json({ + success: false, + message: "Error get pencairan donasi", + reason: (error as Error).message, + }); + } +} diff --git a/src/app/dev/admin/donasi/detail/publish/[id]/page.tsx b/src/app/dev/admin/donasi/detail/publish/[id]/page.tsx index d35f3207..7e45a457 100644 --- a/src/app/dev/admin/donasi/detail/publish/[id]/page.tsx +++ b/src/app/dev/admin/donasi/detail/publish/[id]/page.tsx @@ -2,18 +2,10 @@ import { AdminDonasi_DetailPublish } from "@/app_modules/admin/donasi"; import { AdminDonasi_funCountDonatur } from "@/app_modules/admin/donasi/fun/count/fun_count_donatur"; import { AdminDonasi_getListPencairanDana } from "@/app_modules/admin/donasi/fun/get/get_list_pencairan_dana_by_id"; -export default async function Page({ params }: { params: { id: string } }) { - let donasiId = params.id; - // const dataPublish = await AdminDonasi_getOneById(params.id); - const countDonatur = await AdminDonasi_funCountDonatur(params.id); - const listPencairan = await AdminDonasi_getListPencairanDana(params.id); - +export default async function Page() { return ( <> - + ); } diff --git a/src/app_modules/admin/_admin_global/comp_preview_image_admin.tsx b/src/app_modules/admin/_admin_global/comp_preview_image_admin.tsx index 8bc2ccc9..31f15088 100644 --- a/src/app_modules/admin/_admin_global/comp_preview_image_admin.tsx +++ b/src/app_modules/admin/_admin_global/comp_preview_image_admin.tsx @@ -5,15 +5,18 @@ import Admin_ComponentBackButton from "./back_button"; import { APIs, pathAssetImage } from "@/lib"; import { useShallowEffect } from "@mantine/hooks"; import { useState } from "react"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; export function Admin_ComponentPreviewImageAdmin({ fileId, + size, }: { fileId: string; + size?: string; }) { const [isImage, setIsImage] = useState(null); - const url = APIs.GET({ fileId: fileId, size: "500" }); + const url = APIs.GET({ fileId: fileId, size: size || "1000" }); useShallowEffect(() => { onLoadImage(); @@ -35,18 +38,20 @@ export function Admin_ComponentPreviewImageAdmin({ <> - + {isImage === null ? (
- +
) : isImage ? ( - -
- Image -
-
+
+ Image +
) : ( + // + //
+ //
+ //
diff --git a/src/app_modules/admin/donasi/detail/publish/detail_list_pencairan.tsx b/src/app_modules/admin/donasi/detail/publish/detail_list_pencairan.tsx index 18729b88..eec28e51 100644 --- a/src/app_modules/admin/donasi/detail/publish/detail_list_pencairan.tsx +++ b/src/app_modules/admin/donasi/detail/publish/detail_list_pencairan.tsx @@ -1,114 +1,176 @@ -import { AccentColor } from '@/app_modules/_global/color'; -import { AdminColor } from '@/app_modules/_global/color/color_pallet'; -import { ComponentAdminGlobal_TitlePage } from '@/app_modules/admin/_admin_global/_component'; -import TampilanRupiahDonasi from '@/app_modules/donasi/component/tampilan_rupiah'; -import { MODEL_DONASI_PENCAIRAN_DANA } from '@/app_modules/donasi/model/interface'; -import { RouterAdminDonasi } from '@/lib/router_admin/router_admin_donasi'; -import { Center, Box, Spoiler, Button, Stack, Group, ActionIcon, Paper, ScrollArea, Table, Text, TextInput } from '@mantine/core'; -import { useDisclosure } from '@mantine/hooks'; -import { IconReload } from '@tabler/icons-react'; -import moment from 'moment'; -import { useRouter } from 'next/navigation'; -import React, { useState } from 'react'; +import { AccentColor } from "@/app_modules/_global/color"; +import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { ComponentAdminGlobal_TitlePage } from "@/app_modules/admin/_admin_global/_component"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; +import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah"; +import { MODEL_DONASI_PENCAIRAN_DANA } from "@/app_modules/donasi/model/interface"; +import { RouterAdminDonasi } from "@/lib/router_admin/router_admin_donasi"; +import { + Box, + Button, + Center, + Paper, + ScrollArea, + Spoiler, + Stack, + Table, + Text, +} from "@mantine/core"; +import { useShallowEffect } from "@mantine/hooks"; +import moment from "moment"; +import { useParams, useRouter } from "next/navigation"; +import { useState } from "react"; +import { apiGetAdminDonasiPencairan } from "../../lib/api_fetch_admin_donasi"; +import { Admin_V3_ComponentPaginationBreakpoint } from "@/app_modules/admin/_components_v3/comp_pagination_breakpoint"; -function TampilanListPencairan({ - pencairan, -}: { - pencairan: MODEL_DONASI_PENCAIRAN_DANA[]; -}) { +function TampilanListPencairan() { + const params = useParams<{ id: string }>(); const router = useRouter(); - const [data, setData] = useState(pencairan); - const [opened, { open, close }] = useDisclosure(false); - const [gambarId, setGambarId] = useState(""); + const [data, setData] = useState(null); + const [nPage, setNPage] = useState(1); + const [activePage, setActivePage] = useState(1); + const [loading, setLoading] = useState(""); - const rowTable = data.map((e) => ( - - -
- -
- - -
{moment(e.createdAt).format("ll")}
- - -
- {e.title} -
- - - - - {e.deskripsi} - - - - - + useShallowEffect(() => { + onLoadData(); + }, [activePage]); + + async function onLoadData() { + try { + const response = await apiGetAdminDonasiPencairan({ + id: params.id, + page: `${activePage}`, + }); + + if (response?.success && response?.data) { + // console.log("response", response.data); + setData(response.data.data); + setNPage(response.data.nPage); + } else { + setData([]); + setNPage(1); + } + } catch (error) { + console.error("Error get pencairan donasi:", error); + setData([]); + setNPage(1); + } + } + + const onPageClick = (page: number) => { + setActivePage(page); + }; + + const rowTable = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data +
+ + + ); + } + + return data.map((e) => ( + + +
+ +
+ + +
+ {moment(e.createdAt).format("ll")} +
+ + + + + {e.title} + + + + + + + {e.deskripsi} + + + +
-
- - - )); + + + )); + }; + + if (!data) return ; return ( <> - - { - // onRelaod(); - }} - > - - - {/* ({ + // value: e.id, + // label: e.name, + // }))} + // onChange={(val) => { + // onSelect(val); + // }} + // /> */} + // + // } /> - +
- {rowTable} + {rowTable()}
@@ -118,7 +180,7 @@ function TampilanListPencairan({
Tanggal
-
Judul
+ Judul
Deskripsi @@ -126,28 +188,21 @@ function TampilanListPencairan({
- {/*
- { - onPageClick(val); - }} - /> -
*/} + { + onPageClick(val); + }} + />
- - ); } - export default TampilanListPencairan; - - diff --git a/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx b/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx index 2f7a9b06..17496b24 100644 --- a/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx +++ b/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx @@ -6,12 +6,10 @@ import { Admin_ComponentLoadImageLandscape } from "@/app_modules/admin/_admin_gl import CustomSkeletonAdmin from "@/app_modules/admin/_admin_global/_component/skeleton/customSkeletonAdmin"; import Admin_ComponentBackButton from "@/app_modules/admin/_admin_global/back_button"; import { - MODEL_DONASI, - MODEL_DONASI_PENCAIRAN_DANA, + MODEL_DONASI } from "@/app_modules/donasi/model/interface"; import { RouterAdminDonasi } from "@/lib/router_admin/router_admin_donasi"; import { RouterAdminDonasi_OLD } from "@/lib/router_hipmi/router_admin"; -import { clientLogger } from "@/util/clientLogger"; import { Button, Center, @@ -28,20 +26,16 @@ import { useDisclosure, useShallowEffect } from "@mantine/hooks"; import { toNumber } from "lodash"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; -import { apiGetAdminDonasiById } from "../../lib/api_fetch_admin_donasi"; +import { + apiGetAdminDonasiById, + apiGetAdminDonasiCountDonatur, +} from "../../lib/api_fetch_admin_donasi"; import TampilanListDonatur from "./detail_list_donatur"; import TampilanListPencairan from "./detail_list_pencairan"; -export default function AdminDonasi_DetailPublish({ - countDonatur, - listPencairan, -}: { - countDonatur: number; - listPencairan: MODEL_DONASI_PENCAIRAN_DANA[]; -}) { - const [pencairan, setPencairan] = useState(listPencairan); - const [isReload, setReload] = useState(false); +export default function AdminDonasi_DetailPublish() { const params = useParams<{ id: string }>(); + const [isReload, setReload] = useState(false); const [data, setData] = useState(null); useShallowEffect(() => { @@ -61,23 +55,20 @@ export default function AdminDonasi_DetailPublish({ setData(null); } } catch (error) { - clientLogger.error("Invalid data format recieved:", error); + console.error("Invalid data format recieved:", error); setData(null); } }; return ( <> - {/*
{JSON.stringify(pencairan, null, 2)}
*/} <> - + {!data ? ( ) : ( - + )} {!data ? ( @@ -90,7 +81,7 @@ export default function AdminDonasi_DetailPublish({ isReload={isReload} /> )} - + @@ -98,15 +89,34 @@ export default function AdminDonasi_DetailPublish({ } function TampilanDetailDonasi({ - countDonatur, + // countDonatur, donasi, }: { - countDonatur: number; + // countDonatur: number; donasi: MODEL_DONASI; }) { const [opened, { open, close }] = useDisclosure(false); const router = useRouter(); const [isLoadingPencairanDana, setIsLoadingPencairanDana] = useState(false); + const [countDonatur, setCountDonatur] = useState(0); + + useShallowEffect(() => { + onLoadData() + }, []); + + async function onLoadData() { + try { + const response = await apiGetAdminDonasiCountDonatur({ id: donasi.id }); + if (response?.success && response?.data) { + setCountDonatur(response.data); + } else { + setCountDonatur(0); + } + } catch (error) { + console.error("Error get count donatur", error); + setCountDonatur(0); + } + } return ( <> @@ -227,7 +237,7 @@ function TampilanDetailDonasi({ - {countDonatur} + {countDonatur ? countDonatur : "-"} diff --git a/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts b/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts index 99f8af19..96d933e4 100644 --- a/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts +++ b/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts @@ -1,163 +1,237 @@ export { - apiGetAdminDonasiStatusCountDashboard, - apiGetAdminDonasiKategoriCountDashboard, - apiGetAdminDonasiByStatus, - apiGetAdminDonasiKategori, - apiGetAdminDonasiById, - apiGetAdminAllDaftarDonatur, - apiGetAdminStatusDaftarDonatur + apiGetAdminDonasiStatusCountDashboard, + apiGetAdminDonasiKategoriCountDashboard, + apiGetAdminDonasiByStatus, + apiGetAdminDonasiKategori, + apiGetAdminDonasiById, + apiGetAdminAllDaftarDonatur, + apiGetAdminStatusDaftarDonatur, + apiGetAdminDonasiCountDonatur, + apiGetAdminDonasiPencairan, }; -const apiGetAdminDonasiStatusCountDashboard = async ({ name }: - { name: "Publish" | "Review" | "Reject" }) => { - const { token } = await fetch("/api/get-cookie").then((res) => res.json()); - if (!token) return await token.json().catch(() => null); +const apiGetAdminDonasiStatusCountDashboard = async ({ + name, +}: { + name: "Publish" | "Review" | "Reject"; +}) => { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); - const response = await fetch(`/api/admin/donasi/dashboard/${name}`, { - method: "GET", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - "Access-Control-Allow-Origin": "*", - Authorization: `Bearer ${token}`, - } - }); - return await response.json().catch(() => null); + const response = await fetch(`/api/admin/donasi/dashboard/${name}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }); + return await response.json().catch(() => null); }; const apiGetAdminDonasiKategoriCountDashboard = async () => { - const { token } = await fetch("/api/get-cookie").then((res) => res.json()); - if (!token) return await token.json().catch(() => null); + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); - const response = await fetch(`/api/admin/donasi/dashboard/kategori`, { - method: "GET", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - "Access-Control_Allow-Origin": "*", - Authorization: `Bearer ${token}` - } - }); - return await response.json().catch(() => null); -} + const response = await fetch(`/api/admin/donasi/dashboard/kategori`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control_Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }); + return await response.json().catch(() => null); +}; const apiGetAdminDonasiByStatus = async ({ - name, - page, - search }: { - name: "Publish" | "Review" | "Reject", - page: string; - search: string; - }) => { - const { token } = await fetch("/api/get-cookie").then((res) => res.json()); - if (!token) return await token.json().catch(() => null); - - - const isPage = page ? `?page=${page}` : ""; - const isSearch = search ? `&search=${search}` : ""; - const response = await fetch( - `/api/admin/donasi/status/${name}${isPage}${isSearch}`, - { - headers: { - "Content-Type": "application/json", - Accept: "application/json", - "Access-Control-Allow-Origin": "*", - Authorization: `Bearer ${token}` - } - } - ) - - return await response.json().catch(() => null); -} -const apiGetAdminDonasiKategori = async () => { - const { token } = await fetch("/api/get-cookie").then((res) => res.json()); - if (!token) return await token.json().catch(() => null); - - - const response = await fetch(`/api/admin/donasi/kategori`, { - method: "GET", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - "Access-Control-Allow-Origin": "*", - Authorization: `Bearer ${token}` - - } - }) - return await response.json().catch(() => null); -} -const apiGetAdminDonasiById = async ({ id }: { id: string }) => { - const { token } = await fetch("/api/get-cookie").then((res) => res.json()); - if (!token) return await token.json().catch(() => null); - - const response = await fetch(`/api/admin/donasi/${id}`, { - method: "GET", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - "Access-Control-Allow-Origin": "*", - Authorization: `Bearer ${token}` - } - }) - return await response.json().catch(() => null); -} -const apiGetAdminAllDaftarDonatur = async ({ - id, - page, - status + name, + page, + search, }: { - id: string, - page: string, - status?: string | undefined + name: "Publish" | "Review" | "Reject"; + page: string; + search: string; }) => { - try { - const { token } = await fetch("/api/get-cookie").then((res) => res.json()); - if (!token) { - console.error("No token found"); - return null; - } + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); - const isStatus = status ? `&status=${status}` : ""; - const isPage = page ? `?page=${page}` : ""; - const response = await fetch( - `/api/admin/donasi/${id}/donatur${isPage}${isStatus}`, - { - method: "GET", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - "Access-Control-Allow-Origin": "*", - Authorization: `Bearer ${token}`, - }, - } - ); - - if (!response.ok) { - const errorData = await response.json().catch(() => null); - console.error("Error get daftar donatur:", - errorData?.message || "Unknown error"); - return null; - } - - return response.json(); - } catch (error) { - console.error("Error get daftar donatur:", error); - throw error; + const isPage = page ? `?page=${page}` : ""; + const isSearch = search ? `&search=${search}` : ""; + const response = await fetch( + `/api/admin/donasi/status/${name}${isPage}${isSearch}`, + { + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, } -} + ); + + return await response.json().catch(() => null); +}; +const apiGetAdminDonasiKategori = async () => { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + const response = await fetch(`/api/admin/donasi/kategori`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }); + return await response.json().catch(() => null); +}; +const apiGetAdminDonasiById = async ({ id }: { id: string }) => { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + const response = await fetch(`/api/admin/donasi/${id}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }); + return await response.json().catch(() => null); +}; +const apiGetAdminAllDaftarDonatur = async ({ + id, + page, + status, +}: { + id: string; + page: string; + status?: string | undefined; +}) => { + try { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) { + console.error("No token found"); + return null; + } + + const isStatus = status ? `&status=${status}` : ""; + const isPage = page ? `?page=${page}` : ""; + const response = await fetch( + `/api/admin/donasi/${id}/donatur${isPage}${isStatus}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + } + ); + + if (!response.ok) { + const errorData = await response.json().catch(() => null); + console.error( + "Error get daftar donatur:", + errorData?.message || "Unknown error" + ); + return null; + } + + return response.json(); + } catch (error) { + console.error("Error get daftar donatur:", error); + throw error; + } +}; const apiGetAdminStatusDaftarDonatur = async () => { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + const response = await fetch(`/api/master/status_transaksi`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}`, + }, + }); + + return await response.json().catch(() => null); +}; + +const apiGetAdminDonasiCountDonatur = async ({ id }: { id: string }) => { + try { const { token } = await fetch("/api/get-cookie").then((res) => res.json()); if (!token) return await token.json().catch(() => null); - const response = await fetch(`/api/master/status_transaksi`, { + const response = await fetch(`/api/admin/donasi/${id}/count`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${token}`, + }, + }); + + if (!response.ok) { + const errorData = await response.json().catch(() => null); + console.error( + "Error get count donatur:", + errorData?.message || "Unknown error" + ); + return null; + } + const data = await response.json().catch(() => null); + return data; + } catch (error) { + console.error("Error get count donatur:", error); + throw error; + } +}; + +const apiGetAdminDonasiPencairan = async ({ + id, + page, +}: { + id: string; + page: string; +}) => { + try { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + const response = await fetch( + `/api/admin/donasi/${id}/pencairan?page=${page}`, + { method: "GET", headers: { - "Content-Type": "application/json", - Accept: "application/json", - "Access-Control-Allow-Origin": "*", - Authorization: `Bearer ${token}` - } - }) + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${token}`, + }, + } + ); - return await response.json().catch(() => null); -} \ No newline at end of file + if (!response.ok) { + const errorData = await response.json().catch(() => null); + console.error( + "Error get pencairan donasi:", + errorData?.message || "Unknown error" + ); + return null; + } + const data = await response.json().catch(() => null); + return data; + } catch (error) { + console.error("Error get pencairan donasi:", error); + throw error; + } +}; diff --git a/src/app_modules/admin/donasi/sub-detail/bukti_transfer_pencairan.tsx b/src/app_modules/admin/donasi/sub-detail/bukti_transfer_pencairan.tsx index a3b73374..e7b71ef6 100644 --- a/src/app_modules/admin/donasi/sub-detail/bukti_transfer_pencairan.tsx +++ b/src/app_modules/admin/donasi/sub-detail/bukti_transfer_pencairan.tsx @@ -1,9 +1,7 @@ "use client"; -import { AspectRatio, Box, Image, Paper, Stack } from "@mantine/core"; -import Admin_ComponentBackButton from "../../_admin_global/back_button"; -import { RouterAdminDonasi_OLD } from "@/lib/router_hipmi/router_admin"; -import { RouterDonasi } from "@/lib/router_hipmi/router_donasi"; +import { Stack } from "@mantine/core"; +import { Admin_ComponentPreviewImageAdmin } from "../../_admin_global/comp_preview_image_admin"; export default function AdminDonasi_BuktiTransferPencairan({ imageId, @@ -13,36 +11,8 @@ export default function AdminDonasi_BuktiTransferPencairan({ return ( <> - - + ); } - -function BuktiTransfer({ imageId }: { imageId: string }) { - return ( - <> - - - Foto - - {/* - - Foto - - */} - - - ); -}