import React, { useCallback, useEffect, useState } from "react"; import "./App.css"; import { Layout, Menu, ConfigProvider, Dropdown, notification, Button, } from "antd"; import { Routes, Route, Navigate, useLocation } from "react-router-dom"; import { mainItems, superItems } from "./Utils/sidebar"; import Login from "./Auth/Login"; import Notfound from "./Utils/Notfound"; import { LogoutApi } from "./API/auth/Logout"; import { Link } from "react-router-dom"; import { MenuProps } from "antd"; // @ts-ignore import TT_ELD from "./assets/tticon.svg"; import collapsedIcon from "./assets/collapsed.png"; import themeBtn from "./assets/theme-btn.svg"; // @ts-ignore import avatar from "./assets/avatar-img.svg"; // @ts-ignore import taskIcon from "./assets/tasknavicon.png"; // @ts-ignore import companyIcon from "./assets/companynavicon.png"; // @ts-ignore import serviceIcon from "./assets/servicenavicon.png"; // @ts-ignore import teamIcon from "./assets/teamnavicon.png"; // @ts-ignore import statisticIcon from "./assets/statnavicon.png"; // @ts-ignore import updateIcon from "./assets/updatenavicon.png"; // @ts-ignore import userIcon from "./assets/usernavicon.png"; // @ts-ignore import driverIcon from "./assets/customersIcon.png"; // @ts-ignore import requestIcon from "./assets/requestIcon.png"; // @ts-ignore import callIcon from "./assets/callIcon.png"; import Register from "./Auth/Register"; import Activate from "./Auth/Activate"; import Invite from "./Auth/Invite"; import ResetPassword from "./Auth/ResetPassword"; import ResetByEmail from "./Auth/ResetByEmail"; import { NotificationPlacement } from "antd/es/notification/interface"; import { TCall } from "./types/CallRequests/TCall"; import Task from "./Components/Tasks/Tasks"; import Requests from "./Components/Requests/Requests"; import { callController } from "./API/LayoutApi/callrequests"; import Call from "./Components/CallRequests/Call"; import { dark, light } from "./Utils/styles"; // import Input from "antd/es/input/Input"; const { Header, Sider, Content } = Layout; const userJSON: any = localStorage.getItem("user"); const userObject = JSON.parse(userJSON); export const timeZone = userObject?.timezone; export const role = userObject?.role; export const admin_id = localStorage.getItem("admin_id"); export const team_id = userObject?.team?.id; export const isMobile = window.innerWidth <= 768; const username = localStorage.getItem("username"); const App: React.FC = () => { const isAuthenticated = localStorage.getItem("access") as string; const authorized = isAuthenticated; const [collapsed, setCollapsed] = useState( localStorage.getItem("collapsed") === "true" ? true : false ); const [theme, setTheme] = useState( localStorage.getItem("theme") === "true" ? true : false ); const [calls, setCalls] = useState(0); const [data, setData] = useState(); useEffect(() => { if (admin_id) { callController .read({ status: "Awaiting", page: 1, page_size: 100 }) .then((data: any) => { setData(data); }); } }, []); useEffect(() => { if (data) { setCalls(data.data?.length); } }, [data]); type MenuItem = Required["items"][number]; function getItem( label: React.ReactNode, key: React.Key, icon?: React.ReactNode, children?: MenuItem[] ): MenuItem { return { key, icon, children, label, } as MenuItem; } const allMenu: MenuItem[] = [ getItem(Tasks, "/", ), getItem( Companies, "companies/", ), getItem( Drivers, "customers/", ), getItem( Services, "services/", ), ]; if (role === "Tech Support") { allMenu.push( getItem( Users, "users/", ), getItem( Teams, "teams/", ), getItem( Updates, "updates/", ), getItem( Driver Requests, "requests/", ), getItem( Call Requests, "calls/", ) ); } if (role === "Owner") { allMenu.push( getItem( Users, "users/", ), getItem( Teams, "teams/", ), getItem( Statistics, "stats/", ), getItem( Updates, "updates/", ), getItem( Driver Requests, "requests/", ), getItem( Call Requests{" "} {calls} , "calls/", ) ); } useEffect(() => { localStorage.setItem("theme", theme); }, [theme]); useEffect(() => { localStorage.setItem("collapsed", collapsed); }, [collapsed]); let location: any = useLocation(); const clickLogout = () => { LogoutApi(); }; const rep = () => { document.location.replace("/"); }; const menu: any = ( Profile Logout ); // const [isOnline, setIsOnline] = useState(navigator.onLine); // const reconnectingMessageKey = "reconnectingMessage"; // const reconnectingMessageContent = "Reconnecting..."; // useEffect(() => { // let reconnectingTimeout: NodeJS.Timeout | null = null; // const handleOnlineStatus = () => { // setIsOnline(true); // message.success({ content: "Reconnected!" }); // if (isOnline === false) { // message.destroy(reconnectingMessageKey); // } // if (reconnectingTimeout) { // clearTimeout(reconnectingTimeout); // } // }; // const handleOfflineStatus = () => { // setIsOnline(false); // if (isOnline !== false) { // message.loading({ // content: reconnectingMessageContent, // key: reconnectingMessageKey, // duration: 0, // }); // reconnectingTimeout = setTimeout(() => { // message.destroy(reconnectingMessageKey); // }, 30 * 60 * 1000); // 30 minutes // } // }; // window.addEventListener("online", handleOnlineStatus); // window.addEventListener("offline", handleOfflineStatus); // return () => { // window.removeEventListener("online", handleOnlineStatus); // window.removeEventListener("offline", handleOfflineStatus); // if (reconnectingTimeout) { // clearTimeout(reconnectingTimeout); // } // }; // }, [isOnline]); let taskSocket: WebSocket; const [isLive, setIslive] = useState(false); const [socketData, setSocketData] = useState(); const connect = async () => { try { if ( (!taskSocket || taskSocket.readyState === WebSocket.CLOSED) && admin_id ) { // taskSocket = new WebSocket( // `ws://10.10.10.64:8080/global/?user_id=${admin_id}` // ); // taskSocket = new WebSocket(`wss://api.tteld.co/global/?user_id=${admin_id}`); taskSocket = new WebSocket( `wss://ontime-socket.tteld.co/global/?user_id=${admin_id}` ); taskSocket.addEventListener("open", (event) => { setIslive(true); }); taskSocket.addEventListener("message", (event) => { const newData: any = JSON.parse(event.data); setSocketData(newData); }); taskSocket.addEventListener("error", (errorEvent) => { console.error("WebSocket error:", errorEvent); }); taskSocket.addEventListener("close", (event) => { console.log("WebSocket: clocse"); setIslive(false); }); } } catch (err) {} }; useEffect(() => { connect(); }, []); useEffect(() => { const handleResize = () => { if (window.innerWidth <= 1000) { setCollapsed(true); } else { setCollapsed(false); } }; handleResize(); window.addEventListener("resize", handleResize); return () => { window.removeEventListener("resize", handleResize); }; }, []); const toggleCollapsed = () => { setCollapsed(!collapsed); }; // function checkConnection() { // if (!isLive) { // connect(); // } // } // setInterval(checkConnection, 5000); const [api, contextHolder] = notification.useNotification(); const openNotification = useCallback( (placement: NotificationPlacement, data: TCall) => { api.info({ message: `Driver ${data?.driver?.name} from ${data?.company?.name} company has made a call request`, placement, }); }, [api] ); useEffect(() => { if (socketData?.type === "callback_request") { let status = socketData?.callback_request.status; if (status === "Awaiting") { openNotification("bottomRight", socketData?.callback_request); setCalls((prev: any) => prev + 1); } else if (status === "Resolved" && calls !== 0) { setCalls((prev: any) => prev - 1); } } }, [socketData, openNotification]); return (
{!authorized && !( location.pathname.startsWith("/auth/register") || location.pathname.startsWith("/auth/activate") || location.pathname.startsWith("/auth/reset_password") || location.pathname.startsWith("/auth/reset-password") || location.pathname.startsWith("/auth/login") || location.pathname.startsWith("/auth/invite") ) && ( )} {authorized && location.pathname === "/login" && ( )} {authorized ? ( {contextHolder} {isMobile ? (
) : (

{collapsed ? ( Icon ) : ( "TT ELD" )}

)} {isMobile ? (
) : (
e.preventDefault()} >

{username} {isLive ? (

online

) : (

offline

)}

)} } /> {mainItems && mainItems.map((u) => ( ))} {superItems && superItems.map((u) => ( ))} {superItems && ( } /> )} {superItems && ( } /> )} } />
) : ( <> )} } /> } /> } /> } /> } /> } />
); }; export default App;