diff --git a/src/renderer/src/components/plugins/list/PluginManager.tsx b/src/renderer/src/components/plugins/list/PluginManager.tsx index 61ae718af49..b2885c060e0 100644 --- a/src/renderer/src/components/plugins/list/PluginManager.tsx +++ b/src/renderer/src/components/plugins/list/PluginManager.tsx @@ -1,15 +1,12 @@ -import { useCallback, useMemo, useState } from 'react' +import { useCallback, useState } from 'react' import type { PluginHostListEntry } from '../../../../../preload/api-types' import { translate } from '@/i18n/i18n' import { useTranslate, type Translate } from '@/i18n/use-translate' import { Button } from '../../ui/button' import { PluginCatalogLayout, type PluginCatalogFilter } from './PluginCatalogLayout' import { PluginListGroup } from './PluginListGroup' -import { - buildPluginListEntries, - matchesPluginSearch, - type PluginListEntry -} from './plugin-list-entries' +import { matchesPluginSearch, type PluginListEntry } from './plugin-list-entries' +import { usePluginManagerEntries } from './use-plugin-manager-entries' import type { InstalledRowHandlers } from './PluginManagerRows' import { PluginMarketplaceSourceDialog } from '../dialogs/PluginMarketplaceSourceDialog' import { PluginCatalogLinkDialog } from '../dialogs/PluginCatalogLinkDialog' @@ -34,8 +31,6 @@ import { PluginNoneInstalled, PluginPageMissing } from './PluginListEmptyStates' -import { sortByAttention } from '../presentation/plugin-status-presentation' -import { usePluginAutoUpdatesStore } from '@/store/plugins/updates/plugin-auto-updates' import { PluginUpdateAllDialog } from '../dialogs/PluginUpdateAllDialog' import { matchesPluginFilter, @@ -137,20 +132,13 @@ export function PluginManager({ }) const prefetch = usePluginHoverPrefetch(catalog.fetchPreview) const orcaVersion = useOrcaVersion() - const autoUpdated = usePluginAutoUpdatesStore((state) => state.updated) - const autoNeedsReview = usePluginAutoUpdatesStore((state) => state.needsReview) - - const entries = useMemo(() => { - const built = buildPluginListEntries(plugins, catalog.listings, { - sources: catalog.sources, - orcaVersion, - autoUpdates: { updated: autoUpdated, needsReview: autoNeedsReview } - }) - return { - ...built, - installed: sortByAttention(built.installed, (entry) => Boolean(entry.updateVersion)) - } - }, [plugins, catalog.listings, catalog.sources, orcaVersion, autoUpdated, autoNeedsReview]) + const entries = usePluginManagerEntries( + plugins, + catalog.listings, + catalog.sources, + orcaVersion, + t + ) const query = search.trim() const filterSize = pluginFilterSize(listFilter) const narrowed = Boolean(query) || filterSize > 0 diff --git a/src/renderer/src/components/plugins/list/use-plugin-manager-entries.ts b/src/renderer/src/components/plugins/list/use-plugin-manager-entries.ts new file mode 100644 index 00000000000..5669a742187 --- /dev/null +++ b/src/renderer/src/components/plugins/list/use-plugin-manager-entries.ts @@ -0,0 +1,35 @@ +import { useMemo } from 'react' +import type { Translate } from '@/i18n/use-translate' +import { usePluginAutoUpdatesStore } from '@/store/plugins/updates/plugin-auto-updates' +import { sortByAttention } from '../presentation/plugin-status-presentation' +import { buildPluginListEntries } from './plugin-list-entries' + +type EntryOptions = NonNullable[2]> + +/** Installed and catalog entries for the plugin manager, installed ones needing attention first. */ +export function usePluginManagerEntries( + plugins: Parameters[0], + listings: Parameters[1], + sources: EntryOptions['sources'], + orcaVersion: EntryOptions['orcaVersion'], + t: Translate +): ReturnType { + const autoUpdated = usePluginAutoUpdatesStore((state) => state.updated) + const autoNeedsReview = usePluginAutoUpdatesStore((state) => state.needsReview) + return useMemo(() => { + const built = buildPluginListEntries( + plugins, + listings, + { + sources, + orcaVersion, + autoUpdates: { updated: autoUpdated, needsReview: autoNeedsReview } + }, + t + ) + return { + ...built, + installed: sortByAttention(built.installed, (entry) => Boolean(entry.updateVersion)) + } + }, [plugins, listings, sources, orcaVersion, autoUpdated, autoNeedsReview, t]) +}