fix ( upload & api )

deksripsi:
- fix upload image pada berita investasi
- fix api berita investasi
This commit is contained in:
2025-01-16 12:28:39 +08:00
parent cb0691c7f2
commit cdc8ff6d18
17 changed files with 502 additions and 241 deletions

View File

@@ -0,0 +1,85 @@
import { prisma } from "@/app/lib";
import backendLogger from "@/util/backendLogger";
import { NextResponse } from "next/server";
export async function GET(
request: Request,
context: { params: { id: string } }
) {
// if (request.method === "GET") {
// return NextResponse.json(
// { success: false, message: "Method not allowed" },
// { status: 405 }
// );
// }
try {
let fixData;
const { id } = context.params;
const { searchParams } = new URL(request.url);
const kategori: string | null = searchParams.get("kategori");
const page = searchParams.get("page");
const takeData = 10;
const skipData = Number(page) * takeData - takeData;
if (!kategori) {
fixData = await prisma.beritaInvestasi.findFirst({
where: {
id: id,
},
include: {
investasi: {
select: {
authorId: true,
},
},
},
});
} else if (kategori == "get-all") {
fixData = await prisma.beritaInvestasi.findMany({
take: takeData,
skip: skipData,
orderBy: {
updatedAt: "desc",
},
where: {
investasiId: id,
active: true,
},
});
}
await prisma.$disconnect();
return NextResponse.json(
{ success: true, message: "Success get data news", data: fixData },
{ status: 200 }
);
} catch (error) {
await prisma.$disconnect();
backendLogger.error("Error get data news", error);
return NextResponse.json(
{
success: false,
message: "Failed to get data, try again later",
reason: (error as Error).message,
},
{ status: 500 }
);
}
}
async function main({ id }: { id: string }) {
const fixData = await prisma.beritaInvestasi.findMany({
take: 10,
skip: 0,
orderBy: {
updatedAt: "desc",
},
where: {
investasiId: id.trim(),
active: true,
},
});
console.log("data sebelum disconnect>>", fixData);
}

View File

@@ -1,12 +1,12 @@
import { investasi_funGetOneBeritaById } from "@/app_modules/investasi/_fun"; import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
import { Investasi_UiDetailBerita } from "@/app_modules/investasi/_ui"; import { Investasi_UiDetailBerita } from "@/app_modules/investasi/_ui";
export default async function Page({ params }: { params: { id: string } }) { export default async function Page() {
const beritaId = params.id; const userLoginId = await funGetUserIdByToken();
const dataBerita = await investasi_funGetOneBeritaById({ beritaId });
return ( return (
<> <>
<Investasi_UiDetailBerita dataBerita={dataBerita} /> <Investasi_UiDetailBerita userLoginId={userLoginId} />
</> </>
); );
} }

View File

@@ -1,14 +1,9 @@
import { investasi_funGetBeritaById } from "@/app_modules/investasi/_fun";
import { Investasi_UiDaftarBerita } from "@/app_modules/investasi/_ui"; import { Investasi_UiDaftarBerita } from "@/app_modules/investasi/_ui";
export default async function Page({ params }: { params: { id: string } }) { export default async function Page() {
const investasiId = params.id;
const dataBerita = await investasi_funGetBeritaById({ investasiId });
return ( return (
<> <>
<Investasi_UiDaftarBerita dataBerita={dataBerita} /> <Investasi_UiDaftarBerita />
</> </>
); );
} }

View File

@@ -1,17 +1,9 @@
import { investasi_funGetBeritaById } from "@/app_modules/investasi/_fun";
import { Investasi_UiRekapBerita } from "@/app_modules/investasi/_ui"; import { Investasi_UiRekapBerita } from "@/app_modules/investasi/_ui";
export default async function Page({ params }: { params: { id: string } }) { export default async function Page() {
const investasiId = params.id;
const dataBerita = await investasi_funGetBeritaById({ investasiId });
return ( return (
<> <>
<Investasi_UiRekapBerita <Investasi_UiRekapBerita />
investasiId={investasiId}
dataBerita={dataBerita}
/>
</> </>
); );
} }

