saat tampilan user sudah diubah dan login ulan sudah menyesuaikan untuk menunya

This commit is contained in:
2025-11-26 11:01:23 +08:00
parent 2fb3666e57
commit 29a9a59bca

View File

@@ -30,68 +30,67 @@ import _ from "lodash";
import Link from "next/link"; import Link from "next/link";
import { useRouter, useSelectedLayoutSegments } from "next/navigation"; import { useRouter, useSelectedLayoutSegments } from "next/navigation";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { useSnapshot } from "valtio"; // import { useSnapshot } from "valtio";
import { getNavbar } from "./(dashboard)/user&role/_com/dynamicNavbar"; import { getNavbar } from "./(dashboard)/user&role/_com/dynamicNavbar";
export default function Layout({ children }: { children: React.ReactNode }) { export default function Layout({ children }: { children: React.ReactNode }) {
const [opened, { toggle }] = useDisclosure(); const [opened, { toggle }] = useDisclosure();
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [isLoggingOut, setIsLoggingOut] = useState(false);
const [desktopOpened, { toggle: toggleDesktop }] = useDisclosure(true); const [desktopOpened, { toggle: toggleDesktop }] = useDisclosure(true);
const router = useRouter(); const router = useRouter();
const segments = useSelectedLayoutSegments().map((s) => _.lowerCase(s)); const segments = useSelectedLayoutSegments().map((s) => _.lowerCase(s));
const { user } = useSnapshot(authStore); // const { user } = useSnapshot(authStore);
console.log("Current user in store:", user); // console.log("Current user in store:", user);
useEffect(() => { // ✅ FIX: Selalu fetch user data setiap kali komponen mount
if (authStore.user) { useEffect(() => {
setLoading(false); const fetchUser = async () => {
return; try {
} const res = await fetch('/api/auth/me');
const data = await res.json();
const fetchUser = async () => { if (data.user) {
try { // Check if user is active
const res = await fetch('/api/auth/me'); if (!data.user.isActive) {
const data = await res.json(); authStore.setUser(null);
router.replace('/waiting-room');
return;
}
if (data.user) { // ✅ PENTING: Selalu fetch menuIds terbaru setiap login
// Check if user is active const menuRes = await fetch(`/api/admin/user-menu-access?userId=${data.user.id}`);
if (!data.user.isActive) { const menuData = await menuRes.json();
const menuIds = menuData.success && Array.isArray(menuData.menuIds)
? [...menuData.menuIds]
: null;
// ✅ Set user dengan menuIds yang fresh dari database
authStore.setUser({
id: data.user.id,
name: data.user.name,
roleId: Number(data.user.roleId),
menuIds, // menuIds terbaru
isActive: data.user.isActive
});
} else {
authStore.setUser(null);
router.replace('/login');
}
} catch (error) {
console.error('Gagal memuat data pengguna:', error);
authStore.setUser(null); authStore.setUser(null);
router.replace('/waiting-room'); router.replace('/login');
return; } finally {
setLoading(false);
} }
};
const menuRes = await fetch(`/api/admin/user-menu-access?userId=${data.user.id}`);
const menuData = await menuRes.json();
const menuIds = menuData.success && Array.isArray(menuData.menuIds)
? [...menuData.menuIds]
: null;
authStore.setUser({
id: data.user.id,
name: data.user.name,
roleId: Number(data.user.roleId),
menuIds,
isActive: data.user.isActive // Add isActive to store
});
} else {
authStore.setUser(null);
router.replace('/login');
}
} catch (error) {
console.error('Gagal memuat data pengguna:', error);
authStore.setUser(null);
router.replace('/login');
} finally {
setLoading(false);
}
};
fetchUser(); fetchUser();
}, [router]); }, [router]); // ✅ Hapus dependency pada authStore.user
if (loading) { if (loading) {
return ( return (
@@ -105,15 +104,43 @@ export default function Layout({ children }: { children: React.ReactNode }) {
); );
} }
// ✅ Ambil menu berdasarkan roleId // ✅ Ambil menu berdasarkan roleId dan menuIds
const currentNav = authStore.user const currentNav = authStore.user
? getNavbar({ roleId: authStore.user.roleId, menuIds: authStore.user.menuIds }) ? getNavbar({ roleId: authStore.user.roleId, menuIds: authStore.user.menuIds })
: []; : [];
const handleLogout = () => { const handleLogout = async () => {
authStore.setUser(null); try {
document.cookie = `${process.env.BASE_SESSION_KEY}=; Max-Age=0; path=/;`; setIsLoggingOut(true);
router.push('/login');
// ✅ Panggil API logout untuk clear session di server
const response = await fetch('/api/auth/logout', { method: 'POST' });
const result = await response.json();
if (result.success) {
// Clear user data dari store
authStore.setUser(null);
// Clear localStorage
localStorage.removeItem('auth_nomor');
localStorage.removeItem('auth_kodeId');
// Force reload untuk reset semua state
window.location.href = '/login';
} else {
console.error('Logout failed:', result.message);
// Tetap redirect meskipun gagal
authStore.setUser(null);
window.location.href = '/login';
}
} catch (error) {
console.error('Error during logout:', error);
// Tetap clear store dan redirect jika error
authStore.setUser(null);
window.location.href = '/login';
} finally {
setIsLoggingOut(false);
}
}; };
return ( return (
@@ -219,6 +246,8 @@ export default function Layout({ children }: { children: React.ReactNode }) {
size="lg" size="lg"
variant="gradient" variant="gradient"
gradient={{ from: colors["blue-button"], to: "#228be6" }} gradient={{ from: colors["blue-button"], to: "#228be6" }}
loading={isLoggingOut}
disabled={isLoggingOut}
> >
<IconLogout2 size={22} /> <IconLogout2 size={22} />
</ActionIcon> </ActionIcon>