diff --git a/src/app/api/event/status/[name]/route.ts b/src/app/api/event/status/[name]/route.ts new file mode 100644 index 00000000..6981cd40 --- /dev/null +++ b/src/app/api/event/status/[name]/route.ts @@ -0,0 +1,85 @@ +import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; +import backendLogger from "@/util/backendLogger"; +import _ from "lodash"; +import { NextResponse } from "next/server"; + +export async function GET( + request: Request, + { params }: { params: { name: string } } +) { + try { + let fixData; + const { name } = params; + const { searchParams } = new URL(request.url); + const page = searchParams.get("page"); + const takeData = 6; + const skipData = Number(page) * takeData - takeData; + + const userLoginId = await funGetUserIdByToken(); + if (!userLoginId) { + return NextResponse.json( + { + success: false, + message: "Gagal mendapatkan data", + reason: "User Unauthorized", + }, + { + status: 401, + } + ); + } + + if (!page) { + fixData = await prisma.event.findMany({ + orderBy: { + updatedAt: "desc", + }, + where: { + active: true, + authorId: userLoginId, + isArsip: false, + }, + include: { + EventMaster_Status: true, + }, + }); + } else { + const fixStatusName = _.startCase(name); + + fixData = await prisma.event.findMany({ + take: takeData, + skip: skipData, + orderBy: { + tanggal: "asc", + }, + where: { + active: true, + authorId: userLoginId, + isArsip: false, + EventMaster_Status: { + name: fixStatusName || name, + }, + }, + include: { + EventMaster_Status: true, + }, + }); + } + + return NextResponse.json({ + success: true, + message: "Success", + data: fixData, + }); + } catch (error) { + backendLogger.error("Error get data event ", error); + return NextResponse.json( + { + success: false, + message: "Failed to get data", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +} diff --git a/src/app/dev/event/main/status/[id]/page.tsx b/src/app/dev/event/main/status/[id]/page.tsx index b2c2c353..174d569d 100644 --- a/src/app/dev/event/main/status/[id]/page.tsx +++ b/src/app/dev/event/main/status/[id]/page.tsx @@ -1,25 +1,21 @@ import { Event_StatusPage } from "@/app_modules/event"; import { - event_getAllByStatusId, - event_getMasterStatus, + event_getAllByStatusId, + event_getMasterStatus, } from "@/app_modules/event/fun"; async function Page({ params }: { params: { id: string } }) { - let statusId = params.id; - const listStatus = await event_getMasterStatus(); + // let statusId = params.id; + // const listStatus = await event_getMasterStatus(); - const dataStatus = await event_getAllByStatusId({ - page: 1, - statusId: statusId, - }); + // const dataStatus = await event_getAllByStatusId({ + // page: 1, + // statusId: statusId, + // }); return ( <> - + ); } diff --git a/src/app_modules/event/component/box_list_status.tsx b/src/app_modules/event/component/box_list_status.tsx index ccf1dd41..bcc450f6 100644 --- a/src/app_modules/event/component/box_list_status.tsx +++ b/src/app_modules/event/component/box_list_status.tsx @@ -39,7 +39,7 @@ export default function ComponentEvent_BoxListStatus({ {new Intl.DateTimeFormat("id-ID", { dateStyle: "medium", - }).format(data.tanggal)} + }).format(new Date(data.tanggal))} diff --git a/src/app_modules/event/component/button/api_fetch_event.ts b/src/app_modules/event/component/button/api_fetch_event.ts new file mode 100644 index 00000000..a6c6823e --- /dev/null +++ b/src/app_modules/event/component/button/api_fetch_event.ts @@ -0,0 +1,45 @@ +export { apiGetEventByStatus }; + +const apiGetEventByStatus = async ({ + status, + page, +}: { + status: string; + page: string; +}) => { + try { + // Fetch token from cookie + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) { + console.error("No token found"); + return null; + } + + // Send PUT request to update portfolio logo + const isPage = `?page=${page}`; + const response = await fetch(`/api/event/status/${status}${isPage}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${token}`, + }, + }); + + // Check if the response is OK + if (!response.ok) { + const errorData = await response.json().catch(() => null); + console.error( + "Error updating portfolio logo:", + errorData?.message || "Unknown error" + ); + + return null; + } + + return await response.json(); + } catch (error) { + console.error("Error updating portfolio medsos:", error); + throw error; // Re-throw the error to handle it in the calling function + } +}; diff --git a/src/app_modules/event/component/button/button_create_event.tsx b/src/app_modules/event/component/button/button_create_event.tsx index c29f96d8..0529c7ec 100644 --- a/src/app_modules/event/component/button/button_create_event.tsx +++ b/src/app_modules/event/component/button/button_create_event.tsx @@ -1,21 +1,19 @@ -import { IRealtimeData } from "@/lib/global_state"; -import { RouterEvent } from "@/lib/router_hipmi/router_event"; import { MainColor } from "@/app_modules/_global/color"; import { ComponentGlobal_NotifikasiBerhasil, ComponentGlobal_NotifikasiGagal, - ComponentGlobal_NotifikasiPeringatan, } from "@/app_modules/_global/notif_global"; import { notifikasiToAdmin_funCreate } from "@/app_modules/notifikasi/fun"; +import { IRealtimeData } from "@/lib/global_state"; +import { RouterEvent } from "@/lib/router_hipmi/router_event"; import { Button } from "@mantine/core"; import { useAtom } from "jotai"; -import moment from "moment"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { WibuRealtime } from "wibu-pkg"; import { Event_funCreate } from "../../fun/create/fun_create"; import { gs_event_hotMenu } from "../../global_state"; -import { event_checkStatus } from "../../fun/get/fun_check_status_by_id"; +import { clientLogger } from "@/util/clientLogger"; export default function Event_ComponentCreateButton({ value, @@ -31,42 +29,47 @@ export default function Event_ComponentCreateButton({ const [isLoading, setLoading] = useState(false); async function onSave() { - - const res = await Event_funCreate(value); + try { + setLoading(true); + const res = await Event_funCreate(value); - if (res.status === 201) { - const dataNotifikasi: IRealtimeData = { - appId: res.data?.id as any, - status: res.data?.EventMaster_Status?.name as any, - userId: res.data?.authorId as any, - pesan: res.data?.title as any, - kategoriApp: "EVENT", - title: "Event baru", - }; + if (res.status === 201) { + const dataNotifikasi: IRealtimeData = { + appId: res.data?.id as any, + status: res.data?.EventMaster_Status?.name as any, + userId: res.data?.authorId as any, + pesan: res.data?.title as any, + kategoriApp: "EVENT", + title: "Event baru", + }; - const notif = await notifikasiToAdmin_funCreate({ - data: dataNotifikasi as any, - }); - - if (notif.status === 201) { - WibuRealtime.setData({ - type: "notification", - pushNotificationTo: "ADMIN", + const notif = await notifikasiToAdmin_funCreate({ + data: dataNotifikasi as any, }); - WibuRealtime.setData({ - type: "trigger", - pushNotificationTo: "ADMIN", - dataMessage: dataNotifikasi, - }); + if (notif.status === 201) { + WibuRealtime.setData({ + type: "notification", + pushNotificationTo: "ADMIN", + }); - ComponentGlobal_NotifikasiBerhasil(res.message); - setHotMenu(1); - setLoading(true); - router.push(RouterEvent.status({ id: "2" }), { scroll: false }); + WibuRealtime.setData({ + type: "trigger", + pushNotificationTo: "ADMIN", + dataMessage: dataNotifikasi, + }); + + ComponentGlobal_NotifikasiBerhasil(res.message); + setHotMenu(1); + router.push(RouterEvent.status({ id: "2" }), { scroll: false }); + } + } else { + setLoading(false); + ComponentGlobal_NotifikasiGagal(res.message); } - } else { - ComponentGlobal_NotifikasiGagal(res.message); + } catch (error) { + setLoading(false); + clientLogger.error("Error create event", error); } } diff --git a/src/app_modules/event/fun/create/fun_create.ts b/src/app_modules/event/fun/create/fun_create.ts index 3b082a75..20cc407f 100644 --- a/src/app_modules/event/fun/create/fun_create.ts +++ b/src/app_modules/event/fun/create/fun_create.ts @@ -6,33 +6,40 @@ import { revalidatePath } from "next/cache"; import _ from "lodash"; export async function Event_funCreate(req: MODEL_EVENT) { - const res = await prisma.event.create({ - data: { - title: _.startCase(req.title), - lokasi: req.lokasi, - deskripsi: req.deskripsi, - eventMaster_TipeAcaraId: req.eventMaster_TipeAcaraId, - tanggal: req.tanggal, - tanggalSelesai: req.tanggalSelesai, - authorId: req.authorId, - }, - select: { - id: true, - title: true, - EventMaster_Status: { - select: { - name: true, - }, + try { + const res = await prisma.event.create({ + data: { + title: _.startCase(req.title), + lokasi: req.lokasi, + deskripsi: req.deskripsi, + eventMaster_TipeAcaraId: req.eventMaster_TipeAcaraId, + tanggal: req.tanggal, + tanggalSelesai: req.tanggalSelesai, + authorId: req.authorId, }, - authorId: true, - }, - }); + select: { + id: true, + title: true, + EventMaster_Status: { + select: { + name: true, + }, + }, + authorId: true, + }, + }); - if (!res) return { status: 400, message: "Gagal Disimpan" }; - revalidatePath("/dev/event/main/status_page"); - return { - data: res, - status: 201, - message: "Berhasil Disimpan", - }; + if (!res) return { status: 400, message: "Gagal disimpan" }; + revalidatePath("/dev/event/main/status_page"); + return { + data: res, + status: 201, + message: "Berhasil disimpan", + }; + } catch (error) { + return { + status: 500, + message: "Error create event", + }; + } } diff --git a/src/app_modules/event/main/status_page/index.tsx b/src/app_modules/event/main/status_page/index.tsx index f186834e..3df587ce 100644 --- a/src/app_modules/event/main/status_page/index.tsx +++ b/src/app_modules/event/main/status_page/index.tsx @@ -7,28 +7,23 @@ import { } from "@/app_modules/_global/color/color_pallet"; import { MODEL_NEW_DEFAULT_MASTER } from "@/app_modules/model_global/interface"; import { Box, Stack, Tabs } from "@mantine/core"; -import { useRouter } from "next/navigation"; +import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; import Event_StatusDraft from "./draft"; import Event_StatusPublish from "./publish"; import Event_StatusReject from "./reject"; import Event_StatusReview from "./review"; +import { globalStatusApp } from "@/app_modules/_global/lib"; +import Event_ViewStatus from "./view_status"; -export default function Event_StatusPage({ - statusId, - dataStatus, - listStatus, -}: { - statusId: string; - dataStatus: any[]; - listStatus: MODEL_NEW_DEFAULT_MASTER[]; -}) { +export default function Event_StatusPage() { + // const [changeStatus, setChangeStatus] = useState(statusId); + // async function onChangeStatus({ statusId }: { statusId: string }) { + // router.replace(RouterEvent.status({ id: statusId })); + // } const router = useRouter(); - const [changeStatus, setChangeStatus] = useState(statusId); - - async function onChangeStatus({ statusId }: { statusId: string }) { - router.replace(RouterEvent.status({ id: statusId })); - } + const param = useParams<{ id: string }>(); + const statusId = param.id; return ( <> @@ -36,10 +31,10 @@ export default function Event_StatusPage({ variant="pills" radius="xl" mt={1} - value={changeStatus} + defaultValue={statusId} + value={statusId} onTabChange={(val: any) => { - setChangeStatus(val); - onChangeStatus({ statusId: val }); + router.replace(RouterEvent.status({ id: val })); }} styles={{ tabsList: { @@ -52,18 +47,21 @@ export default function Event_StatusPage({ > - {listStatus.map((e) => ( + {globalStatusApp.map((e) => ( - + + + {/* {changeStatus === "1" && ( )} @@ -86,7 +86,7 @@ export default function Event_StatusPage({ {changeStatus === "4" && ( )} - + */} diff --git a/src/app_modules/event/main/status_page/view_status.tsx b/src/app_modules/event/main/status_page/view_status.tsx new file mode 100644 index 00000000..6b05ce78 --- /dev/null +++ b/src/app_modules/event/main/status_page/view_status.tsx @@ -0,0 +1,111 @@ +"use client"; + +import { RouterEvent } from "@/lib/router_hipmi/router_event"; +import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data"; +import ComponentGlobal_Loader from "@/app_modules/_global/component/loader"; +import { Box, Center, Stack } from "@mantine/core"; +import _ from "lodash"; +import { ScrollOnly } from "next-scroll-loader"; +import { useState } from "react"; +import ComponentEvent_BoxListStatus from "../../component/box_list_status"; +import { event_getAllByStatusId } from "../../fun"; +import { MODEL_EVENT } from "../../_lib/interface"; +import { useParams } from "next/navigation"; +import { globalStatusApp } from "@/app_modules/_global/lib"; +import { apiGetJobByStatus } from "@/app_modules/job/component/api_fetch_job"; +import { clientLogger } from "@/util/clientLogger"; +import { useShallowEffect } from "@mantine/hooks"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; +import { apiGetEventByStatus } from "../../component/button/api_fetch_event"; + +export default function Event_ViewStatus() { + const param = useParams<{ id: string }>(); + const [data, setData] = useState(null); + const [activePage, setActivePage] = useState(1); + + useShallowEffect(() => { + handleLoadData(); + }, []); + + const handleLoadData = async () => { + try { + const cek = globalStatusApp.find((e) => e.id === param.id); + const response = await apiGetEventByStatus({ + status: cek?.name as string, + page: `${activePage}`, + }); + if (response.success) { + setData(response.data); + } + } catch (error) { + clientLogger.error("Error get job", error); + } + }; + + const hanldeMoreData = async () => { + try { + const cek = globalStatusApp.find((e) => e.id === param.id); + const nextPage = activePage + 1; + const response = await apiGetEventByStatus({ + status: cek?.name as string, + page: `${nextPage}`, + }); + if (response.success) { + setActivePage(nextPage); + return response.data; + } + } catch (error) { + clientLogger.error("Error get job", error); + } + }; + + if (!data) + return ( + <> + + + + + + ); + + return ( + <> + {_.isEmpty(data) ? ( + + ) : ( + // --- Main component --- // + + ( +
+ +
+ )} + data={data} + setData={setData as any} + moreData={hanldeMoreData} + > + {(item) => ( + + )} +
+
+ )} + + ); +} diff --git a/src/app_modules/user_search/component/api_fetch_user_search.ts b/src/app_modules/user_search/component/api_fetch_user_search.ts index 513f788b..cf85a88e 100644 --- a/src/app_modules/user_search/component/api_fetch_user_search.ts +++ b/src/app_modules/user_search/component/api_fetch_user_search.ts @@ -10,7 +10,7 @@ export const apiGetUserSearch = async ({ const isPage = page ? `?page=${page}` : ""; const isSearch = search ? `&search=${search}` : ""; - console.log("page", page); + const response = await fetch(`/api/user${isPage}${isSearch}`, { method: "GET", headers: { diff --git a/src/middleware.ts b/src/middleware.ts index a8abf4e0..2d1112c2 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -29,7 +29,7 @@ const middlewareConfig: MiddlewareConfig = { "/api/logs/*", "/api/auth/*", "/api/origin-url", - "/api/event/*", + // "/api/event/*", // ADMIN API // >> buat dibawah sini <<