import React, { useEffect, useRef, useState } from 'react'; // import { useSelector } from 'react-redux'; import { Link, useLocation, useNavigate } from 'react-router-dom'; import { FaSignOutAlt, FaUser, FaBuilding, FaChevronDown, FaCheck } from "react-icons/fa"; import api from '../config/api'; // import { FaUser, FaSignOutAlt, FaBuilding, FaChevronDown, FaCheck } from 'react-icons/fa'; // import { RootState } from '../../store/store'; // import { UserState } from '../../store/slices/userSlice'; interface CommonNavProps { accountName?: string | null; transactionName?: string | null; } // Define the shape of state object interface Account { id: number; isDefault: boolean; name: string; } interface UserData { id: string; firstName: string; lastName: string; email: string; language: string; account: Account; } interface AccountDataArray { accountId: number, accountName: string, role: string, status: boolean } const CommonNav: React.FC = ({ accountName = null, transactionName = null }) => { // const user: UserState = useSelector((state: RootState) => state.user); const [open, setOpen] = useState(false); const [accountsOpen, setAccountsOpen] = useState(false); const [loadingAccounts, setLoadingAccounts] = useState(false); const [accounts, setAccounts] = useState([]); const [hasModalBeenClosed, setHasModalBeenClosed] = useState(false); // Track if modal was closed const dropdownRef = useRef(null); const [user, setUser] = useState({ id: "", firstName: "", lastName: "", email: "", language: "", account: { id: 0, isDefault: false, name: "", }, }); const getAccountDetails = async () => { try { let res = await api.get('/api/user/accounts') let items = res?.data console.log('items', items) // Extract only the fields you want const cleanedData: AccountDataArray[] = items.map((item: any) => ({ 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); // Fetch API if: // 1. No accounts data exists (first time), OR // 2. Modal was previously closed (need fresh data) if (accounts.length === 0 || hasModalBeenClosed) { await getAccountDetails(); setHasModalBeenClosed(false); // Reset the flag after fetching } setLoadingAccounts(false); } }; const handleAccountSwitch = (account) => { setUser(prev => ({ ...prev, account: { name: account.name, id: account.id } })); // Update accounts active status setAccounts(prevAccounts => prevAccounts.map(acc => ({ ...acc, isActive: acc.id === account.id })) ); setAccountsOpen(false); setOpen(false); }; const navigate = useNavigate() const getUserDetails = async () => { try { let res = await api.get(`/api/user/details`) console.log("getuser", res) setUser(res?.data) } catch (error) { console.error("Error fetching user details:", error); } } useEffect(() => { getUserDetails() }, []) const location = useLocation(); const pathnames = location.pathname .split("/") .filter((x) => x && isNaN(Number(x))); // remove numeric IDs const labelMap: Record = { accounts: "Accounts", transactions: "Transactions", templates: "Templates" // Add more routes here if needed }; // const [open, setOpen] = useState(false); // const dropdownRef = useRef(null); // Close dropdown when clicked outside useEffect(() => { function handleClickOutside(event: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { if (open) { setHasModalBeenClosed(true); // Mark modal as closed when clicking outside } setOpen(false); setAccountsOpen(false); // Also close accounts dropdown } } 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) { setOpen(false); navigate("/login") } } catch (error) { console.log(error) } }; // Handle main dropdown toggle const handleMainDropdownToggle = () => { if (open) { setHasModalBeenClosed(true); // Mark as closed when manually closing } setOpen(!open); if (!open) { setAccountsOpen(false); // Close accounts dropdown when opening main dropdown } }; const formatSegment = (segment: string) => segment .replace(/[-_]/g, " ") .replace(/\b\w/g, (char) => char.toUpperCase()); const ShimmerRow = () => (
); return (
{/* User Dropdown */}
{/* Avatar Button */} {/* Enhanced Dropdown */} {open && (
{/* User Info Section */}
{(user) ? ( {(user?.firstName + " " + user?.lastName).split(' ').map((item) => item.slice(0, 1)).join("").toUpperCase()} ) : ( )}
{user.firstName + ' ' + user.lastName || '-'}
{user.email || '-'}
Account #{user?.account?.name || '-'}
{/* Account List Section */}
{/* Accounts Dropdown */} {accountsOpen && (
{loadingAccounts ? (
) : (
{accounts.length > 0 ? (accounts?.map((account) => ( ))) : No Account...}
)}
)}
{/* Logout Section */}
)}
); }; export default CommonNav;