import { useState } from 'react'; import { Plus, RefreshCw, Search } from 'lucide-react'; import { type AddonData, type AddonsStatus } from '~main/types'; import { api } from '~renderer/utils/api'; import TextButton from '~renderer/components/styled/TextButton'; import useScrollHint from '~renderer/utils/useScrollHint'; import DialogButton from '../styled/DialogButton'; import IconSpinner from '../styled/IconSpinner'; import AddonList from './addons/AddonList'; import { type Dependencies } from './addons/AddonListItem'; import CustomAddonDialog from './addons/CustomAddonDialog'; const localeFilter = (l: AddonData[], filter: string) => { const seen = new Set(); const deduped = l.filter(a => { if (seen.has(a.folder)) return false; seen.add(a.folder); return true; }); return deduped .filter( a => a.folder.toLocaleLowerCase().indexOf(filter.toLocaleLowerCase()) !== -1 ) .sort((a, b) => a.folder.localeCompare(b.folder)); }; const AddonsTab = () => { const [data, setData] = useState({ state: 'verifying', addons: {}, available: [] }); api.addons.observe.useSubscription(undefined, { onData: setData }); const isUpdateAvailable = Object.values(data.addons).some( a => a.status === 'outOfDate' || a.status === 'downloading' ); const dependencies: Dependencies = Object.fromEntries([ ...data.available.map(a => [a.folder, 'available']), ...Object.values(data.addons).map(a => [ a.folder, a.progress ?? (a.status === 'upToDate' ? 'installed' : 'available') ]) ]); const [filter, setFilter] = useState(''); const verify = api.addons.verify.useMutation(); const update = api.addons.update.useMutation(); const scrollRef = useScrollHint(); return (
!(a.folder in data.addons)), filter )} dependencies={dependencies} />

verify.mutateAsync()} className="-ml-2 text-blueGray" icon={RefreshCw} size={18} loading={data.state !== 'done'} > Check for updates } > {open => ( Add custom git addon )} {data.state === 'verifying' ? ( ) : isUpdateAvailable ? ( update.mutateAsync({})} className="justify-self-end text-warmGreen" > Update all ) : (

Everything is up to date.

)}
setFilter(e.target.value)} />
); }; export default AddonsTab;