"use client"; import React, { useEffect, useState } from 'react'; import { Box, Button, Divider, Group, Image, Modal, Popover, Stack, Switch, Text, Title } from '@mantine/core'; import { IconBook, IconCurrencyRupee, IconHome, IconLogout, IconMoon, IconPhoneFilled, IconSettings, IconSun, IconUserCircle } from '@tabler/icons-react'; import Link from 'next/link'; import { useRouter, usePathname } from "next/navigation"; import { Providers } from '../providers'; import logo from '@/app/image/logo1.jpg'; import NextImage from 'next/image'; import { notifications } from '@mantine/notifications'; import { useDisclosure, useMediaQuery } from '@mantine/hooks'; import { fetchAndStoreUserName } from '../_util/userdetails'; import styles from './page.module.css'; export default function RootLayout({ children }: { children: React.ReactNode }) { const router = useRouter(); const pathname = usePathname(); const [authorized, SetAuthorized] = useState(null); const [userLastLoginDetails, setUserLastLoginDetails] = useState(null); const [custname, setCustname] = useState(null); const isMobile = useMediaQuery("(max-width: 768px)"); const [sessionModal, setSessionModal] = useState(false); const [countdown, setCountdown] = useState(30); // 30 sec countdown before auto logout const [darkMode, setDarkMode] = useState(false); const firstName = custname ? custname.split(" ")[0] : ""; const [userOpened, setUserOpened] = useState(false); // Manage dropdown visibility const [opened, { open, close }] = useDisclosure(false); function doLogout() { localStorage.removeItem("access_token"); sessionStorage.removeItem("access_token"); localStorage.removeItem("remitter_name"); localStorage.removeItem("pswExpiryDate"); localStorage.clear(); sessionStorage.clear(); router.push("/login"); } async function handleLogout(e: React.FormEvent) { e.preventDefault(); doLogout() router.push("/login"); } // Toggle Dark/Light Mode const toggleDarkMode = () => { setDarkMode((prevMode) => !prevMode); }; // When reload and click on back then logout // useEffect(() => { // // Push fake history state to trap navigation // window.history.pushState(null, "", window.location.href); // const handlePopState = () => { // doLogout(); // logout when back/forward pressed // }; // const handleBeforeUnload = (e: BeforeUnloadEvent) => { // // logout on tab close / refresh // localStorage.removeItem("access_token"); // sessionStorage.removeItem("access_token"); // localStorage.clear(); // sessionStorage.clear(); // }; // window.addEventListener("popstate", handlePopState); // window.addEventListener("beforeunload", handleBeforeUnload); // return () => { // window.removeEventListener("popstate", handlePopState); // window.addEventListener("beforeunload", handleBeforeUnload); // }; // }, []); useEffect(() => { const token = localStorage.getItem("access_token"); if (!token) { SetAuthorized(false); router.push("/login"); } else { SetAuthorized(true); fetchAndStoreUserName(token).then(() => { const name = localStorage.getItem("remitter_name"); if (name) setCustname(name); }); } }, []); async function handleFetchUserDetails(e: React.FormEvent) { e.preventDefault(); const token = localStorage.getItem("access_token"); const response = await fetch('/api/auth/user_details', { method: 'GET', headers: { 'Content-Type': 'application/json', "X-Login-Type": "IB", 'Authorization': `Bearer ${token}` }, }); const data = await response.json(); if (response.ok) { return data; } else if (response.status === 401 || data.message === 'invalid or expired token') { // console.log(data); localStorage.removeItem("access_token"); localStorage.clear(); sessionStorage.clear(); router.push('/login'); } else { notifications.show({ withBorder: true, color: "red", title: "Please try again later", message: "Unable to fetch timestamp, please try again later", autoClose: 5000, }); } } useEffect(() => { const fetchLoginTime = async () => { const result = await handleFetchUserDetails({ preventDefault: () => { } } as React.FormEvent); if (result) { setUserLastLoginDetails(result.last_login); } }; fetchLoginTime(); }, []); // LOGOUT AFTER 5 MINUTES OF INACTIVITY OR TAB SWITCH useEffect(() => { const INACTIVITY_LIMIT = 5 * 60 * 1000; // 5 minutes let inactiveSince: number | null = null; let countdownTimer: NodeJS.Timeout; const startCountdown = () => { setSessionModal(true); setCountdown(30); // start from 30 seconds countdownTimer = setInterval(() => { setCountdown((prev) => { if (prev <= 1) { clearInterval(countdownTimer); doLogout(); // auto logout after countdown return 0; } return prev - 1; }); }, 1000); }; const handleVisibilityChange = () => { if (document.hidden) { // User switched tab → mark inactive time inactiveSince = Date.now(); } else { // User returned to tab if (inactiveSince && Date.now() - inactiveSince >= INACTIVITY_LIMIT) { // Inactive for ≥ 5 min → show modal startCountdown(); } inactiveSince = null; // reset inactiveSince } }; const handleUserActivity = () => { // Reset inactivity timestamp if user interacts inactiveSince = null; }; const activityEvents = ["mousemove", "keydown", "click", "scroll", "touchstart"]; activityEvents.forEach((event) => window.addEventListener(event, handleUserActivity)); document.addEventListener("visibilitychange", handleVisibilityChange); return () => { activityEvents.forEach((event) => window.removeEventListener(event, handleUserActivity)); document.removeEventListener("visibilitychange", handleVisibilityChange); clearInterval(countdownTimer); }; }, []); const navItems = [ { href: "/home", label: "Home", icon: IconHome }, { href: "/accounts", label: "Accounts", icon: IconBook }, { href: "/funds_transfer", label: "Send Money", icon: IconCurrencyRupee }, { href: "/settings", label: "Settings", icon: IconSettings }, ]; if (authorized) { return ( {/* HEADER */} ebanking
THE KANGRA CENTRAL CO-OPERATIVE BANK LTD. Head Office: Dharmshala, District Kangra (H.P), Pin: 176215
{/* Dark/Light Mode Toggle using Moon and Sun Icons */} {/* */} {custname} Full Name {userLastLoginDetails ? new Date(userLastLoginDetails).toLocaleString() : "N/A"} Last Login
{/* WELCOME + NAV */} Welcome, {custname ?? null} Last logged in at {userLastLoginDetails ? new Date(userLastLoginDetails).toLocaleString() : "N/A"} {navItems.map((item) => { const isActive = pathname.startsWith(item.href); const Icon = item.icon; return ( ); })} {/* Are you sure you want to logout? */} {/* CHILDREN */} {children} {/* this model for session logout */} setSessionModal(false)} withCloseButton={false} centered closeOnClickOutside={false} // <--- prevents clicking outside to close closeOnEscape={false} // <--- prevents ESC key title="Session Timeout Warning" > You have been inactive for a while.
You’ll be logged out automatically in {countdown} seconds.
{/* */}
{/* FOOTER */} © 2025 The Kangra Central Co-Operative Bank Ltd.
); } }