## Deskripsi :
- Notifikasi investasi
## Issue : Gerbang pembayaran
This commit is contained in:
2024-08-12 10:20:28 +08:00
parent 7131e93a49
commit 6ffeb097e8
188 changed files with 4409 additions and 2488 deletions

View File

@@ -0,0 +1,57 @@
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import { Box, Center } from "@mantine/core";
import _ from "lodash";
import ComponentGlobal_Loader from "@/app_modules/_global/component/loader";
import { ScrollOnly } from "next-scroll-loader";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { donasi_funGetListPencairanDanaById } from "../../fun/get/get_list_pencairan_dana_by_id";
import { MODEL_DONASI_PENCAIRAN_DANA } from "../../model/interface";
import { ComponentDonasi_CardDonatur } from "./ui_card_donatur";
import { ComponentDonasi_CardPencairanDana } from "./card_pencairan_dana";
export function ComponentDonasi_InformasiPencairanDana({
donasiId,
listPD,
}: {
donasiId: string;
listPD: MODEL_DONASI_PENCAIRAN_DANA[];
}) {
const router = useRouter();
const [data, setData] = useState(listPD);
const [activePage, setActivePage] = useState(1);
return (
<>
{_.isEmpty(listPD) ? (
<ComponentGlobal_IsEmptyData height={20} />
) : (
<Box>
<ScrollOnly
height="62vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await donasi_funGetListPencairanDanaById({
page: activePage + 1,
donasiId: donasiId,
});
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => <ComponentDonasi_CardPencairanDana data={item} />}
</ScrollOnly>
</Box>
)}
</>
);
}

View File

@@ -0,0 +1,44 @@
import { MainColor, AccentColor } from "@/app_modules/_global/color/color_pallet";
import ComponentGlobal_BoxInformation from "@/app_modules/_global/component/box_information";
import { Paper, Stack, Grid, Title, Text } from "@mantine/core";
import { MODEL_DONASI } from "../../model/interface";
import TampilanRupiahDonasi from "../tampilan_rupiah";
export function ComponentDonasi_BoxPencariranDana({ akumulasi }: { akumulasi: MODEL_DONASI }) {
return (
<>
<Paper
style={{
backgroundColor: MainColor.darkblue,
border: `2px solid ${AccentColor.blue}`,
padding: "15px",
cursor: "pointer",
borderRadius: "10px",
color: "white",
marginBottom: "10px",
}}
>
<Stack>
<Grid>
<Grid.Col span={6}>
<Title order={5}>
<TampilanRupiahDonasi nominal={akumulasi.totalPencairan} />
</Title>
<Text fz={"xs"}>Dana sudah dicairkan</Text>
</Grid.Col>
<Grid.Col span={6}>
<Title order={5}>{akumulasi.akumulasiPencairan} kali</Title>
<Text fz={"xs"}>Pencairan dana</Text>
</Grid.Col>
</Grid>
<ComponentGlobal_BoxInformation
informasi=" Pencairan dana akan dilakukan oleh Admin HIPMI tanpa campur tangan
pihak manapun, jika berita pencairan dana dibawah tidak sesuai
dengan kabar yang diberikan oleh PENGGALANG DANA. Maka pegguna lain
dapat melaporkannya pada Admin HIPMI !"
/>
</Stack>
</Paper>
</>
);
}

View File

@@ -0,0 +1,113 @@
import {
AspectRatio,
Badge,
Card,
Grid,
Group,
Image,
Paper,
Progress,
Stack,
Text,
} from "@mantine/core";
import { MODEL_DONASI_INVOICE } from "../../model/interface";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global/notifikasi_gagal";
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
import ComponentDonasi_TampilanHitungMundur from "../tampilan_hitung_mundur";
import TampilanRupiahDonasi from "../tampilan_rupiah";
import { useRouter } from "next/navigation";
import { useState } from "react";
import ComponentGlobal_CardLoadingOverlay from "@/app_modules/_global/loading_card";
export function ComponentDonasi_CardInvoice({
data,
}: {
data: MODEL_DONASI_INVOICE;
}) {
const router = useRouter();
const [donasiId, setEventId] = useState("");
const [visible, setVisible] = useState(false);
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 (
<>
<Card
style={{
backgroundColor: AccentColor.blue,
border: `2px solid ${AccentColor.darkblue}`,
padding: "15px",
cursor: "pointer",
borderRadius: "10px",
color: "white",
marginBottom: "15px",
}}
onClick={() => onCekInvoice()}
>
<Stack>
<Grid>
<Grid.Col span={5}>
<Stack spacing={5}>
<Stack spacing={0}>
<Text fz={"xs"} fw={"bold"} truncate>
{data.Donasi.title}
</Text>
<ComponentDonasi_TampilanHitungMundur
durasi={data.Donasi.DonasiMaster_Durasi.name}
publishTime={data.Donasi.publishTime}
textSize={10}
/>
</Stack>
<Progress value={+data.Donasi.progres} color="orange" />
<Group position="apart">
<Stack spacing={0}>
<Text fz={10}>Donasi Saya</Text>
<Text fz={10} fw={"bold"} c={"orange"} truncate>
<TampilanRupiahDonasi nominal={+data.nominal} />
</Text>
</Stack>
</Group>
<Badge size="xs" variant="filled" color="yellow">
<Text>{data.DonasiMaster_StatusInvoice.name}</Text>
</Badge>
</Stack>
</Grid.Col>
<Grid.Col span={7}>
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image
alt="Foto"
src={RouterDonasi.api_gambar + `${data.Donasi.imagesId}`}
radius={"md"}
/>
</Paper>
</AspectRatio>
</Grid.Col>
</Grid>
{/* {width > 575 ? "" : <Divider />} */}
</Stack>
{visible && donasiId !== "" ? (
<ComponentGlobal_CardLoadingOverlay />
) : (
""
)}
</Card>
</>
);
}

