import { BanIcon, BlocksIcon, DownloadIcon, FolderInputIcon, LoaderCircleIcon, SearchIcon, SettingsIcon, SpellCheckIcon, XIcon, } from "lucide-react" import { useTranslation } from "react-i18next" import { Button } from "@/components/ui/button" import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, } from "@/components/ui/input-group" import { ScrollArea } from "@/components/ui/scroll-area" import { TooltipIconButton } from "@/components/common/tooltip-icon-button" import { cn } from "@/lib/utils" import { pluginStoreActions, usePluginStore } from "@/store" import { type PluginInstalledItem } from "./types" import { pluginDefaultLogoUrl } from "./utils" export interface PluginSidebarListItem { fullName: string name: string description: string author: string version: string logo: string homepage: string hasInstall: boolean installedPlugin: PluginInstalledItem | null } interface PluginSidebarProps { items: PluginSidebarListItem[] selectedPluginFullName: string | null onSelectPlugin: (fullName: string) => void onInstallPlugin: (fullName: string) => void onOpenAwesomeList: () => void onImportLocalPlugin: () => void onOpenPluginMenu: (plugin: PluginInstalledItem) => void } export function PluginSidebar({ items, selectedPluginFullName, onSelectPlugin, onInstallPlugin, onOpenAwesomeList, onImportLocalPlugin, onOpenPluginMenu, }: PluginSidebarProps) { const { t } = useTranslation() const searchValue = usePluginStore.use.searchValue() const exactMatch = usePluginStore.use.exactMatch() const isSearching = usePluginStore.use.isSearching() const isImportingLocal = usePluginStore.use.isImportingLocal() const loadingMap = usePluginStore.use.isMutatingByPlugin() const normalizedSearch = searchValue.trim().toLowerCase() const hasSearch = normalizedSearch.length > 0 const scrollAreaKey = `${hasSearch ? "search" : "installed"}:${items.length}` return ( ) }