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
This commit is contained in:
2025-06-10 11:50:49 +08:00
parent 0573e06f30
commit 886d9f37f4
6 changed files with 199 additions and 34 deletions

View File

@@ -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,
});
}
}

View File

@@ -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) {

View File

@@ -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 (
<>
<DonaturDonasi listDonatur={listDonatur as any} donasiId={donasiId} />
<DonaturDonasi />
</>
);
}

View File

@@ -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
</Text>
</Group>
<Text fz={"xs"}>
{new Intl.DateTimeFormat("id-ID", {
dateStyle: "full",
}).format(data?.createdAt)}
{moment(data.createdAt).format("DD MMM YYYY")}
</Text>
</Stack>
</Grid.Col>

View File

@@ -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<MODEL_DONASI_INVOICE[] | null>(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 <CustomSkeleton height={200} />;
return (
<>
{_.isEmpty(data) ? (
@@ -34,17 +70,8 @@ export default function DonaturDonasi({
</Center>
)}
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) => <ComponentDonasi_CardDonatur data={item} />}
</ScrollOnly>

View File

@@ -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
}
}
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
}
}