From 1b58ba7d905f490fdba9e1d90e722faf251b2ae3 Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Tue, 12 Nov 2024 13:49:51 +0800 Subject: [PATCH] Fix: Job Deskripsi: - Fix notifikasi admin to user - Fix trigger autoload --- src/app/dev/admin/layout.tsx | 4 + src/app/layout.tsx | 11 +- src/app/lib/global_state.ts | 4 + src/app/lib/realtime_provider.tsx | 25 +++- .../admin/job/child/review/index.tsx | 6 + src/app_modules/admin/new_layout.tsx | 4 +- .../fun/get/fun_check_status_job.ts | 13 +- .../admin/notifikasi/route_setting/job.ts | 12 +- .../admin/notifikasi/ui_drawer_notifikasi.tsx | 6 +- .../home/component/button_header.tsx | 11 +- .../button/comp_button_update_beranda.tsx | 7 +- .../job/main/beranda/ui_beranda.tsx | 61 +++++----- .../notifikasi/component/path/job.ts | 4 +- .../fun/get/get_notifiaksi_by_id.ts | 5 +- .../notifikasi/ui/ui_notifiaksi.tsx | 112 +++++++++--------- 15 files changed, 168 insertions(+), 117 deletions(-) diff --git a/src/app/dev/admin/layout.tsx b/src/app/dev/admin/layout.tsx index bc8fd499..02eb2434 100644 --- a/src/app/dev/admin/layout.tsx +++ b/src/app/dev/admin/layout.tsx @@ -4,6 +4,8 @@ import { Admin_NewLayout } from "@/app_modules/admin"; import adminNotifikasi_countNotifikasi from "@/app_modules/admin/notifikasi/fun/count/count_is_read"; import adminNotifikasi_getByUserId from "@/app_modules/admin/notifikasi/fun/get/get_notifikasi_by_user_id"; import React from "react"; +import versionUpdate from "../../../../package.json"; + export default async function Layout({ children, @@ -11,6 +13,7 @@ export default async function Layout({ children: React.ReactNode; }) { const userLoginId = await funGetUserIdByToken(); + const version = versionUpdate.version const dataUser = await funGlobal_getUserById({ userId: userLoginId }); const listNotifikasi = await adminNotifikasi_getByUserId(); @@ -30,6 +33,7 @@ export default async function Layout({ user={dataUser as any} countNotifikasi={countNotifikasi as any} listNotifikasi={listNotifikasi as []} + version={version} > {children} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 5b55d385..437df065 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -5,6 +5,7 @@ import { TokenProvider } from "./lib/token"; import dotenv from "dotenv"; import { ServerEnv } from "./lib/server_env"; import { RealtimeProvider } from "./lib"; +import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; dotenv.config({ path: ".env", }); @@ -35,18 +36,20 @@ const envObject = { }; ServerEnv.set(envObject); -export default function RootLayout({ +export default async function RootLayout({ children, }: { children: React.ReactNode; }) { + const userLoginId = await funGetUserIdByToken(); + if (!token) return <>Require Token Storage; return ( - - - + {/* + */} + {children} ); diff --git a/src/app/lib/global_state.ts b/src/app/lib/global_state.ts index 63963eb7..3a748a05 100644 --- a/src/app/lib/global_state.ts +++ b/src/app/lib/global_state.ts @@ -21,3 +21,7 @@ export const gs_realtimeData = atom(null); export const gs_admin_ntf = atom(0); export const gs_user_ntf = atom(0); +// job + +export const gs_job_trigger = atom(false) + diff --git a/src/app/lib/realtime_provider.tsx b/src/app/lib/realtime_provider.tsx index 361c4a43..d340dd00 100644 --- a/src/app/lib/realtime_provider.tsx +++ b/src/app/lib/realtime_provider.tsx @@ -5,23 +5,29 @@ import { useAtom } from "jotai"; import { WibuRealtime } from "wibu-pkg"; import { gs_admin_ntf, + gs_job_trigger, gs_realtimeData, gs_user_ntf, IRealtimeData, } from "./global_state"; export type TypeNotification = { - type: "message" | "notification" + type: "message" | "notification" | "trigger"; pushNotificationTo: "ADMIN" | "USER"; dataMessage?: IRealtimeData; userLoginId?: string; }; const WIBU_REALTIME_TOKEN: any = process.env.NEXT_PUBLIC_WIBU_REALTIME_TOKEN; -export default function RealtimeProvider() { +export default function RealtimeProvider({ + userLoginId, +}: { + userLoginId: string; +}) { const [dataRealtime, setDataRealtime] = useAtom(gs_realtimeData); const [newAdminNtf, setNewAdminNtf] = useAtom(gs_admin_ntf); const [newUserNtf, setNewUserNtf] = useAtom(gs_user_ntf); + const [triggerJob, setTriggerJob] = useAtom(gs_job_trigger); useShallowEffect(() => { WibuRealtime.init({ @@ -30,14 +36,21 @@ export default function RealtimeProvider() { setNewAdminNtf((e) => e + 1); } - if (data.type == "notification" && data.pushNotificationTo == "USER") { + if ( + data.type == "notification" && + data.pushNotificationTo == "USER" && + data.dataMessage?.userId == userLoginId + ) { setNewUserNtf((e) => e + 1); setDataRealtime(data.dataMessage as any); } - if (data.type == "message") { - // console.log(data.dataMessage); - setDataRealtime(data.dataMessage as any); + if ( + data.type == "trigger" && + data.pushNotificationTo == "USER" && + data.dataMessage?.kategoriApp == "JOB" + ) { + setTriggerJob(true); } }, project: "hipmi", diff --git a/src/app_modules/admin/job/child/review/index.tsx b/src/app_modules/admin/job/child/review/index.tsx index 1a897b0c..55b3413b 100644 --- a/src/app_modules/admin/job/child/review/index.tsx +++ b/src/app_modules/admin/job/child/review/index.tsx @@ -355,6 +355,12 @@ async function onPublish({ pushNotificationTo: "USER", dataMessage: dataNotifikasi, }); + + WibuRealtime.setData({ + type: "trigger", + pushNotificationTo: "USER", + dataMessage: dataNotifikasi, + }); } ComponentGlobal_NotifikasiBerhasil(publish.message); diff --git a/src/app_modules/admin/new_layout.tsx b/src/app_modules/admin/new_layout.tsx index d4fbddce..ac5c6e6b 100644 --- a/src/app_modules/admin/new_layout.tsx +++ b/src/app_modules/admin/new_layout.tsx @@ -39,11 +39,13 @@ export function Admin_NewLayout({ user, countNotifikasi, listNotifikasi, + version, }: { children: React.ReactNode; user: MODEL_USER; countNotifikasi: number; listNotifikasi: MODEL_NOTIFIKASI[]; + version: string }) { const matches = useMediaQuery("(min-width: 1024px)"); const [dataUser, setDataUser] = useState(user); @@ -150,7 +152,7 @@ export function Admin_NewLayout({ - V 1.0.0 + V {version} diff --git a/src/app_modules/admin/notifikasi/fun/get/fun_check_status_job.ts b/src/app_modules/admin/notifikasi/fun/get/fun_check_status_job.ts index 00758a42..09a5d21d 100644 --- a/src/app_modules/admin/notifikasi/fun/get/fun_check_status_job.ts +++ b/src/app_modules/admin/notifikasi/fun/get/fun_check_status_job.ts @@ -1,6 +1,7 @@ "use server"; import { prisma } from "@/app/lib"; +import _ from "lodash"; export async function admin_funCheckStatusJob({ id }: { id: string }) { const data = await prisma.job.findUnique({ @@ -12,9 +13,11 @@ export async function admin_funCheckStatusJob({ id }: { id: string }) { }, }); - if (data?.MasterStatus?.name === "Review") { - return true; - } else { - return false; - } + if (!data) + return { status: 400, message: "Id tidak ditemukan", statusName: "" }; + return { + status: 200, + message: "Id ditemukan", + statusName: _.lowerCase(data.MasterStatus?.name), + }; } diff --git a/src/app_modules/admin/notifikasi/route_setting/job.ts b/src/app_modules/admin/notifikasi/route_setting/job.ts index 6509eb72..64c37c0a 100644 --- a/src/app_modules/admin/notifikasi/route_setting/job.ts +++ b/src/app_modules/admin/notifikasi/route_setting/job.ts @@ -10,15 +10,21 @@ export async function adminNotifikasi_findRouterJob({ }) { const check = await admin_funCheckStatusJob({ id: data.appId }); - if (check) { + if (check.status == 200) { const udpateReadNotifikasi = await adminNotifikasi_funUpdateIsReadById({ notifId: data?.id, }); if (udpateReadNotifikasi.status == 200) { - return true; + return { + success: true, + statusName: check.statusName, + }; } else { - return false; + return { + success: false, + statusName: "" + }; } } else { ComponentAdminGlobal_NotifikasiPeringatan("Status telah dirubah oleh user"); diff --git a/src/app_modules/admin/notifikasi/ui_drawer_notifikasi.tsx b/src/app_modules/admin/notifikasi/ui_drawer_notifikasi.tsx index 44b517d5..a8d88018 100644 --- a/src/app_modules/admin/notifikasi/ui_drawer_notifikasi.tsx +++ b/src/app_modules/admin/notifikasi/ui_drawer_notifikasi.tsx @@ -49,7 +49,7 @@ export function ComponentAdmin_UIDrawerNotifikasi({ data: data, }); - if (checkJob) { + if (checkJob?.success) { setVisible(true); setDataId(data.id); @@ -65,7 +65,9 @@ export function ComponentAdmin_UIDrawerNotifikasi({ childId: "Job_3", }); - router.push("/dev/admin/job/child/review"); + const path = `/dev/admin/job/child/${checkJob.statusName}`; + + router.push(path); setVisible(false); setDataId(""); } diff --git a/src/app_modules/home/component/button_header.tsx b/src/app_modules/home/component/button_header.tsx index a1dc8ac2..ae20d147 100644 --- a/src/app_modules/home/component/button_header.tsx +++ b/src/app_modules/home/component/button_header.tsx @@ -1,6 +1,6 @@ "use client"; -import { gs_realtimeData, gs_user_ntf } from "@/app/lib/global_state"; +import { gs_user_ntf } from "@/app/lib/global_state"; import { RouterNotifikasi } from "@/app/lib/router_hipmi/router_notifikasi"; import { RouterUserSearch } from "@/app/lib/router_hipmi/router_user_search"; import { @@ -66,15 +66,16 @@ export function ComponentHome_ButtonHeaderRight({ // Notifikasi const [countNtf, setCountNtf] = useState(countNotifikasi); const [newUserNtf, setNewUserNtf] = useAtom(gs_user_ntf); - const [dataRealtime, setDataRealtime] = useAtom(gs_realtimeData); useShallowEffect(() => { - if (dataRealtime?.userId == dataUser.id) { - setCountNtf((e) => e + newUserNtf), setNewUserNtf(0); - } + // console.log(newUserNtf, "new notif"); + // console.log(countNtf, "count ntf"); + setCountNtf(countNtf + newUserNtf); + setNewUserNtf(0); onLoadNotifikasi({ onLoad(val) { + console.log(val, "total notif"); setCountNtf(val); }, }); diff --git a/src/app_modules/job/component/button/comp_button_update_beranda.tsx b/src/app_modules/job/component/button/comp_button_update_beranda.tsx index ac220794..00135734 100644 --- a/src/app_modules/job/component/button/comp_button_update_beranda.tsx +++ b/src/app_modules/job/component/button/comp_button_update_beranda.tsx @@ -8,17 +8,20 @@ export function Job_ComponentButtonUpdateBeranda({ onSetData, onSetIsNewPost, }: { - onSetData: (val: any) => void; + onSetData: (val : {data: any[]}) => void; onSetIsNewPost: (val: any) => void; }) { const [scroll, scrollTo] = useWindowScroll(); const [isLoading, setIsLoading] = useState(false); async function onLoadData() { + setIsLoading(true) const loadData = await job_getAllListPublish({ page: 1 }); if (loadData) { - onSetData(loadData); + onSetData({ + data: loadData, + }); onSetIsNewPost(false); setIsLoading(false); } diff --git a/src/app_modules/job/main/beranda/ui_beranda.tsx b/src/app_modules/job/main/beranda/ui_beranda.tsx index f4e93da8..69cf18c3 100644 --- a/src/app_modules/job/main/beranda/ui_beranda.tsx +++ b/src/app_modules/job/main/beranda/ui_beranda.tsx @@ -1,33 +1,38 @@ "use client"; +import { gs_job_trigger } from "@/app/lib/global_state"; import { RouterJob } from "@/app/lib/router_hipmi/router_job"; import ComponentGlobal_CreateButton from "@/app_modules/_global/component/button_create"; import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data"; -import { - Affix, - Button, - Center, - Loader, - rem, - Stack, - TextInput, -} from "@mantine/core"; +import { Center, Loader, Stack, TextInput } from "@mantine/core"; +import { useShallowEffect } from "@mantine/hooks"; import { IconSearch } from "@tabler/icons-react"; +import { useAtom } from "jotai"; import _ from "lodash"; import { ScrollOnly } from "next-scroll-loader"; import { useState } from "react"; import ComponentJob_BerandaCardView from "../../component/beranda/card_view"; import { job_getAllListPublish } from "../../fun/get/get_all_publish"; import { MODEL_JOB } from "../../model/interface"; -import { useShallowEffect } from "@mantine/hooks"; -import mqtt_client from "@/util/mqtt_client"; -import { Job_ComponentButtonUpdateBeranda } from "../../component"; export function Job_UiBeranda({ listData }: { listData: MODEL_JOB[] }) { const [data, setData] = useState(listData); const [activePage, setActivePage] = useState(1); const [isSearch, setIsSearch] = useState(""); - const [isNewPost, setIsNewPost] = useState(false); + // const [isNewPost, setIsNewPost] = useState(false); + const [triggerJob, setTriggerJob] = useAtom(gs_job_trigger); + + useShallowEffect(() => { + if (triggerJob) { + // setIsNewPost(true); + setTriggerJob(false); + onLoadNewData({ + onLoad(val) { + setData(val); + }, + }); + } + }, [triggerJob, setData]); async function onSearch(text: string) { setIsSearch(text); @@ -39,21 +44,6 @@ export function Job_UiBeranda({ listData }: { listData: MODEL_JOB[] }) { setActivePage(1); } - useShallowEffect(() => { - onLoadNewData({ - onLoad(val) { - setData(val); - }, - }); - - mqtt_client.subscribe("Job_new_post"); - mqtt_client.on("message", (topic, message) => { - if (topic === "Job_new_post") { - setIsNewPost(true); - } - }); - }, [setIsNewPost, setData]); - async function onLoadNewData({ onLoad }: { onLoad: (val: any) => void }) { const loadData = await job_getAllListPublish({ page: 1 }); onLoad(loadData); @@ -62,12 +52,17 @@ export function Job_UiBeranda({ listData }: { listData: MODEL_JOB[] }) { return ( <> - {isNewPost && ( + {/* {isNewPost && ( setIsNewPost(val)} - onSetData={(val) => setData(val)} + onSetIsNewPost={(val) => { + setIsNewPost(val); + }} + onSetData={(val: { data: any[] }) => { + setData(val.data); + }} /> - )} + )} */} + val + 1); return loadData; diff --git a/src/app_modules/notifikasi/component/path/job.ts b/src/app_modules/notifikasi/component/path/job.ts index df201050..d3afb031 100644 --- a/src/app_modules/notifikasi/component/path/job.ts +++ b/src/app_modules/notifikasi/component/path/job.ts @@ -13,9 +13,7 @@ export async function notifikasi_jobCheckStatus({ id: appId, }); - console.log(check); - - if (check) { + if (check.status == 200) { const updateReadNotifikasi = await notifikasi_funUpdateIsReadById({ notifId: dataId, }); diff --git a/src/app_modules/notifikasi/fun/get/get_notifiaksi_by_id.ts b/src/app_modules/notifikasi/fun/get/get_notifiaksi_by_id.ts index a7584036..da99d45a 100644 --- a/src/app_modules/notifikasi/fun/get/get_notifiaksi_by_id.ts +++ b/src/app_modules/notifikasi/fun/get/get_notifiaksi_by_id.ts @@ -11,11 +11,14 @@ export default async function notifikasi_getByUserId({ page: number; kategoriApp?: string; }) { + console.log(page, "ini page"); + console.log(kategoriApp, "ini kategori"); + const userLoginId = await funGetUserIdByToken(); const takeData = 10; const skipData = page * takeData - takeData; - if (kategoriApp === "Semua" ) { + if (kategoriApp === "Semua") { const data = await prisma.notifikasi.findMany({ take: takeData, skip: skipData, diff --git a/src/app_modules/notifikasi/ui/ui_notifiaksi.tsx b/src/app_modules/notifikasi/ui/ui_notifiaksi.tsx index c2fa6a7e..5a15fb79 100644 --- a/src/app_modules/notifikasi/ui/ui_notifiaksi.tsx +++ b/src/app_modules/notifikasi/ui/ui_notifiaksi.tsx @@ -15,7 +15,6 @@ import { gs_investas_menu, gs_investasi_status, } from "@/app_modules/investasi/g_state"; -import { gs_job_hot_menu } from "@/app_modules/job/global_state"; import { gs_vote_hotMenu, gs_vote_status, @@ -72,6 +71,7 @@ export function Notifikasi_UiView({ setData(loadNotifikasi as any); } + return ( <> @@ -97,6 +97,7 @@ export function Notifikasi_UiView({ }} onClick={() => { setActiveKategori(e.name); + // onLoadDataNotifikasi(e.name); }} > {e.name} @@ -105,64 +106,69 @@ export function Notifikasi_UiView({ - {_.isEmpty(data) ? ( - - ) : ( - ( -
- -
- )} - data={data} - setData={setData} - moreData={async () => { - const loadData = await notifikasi_getByUserId({ - page: activePage + 1, - }); - setActivePage((val) => val + 1); + + {_.isEmpty(data) ? ( + + ) : ( + ( +
+ +
+ )} + data={data} + setData={setData} + moreData={async () => { + const loadData = await notifikasi_getByUserId({ + page: activePage + 1, + kategoriApp: activeKategori, + }); + // console.log(loadData); - return loadData; - }} - > - {(item) => ( - { - // if (item?.kategoriApp === "JOB") { + setActivePage((val) => val + 1); - // setJobMenuId(val.menuId); - // // setJobStatus(val.status); - // } + return loadData; + }} + > + {(item) => ( + { + // if (item?.kategoriApp === "JOB") { - // // if (item?.kategoriApp === "VOTING") { - // // setVoteMenu(val.menuId); - // // setVoteStatus(val.status); - // // } + // setJobMenuId(val.menuId); + // // setJobStatus(val.status); + // } - // // if (item?.kategoriApp === "EVENT") { - // // setEventMenu(val.menuId); - // // setEventStatus(val.status); - // // } + // // if (item?.kategoriApp === "VOTING") { + // // setVoteMenu(val.menuId); + // // setVoteStatus(val.status); + // // } - // // if (item?.kategoriApp === "DONASI") { - // // setDonasiMenu(val.menuId); - // // setDonasiStatus(val.status); - // // } + // // if (item?.kategoriApp === "EVENT") { + // // setEventMenu(val.menuId); + // // setEventStatus(val.status); + // // } - // // if (item?.kategoriApp === "INVESTASI") { - // // setInvestasiMenu(val.menuId); - // // setInvestasiStatus(val.status); - // // } - // }} - /> - )} -
- )} + // // if (item?.kategoriApp === "DONASI") { + // // setDonasiMenu(val.menuId); + // // setDonasiStatus(val.status); + // // } + + // // if (item?.kategoriApp === "INVESTASI") { + // // setInvestasiMenu(val.menuId); + // // setInvestasiStatus(val.status); + // // } + // }} + /> + )} +
+ )} +
);