fix: donasi

deskrispi:
perubahan use server ke API
src/app/api/donasi/[id]/invoice/route.ts
src/app/dev/(user)/donasi/proses_donasi/metode_pembayaran/[id]/layout.tsx
src/app/dev/(user)/donasi/proses_donasi/metode_pembayaran/[id]/page.tsx
src/app/dev/(user)/donasi/proses_donasi/proses_transaksi/[id]/layout.tsx
src/app/dev/(user)/donasi/proses_donasi/proses_transaksi/[id]/page.tsx
src/app_modules/donasi/proses_donasi/metode_pembayaran/index.tsx
src/app_modules/donasi/proses_donasi/proses_transaksi/index.tsx

No Issue
This commit is contained in:
2025-06-09 15:39:53 +08:00
parent 048f819a57
commit 4fdfb6f4b0
7 changed files with 123 additions and 74 deletions

View File

@@ -13,6 +13,7 @@ export async function GET(
}, },
select: { select: {
id: true, id: true,
authorId: true,
nominal: true, nominal: true,
donasiId: true, donasiId: true,
createdAt: true, createdAt: true,

View File

@@ -1,8 +1,14 @@
import { LayoutDonasi_MetodePembayaran } from "@/app_modules/donasi"; import { LayoutDonasi_MetodePembayaran } from "@/app_modules/donasi";
import React from "react"; import React from "react";
export default async function Layout({children}: {children: React.ReactNode}) { export default async function Layout({
return<> children,
<LayoutDonasi_MetodePembayaran>{children}</LayoutDonasi_MetodePembayaran> }: {
children: React.ReactNode;
}) {
return (
<>
<LayoutDonasi_MetodePembayaran>{children}</LayoutDonasi_MetodePembayaran>
</> </>
} );
}

View File

@@ -1,19 +1,9 @@
import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
import { Donasi_MetodePembayaran } from "@/app_modules/donasi"; import { Donasi_MetodePembayaran } from "@/app_modules/donasi";
import { Donasi_getMasterBank } from "@/app_modules/donasi/fun/master/get_bank";
export default async function Page({ params }: { params: { id: string } }) {
let donasiId = params.id;
const listBank = await Donasi_getMasterBank();
const userLoginId = await funGetUserIdByToken();
export default async function Page() {
return ( return (
<> <>
<Donasi_MetodePembayaran <Donasi_MetodePembayaran />
listBank={listBank}
donasiId={donasiId}
authorId={userLoginId as string}
/>
</> </>
); );
} }

View File

@@ -1,8 +1,14 @@
import { LayoutDonasi_ProsesTransaksi } from "@/app_modules/donasi"; import { LayoutDonasi_ProsesTransaksi } from "@/app_modules/donasi";
import React from "react"; import React from "react";
export default async function Layout({children}:{children: React.ReactNode}) { export default async function Layout({
return<> children,
<LayoutDonasi_ProsesTransaksi>{children}</LayoutDonasi_ProsesTransaksi> }: {
children: React.ReactNode;
}) {
return (
<>
<LayoutDonasi_ProsesTransaksi>{children}</LayoutDonasi_ProsesTransaksi>
</> </>
} );
}

View File

@@ -1,20 +1,9 @@
import { Donasi_ProsesTransaksi } from "@/app_modules/donasi"; import { Donasi_ProsesTransaksi } from "@/app_modules/donasi";
import { Donasi_getOneInvoiceById } from "@/app_modules/donasi/fun/get/get_one_invoice_by_id";
import { donasi_getOneStatusInvoiceById } from "@/app_modules/donasi/fun/get/get_one_status_invoice_by_id";
import donasi_getMasterNomorAdmin from "@/app_modules/donasi/fun/master/get_nomor_admin";
export default async function Page({ params }: { params: { id: string } }) {
let invoiceId = params.id;
const nomorAdmin = await donasi_getMasterNomorAdmin();
const statusInvoice = await donasi_getOneStatusInvoiceById({invoiceId: invoiceId})
// console.log(statusInvoice)
export default async function Page() {
return ( return (
<> <>
<Donasi_ProsesTransaksi <Donasi_ProsesTransaksi />
statusInvoice={statusInvoice as any}
nomorAdmin={nomorAdmin}
/>
</> </>
); );
} }

View File

@@ -1,48 +1,73 @@
"use client"; "use client";
import { IRealtimeData } from "@/lib/global_state";
import { RouterDonasi } from "@/lib/router_hipmi/router_donasi";
import { import {
AccentColor, AccentColor,
MainColor, MainColor,
} from "@/app_modules/_global/color/color_pallet"; } from "@/app_modules/_global/color/color_pallet";
import { apiNewGetUserIdByToken } from "@/app_modules/_global/lib/api_fetch_global";
import { apiGetMasterBank } from "@/app_modules/_global/lib/api_fetch_master";
import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/_global/notif_global/notifikasi_berhasil";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global/notifikasi_gagal";
import CustomSkeleton from "@/app_modules/components/CustomSkeleton";
import { MODEL_MASTER_BANK } from "@/app_modules/investasi/_lib/interface"; import { MODEL_MASTER_BANK } from "@/app_modules/investasi/_lib/interface";
import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin";
import { IRealtimeData } from "@/lib/global_state";
import { RouterDonasi } from "@/lib/router_hipmi/router_donasi";
import { clientLogger } from "@/util/clientLogger";
import { Button, Paper, Radio, Stack, Title } from "@mantine/core"; import { Button, Paper, Radio, Stack, Title } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
import { useAtom } from "jotai"; import { useAtom } from "jotai";
import { useRouter } from "next/navigation"; import { useParams, useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { WibuRealtime } from "wibu-pkg";
import { Donasi_funCreateInvoice } from "../../fun/create/fun_create_invoice"; import { Donasi_funCreateInvoice } from "../../fun/create/fun_create_invoice";
import { gs_donasi_hot_menu, gs_proses_donasi } from "../../global_state"; import { gs_donasi_hot_menu, gs_proses_donasi } from "../../global_state";
import { WibuRealtime } from "wibu-pkg";
import { clientLogger } from "@/util/clientLogger";
export default function Donasi_MetodePembayaran({ export default function Donasi_MetodePembayaran() {
listBank, const param = useParams<{ id: string }>();
donasiId,
authorId,
}: {
listBank: MODEL_MASTER_BANK[];
donasiId: string;
authorId: string;
}) {
const router = useRouter(); const router = useRouter();
const [isLoading, setLoading] = useState(false); const [isLoading, setLoading] = useState(false);
const [prosesDonasi, setProsesDonasi] = useAtom(gs_proses_donasi); const [prosesDonasi, setProsesDonasi] = useAtom(gs_proses_donasi);
const [pilihBank, setPilihBank] = useState(""); const [pilihBank, setPilihBank] = useState("");
const [bank, setBank] = useState(listBank); const [bank, setBank] = useState<MODEL_MASTER_BANK[] | null>(null);
const [activeHotMenu, setActiveHotMenu] = useAtom(gs_donasi_hot_menu); const [activeHotMenu, setActiveHotMenu] = useAtom(gs_donasi_hot_menu);
const [userLoginId, setUserLoginId] = useState<string | null>(null);
useShallowEffect(() => {
handleListData();
handleGetUserId();
}, []);
async function handleListData() {
try {
const response = await apiGetMasterBank();
if (response.success) {
setBank(response.data);
}
} catch (error) {
console.error("Error fetching bank data:", error);
}
}
async function handleGetUserId() {
try {
const response = await apiNewGetUserIdByToken();
if (response.success) {
setUserLoginId(response.userId);
}
} catch (error) {
console.error("Error fetching user ID:", error);
}
}
async function onProses() { async function onProses() {
try { try {
setLoading(true); setLoading(true);
const body = { const body = {
donasiId: donasiId, donasiId: param.id,
donasiMaster_BankId: pilihBank, donasiMaster_BankId: pilihBank,
nominal: prosesDonasi.nominal, nominal: prosesDonasi.nominal,
authorId: authorId, authorId: userLoginId,
}; };
const res = await Donasi_funCreateInvoice(body); const res = await Donasi_funCreateInvoice(body);
@@ -84,11 +109,13 @@ export default function Donasi_MetodePembayaran({
} }
} }
if (!bank || !userLoginId) {
return <CustomSkeleton height={400} />;
}
return ( return (
<> <>
<Stack> <Stack>
{/* <pre>{JSON.stringify(prosesDonasi, null, 2)}</pre> */}
<Radio.Group <Radio.Group
value={pilihBank} value={pilihBank}
onChange={setPilihBank} onChange={setPilihBank}

View File

@@ -20,23 +20,51 @@ import { useShallowEffect } from "@mantine/hooks";
import { IconBrandWhatsapp } from "@tabler/icons-react"; import { IconBrandWhatsapp } from "@tabler/icons-react";
import { useAtom } from "jotai"; import { useAtom } from "jotai";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; import { useParams, useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { donasi_getOneStatusInvoiceById } from "../../fun/get/get_one_status_invoice_by_id"; import { donasi_getOneStatusInvoiceById } from "../../fun/get/get_one_status_invoice_by_id";
import { gs_donasi_hot_menu } from "../../global_state"; import { gs_donasi_hot_menu } from "../../global_state";
import { MODEL_DONASI_INVOICE } from "../../model/interface"; import { MODEL_DONASI_INVOICE } from "../../model/interface";
import { apiGetDonasiInvoiceById } from "../../lib/api_donasi";
import { apiGetAdminContact } from "@/app_modules/_global/lib/api_fetch_master";
import CustomSkeleton from "@/app_modules/components/CustomSkeleton";
export default function Donasi_ProsesTransaksi({ export default function Donasi_ProsesTransaksi() {
statusInvoice, const param = useParams<{ id: string }>();
nomorAdmin,
}: {
statusInvoice: MODEL_DONASI_INVOICE;
nomorAdmin: any;
}) {
const router = useRouter(); const router = useRouter();
const [data, setData] = useState(statusInvoice); const [dataInvoice, setDataInvoice] = useState<MODEL_DONASI_INVOICE | null>(
null
);
const [dataNomorAdmin, setDataNomorAdmin] = useState<any | null>(null);
const [hotMenu, setHotMenu] = useAtom(gs_donasi_hot_menu); const [hotMenu, setHotMenu] = useAtom(gs_donasi_hot_menu);
useShallowEffect(() => {
onLoadDataInvoice();
onLoadDataNomorAdmin();
}, []);
async function onLoadDataInvoice() {
try {
const response = await apiGetDonasiInvoiceById({ id: param.id });
if (response.success) {
setDataInvoice(response.data);
}
} catch (error) {
console.log(error);
}
}
async function onLoadDataNomorAdmin() {
try {
const response = await apiGetAdminContact();
if (response.success) {
setDataNomorAdmin(response.data);
}
} catch (error) {
console.log(error);
}
}
interface MODAL_DONASI_INVOICE { interface MODAL_DONASI_INVOICE {
invoiceId: string; invoiceId: string;
statusInvoiceId: string; statusInvoiceId: string;
@@ -47,33 +75,35 @@ export default function Donasi_ProsesTransaksi({
mqtt_client.on("message", (topic, message) => { mqtt_client.on("message", (topic, message) => {
const dataClient: MODAL_DONASI_INVOICE = JSON.parse(message.toString()); const dataClient: MODAL_DONASI_INVOICE = JSON.parse(message.toString());
if (topic === "donasi_invoice" && dataClient.invoiceId === data.id) { if (topic === "donasi_invoice" && dataClient.invoiceId === param.id) {
// setData({
// ...data,
// donasiMaster_StatusInvoiceId: dataClient.statusInvoiceId,
// });
onLoad(); onLoad();
} }
}); });
}, []); }, []);
async function onLoad() { async function onLoad() {
const loadData = await donasi_getOneStatusInvoiceById({ try {
invoiceId: data.id, const response = await apiGetDonasiInvoiceById({ id: param.id });
}); if (response.success) {
setData(loadData as any); setDataInvoice(response.data);
}
} catch (error) {
console.log(error);
}
} }
if (data.DonasiMaster_StatusInvoice.id === "1") { if (dataInvoice?.DonasiMaster_StatusInvoice.id === "1") {
setHotMenu(2); setHotMenu(2);
router.replace(RouterDonasi.detail_donasi_saya + `${data.id}`, { router.replace(RouterDonasi.detail_donasi_saya + `${dataInvoice?.id}`, {
scroll: false, scroll: false,
}); });
} }
if(!dataInvoice || !dataNomorAdmin) return <CustomSkeleton height={400}/>
return ( return (
<> <>
{data.DonasiMaster_StatusInvoice.id === "1" ? ( {dataInvoice.DonasiMaster_StatusInvoice.id === "1" ? (
<> <>
<Center h={"50vh"}> <Center h={"50vh"}>
<Loader color="yellow" /> <Loader color="yellow" />
@@ -150,7 +180,7 @@ export default function Donasi_ProsesTransaksi({
textDecoration: "none", textDecoration: "none",
}} }}
target="_blank" target="_blank"
href={`https://wa.me/+${nomorAdmin.nomor}?text=Hallo Admin , Saya ada kendala dalam proses transfer donasi!`} href={`https://wa.me/+${dataNomorAdmin}?text=Hallo Admin , Saya ada kendala dalam proses transfer donasi!`}
> >
<IconBrandWhatsapp size={40} color={MainColor.green} /> <IconBrandWhatsapp size={40} color={MainColor.green} />
</Link> </Link>