View File

@@ -0,0 +1,71 @@
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import {
AccentColor,
MainColor,
} from "@/app_modules/_global/color/color_pallet";
import {
Paper,
Stack,
Title,
Spoiler,
Center,
Button,
Text,
} from "@mantine/core";
import { IconImageInPicture } from "@tabler/icons-react";
import moment from "moment";
import { MODEL_DONASI_PENCAIRAN_DANA } from "../../model/interface";
import { useRouter } from "next/navigation";
export function ComponentDonasi_CardPencairanDana({
data,
}: {
data: MODEL_DONASI_PENCAIRAN_DANA;
}) {
const router = useRouter();
return (
<>
<Paper
style={{
padding: "15px",
border: `2px solid ${AccentColor.blue}`,
backgroundColor: AccentColor.darkblue,
borderRadius: "10px",
color: "white",
}}
>
<Text fz={"xs"}>{moment(data.createdAt).format("ll")}</Text>
<Stack spacing={"lg"}>
<Title order={5}>{data.title}</Title>
<Spoiler
maxHeight={50}
hideLabel="Sembunyikan"
showLabel="Baca Selengkapnya"
>
{data.deskripsi}
</Spoiler>
<Center>
<Button
radius={"xl"}
leftIcon={<IconImageInPicture />}
onClick={() => {
// open();
// setIdGambar(e.imagesId);
router.push(RouterDonasi.bukti_transfer + data.imagesId, {
scroll: false,
});
}}
bg={MainColor.yellow}
color="yellow"
c={"black"}
>
Bukti Transfer
</Button>
</Center>
</Stack>
</Paper>
</>
);
}

View File