View File

@@ -1,10 +1,9 @@
import { Investasi_UiCreateBerita } from "@/app_modules/investasi/_ui"; import { Investasi_UiCreateBerita } from "@/app_modules/investasi/_ui";
export default async function Page({ params }: { params: { id: string } }) { export default async function Page() {
const investasiId = params.id;
return ( return (
<> <>
<Investasi_UiCreateBerita investasiId={investasiId} /> <Investasi_UiCreateBerita />
</> </>
); );
} }

View File

@@ -21,9 +21,9 @@ if (process.env.NODE_ENV !== "production") {
} }
process.on("SIGINT", async () => { process.on("SIGINT", async () => {
console.log("Start in Disconnecting PrismaClient..."); // console.log("Start in Disconnecting PrismaClient...");
const disconnect = await prisma.$disconnect(); const disconnect = await prisma.$disconnect();
console.log("End of Disconnecting PrismaClient...", disconnect); // console.log("End of Disconnecting PrismaClient...", disconnect);
process.exit(0); process.exit(0);
}); });

View File

@@ -10,7 +10,7 @@ export async function funDeteleteFileById({
try { try {
const tokenResponse = await fetch("/api/get-cookie"); const tokenResponse = await fetch("/api/get-cookie");
if (!tokenResponse.ok) { if (!tokenResponse.ok) {
throw new Error("Failed to get token"); return { success: false, message: "Token not found" };
} }
const { token } = await tokenResponse.json(); const { token } = await tokenResponse.json();

View File

@@ -1,3 +1,4 @@
import { data } from "autoprefixer";
export const apiGetOneInvestasiById = async ({ id }: { id: string }) => { export const apiGetOneInvestasiById = async ({ id }: { id: string }) => {
const { token } = await fetch("/api/get-cookie").then((res) => res.json()); const { token } = await fetch("/api/get-cookie").then((res) => res.json());
if (!token) return await token.json().catch(() => null); if (!token) return await token.json().catch(() => null);
@@ -88,3 +89,29 @@ export const apiGetDokumenInvestasiById = async ({
); );
return await response.json().catch(() => null); return await response.json().catch(() => null);
}; };
export const apiGetBeritaInvestasiById = async ({
id,
kategori,
page,
}: {
id: string;
kategori?: undefined | "get-all";
page?: string;
}) => {
const { token } = await fetch("/api/get-cookie").then((res) => res.json());
if (!token) return await token.json().catch(() => null);
const onCategory = kategori ? `?kategori=${kategori}&page=${page}` : "";
const response = await fetch(`/api/new/investasi/berita/${id}${onCategory}`, {
headers: {
"Content-Type": "application/json",
Accept: "application/json",
"Access-Control-Allow-Origin": "*",
Authorization: `Bearer ${token}`,
},
});
return await response.json().catch(() => null);
};

View File

@@ -6,17 +6,13 @@ import {
} from "@/app_modules/_global/ui"; } from "@/app_modules/_global/ui";
import { Investasi_ViewCreateBerita } from "../../_view"; import { Investasi_ViewCreateBerita } from "../../_view";
export function Investasi_UiCreateBerita({ export function Investasi_UiCreateBerita() {
investasiId,
}: {
investasiId: string;
}) {
return ( return (
<> <>
<UIGlobal_LayoutTamplate <UIGlobal_LayoutTamplate
header={<UIGlobal_LayoutHeaderTamplate title="Tambah Berita" />} header={<UIGlobal_LayoutHeaderTamplate title="Tambah Berita" />}
> >
<Investasi_ViewCreateBerita investasiId={investasiId} /> <Investasi_ViewCreateBerita />
</UIGlobal_LayoutTamplate> </UIGlobal_LayoutTamplate>
</> </>
); );

View File

@@ -10,40 +10,82 @@ import {
UIGlobal_DrawerCustom, UIGlobal_DrawerCustom,
UIGlobal_LayoutHeaderTamplate, UIGlobal_LayoutHeaderTamplate,
UIGlobal_LayoutTamplate, UIGlobal_LayoutTamplate,
UIGlobal_Modal UIGlobal_Modal,
} from "@/app_modules/_global/ui"; } from "@/app_modules/_global/ui";
import { ActionIcon, Button, Center, Stack, Text } from "@mantine/core"; import { ActionIcon, Button, Center, Stack, Text } from "@mantine/core";
import { IconDotsVertical, IconTrash } from "@tabler/icons-react"; import { IconDotsVertical, IconTrash } from "@tabler/icons-react";
import { useRouter } from "next/navigation"; import { useParams, useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { investasi_funDeleteBerita } from "../../_fun"; import { investasi_funDeleteBerita } from "../../_fun";
import { Investasi_ViewDetailBerita } from "../../_view"; import { Investasi_ViewDetailBerita } from "../../_view";
import { DIRECTORY_ID } from "@/app/lib";
import { clientLogger } from "@/util/clientLogger";
import { useShallowEffect } from "@mantine/hooks";
import { apiGetBeritaInvestasiById } from "../../_lib/api_interface";
import CustomSkeleton from "@/app_modules/components/CustomSkeleton";
export function Investasi_UiDetailBerita({
userLoginId,
}: {
userLoginId: string;
}) {
const params = useParams<{ id: string }>();
const id = params.id;
export function Investasi_UiDetailBerita({ dataBerita }: { dataBerita: any }) {
const router = useRouter(); const router = useRouter();
const [openDrawer, setOpenDrawer] = useState(false); const [openDrawer, setOpenDrawer] = useState(false);
const [openModal, setOpenModal] = useState(false); const [openModal, setOpenModal] = useState(false);
const [data, setData] = useState(dataBerita); const [data, setData] = useState<any | null>(null);
const [isLoading, setLoading] = useState(false);
async function onDelete() { useShallowEffect(() => {
const del = await investasi_funDeleteBerita({ onLoadData();
beritaId: dataBerita.id, }, []);
});
if (del.status === 200) { async function onLoadData() {
const deleteImage = await funGlobal_DeleteFileById({ try {
fileId: data.imageId, const respone = await apiGetBeritaInvestasiById({
id: id,
}); });
if (!deleteImage.success) { if (respone) {
ComponentGlobal_NotifikasiPeringatan("Gagal hapus gambar "); setData(respone.data);
} }
} catch (error) {
clientLogger.error("Error get detail berita", error);
}
}
ComponentGlobal_NotifikasiBerhasil(del.message); async function onDelete() {
setOpenModal(false); try {
router.back(); setLoading(true);
} else { const del = await investasi_funDeleteBerita({
ComponentGlobal_NotifikasiGagal(del.message); beritaId: id,
});
if (del.status === 200) {
if (data.imageId != null) {
const deleteImage = await funGlobal_DeleteFileById({
fileId: data.imageId,
dirId: DIRECTORY_ID.investasi_berita,
});
if (!deleteImage.success) {
setLoading(false);
ComponentGlobal_NotifikasiPeringatan("Gagal hapus gambar ");
}
}
router.back();
ComponentGlobal_NotifikasiBerhasil(del.message);
setOpenModal(false);
} else {
setLoading(false);
ComponentGlobal_NotifikasiGagal(del.message);
}
} catch (error) {
setLoading(false);
clientLogger.error("Error delete berita", error);
} }
} }
@@ -54,17 +96,21 @@ export function Investasi_UiDetailBerita({ dataBerita }: { dataBerita: any }) {
<UIGlobal_LayoutHeaderTamplate <UIGlobal_LayoutHeaderTamplate
title="Detail Berita" title="Detail Berita"
customButtonRight={ customButtonRight={
<ActionIcon data && userLoginId === data.investasi.authorId ? (
variant="transparent" <ActionIcon
onClick={() => setOpenDrawer(true)} variant="transparent"
> onClick={() => setOpenDrawer(true)}
<IconDotsVertical color="white" /> >
</ActionIcon> <IconDotsVertical color="white" />
</ActionIcon>
) : (
""
)
} }
/> />
} }
> >
<Investasi_ViewDetailBerita dataBerita={data} /> <Investasi_ViewDetailBerita />
</UIGlobal_LayoutTamplate> </UIGlobal_LayoutTamplate>
<UIGlobal_DrawerCustom <UIGlobal_DrawerCustom
@@ -100,6 +146,8 @@ export function Investasi_UiDetailBerita({ dataBerita }: { dataBerita: any }) {
} }
buttonKanan={ buttonKanan={
<Button <Button
loaderPosition="center"
loading={isLoading}
radius="xl" radius="xl"
color="red" color="red"
onClick={() => { onClick={() => {

View File

@@ -6,16 +6,12 @@ import {
} from "@/app_modules/_global/ui"; } from "@/app_modules/_global/ui";
import { Investasi_ViewDaftarBerita } from "../../_view"; import { Investasi_ViewDaftarBerita } from "../../_view";
export function Investasi_UiDaftarBerita({ export function Investasi_UiDaftarBerita() {
dataBerita,
}: {
dataBerita: any[];
}) {
return ( return (
<UIGlobal_LayoutTamplate <UIGlobal_LayoutTamplate
header={<UIGlobal_LayoutHeaderTamplate title="Daftar Berita" />} header={<UIGlobal_LayoutHeaderTamplate title="Daftar Berita" />}
> >
<Investasi_ViewDaftarBerita dataBerita={dataBerita} /> <Investasi_ViewDaftarBerita />
</UIGlobal_LayoutTamplate> </UIGlobal_LayoutTamplate>
); );
} }

View File

@@ -1,5 +1,6 @@
"use client"; "use client";
import { NEW_RouterInvestasi } from "@/app/lib/router_hipmi/router_investasi";
import { import {
UIGlobal_Drawer, UIGlobal_Drawer,
UIGlobal_LayoutHeaderTamplate, UIGlobal_LayoutHeaderTamplate,
@@ -7,19 +8,13 @@ import {
} from "@/app_modules/_global/ui"; } from "@/app_modules/_global/ui";
import { ActionIcon } from "@mantine/core"; import { ActionIcon } from "@mantine/core";
import { IconCirclePlus, IconDotsVertical } from "@tabler/icons-react"; import { IconCirclePlus, IconDotsVertical } from "@tabler/icons-react";
import { useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { Investasi_ViewRekapBerita } from "../../_view"; import { Investasi_ViewRekapBerita } from "../../_view";
import { NEW_RouterInvestasi } from "@/app/lib/router_hipmi/router_investasi";
export function Investasi_UiRekapBerita({ export function Investasi_UiRekapBerita() {
investasiId, const params = useParams<{ id: string }>();
dataBerita, const investasiId = params.id;
}: {
investasiId: string;
dataBerita: any[]
}) {
const router = useRouter();
const [openDrawer, setOpenDrawer] = useState(false); const [openDrawer, setOpenDrawer] = useState(false);
const listPage = [ const listPage = [
@@ -32,32 +27,32 @@ export function Investasi_UiRekapBerita({
]; ];
return ( return (
<UIGlobal_LayoutTamplate <>
header={ <UIGlobal_LayoutTamplate
<UIGlobal_LayoutHeaderTamplate header={
title="Rekap Berita" <UIGlobal_LayoutHeaderTamplate
customButtonRight={ title="Rekap Berita"
<ActionIcon customButtonRight={
variant="transparent" <ActionIcon
onClick={() => { variant="transparent"
setOpenDrawer(true); onClick={() => {
}} setOpenDrawer(true);
> }}
<IconDotsVertical color="white" /> >
</ActionIcon> <IconDotsVertical color="white" />
} </ActionIcon>
/> }
} />
> }
>
<Investasi_ViewRekapBerita />
<Investasi_ViewRekapBerita dataBerita={dataBerita} /> </UIGlobal_LayoutTamplate>
<UIGlobal_Drawer <UIGlobal_Drawer
opened={openDrawer} opened={openDrawer}
close={() => setOpenDrawer(false)} close={() => setOpenDrawer(false)}
component={listPage} component={listPage}
/> />
</UIGlobal_LayoutTamplate> </>
); );
} }

View File

@@ -1,39 +1,37 @@
import { AccentColor, MainColor } from "@/app_modules/_global/color";
import {
ComponentGlobal_BoxInformation,
ComponentGlobal_BoxUploadImage,
ComponentGlobal_InputCountDown,
} from "@/app_modules/_global/component";
import {
ComponentGlobal_NotifikasiBerhasil,
ComponentGlobal_NotifikasiGagal,
ComponentGlobal_NotifikasiPeringatan,
} from "@/app_modules/_global/notif_global";
import {
AspectRatio,
Button,
Center,
FileButton,
Image,
Stack,
Text,
TextInput,
Textarea,
} from "@mantine/core";
import { IconCamera, IconUpload } from "@tabler/icons-react";
import { DIRECTORY_ID } from "@/app/lib"; import { DIRECTORY_ID } from "@/app/lib";
import { MainColor } from "@/app_modules/_global/color";
import {
ComponentGlobal_BoxInformation,
ComponentGlobal_BoxUploadImage,
ComponentGlobal_ButtonUploadFileImage,
ComponentGlobal_InputCountDown,
} from "@/app_modules/_global/component";
import { funGlobal_UploadToStorage } from "@/app_modules/_global/fun"; import { funGlobal_UploadToStorage } from "@/app_modules/_global/fun";
import {
ComponentGlobal_NotifikasiBerhasil,
ComponentGlobal_NotifikasiGagal,
ComponentGlobal_NotifikasiPeringatan,
} from "@/app_modules/_global/notif_global";
import { clientLogger } from "@/util/clientLogger";
import {
AspectRatio,
Button,
Center,
Image,
Stack,
TextInput,
Textarea,
} from "@mantine/core";
import { Prisma } from "@prisma/client"; import { Prisma } from "@prisma/client";
import { useRouter } from "next/navigation"; import { IconPhoto } from "@tabler/icons-react";
import { useParams, useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { investasi_funCreateBerita } from "../../_fun"; import { investasi_funCreateBerita } from "../../_fun";
export function Investasi_ViewCreateBerita({ export function Investasi_ViewCreateBerita() {
investasiId, const params = useParams<{ id: string }>();
}: { const investasiId = params.id;
investasiId: string;
}) {
const router = useRouter(); const router = useRouter();
const [file, setFile] = useState<File | null>(null); const [file, setFile] = useState<File | null>(null);
const [img, setImg] = useState<any | null>(); const [img, setImg] = useState<any | null>();
@@ -48,9 +46,6 @@ export function Investasi_ViewCreateBerita({
}); });
async function onCreate() { async function onCreate() {
if (data.data.title == "" || data.data.deskripsi == "")
return ComponentGlobal_NotifikasiPeringatan("Lengkapi data");
try { try {
setIsLoading(true); setIsLoading(true);
if (file != null) { if (file != null) {
@@ -59,32 +54,39 @@ export function Investasi_ViewCreateBerita({
dirId: DIRECTORY_ID.investasi_berita, dirId: DIRECTORY_ID.investasi_berita,
}); });
if (!uploadFile.success) if (!uploadFile.success) {
return ComponentGlobal_NotifikasiPeringatan("Gagal upload gambar"); ComponentGlobal_NotifikasiPeringatan("Gagal upload gambar");
return;
}
const createWithFile = await investasi_funCreateBerita({ const createWithFile = await investasi_funCreateBerita({
data: data.data as any, data: data.data as any,
fileId: uploadFile.data.id, fileId: uploadFile.data.id,
}); });
createWithFile.status === 201 if (createWithFile.status === 201) {
? (ComponentGlobal_NotifikasiBerhasil(createWithFile.message), ComponentGlobal_NotifikasiBerhasil(createWithFile.message);
router.back()) router.back();
: ComponentGlobal_NotifikasiGagal(createWithFile.message); } else {
setIsLoading(false);
ComponentGlobal_NotifikasiGagal(createWithFile.message);
}
} else { } else {
const createNoFile = await investasi_funCreateBerita({ const createNoFile = await investasi_funCreateBerita({
data: data.data as any, data: data.data as any,
}); });
createNoFile.status === 201 if (createNoFile.status === 201) {
? (ComponentGlobal_NotifikasiBerhasil(createNoFile.message), ComponentGlobal_NotifikasiBerhasil(createNoFile.message);
router.back()) router.back();
: ComponentGlobal_NotifikasiGagal(createNoFile.message); } else {
setIsLoading(false);
ComponentGlobal_NotifikasiGagal(createNoFile.message);
}
} }
} catch (error) { } catch (error) {
console.log(error);
} finally {
setIsLoading(false); setIsLoading(false);
clientLogger.error("Error create news", error);
} }
} }
@@ -106,43 +108,16 @@ export function Investasi_ViewCreateBerita({
</AspectRatio> </AspectRatio>
) : ( ) : (
<Stack justify="center" align="center" h={"100%"}> <Stack justify="center" align="center" h={"100%"}>
<IconUpload color="white" /> <IconPhoto size={100} />
<Text fz={10} fs={"italic"} c={"white"} fw={"bold"}>
Upload Gambar
</Text>
</Stack> </Stack>
)} )}
</ComponentGlobal_BoxUploadImage> </ComponentGlobal_BoxUploadImage>
<Center> <Center>
<FileButton <ComponentGlobal_ButtonUploadFileImage
onChange={async (files: any | null) => { onSetFile={setFile}
try { onSetImage={setImg}
const buffer = URL.createObjectURL( />
new Blob([new Uint8Array(await files.arrayBuffer())])
);
setImg(buffer);
setFile(files);
} catch (error) {
console.log(error);
}
}}
accept="image/png,image/jpeg"
>
{(props) => (
<Button
{...props}
radius={"xl"}
w={100}
style={{
backgroundColor: MainColor.yellow,
border: `1px solid ${AccentColor.yellow}`,
}}
>
<IconCamera color="black" />
</Button>
)}
</FileButton>
</Center> </Center>
</Stack> </Stack>
@@ -187,6 +162,10 @@ export function Investasi_ViewCreateBerita({
</Stack> </Stack>
<Button <Button
disabled={data.data.title === "" || data.data.deskripsi === ""}
style={{
transition: "all 0.5s",
}}
loaderPosition="center" loaderPosition="center"
loading={isLoading} loading={isLoading}
my={"md"} my={"md"}

View File

@@ -3,29 +3,55 @@ import {
ComponentGlobal_LoadImageLandscape, ComponentGlobal_LoadImageLandscape,
} from "@/app_modules/_global/component"; } from "@/app_modules/_global/component";
import { Stack, Text, Title } from "@mantine/core"; import { Stack, Text, Title } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
import { Prisma } from "@prisma/client"; import { Prisma } from "@prisma/client";
import { useParams } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { apiGetBeritaInvestasiById } from "../../_lib/api_interface";
import { clientLogger } from "@/util/clientLogger";
import CustomSkeleton from "@/app_modules/components/CustomSkeleton";
export function Investasi_ViewDetailBerita({ type MODEL_DATA = Prisma.BeritaInvestasiGetPayload<{}>;
dataBerita,
}: { export function Investasi_ViewDetailBerita() {
dataBerita: any; const params = useParams<{ id: string }>();
}) { const id = params.id;
const [data, setData] =
useState<Prisma.BeritaInvestasiGetPayload<{}>>(dataBerita); const [data, setData] = useState<MODEL_DATA | null>(null);
useShallowEffect(() => {
onLoadData();
}, []);
async function onLoadData() {
try {
const respone = await apiGetBeritaInvestasiById({
id: id,
});
if (respone) {
setData(respone.data);
}
} catch (error) {
clientLogger.error("Error get detail berita", error);
}
}
if (!data) {
return <CustomSkeleton height={300} width={"100%"} />;
}
return ( return (
<> <>
<ComponentGlobal_CardStyles> <ComponentGlobal_CardStyles>
<Stack> <Stack>
{data.imageId == null ? ( {data.imagesId && (
"" <ComponentGlobal_LoadImageLandscape
) : ( fileId={data.imageId as string}
<ComponentGlobal_LoadImageLandscape fileId={data.imageId} /> />
)} )}
<Title order={4} align="center"> <Title order={4} align="center">
{" "}
{data.title} {data.title}
</Title> </Title>

View File

@@ -3,43 +3,104 @@ import {
ComponentGlobal_CardStyles, ComponentGlobal_CardStyles,
ComponentGlobal_CardLoadingOverlay, ComponentGlobal_CardLoadingOverlay,
} from "@/app_modules/_global/component"; } from "@/app_modules/_global/component";
import { Box, Title } from "@mantine/core"; import { clientLogger } from "@/util/clientLogger";
import { useRouter } from "next/navigation"; import { Box, Center, Title } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
import { useParams, useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { Investasi_SkeletonListDokumen } from "../../_component/skeleton_view";
import { apiGetBeritaInvestasiById } from "../../_lib/api_interface";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import { ScrollOnly } from "next-scroll-loader";
import ComponentGlobal_Loader from "@/app_modules/_global/component/loader";
import _ from "lodash";
export function Investasi_ViewDaftarBerita() {
const params = useParams<{ id: string }>();
const investasiId = params.id;
export function Investasi_ViewDaftarBerita({
dataBerita,
}: {
dataBerita: any[];
}) {
const router = useRouter(); const router = useRouter();
const [data, setData] = useState(dataBerita); const [data, setData] = useState<any[] | null>(null);
const [activePage, setActivePage] = useState(1);
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [dataId, setDataId] = useState(""); const [dataId, setDataId] = useState("");
useShallowEffect(() => {
onLoadData();
}, []);
async function onLoadData() {
try {
const respone = await apiGetBeritaInvestasiById({
id: investasiId,
kategori: "get-all",
page: `${activePage}`,
});
if (respone) {
setData(respone.data);
}
} catch (error) {
clientLogger.error("Error get daftar berita", error);
}
}
if (data === null) {
return <Investasi_SkeletonListDokumen />;
}
return ( return (
<> <>
<Box> {_.isEmpty(data) ? (
{data.map((e, i) => ( <ComponentGlobal_IsEmptyData />
<ComponentGlobal_CardStyles ) : (
key={i} <Box>
onClickHandler={() => { <ScrollOnly
router.push(NEW_RouterInvestasi.berita({ id: e.id }), { height="90vh"
scroll: false, renderLoading={() => (
}); <Center>
setVisible(true); <ComponentGlobal_Loader size={25} />
setDataId(e.id); </Center>
)}
data={data}
setData={setData as any}
moreData={async () => {
try {
const respone = await apiGetBeritaInvestasiById({
id: investasiId,
kategori: "get-all",
page: `${activePage + 1}`,
});
if (respone.success) {
setActivePage((val) => val + 1);
return respone.data;
}
} catch (error) {
clientLogger.error("Error load data dokumen:", error);
}
}} }}
> >
<Title order={6} lineClamp={1}> {(item) => (
{e.title} <ComponentGlobal_CardStyles
</Title> onClickHandler={() => {
{visible && dataId === e.id && ( router.push(NEW_RouterInvestasi.berita({ id: item.id }), {
<ComponentGlobal_CardLoadingOverlay /> scroll: false,
});
setVisible(true);
}}
>
<Title order={6} lineClamp={1}>
{item.title}
</Title>
{visible && <ComponentGlobal_CardLoadingOverlay />}
</ComponentGlobal_CardStyles>
)} )}
</ComponentGlobal_CardStyles> </ScrollOnly>
))} </Box>
</Box> )}
</> </>
); );
} }

View File

@@ -1,45 +1,108 @@
"use client";
import { NEW_RouterInvestasi } from "@/app/lib/router_hipmi/router_investasi"; import { NEW_RouterInvestasi } from "@/app/lib/router_hipmi/router_investasi";
import { import {
ComponentGlobal_CardLoadingOverlay, ComponentGlobal_CardLoadingOverlay,
ComponentGlobal_CardStyles, ComponentGlobal_CardStyles,
} from "@/app_modules/_global/component"; } from "@/app_modules/_global/component";
import { Box, Group, Title } from "@mantine/core"; import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import { useRouter } from "next/navigation"; import ComponentGlobal_Loader from "@/app_modules/_global/component/loader";
import { clientLogger } from "@/util/clientLogger";
import { Box, Center, Title } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
import _ from "lodash";
import { ScrollOnly } from "next-scroll-loader";
import { useParams, useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { Investasi_SkeletonListDokumen } from "../../_component/skeleton_view";
import { apiGetBeritaInvestasiById } from "../../_lib/api_interface";
export function Investasi_ViewRekapBerita() {
const params = useParams<{ id: string }>();
const investasiId = params.id;
export function Investasi_ViewRekapBerita({
dataBerita,
}: {
dataBerita: any[];
}) {
const router = useRouter(); const router = useRouter();
const [data, setData] = useState(dataBerita); const [data, setData] = useState<any[] | null>(null);
const [activePage, setActivePage] = useState(1);
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [dataId, setDataId] = useState("");
useShallowEffect(() => {
onLoadData();
}, []);
async function onLoadData() {
try {
const respone = await apiGetBeritaInvestasiById({
id: investasiId,
kategori: "get-all",
page: `${activePage}`,
});
if (respone) {
setData(respone.data);
}
} catch (error) {
clientLogger.error("Error get data berita", error);
}
}
if (data === null) {
return <Investasi_SkeletonListDokumen />;
}
return ( return (
<> <>
<Box> {_.isEmpty(data) ? (
{data.map((e, i) => ( <ComponentGlobal_IsEmptyData />
<ComponentGlobal_CardStyles ) : (
key={i} <Box>
onClickHandler={() => { <ScrollOnly
router.push(NEW_RouterInvestasi.berita({ id: e.id }), { height="90vh"
scroll: false, renderLoading={() => (
}); <Center>
setVisible(true); <ComponentGlobal_Loader size={25} />
setDataId(e.id); </Center>
)}
data={data}
setData={setData as any}
moreData={async () => {
try {
const respone = await apiGetBeritaInvestasiById({
id: investasiId,
kategori: "get-all",
page: `${activePage + 1}`,
});
if (respone.success) {
setActivePage((val) => val + 1);
return respone.data;
}
} catch (error) {
clientLogger.error("Error load data dokumen:", error);
}
}} }}
> >
<Title order={6} lineClamp={1}> {(item) => (
{e.title} <ComponentGlobal_CardStyles
</Title> onClickHandler={() => {
{visible && dataId === e.id && ( router.push(NEW_RouterInvestasi.berita({ id: item.id }), {
<ComponentGlobal_CardLoadingOverlay /> scroll: false,
});
setVisible(true);
}}
>
<Title order={6} lineClamp={1}>
{item.title}
</Title>
{visible && (
<ComponentGlobal_CardLoadingOverlay />
)}
</ComponentGlobal_CardStyles>
)} )}
</ComponentGlobal_CardStyles> </ScrollOnly>
))} </Box>
</Box> )}
</> </>
); );
} }

View File

@@ -22,7 +22,6 @@ const middlewareConfig: MiddlewareConfig = {
// registarasiPath: "/register", // registarasiPath: "/register",
userPath: "/dev/home", userPath: "/dev/home",
publicRoutes: [ publicRoutes: [
// API // API
"/", "/",
"/api/voting/*", "/api/voting/*",
@@ -35,7 +34,7 @@ const middlewareConfig: MiddlewareConfig = {
"/api/event/*", "/api/event/*",
// "/api/image/*", // "/api/image/*",
// "/api/user", // "/api/user",
// "/api/new/*", "/api/new/*",
// Akses awal // Akses awal
"/api/get-cookie", "/api/get-cookie",
"/api/user/activation", "/api/user/activation",
@@ -104,7 +103,7 @@ export const middleware = async (req: NextRequest) => {
if ( if (
isPublicRoute && isPublicRoute &&
pathname !== loginPath pathname !== loginPath
// && // &&
// pathname !== validasiPath && // pathname !== validasiPath &&
// pathname !== registarasiPath // pathname !== registarasiPath