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 { id } = params;
const { searchParams } = new URL(request.url); const { searchParams } = new URL(request.url);
const page = Number(searchParams.get("page")); const page = Number(searchParams.get("page"));
const takeData = 3; const takeData = 5
const skipData = page * takeData - takeData; const skipData = page * takeData - takeData;
if (!page) { if (!page) {

View File

@@ -1,16 +1,9 @@
import { DonaturDonasi } from "@/app_modules/donasi"; 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 ( 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 { IconMoodSmileBeam } from "@tabler/icons-react";
import { MODEL_DONASI_INVOICE } from "../../model/interface"; import { MODEL_DONASI_INVOICE } from "../../model/interface";
import TampilanRupiahDonasi from "../tampilan_rupiah"; import TampilanRupiahDonasi from "../tampilan_rupiah";
import moment from "moment";
import "moment/locale/id";
export function ComponentDonasi_CardDonatur({ data }: { data: MODEL_DONASI_INVOICE }){ export function ComponentDonasi_CardDonatur({ data }: { data: MODEL_DONASI_INVOICE }){
return ( return (
@@ -35,9 +37,7 @@ export function ComponentDonasi_CardDonatur({ data }: { data: MODEL_DONASI_INVOI
</Text> </Text>
</Group> </Group>
<Text fz={"xs"}> <Text fz={"xs"}>
{new Intl.DateTimeFormat("id-ID", { {moment(data.createdAt).format("DD MMM YYYY")}
dateStyle: "full",
}).format(data?.createdAt)}
</Text> </Text>
</Stack> </Stack>
</Grid.Col> </Grid.Col>

View File

@@ -2,24 +2,60 @@
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data"; import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import ComponentGlobal_Loader from "@/app_modules/_global/component/loader"; 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 { 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 { MODEL_DONASI_INVOICE } from "@/app_modules/donasi/model/interface";
import { Box, Center } from "@mantine/core"; import { Box, Center } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
import _ from "lodash"; import _ from "lodash";
import { ScrollOnly } from "next-scroll-loader"; import { ScrollOnly } from "next-scroll-loader";
import { useParams } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
export default function DonaturDonasi({ export default function DonaturDonasi() {
listDonatur, const param = useParams<{ id: string }>();
donasiId, const [data, setData] = useState<MODEL_DONASI_INVOICE[] | null>(null);
}: {
listDonatur: MODEL_DONASI_INVOICE[];
donasiId: string;
}) {
const [data, setData] = useState(listDonatur);
const [activePage, setActivePage] = useState(1); 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 ( return (
<> <>
{_.isEmpty(data) ? ( {_.isEmpty(data) ? (
@@ -34,17 +70,8 @@ export default function DonaturDonasi({
</Center> </Center>
)} )}
data={data} data={data}
setData={setData} setData={setData as any}
moreData={async () => { moreData={onMoreData}
const loadData = await donasi_funGetListDonaturById({
page: activePage + 1,
donasiId: donasiId,
});
setActivePage((val) => val + 1);
return loadData;
}}
> >
{(item) => <ComponentDonasi_CardDonatur data={item} />} {(item) => <ComponentDonasi_CardDonatur data={item} />}
</ScrollOnly> </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 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
}
}