"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={
{userRoleId === "3" ? developerNavbar : adminNavbar}
V 1.0.0
}
>
{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
)}
))}
>
);
}