diff --git a/src/ui/desktop/navigation/LeftSidebar.tsx b/src/ui/desktop/navigation/LeftSidebar.tsx index 15b0e812..9669b788 100644 --- a/src/ui/desktop/navigation/LeftSidebar.tsx +++ b/src/ui/desktop/navigation/LeftSidebar.tsx @@ -34,8 +34,9 @@ import { import { Input } from "@/components/ui/input.tsx"; import { Button } from "@/components/ui/button.tsx"; import { FolderCard } from "@/ui/desktop/navigation/hosts/FolderCard.tsx"; -import { getSSHHosts } from "@/ui/main-axios.ts"; +import { getSSHHosts, getSSHFolders } from "@/ui/main-axios.ts"; import { useTabs } from "@/ui/desktop/navigation/tabs/TabContext.tsx"; +import type { SSHFolder } from "@/types/index.ts"; interface SSHHost { id: number; @@ -145,6 +146,20 @@ export function LeftSidebar({ const prevHostsRef = React.useRef([]); const [search, setSearch] = useState(""); const [debouncedSearch, setDebouncedSearch] = useState(""); + const [folderMetadata, setFolderMetadata] = useState>(new Map()); + + const fetchFolderMetadata = React.useCallback(async () => { + try { + const folders = await getSSHFolders(); + const metadataMap = new Map(); + folders.forEach((folder) => { + metadataMap.set(folder.name, folder); + }); + setFolderMetadata(metadataMap); + } catch (error) { + console.error("Failed to fetch folder metadata:", error); + } + }, []); const fetchHosts = React.useCallback(async () => { try { @@ -210,13 +225,18 @@ export function LeftSidebar({ React.useEffect(() => { fetchHosts(); - const interval = setInterval(fetchHosts, 300000); + fetchFolderMetadata(); + const interval = setInterval(() => { + fetchHosts(); + fetchFolderMetadata(); + }, 300000); return () => clearInterval(interval); - }, [fetchHosts]); + }, [fetchHosts, fetchFolderMetadata]); React.useEffect(() => { const handleHostsChanged = () => { fetchHosts(); + fetchFolderMetadata(); }; const handleCredentialsChanged = () => { fetchHosts(); @@ -239,7 +259,7 @@ export function LeftSidebar({ handleCredentialsChanged as EventListener, ); }; - }, [fetchHosts]); + }, [fetchHosts, fetchFolderMetadata]); React.useEffect(() => { const handler = setTimeout(() => setDebouncedSearch(search), 200); @@ -437,15 +457,20 @@ export function LeftSidebar({ )} - {sortedFolders.map((folder, idx) => ( - - ))} + {sortedFolders.map((folder, idx) => { + const metadata = folderMetadata.get(folder); + return ( + + ); + })} diff --git a/src/ui/desktop/navigation/hosts/FolderCard.tsx b/src/ui/desktop/navigation/hosts/FolderCard.tsx index 82b0dc38..67451273 100644 --- a/src/ui/desktop/navigation/hosts/FolderCard.tsx +++ b/src/ui/desktop/navigation/hosts/FolderCard.tsx @@ -1,6 +1,18 @@ import React, { useState } from "react"; import { CardTitle } from "@/components/ui/card.tsx"; -import { ChevronDown, Folder } from "lucide-react"; +import { + ChevronDown, + Folder, + Server, + Cloud, + Database, + Box, + Package, + Layers, + Archive, + HardDrive, + Globe, +} from "lucide-react"; import { Button } from "@/components/ui/button.tsx"; import { Host } from "@/ui/desktop/navigation/hosts/Host.tsx"; import { Separator } from "@/components/ui/separator.tsx"; @@ -40,11 +52,15 @@ interface FolderCardProps { hosts: SSHHost[]; isFirst: boolean; isLast: boolean; + folderColor?: string; + folderIcon?: string; } export function FolderCard({ folderName, hosts, + folderColor, + folderIcon, }: FolderCardProps): React.ReactElement { const [isExpanded, setIsExpanded] = useState(true); @@ -52,6 +68,21 @@ export function FolderCard({ setIsExpanded(!isExpanded); }; + const iconMap: Record> = { + Folder, + Server, + Cloud, + Database, + Box, + Package, + Layers, + Archive, + HardDrive, + Globe, + }; + + const FolderIcon = folderIcon && iconMap[folderIcon] ? iconMap[folderIcon] : Folder; + return (
- +