Package manager UI-related tweaks (#4382)

* Add Plugins Path setting
* Fix/improve cache invalidation
* Hide load error when collapsing package source
* Package manager style tweaks
* Show error if installed packages query failed
* Prevent "No packages found" flicker
* Show <unknown> if empty version
* Always show latest version, highlight if new version available
* Fix issues with non-unique cross-source package ids
* Don't wrap id, version and date
* Decrease collapse button padding
* Display description for scraper packages
* Fix default packages population
* Change default package path to community
---------
Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
DingDongSoLong4
2023-12-22 05:05:53 +02:00
committed by GitHub
parent 23b4d4f1e0
commit a1bd7cf817
16 changed files with 611 additions and 500 deletions

View File

@@ -1,4 +1,9 @@
import { ApolloCache, DocumentNode, FetchResult } from "@apollo/client";
import {
ApolloCache,
DocumentNode,
FetchResult,
useQuery,
} from "@apollo/client";
import { Modifiers } from "@apollo/client/cache";
import {
isField,
@@ -1961,43 +1966,6 @@ export const mutateSubmitStashBoxPerformerDraft = (
variables: { input },
});
/// Packages
export const useInstalledScraperPackages = GQL.useInstalledScraperPackagesQuery;
export const useInstalledScraperPackagesStatus =
GQL.useInstalledScraperPackagesStatusQuery;
export const queryAvailableScraperPackages = (source: string) =>
client.query<GQL.AvailableScraperPackagesQuery>({
query: GQL.AvailableScraperPackagesDocument,
variables: {
source,
},
fetchPolicy: "network-only",
});
export const useInstallScraperPackages = GQL.useInstallScraperPackagesMutation;
export const useUpdateScraperPackages = GQL.useUpdateScraperPackagesMutation;
export const useUninstallScraperPackages =
GQL.useUninstallScraperPackagesMutation;
export const useInstalledPluginPackages = GQL.useInstalledPluginPackagesQuery;
export const useInstalledPluginPackagesStatus =
GQL.useInstalledPluginPackagesStatusQuery;
export const queryAvailablePluginPackages = (source: string) =>
client.query<GQL.AvailablePluginPackagesQuery>({
query: GQL.AvailablePluginPackagesDocument,
variables: {
source,
},
fetchPolicy: "network-only",
});
export const useInstallPluginPackages = GQL.useInstallPluginPackagesMutation;
export const useUpdatePluginPackages = GQL.useUpdatePluginPackagesMutation;
export const useUninstallPluginPackages =
GQL.useUninstallPluginPackagesMutation;
/// Configuration
export const useConfiguration = () => GQL.useConfigurationQuery();
@@ -2043,6 +2011,65 @@ export const useJobsSubscribe = () => GQL.useJobsSubscribeSubscription();
export const useLoggingSubscribe = () => GQL.useLoggingSubscribeSubscription();
// all scraper-related queries
export const scraperMutationImpactedQueries = [
GQL.ListMovieScrapersDocument,
GQL.ListPerformerScrapersDocument,
GQL.ListSceneScrapersDocument,
GQL.InstalledScraperPackagesDocument,
GQL.InstalledScraperPackagesStatusDocument,
];
export const mutateReloadScrapers = () =>
client.mutate<GQL.ReloadScrapersMutation>({
mutation: GQL.ReloadScrapersDocument,
update(cache, result) {
if (!result.data?.reloadScrapers) return;
evictQueries(cache, scraperMutationImpactedQueries);
},
});
// all plugin-related queries
export const pluginMutationImpactedQueries = [
GQL.PluginsDocument,
GQL.PluginTasksDocument,
GQL.InstalledPluginPackagesDocument,
GQL.InstalledPluginPackagesStatusDocument,
];
export const mutateReloadPlugins = () =>
client.mutate<GQL.ReloadPluginsMutation>({
mutation: GQL.ReloadPluginsDocument,
update(cache, result) {
if (!result.data?.reloadPlugins) return;
evictQueries(cache, pluginMutationImpactedQueries);
},
});
type BoolMap = { [key: string]: boolean };
export const mutateSetPluginsEnabled = (enabledMap: BoolMap) =>
client.mutate<GQL.SetPluginsEnabledMutation>({
mutation: GQL.SetPluginsEnabledDocument,
variables: { enabledMap },
update(cache, result) {
if (!result.data?.setPluginsEnabled) return;
for (const id in enabledMap) {
cache.modify({
id: cache.identify({ __typename: "Plugin", id }),
fields: {
enabled() {
return enabledMap[id];
},
},
});
}
},
});
function updateConfiguration(cache: ApolloCache<unknown>, result: FetchResult) {
if (!result.data) return;
@@ -2051,7 +2078,15 @@ function updateConfiguration(cache: ApolloCache<unknown>, result: FetchResult) {
export const useConfigureGeneral = () =>
GQL.useConfigureGeneralMutation({
update: updateConfiguration,
update(cache, result) {
if (!result.data?.configureGeneral) return;
evictQueries(cache, [
GQL.ConfigurationDocument,
...scraperMutationImpactedQueries,
...pluginMutationImpactedQueries,
]);
},
});
export const useConfigureInterface = () =>
@@ -2097,48 +2132,6 @@ export const useAddTempDLNAIP = () => GQL.useAddTempDlnaipMutation();
export const useRemoveTempDLNAIP = () => GQL.useRemoveTempDlnaipMutation();
export const mutateReloadScrapers = () =>
client.mutate<GQL.ReloadScrapersMutation>({
mutation: GQL.ReloadScrapersDocument,
update(cache, result) {
if (!result.data?.reloadScrapers) return;
evictQueries(cache, [
GQL.ListMovieScrapersDocument,
GQL.ListPerformerScrapersDocument,
GQL.ListSceneScrapersDocument,
]);
},
});
const pluginMutationImpactedQueries = [
GQL.PluginsDocument,
GQL.PluginTasksDocument,
];
export const mutateReloadPlugins = () =>
client.mutate<GQL.ReloadPluginsMutation>({
mutation: GQL.ReloadPluginsDocument,
update(cache, result) {
if (!result.data?.reloadPlugins) return;
evictQueries(cache, pluginMutationImpactedQueries);
},
});
type BoolMap = { [key: string]: boolean };
export const mutateSetPluginsEnabled = (enabledMap: BoolMap) =>
client.mutate<GQL.SetPluginsEnabledMutation>({
mutation: GQL.SetPluginsEnabledDocument,
variables: { enabledMap },
update(cache, result) {
if (!result.data?.setPluginsEnabled) return;
evictQueries(cache, pluginMutationImpactedQueries);
},
});
export const mutateStopJob = (jobID: string) =>
client.mutate<GQL.StopJobMutation>({
mutation: GQL.StopJobDocument,
@@ -2172,6 +2165,118 @@ export const mutateMigrate = (input: GQL.MigrateInput) =>
},
});
/// Packages
// Acts like GQL.useInstalledScraperPackagesStatusQuery if loadUpgrades is true,
// and GQL.useInstalledScraperPackagesQuery if it is false
export const useInstalledScraperPackages = <T extends boolean>(
loadUpgrades: T
) => {
const query = loadUpgrades
? GQL.InstalledScraperPackagesStatusDocument
: GQL.InstalledScraperPackagesDocument;
type TData = T extends true
? GQL.InstalledScraperPackagesStatusQuery
: GQL.InstalledScraperPackagesQuery;
type TVariables = T extends true
? GQL.InstalledScraperPackagesStatusQueryVariables
: GQL.InstalledScraperPackagesQueryVariables;
return useQuery<TData, TVariables>(query);
};
export const queryAvailableScraperPackages = (source: string) =>
client.query<GQL.AvailableScraperPackagesQuery>({
query: GQL.AvailableScraperPackagesDocument,
variables: {
source,
},
fetchPolicy: "network-only",
});
export const mutateInstallScraperPackages = (
packages: GQL.PackageSpecInput[]
) =>
client.mutate<GQL.InstallScraperPackagesMutation>({
mutation: GQL.InstallScraperPackagesDocument,
variables: {
packages,
},
});
export const mutateUpdateScraperPackages = (packages: GQL.PackageSpecInput[]) =>
client.mutate<GQL.UpdateScraperPackagesMutation>({
mutation: GQL.UpdateScraperPackagesDocument,
variables: {
packages,
},
});
export const mutateUninstallScraperPackages = (
packages: GQL.PackageSpecInput[]
) =>
client.mutate<GQL.UninstallScraperPackagesMutation>({
mutation: GQL.UninstallScraperPackagesDocument,
variables: {
packages,
},
});
// Acts like GQL.useInstalledPluginPackagesStatusQuery if loadUpgrades is true,
// and GQL.useInstalledPluginPackagesQuery if it is false
export const useInstalledPluginPackages = <T extends boolean>(
loadUpgrades: T
) => {
const query = loadUpgrades
? GQL.InstalledPluginPackagesStatusDocument
: GQL.InstalledPluginPackagesDocument;
type TData = T extends true
? GQL.InstalledPluginPackagesStatusQuery
: GQL.InstalledPluginPackagesQuery;
type TVariables = T extends true
? GQL.InstalledPluginPackagesStatusQueryVariables
: GQL.InstalledPluginPackagesQueryVariables;
return useQuery<TData, TVariables>(query);
};
export const queryAvailablePluginPackages = (source: string) =>
client.query<GQL.AvailablePluginPackagesQuery>({
query: GQL.AvailablePluginPackagesDocument,
variables: {
source,
},
fetchPolicy: "network-only",
});
export const mutateInstallPluginPackages = (packages: GQL.PackageSpecInput[]) =>
client.mutate<GQL.InstallPluginPackagesMutation>({
mutation: GQL.InstallPluginPackagesDocument,
variables: {
packages,
},
});
export const mutateUpdatePluginPackages = (packages: GQL.PackageSpecInput[]) =>
client.mutate<GQL.UpdatePluginPackagesMutation>({
mutation: GQL.UpdatePluginPackagesDocument,
variables: {
packages,
},
});
export const mutateUninstallPluginPackages = (
packages: GQL.PackageSpecInput[]
) =>
client.mutate<GQL.UninstallPluginPackagesMutation>({
mutation: GQL.UninstallPluginPackagesDocument,
variables: {
packages,
},
});
/// Tasks
export const mutateMetadataScan = (input: GQL.ScanMetadataInput) =>