import {useStore} from "../store/store.ts"; import {useEffect, useMemo, useState} from "react"; import {InstalledPlugin, PluginDef, SearchParams} from "./Plugin.ts"; import {useDebounce} from "../utils/useDebounce.ts"; import {Trans, useTranslation} from "react-i18next"; import {SearchField} from "../components/SearchField.tsx"; import {Download, Trash} from "lucide-react"; import {IconButton} from "../components/IconButton.tsx"; import {determineSorting} from "../utils/sorting.ts"; export const HomePage = () => { const pluginsSocket = useStore(state=>state.pluginsSocket) const [plugins,setPlugins] = useState([]) const [installedPlugins, setInstalledPlugins] = useState([]) const [searchParams, setSearchParams] = useState({ offset: 0, limit: 99999, sortBy: 'name', sortDir: 'asc', searchTerm: '' }) const filteredInstallablePlugins = useMemo(()=>{ return plugins.sort((a, b)=>{ if(searchParams.sortBy === "version"){ if(searchParams.sortDir === "asc"){ return a.version.localeCompare(b.version) } return b.version.localeCompare(a.version) } if(searchParams.sortBy === "last-updated"){ if(searchParams.sortDir === "asc"){ return a.time.localeCompare(b.time) } return b.time.localeCompare(a.time) } if (searchParams.sortBy === "name") { if(searchParams.sortDir === "asc"){ return a.name.localeCompare(b.name) } return b.name.localeCompare(a.name) } return 0 }) }, [plugins, searchParams]) const sortedInstalledPlugins = useMemo(()=>{ return installedPlugins.sort((a, b)=>{ if(a.name < b.name){ return -1 } if(a.name > b.name){ return 1 } return 0 }) } ,[installedPlugins, searchParams]) const [searchTerm, setSearchTerm] = useState('') const {t} = useTranslation() useEffect(() => { if(!pluginsSocket){ return } pluginsSocket.on('results:installed', (data:{ installed: InstalledPlugin[] })=>{ setInstalledPlugins(data.installed) }) pluginsSocket.on('results:updatable', (data) => { data.updatable.forEach((pluginName: string) => { setInstalledPlugins(installedPlugins.map(plugin => { if (plugin.name === pluginName) { return { ...plugin, updatable: true } } return plugin })) }) }) pluginsSocket.on('finished:install', () => { pluginsSocket!.emit('getInstalled'); }) pluginsSocket.on('finished:uninstall', () => { console.log("Finished uninstall") }) // Reload on reconnect pluginsSocket.on('connect', ()=>{ // Initial retrieval of installed plugins pluginsSocket.emit('getInstalled'); pluginsSocket.emit('search', searchParams) }) pluginsSocket.emit('getInstalled'); // check for updates every 5mins const interval = setInterval(() => { pluginsSocket.emit('checkUpdates'); }, 1000 * 60 * 5); return ()=>{ clearInterval(interval) } }, [pluginsSocket]); useEffect(() => { if (!pluginsSocket) { return } pluginsSocket?.emit('search', searchParams) pluginsSocket!.on('results:search', (data: { results: PluginDef[] }) => { setPlugins(data.results) }) pluginsSocket!.on('results:searcherror', (data: {error: string}) => { console.log(data.error) useStore.getState().setToastState({ open: true, title: "Error retrieving plugins", success: false }) }) }, [searchParams, pluginsSocket]); const uninstallPlugin = (pluginName: string)=>{ pluginsSocket!.emit('uninstall', pluginName); // Remove plugin setInstalledPlugins(installedPlugins.filter(i=>i.name !== pluginName)) } const installPlugin = (pluginName: string)=>{ pluginsSocket!.emit('install', pluginName); setPlugins(plugins.filter(plugin=>plugin.name !== pluginName)) } useDebounce(()=>{ setSearchParams({ ...searchParams, offset: 0, searchTerm: searchTerm }) }, 500, [searchTerm]) return

{sortedInstalledPlugins.map((plugin, index) => { return })}
{plugin.name} {plugin.version} { plugin.updatable ? : } title={} onClick={() => uninstallPlugin(plugin.name)}/> }

{setSearchTerm(v.target.value)}} placeholder={t('admin_plugins.available_search.placeholder')} value={searchTerm}/>
{(filteredInstallablePlugins.length > 0) ? filteredInstallablePlugins.map((plugin) => { return }) : }
{ setSearchParams({ ...searchParams, sortBy: 'name', sortDir: searchParams.sortDir === "asc"? "desc": "asc" }) }}> { setSearchParams({ ...searchParams, sortBy: 'version', sortDir: searchParams.sortDir === "asc"? "desc": "asc" }) }}> { setSearchParams({ ...searchParams, sortBy: 'last-updated', sortDir: searchParams.sortDir === "asc"? "desc": "asc" }) }}>
{plugin.name} {plugin.description} {plugin.version} {plugin.time} } onClick={() => installPlugin(plugin.name)} title={}/>
{searchTerm == '' ? : }
}