diff --git a/src/app/api/new/donasi/invoice/route.ts b/src/app/api/new/donasi/invoice/route.ts new file mode 100644 index 00000000..4585a9b9 --- /dev/null +++ b/src/app/api/new/donasi/invoice/route.ts @@ -0,0 +1,77 @@ +import { prisma } from "@/app/lib"; +import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; +import _ from "lodash"; +import { NextResponse } from "next/server"; +export const dynamic = "force-dynamic"; + + + + +// GET ALL DATA DONASI SAYA (INVOICE) +export async function GET(request: Request) { + try { + const { searchParams } = new URL(request.url) + const page = searchParams.get("page") + const dataSkip = Number(page) * 5 - 5; + + + const userLoginId = await funGetUserIdByToken() + if (userLoginId == null) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan data, user id tidak ada" }, { status: 500 }); + } + + const data = await prisma.donasi_Invoice.findMany({ + take: 5, + skip: dataSkip, + orderBy: { + createdAt: "desc", + }, + where: { + authorId: userLoginId, + }, + select: { + id: true, + nominal: true, + donasiMaster_StatusInvoiceId: true, + DonasiMaster_StatusInvoice: { + select: { + name: true + } + }, + Donasi: { + select: { + id: true, + title: true, + publishTime: true, + progres: true, + imageId: true, + DonasiMaster_Durasi: { + select: { + name: true + } + }, + }, + }, + }, + }); + + const dataFix = data.map((v: any) => ({ + ..._.omit(v, ["DonasiMaster_StatusInvoice", "Donasi"]), + nameStatusInvoice: v.DonasiMaster_StatusInvoice.name, + donasiId: v.Donasi.id, + title: v.Donasi.title, + publishTime: v.Donasi.publishTime, + progres: v.Donasi.progres, + imageId: v.Donasi.imageId, + durasiDonasi: v.Donasi.DonasiMaster_Durasi.name + })) + + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan data", data: dataFix }, { status: 200 }); + + } + catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mendapatkan data, coba lagi nanti ", reason: (error as Error).message, }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/dev/donasi/main/donasi_saya/page.tsx b/src/app/dev/donasi/main/donasi_saya/page.tsx index bbb25e4a..a04c7954 100644 --- a/src/app/dev/donasi/main/donasi_saya/page.tsx +++ b/src/app/dev/donasi/main/donasi_saya/page.tsx @@ -1,8 +1,12 @@ -import { DonasiSayaDonasi } from "@/app_modules/donasi"; -import { donasi_funGetAllInvoiceByAuthorId } from "@/app_modules/donasi/fun/get/get_all_invoice_by_author_id"; +import DonasiSayaNew from "@/app_modules/donasi/main/donasi_saya_new"; export default async function Page() { - const listInvoice = await donasi_funGetAllInvoiceByAuthorId({ page: 1 }); + // const listInvoice = await donasi_funGetAllInvoiceByAuthorId({ page: 1 }); - return ; + return ( + <> + {/* ; */} + + + ) } diff --git a/src/app_modules/donasi/component/card_view/card_invoice_new.tsx b/src/app_modules/donasi/component/card_view/card_invoice_new.tsx new file mode 100644 index 00000000..c5712648 --- /dev/null +++ b/src/app_modules/donasi/component/card_view/card_invoice_new.tsx @@ -0,0 +1,83 @@ +import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi"; +import { AccentColor } from "@/app_modules/_global/color/color_pallet"; +import { ComponentGlobal_LoadImageCustom } from "@/app_modules/_global/component"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global/notifikasi_gagal"; +import { Badge, Card, Grid, Group, Progress, Stack, Text } from "@mantine/core"; +import { useRouter } from "next/navigation"; +import { IDataAllDonasiSaya } from "../../lib/type_donasi"; +import ComponentDonasi_TampilanHitungMundur from "../tampilan_hitung_mundur"; +import TampilanRupiahDonasi from "../tampilan_rupiah"; + +export function ComponentDonasi_CardInvoiceNew({ data, }: { data: IDataAllDonasiSaya; }) { + const router = useRouter(); + + async function onCekInvoice() { + if (data.donasiMaster_StatusInvoiceId === "1") { + return router.push(RouterDonasi.detail_donasi_saya + `${data?.id}`); + } else { + if (data.donasiMaster_StatusInvoiceId === "2") { + return router.push(RouterDonasi.proses_transaksi + `${data?.id}`); + } else { + if (data.donasiMaster_StatusInvoiceId === "3") { + return router.push(RouterDonasi.invoice + `${data?.id}`); + } else { + ComponentGlobal_NotifikasiGagal("Gagal Melihat Invoice"); + } + } + } + } + + return ( + <> + onCekInvoice()} + > + + + + + + + {data.title} + + + + + + + Donasi Saya + + + + + + + {data.nameStatusInvoice} + + + + + + + + + + + ); +} diff --git a/src/app_modules/donasi/component/skeleton_donasi.tsx b/src/app_modules/donasi/component/skeleton_donasi.tsx index 7c27f924..7f461e64 100644 --- a/src/app_modules/donasi/component/skeleton_donasi.tsx +++ b/src/app_modules/donasi/component/skeleton_donasi.tsx @@ -1,5 +1,5 @@ import { ComponentGlobal_CardStyles } from "@/app_modules/_global/component"; -import { Box, Grid, Group, Skeleton, Stack } from "@mantine/core"; +import { Box, Grid, Skeleton } from "@mantine/core"; export default function SkeletonDonasi() { return <> diff --git a/src/app_modules/donasi/component/skeleton_donasi_saya.tsx b/src/app_modules/donasi/component/skeleton_donasi_saya.tsx new file mode 100644 index 00000000..1b3b3a2b --- /dev/null +++ b/src/app_modules/donasi/component/skeleton_donasi_saya.tsx @@ -0,0 +1,32 @@ +import { ComponentGlobal_CardStyles } from "@/app_modules/_global/component"; +import { Box, Grid, Skeleton } from "@mantine/core"; + +export default function SkeletonDonasiSaya() { + return <> + + {[...Array(3)].map((_, index) => ( + + + + + {[...Array(4)].map((_, index) => ( + + + + + + + + ))} + + + + + + + + + ))} + + ; +} \ No newline at end of file diff --git a/src/app_modules/donasi/lib/api_donasi.ts b/src/app_modules/donasi/lib/api_donasi.ts index 04f661f3..2f7e719e 100644 --- a/src/app_modules/donasi/lib/api_donasi.ts +++ b/src/app_modules/donasi/lib/api_donasi.ts @@ -6,4 +6,9 @@ export const apiGetAllDonasi = async (path?: string) => { export const apiGetMasterDonasi = async (path?: string) => { const response = await fetch(`/api/new/donasi/master${(path) ? path : ''}`) return await response.json().catch(() => null) +} + +export const apiGetAllDonasiSaya = async (path?: string) => { + const response = await fetch(`/api/new/donasi/invoice${(path) ? path : ''}`) + return await response.json().catch(() => null) } \ No newline at end of file diff --git a/src/app_modules/donasi/lib/type_donasi.ts b/src/app_modules/donasi/lib/type_donasi.ts index 2931b59f..912d067f 100644 --- a/src/app_modules/donasi/lib/type_donasi.ts +++ b/src/app_modules/donasi/lib/type_donasi.ts @@ -7,4 +7,17 @@ export interface IDataAllDonasi { terkumpul: string target: string nameDonasiDurasi: string +} + +export interface IDataAllDonasiSaya { + id: string + nominal: string + donasiMaster_StatusInvoiceId: string + nameStatusInvoice: string + donasiId: string + title: string + publishTime: Date + progres: string + imageId: string + durasiDonasi: string } \ No newline at end of file diff --git a/src/app_modules/donasi/main/donasi_saya_new.tsx b/src/app_modules/donasi/main/donasi_saya_new.tsx new file mode 100644 index 00000000..0ecf12b1 --- /dev/null +++ b/src/app_modules/donasi/main/donasi_saya_new.tsx @@ -0,0 +1,72 @@ +"use client"; +import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data"; +import ComponentGlobal_Loader from "@/app_modules/_global/component/loader"; +import { Box, Center } from "@mantine/core"; +import { useShallowEffect } from "@mantine/hooks"; +import _ from "lodash"; +import { ScrollOnly } from "next-scroll-loader"; +import { useState } from "react"; +import { ComponentDonasi_CardInvoiceNew } from "../component/card_view/card_invoice_new"; +import SkeletonDonasiSaya from "../component/skeleton_donasi_saya"; +import { apiGetAllDonasiSaya } from "../lib/api_donasi"; +import { IDataAllDonasiSaya } from "../lib/type_donasi"; + +export default function DonasiSayaNew() { + const [data, setData] = useState([]); + const [activePage, setActivePage] = useState(1); + const [loading, setLoading] = useState(true) + + async function getDataDonasiSaya() { + try { + setLoading(true) + const response = await apiGetAllDonasiSaya(`?page=1`) + if (response.success) { + setData(response.data); + } + } catch (error) { + console.error(error); + } finally { + setLoading(false) + } + } + + + useShallowEffect(() => { + getDataDonasiSaya() + }, []); + + return ( + <> + + { + loading ? + + : + _.isEmpty(data) ? ( + + ) : ( + ( +
+ +
+ )} + data={data} + setData={setData} + moreData={async () => { + const pageNew = activePage + 1 + const loadData = await apiGetAllDonasiSaya(`?page=${pageNew}`) + setActivePage((val) => val + 1); + + return loadData.data; + }} + > + {(item) => } +
+ ) + } +
+ + ); +} \ No newline at end of file