Files
Termix/src/ui/desktop/DesktopApp.tsx
T

183 lines
5.7 KiB
TypeScript
Raw Normal View History

+7
2025-11-05 10:36:16 -06:00
import React, { useState, useEffect, useCallback } from "react";
import { LeftSidebar } from "@/ui/desktop/navigation/LeftSidebar.tsx";
import { Dashboard } from "@/ui/desktop/apps/dashboard/Dashboard.tsx";
import { AppView } from "@/ui/desktop/navigation/AppView.tsx";
import { HostManager } from "@/ui/desktop/apps/host-manager/HostManager.tsx";
2025-09-12 14:42:00 -05:00
import {
TabProvider,
useTabs,
+7
2025-11-05 10:36:16 -06:00
} from "@/ui/desktop/navigation/tabs/TabContext.tsx";
import { TopNavbar } from "@/ui/desktop/navigation/TopNavbar.tsx";
import { AdminSettings } from "@/ui/desktop/admin/AdminSettings.tsx";
import { UserProfile } from "@/ui/desktop/user/UserProfile.tsx";
2025-09-12 14:42:00 -05:00
import { Toaster } from "@/components/ui/sonner.tsx";
+7
2025-11-05 10:36:16 -06:00
import { getUserInfo } from "@/ui/main-axios.ts";
2025-09-12 14:42:00 -05:00
function AppContent() {
const [isAuthenticated, setIsAuthenticated] = useState(false);
const [username, setUsername] = useState<string | null>(null);
const [isAdmin, setIsAdmin] = useState(false);
const [authLoading, setAuthLoading] = useState(true);
2025-10-06 10:11:25 -05:00
const [isTopbarOpen, setIsTopbarOpen] = useState<boolean>(() => {
const saved = localStorage.getItem("topNavbarOpen");
return saved !== null ? JSON.parse(saved) : true;
});
2025-09-12 14:42:00 -05:00
const { currentTab, tabs } = useTabs();
useEffect(() => {
const checkAuth = () => {
2025-10-01 15:40:10 -05:00
setAuthLoading(true);
getUserInfo()
.then((meRes) => {
+7
2025-11-05 10:36:16 -06:00
if (typeof meRes === "string" || !meRes.username) {
2025-09-12 14:42:00 -05:00
setIsAuthenticated(false);
setIsAdmin(false);
setUsername(null);
+7
2025-11-05 10:36:16 -06:00
} else {
setIsAuthenticated(true);
setIsAdmin(!!meRes.is_admin);
setUsername(meRes.username || null);
2025-10-01 15:40:10 -05:00
}
})
.catch((err) => {
setIsAuthenticated(false);
setIsAdmin(false);
setUsername(null);
const errorCode = err?.response?.data?.code;
if (errorCode === "SESSION_EXPIRED") {
console.warn("Session expired - please log in again");
}
})
+7
2025-11-05 10:36:16 -06:00
.finally(() => {
setAuthLoading(false);
});
2025-09-12 14:42:00 -05:00
};
checkAuth();
const handleStorageChange = () => checkAuth();
window.addEventListener("storage", handleStorageChange);
return () => window.removeEventListener("storage", handleStorageChange);
}, []);
2025-10-06 10:11:25 -05:00
useEffect(() => {
localStorage.setItem("topNavbarOpen", JSON.stringify(isTopbarOpen));
}, [isTopbarOpen]);
+7
2025-11-05 10:36:16 -06:00
const handleSelectView = () => {};
2025-09-12 14:42:00 -05:00
+7
2025-11-05 10:36:16 -06:00
const handleAuthSuccess = useCallback(
(authData: {
isAdmin: boolean;
username: string | null;
userId: string | null;
}) => {
setIsAuthenticated(true);
setIsAdmin(authData.isAdmin);
setUsername(authData.username);
},
[],
);
2025-09-12 14:42:00 -05:00
const currentTabData = tabs.find((tab) => tab.id === currentTab);
const showTerminalView =
currentTabData?.type === "terminal" ||
currentTabData?.type === "server" ||
currentTabData?.type === "file_manager";
const showHome = currentTabData?.type === "home";
const showSshManager = currentTabData?.type === "ssh_manager";
const showAdmin = currentTabData?.type === "admin";
const showProfile = currentTabData?.type === "user_profile";
return (
<div>
+7
2025-11-05 10:36:16 -06:00
{!isAuthenticated && !authLoading && (
2025-09-12 14:42:00 -05:00
<div className="fixed inset-0 flex items-center justify-center z-[10000]">
+7
2025-11-05 10:36:16 -06:00
<Dashboard
2025-09-12 14:42:00 -05:00
onSelectView={handleSelectView}
isAuthenticated={isAuthenticated}
authLoading={authLoading}
onAuthSuccess={handleAuthSuccess}
isTopbarOpen={isTopbarOpen}
/>
</div>
)}
{isAuthenticated && (
<LeftSidebar
onSelectView={handleSelectView}
disabled={!isAuthenticated || authLoading}
isAdmin={isAdmin}
username={username}
>
2025-10-01 15:40:10 -05:00
<div
className="h-screen w-full visible pointer-events-auto static overflow-hidden"
style={{ display: showTerminalView ? "block" : "none" }}
>
<AppView isTopbarOpen={isTopbarOpen} />
</div>
2025-09-12 14:42:00 -05:00
{showHome && (
<div className="h-screen w-full visible pointer-events-auto static overflow-hidden">
+7
2025-11-05 10:36:16 -06:00
<Dashboard
2025-09-12 14:42:00 -05:00
onSelectView={handleSelectView}
isAuthenticated={isAuthenticated}
authLoading={authLoading}
onAuthSuccess={handleAuthSuccess}
isTopbarOpen={isTopbarOpen}
/>
</div>
)}
{showSshManager && (
<div className="h-screen w-full visible pointer-events-auto static overflow-hidden">
<HostManager
onSelectView={handleSelectView}
isTopbarOpen={isTopbarOpen}
+7
2025-11-05 10:36:16 -06:00
initialTab={currentTabData?.initialTab}
hostConfig={currentTabData?.hostConfig}
2025-09-12 14:42:00 -05:00
/>
</div>
)}
{showAdmin && (
<div className="h-screen w-full visible pointer-events-auto static overflow-hidden">
<AdminSettings isTopbarOpen={isTopbarOpen} />
</div>
)}
{showProfile && (
<div className="h-screen w-full visible pointer-events-auto static overflow-auto">
<UserProfile isTopbarOpen={isTopbarOpen} />
</div>
)}
<TopNavbar
isTopbarOpen={isTopbarOpen}
setIsTopbarOpen={setIsTopbarOpen}
/>
</LeftSidebar>
)}
<Toaster
position="bottom-right"
richColors={false}
closeButton
duration={5000}
offset={20}
/>
</div>
);
}
function DesktopApp() {
return (
<TabProvider>
<AppContent />
</TabProvider>
);
}
export default DesktopApp;