saat tampilan user sudah diubah dan login ulan sudah menyesuaikan untuk menunya
This commit is contained in:
@@ -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>
|
||||||
@@ -334,4 +363,4 @@ export default function Layout({ children }: { children: React.ReactNode }) {
|
|||||||
</AppShellMain>
|
</AppShellMain>
|
||||||
</AppShell>
|
</AppShell>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user