diff --git a/next.config.js b/next.config.js index 5c728631..79d67970 100644 --- a/next.config.js +++ b/next.config.js @@ -1,10 +1,9 @@ /** @type {import('next').NextConfig} */ const nextConfig = { - reactStrictMode: false, - experimental: { - serverActions: true - }, - -} + reactStrictMode: false, + experimental: { + serverActions: true, + }, +}; -module.exports = nextConfig +module.exports = nextConfig; diff --git a/src/app/api/event/check-kehadiran/route.ts b/src/app/api/event/check-kehadiran/route.ts index 3b2ef875..083f6e05 100644 --- a/src/app/api/event/check-kehadiran/route.ts +++ b/src/app/api/event/check-kehadiran/route.ts @@ -11,5 +11,5 @@ export async function GET(req: Request) { userId: userId as string, }); - return NextResponse.json({ res }); + return NextResponse.json(res, { status: 200 }); } diff --git a/src/app/api/event/get-all-by-userId/route.ts b/src/app/api/event/get-all-by-userId/route.ts deleted file mode 100644 index 2ae65ce8..00000000 --- a/src/app/api/event/get-all-by-userId/route.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NextResponse } from "next/server"; - -export async function GET(params: Request) { - const { searchParams } = new URL(params.url); - const userId = searchParams.get("userId"); - - - return NextResponse.json({ userId }); -} \ No newline at end of file diff --git a/src/app/api/event/get-all/route.ts b/src/app/api/event/get-all/route.ts new file mode 100644 index 00000000..33e9c89a --- /dev/null +++ b/src/app/api/event/get-all/route.ts @@ -0,0 +1,12 @@ +import { event_getListAllPublish } from "@/app_modules/event/fun/get/get_list_all_publish"; +import { toNumber } from "lodash"; +import { NextResponse } from "next/server"; + +export async function GET(params: Request) { + const { searchParams } = new URL(params.url); + const page = searchParams.get("page"); + + const data = await event_getListAllPublish({ page: toNumber(page) }); + + return NextResponse.json({ data }); +} diff --git a/src/app/api/event/get-one-by-id/route.ts b/src/app/api/event/get-one-by-id/route.ts new file mode 100644 index 00000000..7ab66fac --- /dev/null +++ b/src/app/api/event/get-one-by-id/route.ts @@ -0,0 +1,21 @@ +import { event_getOneById } from "@/app_modules/event/fun/get/get_one_by_id"; +import { NextResponse } from "next/server"; + +export async function GET(params: Request) { + const { searchParams } = new URL(params.url); + const eventId = searchParams.get("eventId"); + + const res = await event_getOneById(eventId as string); + + if (!res) { + return NextResponse.json( + { message: "Event Not Found", data: null }, + { status: 404 } + ); + } + + return NextResponse.json( + { message: "Event Found", data: res }, + { status: 200 } + ); +} diff --git a/src/app/dev/event/create/page.tsx b/src/app/dev/event/create/page.tsx index 5363ccb1..b731e460 100644 --- a/src/app/dev/event/create/page.tsx +++ b/src/app/dev/event/create/page.tsx @@ -1,9 +1,9 @@ -import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; +import { newFunGetUserId } from "@/app/lib/new_fun_user_id"; import { Event_Create } from "@/app_modules/event"; import { Event_getMasterTipeAcara } from "@/app_modules/event/fun/master/get_tipe_acara"; export default async function Page() { - const userLoginId = await funGetUserIdByToken(); + const userLoginId = await newFunGetUserId(); const listTipeAcara = await Event_getMasterTipeAcara(); return ( diff --git a/src/app/dev/event/konfirmasi/[id]/page.tsx b/src/app/dev/event/konfirmasi/[id]/page.tsx index eb04ea33..05703cb1 100644 --- a/src/app/dev/event/konfirmasi/[id]/page.tsx +++ b/src/app/dev/event/konfirmasi/[id]/page.tsx @@ -1,33 +1,35 @@ import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; import Ui_Konfirmasi from "@/app_modules/event/_ui/konfirmasi"; -import { - event_funCheckKehadiran, - event_funCheckPesertaByUserId, -} from "@/app_modules/event/fun"; +import { event_funCheckPesertaByUserId } from "@/app_modules/event/fun"; import { event_getOneById } from "@/app_modules/event/fun/get/get_one_by_id"; import moment from "moment"; import { redirect } from "next/navigation"; -export default async function Page({ params }: { params: { id: string } }) { - const eventId = params.id; - const userLoginId = await funGetUserIdByToken(); - const dataEvent = await event_getOneById(eventId); +export default async function Page({ + params, +}: { + params: Promise<{ id: string }>; +}) { + const eventId = (await params).id; - const checkPeserta = await event_funCheckPesertaByUserId({ - eventId: eventId, - userId: userLoginId as string, - }); - if (dataEvent == null) return redirect("/dev/event/main/beranda"); + // const userLoginId = await funGetUserIdByToken(); - if (moment(dataEvent?.tanggal).diff(moment(), "minutes") > 0) - return redirect("/dev/event/main/beranda"); + // const checkPeserta = await event_funCheckPesertaByUserId({ + // eventId: eventId, + // userId: userLoginId as string, + // }); - if (dataEvent?.isArsip) - return redirect(`/dev/event/detail/riwayat/${dataEvent.id}`); + // if (dataEvent == null) return redirect("/dev/event/main/beranda"); - if (checkPeserta == false) - return redirect(`/dev/event/detail/main/${eventId}`); + // if (moment(dataEvent?.tanggal).diff(moment(), "minutes") > 0) + // return redirect("/dev/event/main/beranda"); + + // if (dataEvent?.isArsip) + // return redirect(`/dev/event/detail/riwayat/${dataEvent.id}`); + + // if (checkPeserta == false) + // return redirect(`/dev/event/detail/main/${eventId}`); // if (checkKehadiran) { // return redirect(`/dev/event/main/beranda`); @@ -35,10 +37,7 @@ export default async function Page({ params }: { params: { id: string } }) { return ( <> - + ); } diff --git a/src/app/dev/event/main/beranda/page.tsx b/src/app/dev/event/main/beranda/page.tsx index e5201847..5bde2a88 100644 --- a/src/app/dev/event/main/beranda/page.tsx +++ b/src/app/dev/event/main/beranda/page.tsx @@ -1,12 +1,10 @@ import { Event_Beranda } from "@/app_modules/event"; -import { event_getListAllPublish } from "@/app_modules/event/fun/get/get_list_all_publish"; export default async function Page() { - const dataEvent = await event_getListAllPublish({ page: 1 }); return ( <> - + ); } diff --git a/src/app/lib/api_user_router/route_api_event.ts b/src/app/lib/api_user_router/route_api_event.ts new file mode 100644 index 00000000..1394e4ec --- /dev/null +++ b/src/app/lib/api_user_router/route_api_event.ts @@ -0,0 +1,7 @@ +export const API_RouteEvent = { + get_all: ({ page }: { page: number }) => `/api/event/get-all?page=${page}`, + get_one_by_id: ({ eventId }: { eventId: string }) => + `/api/event/get-one-by-id?eventId=${eventId}`, + check_kehadiran: ({ eventId, userId }: { eventId: string; userId: string }) => + `/api/event/check-kehadiran?eventId=${eventId}&userId=${userId}`, +}; diff --git a/src/app_modules/admin/event/_view/view_table_review.tsx b/src/app_modules/admin/event/_view/view_table_review.tsx index 4b9ab12c..4b64fb13 100644 --- a/src/app_modules/admin/event/_view/view_table_review.tsx +++ b/src/app_modules/admin/event/_view/view_table_review.tsx @@ -108,15 +108,15 @@ export default function AdminEvent_ComponentTableReview({ async function onPublish({ eventId, - tanggalSelesai, + tanggal, }: { eventId: string; - tanggalSelesai: Date; + tanggal: Date; }) { const checkStatus = await event_checkStatus({ id: eventId }); if (checkStatus) { - if (moment(tanggalSelesai).diff(Date.now(), "minutes") < 0) + if (moment(tanggal).diff(Date.now(), "minutes") < 0) return ComponentGlobal_NotifikasiPeringatan( "Waktu acara telah lewat, Report untuk memberitahu user !" ); @@ -267,7 +267,7 @@ export default function AdminEvent_ComponentTableReview({ - +
@@ -286,7 +286,7 @@ export default function AdminEvent_ComponentTableReview({ onClick={() => onPublish({ eventId: e.id, - tanggalSelesai: e.tanggalSelesai, + tanggal: e.tanggal, }) } > @@ -297,7 +297,7 @@ export default function AdminEvent_ComponentTableReview({ leftIcon={} radius={"xl"} onClick={async () => { - const checkStatus = await event_checkStatus({ id: eventId }); + const checkStatus = await event_checkStatus({ id: e.id }); if (checkStatus) { open(); diff --git a/src/app_modules/event/_ui/konfirmasi.tsx b/src/app_modules/event/_ui/konfirmasi.tsx index ec95fc00..90194d65 100644 --- a/src/app_modules/event/_ui/konfirmasi.tsx +++ b/src/app_modules/event/_ui/konfirmasi.tsx @@ -4,7 +4,17 @@ import { UIGlobal_LayoutDefault, UIGlobal_LayoutTamplate, } from "@/app_modules/_global/ui"; -import { Button, Paper, Skeleton, Stack, Text, Title } from "@mantine/core"; +import { + Button, + Card, + Center, + Group, + Paper, + Skeleton, + Stack, + Text, + Title, +} from "@mantine/core"; import { MODEL_EVENT } from "../model/interface"; import { useShallowEffect } from "@mantine/hooks"; import { AccentColor, MainColor } from "@/app_modules/_global/color"; @@ -13,112 +23,328 @@ import { ComponentGlobal_NotifikasiBerhasil, ComponentGlobal_NotifikasiGagal, } from "@/app_modules/_global/notif_global"; -import { useRouter } from "next/navigation"; +import { redirect, useRouter } from "next/navigation"; import { RouterEvent } from "@/app/lib/router_hipmi/router_event"; import { useState } from "react"; +import { API_RouteEvent } from "@/app/lib/api_user_router/route_api_event"; +import { ComponentGlobal_CardStyles } from "@/app_modules/_global/component"; +import moment from "moment"; +import { gs_event_hotMenu } from "../global_state"; +import { useAtom } from "jotai"; export default function Ui_Konfirmasi({ - dataEvent, userLoginId, + eventId, }: { - dataEvent: MODEL_EVENT; userLoginId: string; + eventId: string; }) { // console.log(dataEvent); const router = useRouter(); - const [isLoading, setLoading] = useState(false); + const [data, setData] = useState(null); const [isPresent, setIsPresent] = useState(null); useShallowEffect(() => { - onLoadKehadiran({ - onChange(val) { - setIsPresent(val); - }, - }); - }, [setIsPresent]); + onLoadData(); + }, []); - async function onLoadKehadiran({ - onChange, - }: { - onChange: (val: boolean) => void; - }) { - const res = await fetch( - `/api/event/check-kehadiran?userId=${userLoginId}&eventId=${dataEvent.id}` + async function onLoadData() { + const data = await fetch( + API_RouteEvent.get_one_by_id({ eventId: eventId }) ); - const checkKehadiran = await res.json(); - - onChange(checkKehadiran.res); - } - async function onUpdateKonfirmasi() { - setLoading(true); - const res = await event_funUpdateKehadiran({ - eventId: dataEvent.id, - userId: userLoginId, - }); - - if (res.status === 200) { - ComponentGlobal_NotifikasiBerhasil(res.message, 2000); - router.push(RouterEvent.detail_main + dataEvent.id); - } else { - setLoading(false); - ComponentGlobal_NotifikasiGagal(res.message); - } + const res = await data.json(); + console.log(res.data, "data event"); + setData(res.data); } - console.log(isPresent, "isPresent"); + useShallowEffect(() => { + onLoadKehadiran(); + }, []); + + async function onLoadKehadiran() { + const res = await fetch( + API_RouteEvent.check_kehadiran({ eventId: eventId, userId: userLoginId }) + ); + const data = await res.json(); + + setIsPresent(data); + } + + // console.log("kehadiran:", isPresent); + // console.log("data:", data); + + if (data == null && isPresent == null) { + return ; + } + + if (data == null) { + return ( + <> + + + ); + } + + if (moment(data?.tanggal).diff(moment(), "minute") < 0) { + return ( + <> + + + ); + } + + if (isPresent && data) { + return ; + } + + if (isPresent == false && data) { + return ( + + ); + } + // const tgl = moment(data?.tanggal).diff(moment(), "minute") < 0; + // return ( + // <> + // + // + // {JSON.stringify(tgl)} + // + // + // + // ); +} + +function DataNotFound() { + const router = useRouter(); + const [isLoading, setLoading] = useState(false); + const [hotMenu, setHotMenu] = useAtom(gs_event_hotMenu); return ( <> - - {isPresent == null ? ( - - ) : isPresent ? ( - - - - Anda telah terkonfirmasi silahkan kembali ke beranda ! - - {dataEvent.title} - - - - ) : ( - - - - Anda mengkonfirmasi bahwa anda telah datang & ikut menghadir - di event - - {dataEvent.title} - - - - )} + + + + + Data Event Tidak Ditemukan + + + + + + + + + ); +} + +function SkeletonIsDataNull() { + return ( + <> + + + + + {" "} + {" "} + +
+ +
+
+
+
+
+ + ); +} + +function EventAlreadyDone({ + title, + eventId, +}: { + title: string; + eventId: string; +}) { + const router = useRouter(); + const [isLoading, setLoading] = useState(false); + const [isLoadingDetail, setLoadingDetail] = useState(false); + const [hotMenu, setHotMenu] = useAtom(gs_event_hotMenu); + + return ( + <> + + + + + + Kami mohon maaf, Bapak/Ibu, acara{" "} + + {title} + {" "} + telah selesai, sehingga konfirmasi kehadiran sudah tidak dapat + dilakukan. Terima kasih atas perhatian dan minat Anda. Kami + berharap dapat bertemu di acara kami berikutnya. Terima kasih, + Bapak/Ibu, kehadiran Anda di acara. + + + + + + + + + + + + ); +} + +function UserNotConfirm({ + title, + eventId, + userLoginId, +}: { + title: string; + eventId: string; + userLoginId: string; +}) { + const router = useRouter(); + const [isLoading, setLoading] = useState(false); + async function onUpdateKonfirmasi() { + setLoading(true); + const res = await event_funUpdateKehadiran({ + eventId: eventId, + userId: userLoginId, + }); + + if (res.status === 200) { + ComponentGlobal_NotifikasiBerhasil(res.message, 2000); + router.push(RouterEvent.detail_main + eventId); + } else { + setLoading(false); + ComponentGlobal_NotifikasiGagal(res.message); + } + } + return ( + <> + + + + + + Terima kasih atas kehadiran Anda di acara{" "} + + {title} + {" "} + pada hari ini. Mohon untuk mengonfirmasi kehadiran Anda dengan + menekan tombol {"Hadir"} atau fitur konfirmasi yang tersedia di + bawah. Terima kasih dan selamat menikmati acara. + + + + + + + + + ); +} + +function UserAlreadyConfirm({ title }: { title: string }) { + const router = useRouter(); + const [isLoading, setLoading] = useState(false); + const [hotMenu, setHotMenu] = useAtom(gs_event_hotMenu); + + return ( + <> + + + + + + Terima kasih, Bapak/Ibu, kehadiran Anda di acara{" "} + + {title} + {" "} + telah berhasil dikonfirmasi. Kami senang menyambut Anda dan + semoga acara ini memberikan manfaat yang maksimal. Selamat + mengikuti kegiatan. + + + + + diff --git a/src/app_modules/event/component/card_view/card_beranda.tsx b/src/app_modules/event/component/card_view/card_beranda.tsx index d751c207..adb952fa 100644 --- a/src/app_modules/event/component/card_view/card_beranda.tsx +++ b/src/app_modules/event/component/card_view/card_beranda.tsx @@ -34,11 +34,11 @@ export function ComponentEvent_CardBeranda({ data }: { data: any }) { {data.title} - + {/* {new Intl.DateTimeFormat("id-ID", { dateStyle: "medium", - }).format(data.tanggal)} - + }).format(data?.tanggal)} + */} diff --git a/src/app_modules/event/component/index.ts b/src/app_modules/event/component/index.ts index d9cc4eeb..b146da16 100644 --- a/src/app_modules/event/component/index.ts +++ b/src/app_modules/event/component/index.ts @@ -1,5 +1,7 @@ import Event_ComponentCreateButton from "./button/button_create_event"; +import Event_ComponentSkeletonBeranda from "./skeleton/comp_skeleton_beranda"; import { Event_ComponentSkeletonDetailData } from "./skeleton/comp_skeleton_detail_data"; export { Event_ComponentSkeletonDetailData }; export { Event_ComponentCreateButton }; +export { Event_ComponentSkeletonBeranda }; diff --git a/src/app_modules/event/component/skeleton/comp_skeleton_beranda.tsx b/src/app_modules/event/component/skeleton/comp_skeleton_beranda.tsx new file mode 100644 index 00000000..e45a9247 --- /dev/null +++ b/src/app_modules/event/component/skeleton/comp_skeleton_beranda.tsx @@ -0,0 +1,29 @@ +import { AccentColor } from "@/app_modules/_global/color"; +import { ComponentGlobal_CardStyles } from "@/app_modules/_global/component"; +import { Grid, Group, Paper, Skeleton, Stack, Text } from "@mantine/core"; + +export default function Event_ComponentSkeletonBeranda() { + return ( + <> + {Array.from({ length: 10 }).map((_, index) => ( + + + + + + + + + + + + + + + + + + ))} + + ); +} diff --git a/src/app_modules/event/main/beranda.tsx b/src/app_modules/event/main/beranda.tsx index 3387a29b..33565488 100644 --- a/src/app_modules/event/main/beranda.tsx +++ b/src/app_modules/event/main/beranda.tsx @@ -13,6 +13,7 @@ import { Loader, rem, Skeleton, + Paper, } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { useAtom } from "jotai"; @@ -22,12 +23,10 @@ import { useState } from "react"; import { ComponentEvent_CardBeranda } from "../component/card_view/card_beranda"; import { event_getListAllPublish } from "../fun/get/get_list_all_publish"; import { MODEL_EVENT } from "../model/interface"; +import { Event_ComponentSkeletonBeranda } from "../component"; +import { API_RouteEvent } from "@/app/lib/api_user_router/route_api_event"; -export default function Event_Beranda({ - dataEvent, -}: { - dataEvent: MODEL_EVENT[]; -}) { +export default function Event_Beranda() { const [data, setData] = useState(null); const [activePage, setActivePage] = useState(1); const [isLoading, setIsLoading] = useState(false); @@ -39,6 +38,7 @@ export default function Event_Beranda({ const [isShowUpdate, setIsShowUpdate] = useState(false); useShallowEffect(() => { + setIsShowUpdate(false); loadData(); }, []); @@ -49,14 +49,16 @@ export default function Event_Beranda({ }, [isTriggerEventBeranda]); async function loadData() { - const loadData = await event_getListAllPublish({ page: 1 }); - setData(loadData as any); + const res = await fetch(API_RouteEvent.get_all({ page: activePage })); + const data = await res.json(); + setData(data.data as any); } async function onLoadNewData() { setIsLoading(true); - const loadData = await event_getListAllPublish({ page: 1 }); - setData(loadData as any); + const res = await fetch(API_RouteEvent.get_all({ page: 1 })); + const data = await res.json(); + setData(data.data as any); setIsShowUpdate(false); setIsTriggerEventBeranca(false); @@ -92,16 +94,7 @@ export default function Event_Beranda({ {data == null ? ( - Array.from({ length: 10 }).map((_, index) => ( - - )) + ) : _.isEmpty(data) ? ( ) : ( diff --git a/src/app_modules/event/splash/index.tsx b/src/app_modules/event/splash/index.tsx index e6d75e20..bd06d4ca 100644 --- a/src/app_modules/event/splash/index.tsx +++ b/src/app_modules/event/splash/index.tsx @@ -16,7 +16,7 @@ export default function Event_SplashScreen() { setTimeout(() => { router.replace(RouterEvent.beranda); setHotMenu(0); - }, 1000); + }, 500); }, []); return ( <>