import React, { useEffect, useRef, useState } from 'react'; import { Link, useLocation, useNavigate } from 'react-router-dom'; import { FaSignOutAlt, FaUser, FaBuilding, FaChevronDown, FaCheck } from "react-icons/fa"; import api from '../config/api'; interface AccountNavProps { accountName?: string | null; transactionName?: string | null; } interface Account { id: number; isDefault: boolean; name: string; } interface UserData { id: number; name: string; email: string; language: string; account: Account; } interface AccountDataArray { userId: number, userEmail: string, name: string, accountId: number; accountName: string; role: string; status: string; } // Helper function to dispatch custom storage event const dispatchSessionStorageChange = (key: string, newValue: any) => { window.dispatchEvent(new CustomEvent('sessionStorageChange', { detail: { key, newValue } })); }; const CommonNav: React.FC = () => { const activeAccountId = JSON.parse(sessionStorage.getItem('activeAccountId') || 'null'); const userDetails = JSON.parse(sessionStorage.getItem('userDetails') || '{}'); console.log("activeAccountId", activeAccountId); const [open, setOpen] = useState(false); const [accountsOpen, setAccountsOpen] = useState(false); const [loadingAccounts, setLoadingAccounts] = useState(false); const [accounts, setAccounts] = useState([]); const [hasModalBeenClosed, setHasModalBeenClosed] = useState(false); const dropdownRef = useRef(null); const [user, setUser] = useState({ id: 0, name: "", email: "", language: "", account: { id: 0, isDefault: false, name: "", }, }); console.log("user", user) const getAccountDetails = async () => { try { let res = await api.get('/api/user/accounts'); let items = res?.data; console.log('items', items); const cleanedData: AccountDataArray[] = items.map((item: any) => ({ userId: item.userId, userEmail: item.userEmail, name: item.name, accountId: item.accountId, accountName: item.accountName, role: item.role, status: item.status, })); setAccounts(cleanedData); } catch (error) { console.log(error); } }; const handleAccountsClick = async () => { setAccountsOpen(!accountsOpen); if (!accountsOpen) { setLoadingAccounts(true); if (accounts.length === 0 || hasModalBeenClosed) { await getAccountDetails(); setHasModalBeenClosed(false); } setLoadingAccounts(false); } }; const handleAccountSwitch = (account: any) => { console.log("handleAccountSwitch", account); // Update sessionStorage sessionStorage.setItem('activeAccountId', JSON.stringify(account.accountId)); // Dispatch custom event dispatchSessionStorageChange('activeAccountId', account.accountId); // Update user state setUser({ id: account.userId, name: account.name, email: account.userEmail, language: "", // set it if available account: { id: account.accountId, isDefault: false, // update as needed name: account.accountName, }, }); sessionStorage.setItem('userDetails', JSON.stringify({ id: account.userId, name: account.name, email: account.userEmail, language: "", // set it if available account: { id: account.accountId, isDefault: false, // update as needed name: account.accountName, }, })); setAccountsOpen(false); setOpen(false); }; const navigate = useNavigate(); const getUserDetails = async () => { try { let res = await api.get(`/api/user/details`); console.log("getuser", res); const item = res?.data; if (item) { const userData = { id: item?.id, name : item?.firstName + " " + item?.lastName , email: item?.email, language: "", account: { id: item?.account.id, isDefault: false, name: item?.account.name, }, }; console.log("userData",userData) setUser(userData); sessionStorage.setItem('userDetails', JSON.stringify(userData)); sessionStorage.setItem('activeAccountId', JSON.stringify(userData.account.id)); // Dispatch event for initial load dispatchSessionStorageChange('activeAccountId', userData.account.id); console.log("Data is saved in sessionStorage"); } } catch (error) { console.error("Error fetching user details:", error); } }; useEffect(() => { if (!activeAccountId) { getUserDetails(); } else { setUser(userDetails); } }, []); const location = useLocation(); const rawPathnames = location.pathname .split("/") .filter((x) => x && isNaN(Number(x))); // Special case: if first segment is 's' and next is 'settings', remove 's' const pathnames = rawPathnames[0] === "s" && rawPathnames[1] === "settings" ? rawPathnames.slice(1) : rawPathnames; const labelMap: Record = { accounts: "Accounts", transactions: "Transactions", templates: "Templates" }; useEffect(() => { function handleClickOutside(event: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { if (open) { setHasModalBeenClosed(true); } setOpen(false); setAccountsOpen(false); } } document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, [open]); const handleLogout = async () => { try { let res = await api.post('/api/auth/logout'); if (res.status === 200) { sessionStorage.clear(); setOpen(false); navigate("/login"); } } catch (error) { console.log(error); } }; const handleMainDropdownToggle = () => { if (open) { setHasModalBeenClosed(true); } setOpen(!open); if (!open) { setAccountsOpen(false); } }; const formatSegment = (segment: string) => segment .replace(/[-_]/g, " ") .replace(/\b\w/g, (char) => char.toUpperCase()); const ShimmerRow = () => (
); return (
{open && (
{user ? ( {(user?.name?.slice(0, 2)).toUpperCase()} ) : ( )}
{user?.name || '-'}
{user?.email || '-'}
Account #{user?.account?.name || '-'}
{accountsOpen && (
{loadingAccounts ? (
) : (
{accounts?.length > 0 ? ( accounts?.map((account) => ( )) ) : ( No Account... )}
)}
)}
)}
); }; export default CommonNav;