From 766d3a24c429a99114792b124d430dc463820aa9 Mon Sep 17 00:00:00 2001 From: Szedann <65607498+Szedann@users.noreply.github.com> Date: Thu, 24 Jul 2025 13:52:09 +0200 Subject: [PATCH] refactor: hook based download --- apps/onelauncher/frontend/src/bindings.gen.ts | 18 +++--- .../frontend/src/hooks/useBrowser.tsx | 6 +- .../app/browser/package.$provider.$slug.tsx | 58 +++++++++++++------ 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/apps/onelauncher/frontend/src/bindings.gen.ts b/apps/onelauncher/frontend/src/bindings.gen.ts index a55b035b..c3765171 100644 --- a/apps/onelauncher/frontend/src/bindings.gen.ts +++ b/apps/onelauncher/frontend/src/bindings.gen.ts @@ -212,14 +212,8 @@ export type VersionType = */ "old_beta" -const ARGS_MAP = { 'core':'{"removeUser":["uuid"],"writeSettings":["setting"],"updateClusterById":["id","request"],"getScreenshots":["id"],"getClusters":[],"getWorlds":["id"],"getGameVersions":[],"getPackage":["provider","slug"],"getLoadersForVersion":["mc_version"],"getMultiplePackages":["provider","slugs"],"getPackageUser":["provider","slug"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"getUsersFromAuthor":["provider","author"],"searchPackages":["provider","query"],"getUser":["uuid"],"getProfileOrDefault":["name"],"updateClusterProfile":["name","profile"],"getPackageVersions":["provider","slug","mc_versions","loaders","offset","limit"],"launchCluster":["id","uuid"],"setDefaultUser":["uuid"],"openMsaLogin":[],"getGlobalProfile":[],"getClusterById":["id"],"getDefaultUser":["fallback"],"readSettings":[],"removeCluster":["id"],"createCluster":["options"],"getUsers":[]}', 'onelauncher':'{"set_window_style":["decorations"],"return_error":[],"open_dev_tools":[]}', 'events':'{"ingress":["event"],"message":["event"],"process":["event"]}' } -export type Router = { 'events': { ingress: (event: IngressPayload) => Promise, -message: (event: MessagePayload) => Promise, -process: (event: ProcessPayload) => Promise }, -'onelauncher': { return_error: () => Promise, -open_dev_tools: () => Promise, -set_window_style: (decorations: boolean) => Promise }, -'core': { getClusters: () => Promise, +const ARGS_MAP = { 'events':'{"ingress":["event"],"message":["event"],"process":["event"]}', 'core':'{"removeUser":["uuid"],"writeSettings":["setting"],"updateClusterById":["id","request"],"getScreenshots":["id"],"getClusters":[],"getWorlds":["id"],"getGameVersions":[],"getPackage":["provider","slug"],"getLoadersForVersion":["mc_version"],"getMultiplePackages":["provider","slugs"],"getPackageUser":["provider","slug"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"getUsersFromAuthor":["provider","author"],"searchPackages":["provider","query"],"getUser":["uuid"],"getProfileOrDefault":["name"],"updateClusterProfile":["name","profile"],"getPackageVersions":["provider","slug","mc_versions","loaders","offset","limit"],"launchCluster":["id","uuid"],"setDefaultUser":["uuid"],"openMsaLogin":[],"getGlobalProfile":[],"getClusterById":["id"],"getDefaultUser":["fallback"],"readSettings":[],"removeCluster":["id"],"createCluster":["options"],"getUsers":[]}', 'onelauncher':'{"set_window_style":["decorations"],"return_error":[],"open_dev_tools":[]}' } +export type Router = { 'core': { getClusters: () => Promise, getClusterById: (id: bigint) => Promise, removeCluster: (id: bigint) => Promise, createCluster: (options: CreateCluster) => Promise, @@ -246,7 +240,13 @@ getMultiplePackages: (provider: Provider, slugs: string[]) => Promise Promise>, getPackageUser: (provider: Provider, slug: string) => Promise, downloadPackage: (provider: Provider, packageId: string, versionId: string, clusterId: bigint, skipCompatibility: boolean | null) => Promise, -getUsersFromAuthor: (provider: Provider, author: PackageAuthor) => Promise } }; +getUsersFromAuthor: (provider: Provider, author: PackageAuthor) => Promise }, +'events': { ingress: (event: IngressPayload) => Promise, +message: (event: MessagePayload) => Promise, +process: (event: ProcessPayload) => Promise }, +'onelauncher': { return_error: () => Promise, +open_dev_tools: () => Promise, +set_window_style: (decorations: boolean) => Promise } }; export type { InferCommandOutput } diff --git a/apps/onelauncher/frontend/src/hooks/useBrowser.tsx b/apps/onelauncher/frontend/src/hooks/useBrowser.tsx index 261b1171..d433d140 100644 --- a/apps/onelauncher/frontend/src/hooks/useBrowser.tsx +++ b/apps/onelauncher/frontend/src/hooks/useBrowser.tsx @@ -4,7 +4,7 @@ import type { UndefinedInitialDataOptions } from '@tanstack/react-query'; import type { Dispatch, SetStateAction } from 'react'; import { bindings } from '@/main'; import { PROVIDERS } from '@/utils'; -import { useCommand } from '@onelauncher/common'; +import { useCommand, useCommandMut } from '@onelauncher/common'; import { useNavigate } from '@tanstack/react-router'; import { createContext, useContext, useEffect, useMemo, useState } from 'react'; @@ -79,3 +79,7 @@ export function usePackageData(provider: Provider, slug: string, options?: Omit< export function usePackageVersions(provider: Provider, slug: string, { mc_versions, loaders, offset, limit, ...options }: { mc_versions?: Array | null; loaders?: Array | null; offset?: number; limit: number } & Omit>, 'queryKey' | 'queryFn'>, key: false | BindingCommands | (string & {}) = `getPackageVersions.${provider}.${slug}.${mc_versions?.join('')}.${loaders?.join('')}`) { return useCommand(key, () => bindings.core.getPackageVersions(provider, slug, mc_versions ?? null, loaders ?? null, (offset ?? 0) as unknown as bigint, limit as unknown as bigint), options); } + +export function useDownloadPackage(cluster: ClusterModel, provider: Provider, version: ManagedVersion, skipCompatibility = false) { + return useCommandMut(() => bindings.core.downloadPackage(provider, version.project_id, version.version_id, cluster.id, skipCompatibility)); +} diff --git a/apps/onelauncher/frontend/src/routes/app/browser/package.$provider.$slug.tsx b/apps/onelauncher/frontend/src/routes/app/browser/package.$provider.$slug.tsx index 5a649bb0..11788629 100644 --- a/apps/onelauncher/frontend/src/routes/app/browser/package.$provider.$slug.tsx +++ b/apps/onelauncher/frontend/src/routes/app/browser/package.$provider.$slug.tsx @@ -1,7 +1,7 @@ import type { ClusterModel, ManagedPackage, ManagedUser, ManagedVersion, PackageDonationUrl, Provider } from '@/bindings.gen'; import type { HTMLProps } from 'react'; import Modal from '@/components/overlay/Modal'; -import { useBrowserContext, usePackageData, usePackageVersions } from '@/hooks/useBrowser'; +import { useBrowserContext, useDownloadPackage, usePackageData, usePackageVersions } from '@/hooks/useBrowser'; import { ChooseClusterModal, useClusters } from '@/hooks/useCluster'; import usePagination from '@/hooks/usePagination'; import { bindings } from '@/main'; @@ -253,7 +253,7 @@ function InstallButton() { const [open, setOpen] = useState(false); const clusters = useClusters(); const browserContext = useBrowserContext(); - const { data: versions } = usePackageVersions(provider, slug, { + const { data: versions, isLoading: versionsLoading } = usePackageVersions(provider, slug, { mc_versions: browserContext.cluster ? [browserContext.cluster.mc_version] : [], loaders: browserContext.cluster ? [browserContext.cluster.mc_loader] : [], limit: 1, @@ -264,11 +264,17 @@ function InstallButton() { return versions.items[0]; }, [browserContext.cluster, versions]); - function download() { - if (!version || !browserContext.cluster || !includes(PROVIDERS, provider)) - return false; - downloadPackage(browserContext.cluster, provider, version); - } + const download = useDownloadPackage(browserContext.cluster!, provider, version!, true); + const downloadRef = useRef(download); + useEffect(() => { + downloadRef.current.reset(); + }, [browserContext.cluster]); + + // function download() { + // if (!version || !browserContext.cluster || !includes(PROVIDERS, provider)) + // return false; + // downloadPackage(browserContext.cluster, provider, version); + // } return ( @@ -276,13 +282,13 @@ function InstallButton() { @@ -390,18 +411,19 @@ function Versions() { itemsCount: versions?.total as unknown as number, itemsPerPage: versions?.limit as unknown as number, }); + const paginationRef = useRef(pagination); useEffect(() => { setOffset(pagination.offset); }, [pagination.offset]); useEffect(() => { - pagination.reset(); + paginationRef.current.reset(); }, [versions?.total]); return ( -
+
- +
Name @@ -425,7 +447,7 @@ function VersionRow({ version }: { version: ManagedVersion }) { if (!includes(PROVIDERS, provider)) throw new Error('invalid provider'); return ( - +