"use client"; import mqtt_client from "@/util/mqtt_client"; import { ActionIcon, AppShell, Badge, Box, Burger, Card, Center, Divider, Drawer, Group, Header, Indicator, MediaQuery, NavLink, Navbar, Paper, ScrollArea, Stack, Text, Title, useMantineTheme, } from "@mantine/core"; import { IconBell, IconCheck, IconChecks, IconCircleDot, IconCircleDotFilled, IconUserSquareRounded, } from "@tabler/icons-react"; import { useAtom } from "jotai"; import _ from "lodash"; import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; import { useRouter } from "next/navigation"; import React, { useEffect, useState } from "react"; import { MODEL_USER } from "../home/model/interface"; import { MODEL_NOTIFIKASI } from "../notifikasi/model/interface"; import Admin_Logout from "./component_global/logout"; import { gs_admin_hotMenu, gs_admin_subMenu, gs_layout_admin_isNavbarOpen, } from "./global_state"; import { listAdminPage } from "./list_page"; import adminNotifikasi_countNotifikasi from "./notifikasi/fun/count/count_is_read"; import adminNotifikasi_getByUserId from "./notifikasi/fun/get/get_notifikasi_by_user_id"; import adminNotifikasi_funUpdateIsReadById from "./notifikasi/fun/update/fun_update_is_read_by_id"; import adminNotifikasi_findRouterJob from "./notifikasi/route_setting/job"; import adminNotifikasi_findRouterForum from "./notifikasi/route_setting/forum"; export default function AdminLayout({ children, listNotif, dataUser, countNotifikasi, }: { children: React.ReactNode; listNotif: MODEL_NOTIFIKASI[]; dataUser: MODEL_USER; countNotifikasi: number; }) { const theme = useMantineTheme(); const [opened, setOpened] = useState(false); const router = useRouter(); const [activeId, setActiveId] = useAtom(gs_admin_hotMenu); const [activeChild, setActiveChild] = useAtom(gs_admin_subMenu); const [loading, setLoading] = useState(false); const [user, setUser] = useState(dataUser); const userRoleId = user.masterUserRoleId; const [isNotif, setIsNotif] = useState(false); const [dataNotif, setDataNotif] = useState(listNotif); const [countNotif, setCountNotif] = useState(countNotifikasi); const [isNavbarOpen, setIsNavbarOpen] = useAtom(gs_layout_admin_isNavbarOpen); const developerNavbar = listAdminPage.map((e, i) => ( : e.icon : e.icon e.icon } label={{e.name}} onClick={() => { setLoading(true); setActiveId(e.id); setActiveChild(null); e.path === "" ? router.push(e.child[0].path) : router.push(e.path); e.path === "" ? setActiveChild(e.child[0].id) : ""; }} > {_.isEmpty(e.child) ? ( "" ) : ( {e.child.map((v, ii) => ( {v.name}} icon={ activeChild === v.id ? ( ) : ( ) } onClick={() => { setActiveId(e.id); setActiveChild(v.id); router.push(v.path); }} /> ))} )} )); const bukanDeveloper = listAdminPage.slice(0, -1); const adminNavbar = bukanDeveloper.map((e) => ( {e.name}} onClick={() => { setLoading(true); setActiveId(e.id); setActiveChild(null); e.path === "" ? router.push(e.child[0].path) : router.push(e.path); e.path === "" ? setActiveChild(e.child[0].id) : ""; setIsNavbarOpen(true); }} > {_.isEmpty(e.child) ? ( "" ) : ( {e.child.map((v, ii) => ( {v.name}} icon={ activeChild === v.id ? ( ) : ( ) } onClick={() => { setActiveId(e.id); setActiveChild(v.id); router.push(v.path); }} /> ))} )} )); async function onLoadNotifikasi() { const loadNotif = await adminNotifikasi_getByUserId(); setDataNotif(loadNotif as any); } useEffect(() => { mqtt_client.subscribe("ADMIN"); mqtt_client.on("message", (topic: any, message: any) => { const data = JSON.parse(message.toString()); // console.log(data); setCountNotif(countNotif + data.count); }); }, [countNotif]); return ( <> {/* Web View */} Dashboard Admin { setIsNotif(true); onLoadNotifikasi(); }} > {countNotif}} > {user?.username} {/* Mobile View */} setOpened((o) => !o)} size="sm" color={theme.colors.gray[6]} mr="xl" /> Dashboard Admin {/* */} } navbar={ } > {children} {/* Drawer Mobile View */} setOpened(false)} size={"50%"}> {listAdminPage.map((e) => ( router.push(e.path)}> {e.name} ))} {/* Drawer Notifikasi */} Notifikasi } opened={isNotif} onClose={() => setIsNotif(false)} position="right" size={"xs"} > { setDataNotif(val); }} onChangeNavbar={(val: any) => { setActiveId(val.id); setActiveChild(val.childId); }} onToggleNavbar={setIsNavbarOpen} onLoadCountNotif={(val: any) => { setCountNotif(val); }} /> ); } function DrawerNotifikasi({ data, onLoadReadNotif, onChangeNavbar, onToggleNavbar, onLoadCountNotif, }: { data: MODEL_NOTIFIKASI[]; onLoadReadNotif: (val: any) => void; onChangeNavbar: (val: any) => void; onToggleNavbar: (val: any) => void; onLoadCountNotif: (val: any) => void; }) { const router = useRouter(); if (_.isEmpty(data)) { return ( <>
Tidak ada notifikasi
); } return ( <> {data.map((e, i) => ( { e?.kategoriApp === "JOB" && adminNotifikasi_findRouterJob({ data: e, router: router, onChangeNavbar: (val: any) => { onChangeNavbar(val); }, onToggleNavbar: onToggleNavbar, }); e?.kategoriApp === "FORUM" && adminNotifikasi_findRouterForum({ data: e, router: router, onChangeNavbar(val) { onChangeNavbar(val); }, onToggleNavbar(val) { onToggleNavbar(val); }, }); const updateIsRead = await adminNotifikasi_funUpdateIsReadById({ notifId: e?.id, }); if (updateIsRead) { const loadCountNotif = await adminNotifikasi_countNotifikasi(); onLoadCountNotif(loadCountNotif); const loadDataNotif = await adminNotifikasi_getByUserId(); onLoadReadNotif(loadDataNotif); } else { return null; } // callBackIsNotifikasi(false); }} > # {e?.kategoriApp} {e?.status ? ( {e?.status} ) : ( "" )} {e?.title} {e?.pesan} {new Intl.DateTimeFormat("id-ID", { dateStyle: "long", }).format(e?.createdAt)} {", "} {new Intl.DateTimeFormat("id-ID", { timeStyle: "short", }).format(e?.createdAt)} {e?.isRead ? ( Sudah dilihat ) : ( Belum dilihat )} ))} ); }