From 886d9f37f4636576b8a89020537e13708f582431 Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Tue, 10 Jun 2025 11:50:49 +0800 Subject: [PATCH] fix: donasi deskrispi: - fix metode pengambilan data dari use server menjadi API src/app/api/donasi/[id]/donatur/route.ts src/app/api/donasi/[id]/pencairan-dana/route.ts src/app/dev/(user)/donasi/donatur/[id]/page.tsx src/app_modules/donasi/component/card_view/ui_card_donatur.tsx src/app_modules/donasi/detail/detail_main/donatur/index.tsx src/app_modules/donasi/lib/api_donasi.ts No Issue --- src/app/api/donasi/[id]/donatur/route.ts | 106 ++++++++++++++++++ .../api/donasi/[id]/pencairan-dana/route.ts | 2 +- .../dev/(user)/donasi/donatur/[id]/page.tsx | 11 +- .../component/card_view/ui_card_donatur.tsx | 6 +- .../detail/detail_main/donatur/index.tsx | 67 +++++++---- src/app_modules/donasi/lib/api_donasi.ts | 41 ++++++- 6 files changed, 199 insertions(+), 34 deletions(-) create mode 100644 src/app/api/donasi/[id]/donatur/route.ts diff --git a/src/app/api/donasi/[id]/donatur/route.ts b/src/app/api/donasi/[id]/donatur/route.ts new file mode 100644 index 00000000..7ad885b4 --- /dev/null +++ b/src/app/api/donasi/[id]/donatur/route.ts @@ -0,0 +1,106 @@ +import prisma from "@/lib/prisma"; +import { NextResponse } from "next/server"; + +export async function GET( + request: Request, + { params }: { params: { id: string } } +) { + try { + let fixData; + const { id } = params; + const { searchParams } = new URL(request.url); + const page = Number(searchParams.get("page")); + const takeData = 10; + const skipData = page * takeData - takeData; + + if (!page) { + fixData = await prisma.donasi_Invoice.findMany({ + orderBy: { + createdAt: "desc", + }, + where: { + donasiId: id, + donasiMaster_StatusInvoiceId: "1", + }, + select: { + id: true, + createdAt: true, + updatedAt: true, + nominal: true, + DonasiMaster_StatusInvoice: true, + donasiMaster_StatusInvoiceId: true, + Author: true, + Donasi: { + select: { + id: true, + title: true, + target: true, + progres: true, + authorId: true, + imagesId: true, + publishTime: true, + donasiMaster_KategoriId: true, + donasiMaster_DurasiId: true, + donasiMaster_StatusDonasiId: true, + imageDonasi: true, + DonasiMaster_Ketegori: true, + DonasiMaster_Durasi: true, + DonasiMaster_Status: true, + }, + }, + }, + }); + } else { + fixData = await prisma.donasi_Invoice.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc", + }, + where: { + donasiId: id, + donasiMaster_StatusInvoiceId: "1", + }, + select: { + id: true, + createdAt: true, + updatedAt: true, + nominal: true, + DonasiMaster_StatusInvoice: true, + donasiMaster_StatusInvoiceId: true, + Author: true, + Donasi: { + select: { + id: true, + title: true, + target: true, + progres: true, + authorId: true, + imagesId: true, + publishTime: true, + donasiMaster_KategoriId: true, + donasiMaster_DurasiId: true, + donasiMaster_StatusDonasiId: true, + imageDonasi: true, + DonasiMaster_Ketegori: true, + DonasiMaster_Durasi: true, + DonasiMaster_Status: true, + }, + }, + }, + }); + } + + return NextResponse.json({ + success: true, + message: "Data berhasil diambil", + data: fixData, + }); + } catch (error) { + return NextResponse.json({ + success: false, + message: "Terjadi kesalahan saat mengambil data", + reason: error as Error, + }); + } +} diff --git a/src/app/api/donasi/[id]/pencairan-dana/route.ts b/src/app/api/donasi/[id]/pencairan-dana/route.ts index 843e9f56..4456b51f 100644 --- a/src/app/api/donasi/[id]/pencairan-dana/route.ts +++ b/src/app/api/donasi/[id]/pencairan-dana/route.ts @@ -12,7 +12,7 @@ export async function GET( const { id } = params; const { searchParams } = new URL(request.url); const page = Number(searchParams.get("page")); - const takeData = 3; + const takeData = 5 const skipData = page * takeData - takeData; if (!page) { diff --git a/src/app/dev/(user)/donasi/donatur/[id]/page.tsx b/src/app/dev/(user)/donasi/donatur/[id]/page.tsx index 37ecb4e6..69843197 100644 --- a/src/app/dev/(user)/donasi/donatur/[id]/page.tsx +++ b/src/app/dev/(user)/donasi/donatur/[id]/page.tsx @@ -1,16 +1,9 @@ import { DonaturDonasi } from "@/app_modules/donasi"; -import { donasi_funGetListDonaturById } from "@/app_modules/donasi/fun/get/get_list_donatur"; - -export default async function Page({ params }: { params: { id: string } }) { - const donasiId = params.id; - const listDonatur = await donasi_funGetListDonaturById({ - page: 1, - donasiId: donasiId, - }); +export default async function Page() { return ( <> - + ); } diff --git a/src/app_modules/donasi/component/card_view/ui_card_donatur.tsx b/src/app_modules/donasi/component/card_view/ui_card_donatur.tsx index 173d0f87..df3271ff 100644 --- a/src/app_modules/donasi/component/card_view/ui_card_donatur.tsx +++ b/src/app_modules/donasi/component/card_view/ui_card_donatur.tsx @@ -3,6 +3,8 @@ import { Paper, Grid, Center, Stack, Title, Group, Text } from "@mantine/core"; import { IconMoodSmileBeam } from "@tabler/icons-react"; import { MODEL_DONASI_INVOICE } from "../../model/interface"; import TampilanRupiahDonasi from "../tampilan_rupiah"; +import moment from "moment"; +import "moment/locale/id"; export function ComponentDonasi_CardDonatur({ data }: { data: MODEL_DONASI_INVOICE }){ return ( @@ -35,9 +37,7 @@ export function ComponentDonasi_CardDonatur({ data }: { data: MODEL_DONASI_INVOI - {new Intl.DateTimeFormat("id-ID", { - dateStyle: "full", - }).format(data?.createdAt)} + {moment(data.createdAt).format("DD MMM YYYY")} diff --git a/src/app_modules/donasi/detail/detail_main/donatur/index.tsx b/src/app_modules/donasi/detail/detail_main/donatur/index.tsx index 391841c3..b88277c9 100644 --- a/src/app_modules/donasi/detail/detail_main/donatur/index.tsx +++ b/src/app_modules/donasi/detail/detail_main/donatur/index.tsx @@ -2,24 +2,60 @@ import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data"; import ComponentGlobal_Loader from "@/app_modules/_global/component/loader"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; import { ComponentDonasi_CardDonatur } from "@/app_modules/donasi/component/card_view/ui_card_donatur"; -import { donasi_funGetListDonaturById } from "@/app_modules/donasi/fun/get/get_list_donatur"; +import { apiGetDonasiListDonaturById } from "@/app_modules/donasi/lib/api_donasi"; import { MODEL_DONASI_INVOICE } from "@/app_modules/donasi/model/interface"; import { Box, Center } from "@mantine/core"; +import { useShallowEffect } from "@mantine/hooks"; import _ from "lodash"; import { ScrollOnly } from "next-scroll-loader"; +import { useParams } from "next/navigation"; import { useState } from "react"; -export default function DonaturDonasi({ - listDonatur, - donasiId, -}: { - listDonatur: MODEL_DONASI_INVOICE[]; - donasiId: string; -}) { - const [data, setData] = useState(listDonatur); +export default function DonaturDonasi() { + const param = useParams<{ id: string }>(); + const [data, setData] = useState(null); const [activePage, setActivePage] = useState(1); + useShallowEffect(() => { + onLoadData(); + }, []); + + async function onLoadData() { + try { + const response = await apiGetDonasiListDonaturById({ + id: param.id, + page: activePage, + }); + + if (response.success) { + setData(response.data); + } + } catch (error) { + console.error(error); + } + } + + async function onMoreData() { + try { + const nextPage = activePage + 1; + setActivePage(nextPage); + const response = await apiGetDonasiListDonaturById({ + id: param.id, + page: nextPage, + }); + + if (response.success) { + return response.data; + } + } catch (error) { + console.error(error); + } + } + + if (!data) return ; + return ( <> {_.isEmpty(data) ? ( @@ -34,17 +70,8 @@ export default function DonaturDonasi({ )} data={data} - setData={setData} - moreData={async () => { - const loadData = await donasi_funGetListDonaturById({ - page: activePage + 1, - donasiId: donasiId, - }); - - setActivePage((val) => val + 1); - - return loadData; - }} + setData={setData as any} + moreData={onMoreData} > {(item) => } diff --git a/src/app_modules/donasi/lib/api_donasi.ts b/src/app_modules/donasi/lib/api_donasi.ts index b8a6975c..dd07cd85 100644 --- a/src/app_modules/donasi/lib/api_donasi.ts +++ b/src/app_modules/donasi/lib/api_donasi.ts @@ -327,4 +327,43 @@ export const apiGetDonasiPencairanDanaById = async ({ id, page }: { id: string, throw error; // Re-throw the error to handle it in the calling function } } - \ No newline at end of file + +export const apiGetDonasiListDonaturById = async ({ id, page }: { id: string, page: number }) => { + try { + // Fetch token from cookie + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) { + console.error("No token found"); + return null; + } + + const response = await fetch(`/api/donasi/${id}/donatur?page=${page}`, { + 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( + "Failed to get donasi list donatur", + response.statusText, + errorData + ); + throw new Error( + errorData?.message || "Failed to get donasi list donatur" + ); + } + + // Return the JSON response + const data = await response.json(); + return data; + } catch (error) { + console.error("Error get donasi list donatur", error); + throw error; // Re-throw the error to handle it in the calling function + } +} + \ No newline at end of file