@@ -5,16 +5,19 @@ import { AccentColor } from "@/app_modules/_global/color/color_pallet";
import {
AspectRatio,
Box,
Card,
Grid,
Image,
Paper,
Progress,
Stack,
Text
Text,
} from "@mantine/core";
import { useRouter } from "next/navigation";
import ComponentDonasi_TampilanHitungMundur from "../tampilan_hitung_mundur";
import TampilanRupiahDonasi from "../tampilan_rupiah";
import { useState } from "react";
import ComponentGlobal_CardLoadingOverlay from "@/app_modules/_global/loading_card";
export default function ComponentDonasi_CardPublish({
data,
@@ -23,12 +26,13 @@ export default function ComponentDonasi_CardPublish({
data: any;
path: string;
}) {
const router = useRouter();
const [visible, setVisible] = useState(false);
const [donasiId, setDonasiId] = useState("");
return (
<>
<Box
<Card
style={{
padding: "15px",
backgroundColor: AccentColor.darkblue,
@@ -38,6 +42,8 @@ export default function ComponentDonasi_CardPublish({
marginBottom: "15px",
}}
onClick={() => {
setVisible(true);
setDonasiId(data.id);
router.push(path + `${data.id}`);
}}
>
@@ -78,7 +84,12 @@ export default function ComponentDonasi_CardPublish({
</Grid>
{/* {width > 575 ? "" : <Divider />} */}
</Stack>
</Box>
{visible && donasiId !== "" ? (
<ComponentGlobal_CardLoadingOverlay />
) : (
""
)}
</Card>
</>
);
}

View File

@@ -8,9 +8,12 @@ import {
Paper,
Image,
Text,
Card,
} from "@mantine/core";
import { useRouter } from "next/navigation";
import { MODEL_DONASI } from "../../model/interface";
import { useState } from "react";
import ComponentGlobal_CardLoadingOverlay from "@/app_modules/_global/loading_card";
export function ComponentDonasi_CardStatus({
data,
@@ -20,9 +23,12 @@ export function ComponentDonasi_CardStatus({
path: string;
}) {
const router = useRouter();
const [visible, setVisible] = useState(false);
const [donasiId, setDonasiId] = useState("");
return (
<>
<Box
<Card
style={{
padding: "15px",
backgroundColor: AccentColor.darkblue,
@@ -31,7 +37,11 @@ export function ComponentDonasi_CardStatus({
color: "white",
marginBottom: "15px",
}}
onClick={() => router.push(path + `${data.id}`)}
onClick={() => {
setVisible(true);
setDonasiId(data.id);
router.push(path + `${data.id}`);
}}
>
<Stack>
<Grid>
@@ -65,7 +75,12 @@ export function ComponentDonasi_CardStatus({
</Grid>
{/* {width > 575 ? "" : <Divider />} */}
</Stack>
</Box>
{visible && donasiId !== "" ? (
<ComponentGlobal_CardLoadingOverlay />
) : (
""
)}
</Card>
</>
);
}

View File

@@ -0,0 +1,48 @@
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
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";
export function ComponentDonasi_CardDonatur({ data }: { data: MODEL_DONASI_INVOICE }){
return (
<>
<Paper
style={{
backgroundColor: AccentColor.blue,
border: `2px solid ${AccentColor.darkblue}`,
padding: "15px",
cursor: "pointer",
borderRadius: "10px",
color: "white",
marginBottom: "10px",
}}
>
<Grid>
<Grid.Col span={3}>
<Center h={"100%"}>
{/* <Avatar variant="filled" radius={"xl"} size={"md"} /> */}
<IconMoodSmileBeam size={50} />
</Center>
</Grid.Col>
<Grid.Col span={9}>
<Stack spacing={0}>
<Title order={5}>{data.Author.username}</Title>
<Group spacing={"xs"}>
<Text fz={"xs"}>Berdonasi sebesar</Text>
<Text truncate fw={"bold"}>
<TampilanRupiahDonasi nominal={+data.nominal} />
</Text>
</Group>
<Text fz={"xs"}>
{new Intl.DateTimeFormat("id-ID", {
dateStyle: "full",
}).format(data?.createdAt)}
</Text>
</Stack>
</Grid.Col>
</Grid>
</Paper>
</>
);
}

View File

@@ -26,7 +26,7 @@ export default function ComponentDonasi_ListKabar({
cursor: "pointer",
borderRadius: "10px",
color: "white",
marginBottom: "5px",
marginBottom: "10px",
}}
onClick={() => router.push(route + `${kabar.id}`)}
>

View File

@@ -15,6 +15,7 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/_global/notif_
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global/notifikasi_peringatan";
import mqtt_client from "@/util/mqtt_client";
import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin";
import { useState } from "react";
export default function DetailDraftDonasi({
dataDonasi,
@@ -52,6 +53,8 @@ function ButtonAjukanPenggalangan({
const [tabsPostingDonasi, setTabsPostingDonasi] = useAtom(
gs_donasi_tabs_posting
);
const [isLoading, setLoading] = useState(false);
async function onCLick() {
const res = await Donasi_funGantiStatus(dataDonasi.id, "2");
if (res.status === 200) {
@@ -71,6 +74,7 @@ function ButtonAjukanPenggalangan({
if (notif.status === 201) {
mqtt_client.publish("ADMIN", JSON.stringify({ count: 1 }));
setLoading(true);
setTabsPostingDonasi("Review");
ComponentGlobal_NotifikasiBerhasil("Berhasil Diajukan");
router.push(RouterDonasi.main_galang_dana);
@@ -82,6 +86,8 @@ function ButtonAjukanPenggalangan({
return (
<>
<Button
loaderPosition="center"
loading={isLoading ? true : false}
radius={"xl"}
bg={"orange"}
color="orange"

View File

@@ -1,64 +1,55 @@
"use client";
"use dev";
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
import ComponentDonasi_IsEmptyData from "@/app_modules/donasi/component/is_empty_data";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import ComponentGlobal_Loader from "@/app_modules/_global/component/loader";
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 { MODEL_DONASI_INVOICE } from "@/app_modules/donasi/model/interface";
import { Center, Grid, Group, Paper, Stack, Text, Title } from "@mantine/core";
import { IconMoodSmileBeam } from "@tabler/icons-react";
import { Box, Center } from "@mantine/core";
import _ from "lodash";
import { ScrollOnly } from "next-scroll-loader";
import { useState } from "react";
export default function DonaturDonasi({
listDonatur,
donasiId,
}: {
listDonatur: MODEL_DONASI_INVOICE[];
donasiId: string;
}) {
const [donatur, setDonatur] = useState(listDonatur);
if (_.isEmpty(donatur)) return <ComponentDonasi_IsEmptyData />;
const [data, setData] = useState(listDonatur);
const [activePage, setActivePage] = useState(1);
return (
<>
{donatur.map((e, i) => (
<Paper
key={i}
style={{
backgroundColor: AccentColor.blue,
border: `2px solid ${AccentColor.darkblue}`,
padding: "15px",
cursor: "pointer",
borderRadius: "10px",
color: "white",
marginBottom: "10px",
}}
>
<Grid>
<Grid.Col span={3}>
<Center h={"100%"}>
{/* <Avatar variant="filled" radius={"xl"} size={"md"} /> */}
<IconMoodSmileBeam size={50} />
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
<Box>
<ScrollOnly
height="92vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
</Grid.Col>
<Grid.Col span={9}>
<Stack spacing={0}>
<Title order={5}>{e.Author.username}</Title>
<Group spacing={"xs"}>
<Text fz={"xs"}>Berdonasi sebesar</Text>
<Text truncate fw={"bold"}>
<TampilanRupiahDonasi nominal={+e.nominal} />
</Text>
</Group>
<Text fz={"xs"}>
{new Intl.DateTimeFormat("id-ID", {
dateStyle: "full",
}).format(e?.createdAt)}
</Text>
</Stack>
</Grid.Col>
</Grid>
</Paper>
))}
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await donasi_funGetListDonaturById({
page: activePage + 1,
donasiId: donasiId,
});
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => <ComponentDonasi_CardDonatur data={item} />}
</ScrollOnly>
</Box>
)}
</>
);
}

View File

@@ -2,32 +2,62 @@
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import ComponentDonasi_ListKabar from "@/app_modules/donasi/component/detail_main/list_kabar";
import ComponentGlobal_Loader from "@/app_modules/_global/component/loader";
import { ComponentDonasi_CardDonatur } from "@/app_modules/donasi/component/card_view/ui_card_donatur";
import ComponentDonasi_ListKabar from "@/app_modules/donasi/component/card_view/ui_card_kabar";
import { donasi_funGetListDonaturById } from "@/app_modules/donasi/fun/get/get_list_donatur";
import { donasi_funGetListKabarById } from "@/app_modules/donasi/fun/get/get_list_kabar";
import { MODEL_DONASI_KABAR } from "@/app_modules/donasi/model/interface";
import { Box } from "@mantine/core";
import { Box, Center } from "@mantine/core";
import _ from "lodash";
import { ScrollOnly } from "next-scroll-loader";
import { useState } from "react";
export default function KabarDonasi({
listKabar,
donasiId,
}: {
listKabar: MODEL_DONASI_KABAR[];
donasiId: string;
}) {
const [kabar, setKabar] = useState(listKabar);
if (_.isEmpty(kabar)) return <ComponentGlobal_IsEmptyData />;
const [data, setData] = useState(listKabar);
const [activePage, setActivePage] = useState(1);
return (
<>
{kabar.map((e, i) => (
<Box key={i}>
<ComponentDonasi_ListKabar
kabar={e}
route={RouterDonasi.detail_kabar}
/>
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
<Box>
<ScrollOnly
height="92vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await donasi_funGetListKabarById({
page: activePage + 1,
donasiId: donasiId,
});
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => (
<ComponentDonasi_ListKabar
kabar={item}
route={RouterDonasi.detail_kabar}
/>
)}
</ScrollOnly>
</Box>
))}
)}
</>
);
}

View File

@@ -7,7 +7,8 @@ import {
} from "@/app_modules/_global/color/color_pallet";
import ComponentGlobal_BoxInformation from "@/app_modules/_global/component/box_information";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import ComponentDonasi_NotedBox from "@/app_modules/donasi/component/noted_box";
import { ComponentDonasi_InformasiPencairanDana } from "@/app_modules/donasi/component/card_view/box_informasi_pencarian_dana";
import { ComponentDonasi_BoxPencariranDana } from "@/app_modules/donasi/component/card_view/box_pencairan_dana";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
import {
MODEL_DONASI,
@@ -15,11 +16,9 @@ import {
} from "@/app_modules/donasi/model/interface";
import {
AspectRatio,
Avatar,
Button,
Center,
Grid,
Group,
Image,
Modal,
Paper,
@@ -29,16 +28,18 @@ import {
Title,
} from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { IconImageInPicture, IconTransferIn } from "@tabler/icons-react";
import { IconImageInPicture } from "@tabler/icons-react";
import _ from "lodash";
import moment from "moment";
import { useRouter } from "next/navigation";
import { useState } from "react";
export default function PencairanDanaDonasi({
donasiId,
totalAkumulasi,
listPencairan,
}: {
donasiId: string;
totalAkumulasi: MODEL_DONASI;
listPencairan: MODEL_DONASI_PENCAIRAN_DANA[];
}) {
@@ -47,119 +48,9 @@ export default function PencairanDanaDonasi({
return (
<>
<Stack>
<BoxDanaDicarikan akumulasi={akumulasi} />
<InformasiPencairanDana listPD={listPD} />
<ComponentDonasi_BoxPencariranDana akumulasi={akumulasi} />
<ComponentDonasi_InformasiPencairanDana donasiId={donasiId} listPD={listPD} />
</Stack>
</>
);
}
function BoxDanaDicarikan({ akumulasi }: { akumulasi: MODEL_DONASI }) {
return (
<>
<Paper
style={{
backgroundColor: MainColor.darkblue,
border: `2px solid ${AccentColor.blue}`,
padding: "15px",
cursor: "pointer",
borderRadius: "10px",
color: "white",
marginBottom: "10px",
}}
>
<Stack>
<Grid>
<Grid.Col span={6}>
<Title order={5}>
<TampilanRupiahDonasi nominal={akumulasi.totalPencairan} />
</Title>
<Text fz={"xs"}>Dana sudah dicairkan</Text>
</Grid.Col>
<Grid.Col span={6}>
<Title order={5}>{akumulasi.akumulasiPencairan} kali</Title>
<Text fz={"xs"}>Pencairan dana</Text>
</Grid.Col>
</Grid>
<ComponentGlobal_BoxInformation
informasi=" Pencairan dana akan dilakukan oleh Admin HIPMI tanpa campur tangan
pihak manapun, jika berita pencairan dana dibawah tidak sesuai
dengan kabar yang diberikan oleh PENGGALANG DANA. Maka pegguna lain
dapat melaporkannya pada Admin HIPMI !"
/>
</Stack>
</Paper>
</>
);
}
function InformasiPencairanDana({
listPD,
}: {
listPD: MODEL_DONASI_PENCAIRAN_DANA[];
}) {
const router = useRouter();
const [opened, { open, close }] = useDisclosure(false);
const [idGambar, setIdGambar] = useState("");
return (
<>
<Modal opened={opened} onClose={close} size={"xl"}>
<AspectRatio ratio={9 / 16}>
<Paper>
<Image
alt="Foto"
src={RouterDonasi.api_gambar_pencairan + `${idGambar}`}
/>
</Paper>
</AspectRatio>
</Modal>
{_.isEmpty(listPD) ? (
<ComponentGlobal_IsEmptyData height={20} />
) : (
listPD.map((e, i) => (
<Paper
key={i}
style={{
padding: "15px",
border: `2px solid ${AccentColor.blue}`,
backgroundColor: AccentColor.darkblue,
borderRadius: "10px",
color: "white",
}}
>
<Text fz={"xs"}>{moment(e.createdAt).format("ll")}</Text>
<Stack spacing={"lg"}>
<Title order={5}>{e.title}</Title>
<Spoiler
maxHeight={50}
hideLabel="Sembunyikan"
showLabel="Baca Selengkapnya"
>
{e.deskripsi}
</Spoiler>
<Center>
<Button
radius={"xl"}
leftIcon={<IconImageInPicture />}
onClick={() => {
// open();
// setIdGambar(e.imagesId);
router.push(`/dev/donasi/bukti-transfer/${e.imagesId}`, {
scroll: false,
});
}}
bg={MainColor.yellow}
color="yellow"
c={"black"}
>
Bukti Transfer
</Button>
</Center>
</Stack>
</Paper>
))
)}
</>
);
}

View File

@@ -3,7 +3,7 @@
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog";
import { AccentColor, MainColor } from "@/app_modules/_global/color/color_pallet";
import ComponentDonasi_CardPublish from "@/app_modules/donasi/component/card_view/box_publish";
import ComponentDonasi_CardPublish from "@/app_modules/donasi/component/card_view/card_publish";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
import {
MODEL_DONASI,

View File

@@ -1,30 +1,20 @@
"use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import {
ActionIcon,
Avatar,
Box,
Button,
Group,
Paper,
SimpleGrid,
Stack,
Text,
Title,
} from "@mantine/core";
import {
IconCirclePlus,
IconEdit,
IconEditCircle,
IconTrash,
} from "@tabler/icons-react";
import moment from "moment";
import { useRouter } from "next/navigation";
import { MODEL_DONASI_KABAR } from "../../model/interface";
import { useState } from "react";
import ComponentDonasi_ListKabar from "../../component/detail_main/list_kabar";
import { MainColor } from "@/app_modules/_global/color/color_pallet";
import { Box, Button, Center, Stack } from "@mantine/core";
import { IconCirclePlus } from "@tabler/icons-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
import ComponentDonasi_ListKabar from "../../component/card_view/ui_card_kabar";
import { MODEL_DONASI_KABAR } from "../../model/interface";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import ComponentGlobal_Loader from "@/app_modules/_global/component/loader";
import _ from "lodash";
import { ScrollOnly } from "next-scroll-loader";
import { ComponentDonasi_CardDonatur } from "../../component/card_view/ui_card_donatur";
import { donasi_funGetListDonaturById } from "../../fun/get/get_list_donatur";
import { donasi_funGetListKabarById } from "../../fun/get/get_list_kabar";
export default function ListKabarDonasi({
donasiId,
@@ -34,8 +24,10 @@ export default function ListKabarDonasi({
listKabar: MODEL_DONASI_KABAR[];
}) {
const router = useRouter();
const [kabar, setKabar] = useState(listKabar);
const [data, setData] = useState(listKabar);
const [activePage, setActivePage] = useState(1);
const [isLoading, setIsLoading] = useState(false);
return (
<>
<Stack>
@@ -54,14 +46,40 @@ export default function ListKabarDonasi({
>
Tambah Kabar
</Button>
{kabar.map((e, i) => (
<Box key={i}>
<ComponentDonasi_ListKabar
kabar={e}
route={RouterDonasi.update_kabar}
/>
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
<Box>
<ScrollOnly
height="85vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await donasi_funGetListKabarById({
page: activePage + 1,
donasiId: donasiId,
});
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => (
<ComponentDonasi_ListKabar
kabar={item}
route={RouterDonasi.update_kabar}
/>
)}
</ScrollOnly>
</Box>
))}
)}
</Stack>
</>
);

View File

@@ -1,12 +1,22 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
export async function donasi_funGetAllInvoiceByAuthorId({
page,
}: {
page: number;
}) {
const authorId = await user_getOneUserId();
const takeData = 5;
const skipData = page * takeData - takeData;
export async function Donasi_getInvoiceByAuthorId(authorId: string) {
// console.log(authorId)
const data = await prisma.donasi_Invoice.findMany({
take: takeData,
skip: skipData,
orderBy: {
createdAt: "desc"
createdAt: "desc",
},
where: {
authorId: authorId,

View File

@@ -3,13 +3,19 @@
import prisma from "@/app/lib/prisma";
import { tree } from "next/dist/build/templates/app-page";
export async function Donasi_getListBeranda() {
export async function donasi_funGetAllPublish({ page }: { page: number }) {
const takeData = 5;
const skipData = page * takeData - takeData;
const data = await prisma.donasi.findMany({
take: takeData,
skip: skipData,
orderBy: {
publishTime: "desc",
},
where: {
donasiMaster_StatusDonasiId: "1",
active: true,
},
select: {
id: true,

View File

@@ -2,8 +2,19 @@
import prisma from "@/app/lib/prisma";
export async function Donasi_getListDonatur(donasiId: string) {
export async function donasi_funGetListDonaturById({
page,
donasiId,
}: {
page: number,
donasiId: string;
}) {
const takeData = 10
const skipData = page * takeData - takeData
const data = await prisma.donasi_Invoice.findMany({
take: takeData,
skip: skipData,
orderBy: {
createdAt: "desc",
},

View File

@@ -2,14 +2,24 @@
import prisma from "@/app/lib/prisma";
export async function Donasi_getListKabar(donasiId: string) {
// console.log(donasiId)
export async function donasi_funGetListKabarById({
page,
donasiId,
}: {
page: number;
donasiId: string;
}) {
const takeData = 10;
const skipData = page * takeData - takeData;
const data = await prisma.donasi_Kabar.findMany({
take: takeData,
skip: skipData,
orderBy: {
createdAt: "desc",
},
where: {
donasiId: donasiId,
active: true,
},
select: {
id: true,

View File

@@ -1,17 +1,26 @@
"use server"
"use server";
import prisma from "@/app/lib/prisma"
import prisma from "@/app/lib/prisma";
export async function Donasi_getListPencairanDanaById(donasiId:string) {
export async function donasi_funGetListPencairanDanaById({
page,
donasiId,
}: {
page: number;
donasiId: string;
}) {
const takeData = 5;
const skipData = page * takeData - takeData;
const data = await prisma.donasi_PencairanDana.findMany({
take: takeData,
skip: skipData,
orderBy: {
createdAt: "desc",
},
where: {
donasiId: donasiId,
},
});
const data = await prisma.donasi_PencairanDana.findMany({
orderBy:{
createdAt: "desc"
},
where: {
donasiId: donasiId
}
})
return data
}
return data;
}

View File

@@ -0,0 +1,24 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
export async function donasi_funGetAllStatusDraft({ page }: { page: number }) {
const authorId = await user_getOneUserId();
const takeData = 5;
const skipData = page * takeData - takeData;
const data = await prisma.donasi.findMany({
take: takeData,
skip: skipData,
orderBy: {
updatedAt: "desc",
},
where: {
authorId: authorId,
donasiMaster_StatusDonasiId: "3",
},
});
return data;
}

View File

@@ -0,0 +1,35 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
export async function donasi_funGetAllStatusPublish({ page }: { page: number }) {
const authorId = await user_getOneUserId();
const takeData = 5;
const skipData = page * takeData - takeData;
const data = await prisma.donasi.findMany({
take: takeData,
skip: skipData,
orderBy: {
publishTime: "desc",
},
where: {
authorId: authorId,
donasiMaster_StatusDonasiId: "1",
active: true,
},
select: {
id: true,
title: true,
imagesId: true,
target: true,
progres: true,
publishTime: true,
DonasiMaster_Durasi: true,
terkumpul: true,
},
});
return data;
}

View File

@@ -0,0 +1,24 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
export async function donasi_funGetAllStatusReject({ page }: { page: number }) {
const authorId = await user_getOneUserId();
const takeData = 5;
const skipData = page * takeData - takeData;
const data = await prisma.donasi.findMany({
take: takeData,
skip: skipData,
orderBy: {
updatedAt: "desc",
},
where: {
authorId: authorId,
donasiMaster_StatusDonasiId: "4",
},
});
return data;
}

View File

@@ -0,0 +1,24 @@
"use server"
import prisma from "@/app/lib/prisma";
import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
export async function donasi_funGetAllStatusReview({page}: {page: number}) {
const authorId = await user_getOneUserId();
const takeData = 5;
const skipData = page * takeData - takeData;
const data = await prisma.donasi.findMany({
take: takeData,
skip: skipData,
orderBy: {
updatedAt: "desc",
},
where: {
authorId: authorId,
donasiMaster_StatusDonasiId: "2",
},
});
return data;
}

View File

@@ -1,16 +1,19 @@
"use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import { ActionIcon, Affix, Box, rem } from "@mantine/core";
import { ActionIcon, Affix, Box, Center, rem } from "@mantine/core";
import { useWindowScroll } from "@mantine/hooks";
import { IconPencilPlus } from "@tabler/icons-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
import ComponentDonasi_CardPublish from "../component/card_view/box_publish";
import ComponentDonasi_CardPublish from "../component/card_view/card_publish";
import { MODEL_DONASI } from "../model/interface";
import ComponentGlobal_CreateButton from "@/app_modules/_global/component/button_create";
import _ from "lodash";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import { ScrollOnly } from "next-scroll-loader";
import { donasi_funGetAllPublish } from "../fun/get/get_list_beranda";
import ComponentGlobal_Loader from "@/app_modules/_global/component/loader";
export default function MainDonasi({
listDonasi,
@@ -18,6 +21,7 @@ export default function MainDonasi({
listDonasi: MODEL_DONASI[];
}) {
const [data, setData] = useState(listDonasi);
const [activePage, setActivePage] = useState(1);
return (
<>
@@ -26,14 +30,32 @@ export default function MainDonasi({
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
data.map((e, i) => (
<Box key={i}>
<ScrollOnly
height="82vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await donasi_funGetAllPublish({
page: activePage + 1,
});
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => (
<ComponentDonasi_CardPublish
data={e as any}
data={item as any}
path={RouterDonasi.detail_main}
/>
</Box>
))
)}
</ScrollOnly>
)}
</Box>
</>

View File

@@ -7,6 +7,7 @@ import {
AspectRatio,
Badge,
Box,
Center,
Grid,
Group,
Image,
@@ -25,105 +26,56 @@ import toast from "react-simple-toasts";
import ComponentDonasi_TampilanHitungMundur from "../component/tampilan_hitung_mundur";
import TampilanRupiahDonasi from "../component/tampilan_rupiah";
import { MODEL_DONASI_INVOICE } from "../model/interface";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global/notifikasi_gagal";
import ComponentGlobal_Loader from "@/app_modules/_global/component/loader";
import { ScrollOnly } from "next-scroll-loader";
import ComponentDonasi_CardPublish from "../component/card_view/card_publish";
import { donasi_funGetAllPublish } from "../fun/get/get_list_beranda";
import { donasi_funGetAllInvoiceByAuthorId } from "../fun/get/get_all_invoice_by_author_id";
import { ComponentDonasi_CardInvoice } from "../component/card_view/card_invoice";
export default function DonasiSayaDonasi({
listInvoice,
}: {
listInvoice: MODEL_DONASI_INVOICE[];
}) {
const [invoice, setInvoice] = useState(listInvoice);
const router = useRouter();
const { height, width } = useViewportSize();
if (_.isEmpty(listInvoice))
return <ComponentGlobal_IsEmptyData />;
const [data, setData] = useState(listInvoice);
const [activePage, setActivePage] = useState(1);
return (
<>
{invoice.map((e, i) => (
<Box
style={{
backgroundColor: AccentColor.blue,
border: `2px solid ${AccentColor.darkblue}`,
padding: "15px",
cursor: "pointer",
borderRadius: "10px",
color: "white",
marginBottom: "15px",
}}
key={i}
onClick={() =>
onClick(router, e.donasiMaster_StatusInvoiceId, e.id, e.Donasi.id)
}
>
<Stack>
<Grid>
<Grid.Col span={5}>
<Stack spacing={5}>
<Stack spacing={0}>
<Text fz={"xs"} fw={"bold"} truncate>
{e.Donasi.title}
</Text>
<ComponentDonasi_TampilanHitungMundur
durasi={e.Donasi.DonasiMaster_Durasi.name}
publishTime={e.Donasi.publishTime}
textSize={10}
/>
</Stack>
<Progress value={+e.Donasi.progres} color="orange" />
<Group position="apart">
<Stack spacing={0}>
<Text fz={10}>Donasi Saya</Text>
<Text fz={10} fw={"bold"} c={"orange"} truncate>
<TampilanRupiahDonasi nominal={+e.nominal} />
</Text>
</Stack>
</Group>
<Badge size="xs" variant="filled" color="yellow">
<Text>{e.DonasiMaster_StatusInvoice.name}</Text>
</Badge>
</Stack>
</Grid.Col>
<Grid.Col span={7}>
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image
alt="Foto"
src={RouterDonasi.api_gambar + `${e.Donasi.imagesId}`}
radius={"md"}
/>
</Paper>
</AspectRatio>
</Grid.Col>
</Grid>
{/* {width > 575 ? "" : <Divider />} */}
</Stack>
</Box>
))}
</>
);
}
<Box>
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
<ScrollOnly
height="82vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await donasi_funGetAllInvoiceByAuthorId({
page: activePage + 1,
});
function HitungMundur({
durasi,
publishTime,
}: {
durasi: string;
publishTime: Date;
}) {
return (
<>
<Stack spacing={0} align="center">
<Text fz={"xs"}>Sisa hari </Text>
<Text span inherit fw={"bold"} fz={"xs"}>
{Number(durasi) -
moment(new Date()).diff(new Date(publishTime), "days") <=
0
? 0
: Number(durasi) -
moment(new Date()).diff(new Date(publishTime), "days")}
</Text>
</Stack>
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => (
<ComponentDonasi_CardInvoice
data={item as any}
/>
)}
</ScrollOnly>
)}
</Box>
</>
);
}
@@ -143,7 +95,7 @@ async function onClick(
if (status === "3") {
return router.push(RouterDonasi.invoice + `${invoiceId}`);
} else {
toast("gagal");
ComponentGlobal_NotifikasiGagal("Gagal Melihat Invoice");
}
}
}

View File

@@ -1,12 +1,14 @@
"use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import {
Box
} from "@mantine/core";
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 _ from "lodash";
import { ScrollOnly } from "next-scroll-loader";
import { useState } from "react";
import { ComponentDonasi_CardStatus } from "../../component/card_view/card_status";
import { donasi_funGetAllStatusDraft } from "../../fun/get/status/get_all_status_draft";
import { MODEL_DONASI } from "../../model/interface";
export default function PostingDraftDonasi({
@@ -14,18 +16,51 @@ export default function PostingDraftDonasi({
}: {
listDraft: MODEL_DONASI[];
}) {
if (_.isEmpty(listDraft)) return <ComponentGlobal_IsEmptyData />;
const [data, setData] = useState(listDraft);
const [activePage, setActivePage] = useState(1);
return (
<>
{listDraft.map((e, i) => (
{/* {listDraft.map((e, i) => (
<Box key={i}>
<ComponentDonasi_CardStatus
data={e}
path={RouterDonasi.detail_draft}
/>
</Box>
))}
))} */}
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
<Box>
<ScrollOnly
height="75vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await donasi_funGetAllStatusDraft({
page: activePage + 1,
});
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => (
<ComponentDonasi_CardStatus
data={item}
path={RouterDonasi.detail_draft}
/>
)}
</ScrollOnly>
</Box>
)}
</>
);
}

View File

@@ -1,12 +1,15 @@
"use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import ComponentDonasi_CardPublish from "../../component/card_view/box_publish";
import { MODEL_DONASI } from "../../model/interface";
import { useState } from "react";
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 _ from "lodash";
import { Box } from "@mantine/core";
import { ScrollOnly } from "next-scroll-loader";
import { useState } from "react";
import ComponentDonasi_CardPublish from "../../component/card_view/card_publish";
import { donasi_funGetAllStatusPublish } from "../../fun/get/status/get_all_status_publish";
import { MODEL_DONASI } from "../../model/interface";
export default function PostingPublishDonasi({
listPublish,
@@ -14,27 +17,42 @@ export default function PostingPublishDonasi({
listPublish: MODEL_DONASI[];
}) {
const [data, setData] = useState(listPublish);
const [activePage, setActivePage] = useState(1);
return (
<>
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
data.map((e, i) => (
<Box key={i}>
<ComponentDonasi_CardPublish
data={e}
path={RouterDonasi.detail_publish}
/>
</Box>
))
<Box >
<ScrollOnly
height="75vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await donasi_funGetAllStatusPublish({
page: activePage + 1,
});
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => (
<ComponentDonasi_CardPublish
data={item}
path={RouterDonasi.detail_publish}
/>
)}
</ScrollOnly>
</Box>
)}
</>
);
// return (
// <>
// <ComponentDonasi_CardPublish dataDonasi={listPublish} path={RouterDonasi.detail_publish} />
// </>
// );
}

View File

@@ -1,24 +1,15 @@
"use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import {
AspectRatio,
Box,
Divider,
Grid,
Image,
Paper,
SimpleGrid,
Stack,
Text,
} from "@mantine/core";
import { useViewportSize } from "@mantine/hooks";
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 _ from "lodash";
import { useRouter } from "next/navigation";
import { ScrollOnly } from "next-scroll-loader";
import { useState } from "react";
import ComponentDonasi_IsEmptyData from "../../component/is_empty_data";
import { MODEL_DONASI } from "../../model/interface";
import { ComponentDonasi_CardStatus } from "../../component/card_view/card_status";
import { donasi_funGetAllStatusReject } from "../../fun/get/status/get_all_status_reject";
import { MODEL_DONASI } from "../../model/interface";
export default function PostingRejectDonasi({
listReject,
@@ -26,73 +17,42 @@ export default function PostingRejectDonasi({
listReject: MODEL_DONASI[];
}) {
const [data, setData] = useState(listReject);
const [activePage, setActivePage] = useState(1);
return (
<>
{data.map((e, i) => (
<Box key={i}>
<ComponentDonasi_CardStatus
data={e}
path={RouterDonasi.detail_reject}
/>
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
<Box>
<ScrollOnly
height="75vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await donasi_funGetAllStatusReject({
page: activePage + 1,
});
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => (
<ComponentDonasi_CardStatus
data={item}
path={RouterDonasi.detail_reject}
/>
)}
</ScrollOnly>
</Box>
))}
)}
</>
);
// if (_.isEmpty(listReject))
// return <ComponentDonasi_IsEmptyData text="Tidak ada data" />;
// return (
// <>
// <SimpleGrid
// cols={4}
// spacing="lg"
// breakpoints={[
// { maxWidth: "62rem", cols: 3, spacing: "md" },
// { maxWidth: "48rem", cols: 2, spacing: "sm" },
// { maxWidth: "36rem", cols: 1, spacing: "sm" },
// ]}
// >
// {donasi.map((e, i) => (
// <Box
// key={i}
// onClick={() => router.push(RouterDonasi.detail_reject + `${e.id}`)}
// >
// <Stack>
// <Grid>
// <Grid.Col span={7}>
// <AspectRatio ratio={16 / 9}>
// <Paper radius={"md"}>
// <Image
// alt="Foto"
// src={RouterDonasi.api_gambar + `${e.imagesId}`}
// radius={"md"}
// />
// </Paper>
// </AspectRatio>
// </Grid.Col>
// <Grid.Col span={5}>
// <Stack spacing={"xs"}>
// <Text fz={"sm"} fw={"bold"} lineClamp={2}>
// {e.title}
// </Text>
// <Stack spacing={0}>
// <Text fz={"sm"} fw={"bold"}>
// Alasan ditolak
// </Text>
// <Text fz={"sm"} lineClamp={2}>
// {e.catatan}
// </Text>
// </Stack>
// </Stack>
// </Grid.Col>
// </Grid>
// {width > 575 ? "" : <Divider />}
// </Stack>
// </Box>
// ))}
// </SimpleGrid>
// </>
// );
}

View File

@@ -1,29 +1,58 @@
"use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import { Box } from "@mantine/core";
import { Box, Center } from "@mantine/core";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import _ from "lodash";
import { ComponentDonasi_CardStatus } from "../../component/card_view/card_status";
import { MODEL_DONASI } from "../../model/interface";
import { donasi_funGetAllStatusReview } from "../../fun/get/status/get_all_status_review";
import { ScrollOnly } from "next-scroll-loader";
import ComponentGlobal_Loader from "@/app_modules/_global/component/loader";
import { useState } from "react";
export default function PostingReviewDonasi({
listReview,
}: {
listReview: MODEL_DONASI[];
}) {
if (_.isEmpty(listReview)) return <ComponentGlobal_IsEmptyData />;
const [data, setData] = useState(listReview);
const [activePage, setActivePage] = useState(1);
return (
<>
{listReview.map((e, i) => (
<Box key={i}>
<ComponentDonasi_CardStatus
data={e}
path={RouterDonasi.detail_review}
/>
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
// --- Main component --- //
<Box>
<ScrollOnly
height="75vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await donasi_funGetAllStatusReview({
page: activePage + 1,
});
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => (
<ComponentDonasi_CardStatus
data={item}
path={RouterDonasi.detail_review}
/>
)}
</ScrollOnly>
</Box>
))}
)}
</>
);
}

View File

@@ -75,7 +75,7 @@ export default function GalangDanaDonasi({
},
}}
>
<Stack>
<Stack >
<Tabs.List grow>
{listPosting.map((e, i) => (
<Tabs.Tab
@@ -98,7 +98,7 @@ export default function GalangDanaDonasi({
))}
</Tabs.List>
{listPosting.map((e, i) => (
<Tabs.Panel key={e.id} value={e.value} pt="xs">
<Tabs.Panel key={e.id} value={e.value} >
{e.path}
</Tabs.Panel>
))}