Skip to content

Commit 766d3a2

Browse files
committed
refactor: hook based download
1 parent 4eb533d commit 766d3a2

File tree

3 files changed

+54
-28
lines changed

3 files changed

+54
-28
lines changed

apps/onelauncher/frontend/src/bindings.gen.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,8 @@ export type VersionType =
212212
*/
213213
"old_beta"
214214

215-
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"]}' }
216-
export type Router = { 'events': { ingress: (event: IngressPayload) => Promise<void>,
217-
message: (event: MessagePayload) => Promise<void>,
218-
process: (event: ProcessPayload) => Promise<void> },
219-
'onelauncher': { return_error: () => Promise<null>,
220-
open_dev_tools: () => Promise<void>,
221-
set_window_style: (decorations: boolean) => Promise<void> },
222-
'core': { getClusters: () => Promise<ClusterModel[]>,
215+
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":[]}' }
216+
export type Router = { 'core': { getClusters: () => Promise<ClusterModel[]>,
223217
getClusterById: (id: bigint) => Promise<ClusterModel | null>,
224218
removeCluster: (id: bigint) => Promise<null>,
225219
createCluster: (options: CreateCluster) => Promise<ClusterModel>,
@@ -246,7 +240,13 @@ getMultiplePackages: (provider: Provider, slugs: string[]) => Promise<ManagedPac
246240
getPackageVersions: (provider: Provider, slug: string, mcVersions: string[] | null, loaders: GameLoader[] | null, offset: bigint, limit: bigint) => Promise<Paginated<ManagedVersion>>,
247241
getPackageUser: (provider: Provider, slug: string) => Promise<ManagedUser>,
248242
downloadPackage: (provider: Provider, packageId: string, versionId: string, clusterId: bigint, skipCompatibility: boolean | null) => Promise<PackageModel>,
249-
getUsersFromAuthor: (provider: Provider, author: PackageAuthor) => Promise<ManagedUser[]> } };
243+
getUsersFromAuthor: (provider: Provider, author: PackageAuthor) => Promise<ManagedUser[]> },
244+
'events': { ingress: (event: IngressPayload) => Promise<void>,
245+
message: (event: MessagePayload) => Promise<void>,
246+
process: (event: ProcessPayload) => Promise<void> },
247+
'onelauncher': { return_error: () => Promise<null>,
248+
open_dev_tools: () => Promise<void>,
249+
set_window_style: (decorations: boolean) => Promise<void> } };
250250

251251

252252
export type { InferCommandOutput }

apps/onelauncher/frontend/src/hooks/useBrowser.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { UndefinedInitialDataOptions } from '@tanstack/react-query';
44
import type { Dispatch, SetStateAction } from 'react';
55
import { bindings } from '@/main';
66
import { PROVIDERS } from '@/utils';
7-
import { useCommand } from '@onelauncher/common';
7+
import { useCommand, useCommandMut } from '@onelauncher/common';
88
import { useNavigate } from '@tanstack/react-router';
99
import { createContext, useContext, useEffect, useMemo, useState } from 'react';
1010

@@ -79,3 +79,7 @@ export function usePackageData(provider: Provider, slug: string, options?: Omit<
7979
export function usePackageVersions(provider: Provider, slug: string, { mc_versions, loaders, offset, limit, ...options }: { mc_versions?: Array<string> | null; loaders?: Array<GameLoader> | null; offset?: number; limit: number } & Omit<UndefinedInitialDataOptions<Paginated<ManagedVersion>>, 'queryKey' | 'queryFn'>, key: false | BindingCommands | (string & {}) = `getPackageVersions.${provider}.${slug}.${mc_versions?.join('')}.${loaders?.join('')}`) {
8080
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);
8181
}
82+
83+
export function useDownloadPackage(cluster: ClusterModel, provider: Provider, version: ManagedVersion, skipCompatibility = false) {
84+
return useCommandMut(() => bindings.core.downloadPackage(provider, version.project_id, version.version_id, cluster.id, skipCompatibility));
85+
}

apps/onelauncher/frontend/src/routes/app/browser/package.$provider.$slug.tsx

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { ClusterModel, ManagedPackage, ManagedUser, ManagedVersion, PackageDonationUrl, Provider } from '@/bindings.gen';
22
import type { HTMLProps } from 'react';
33
import Modal from '@/components/overlay/Modal';
4-
import { useBrowserContext, usePackageData, usePackageVersions } from '@/hooks/useBrowser';
4+
import { useBrowserContext, useDownloadPackage, usePackageData, usePackageVersions } from '@/hooks/useBrowser';
55
import { ChooseClusterModal, useClusters } from '@/hooks/useCluster';
66
import usePagination from '@/hooks/usePagination';
77
import { bindings } from '@/main';
@@ -253,7 +253,7 @@ function InstallButton() {
253253
const [open, setOpen] = useState(false);
254254
const clusters = useClusters();
255255
const browserContext = useBrowserContext();
256-
const { data: versions } = usePackageVersions(provider, slug, {
256+
const { data: versions, isLoading: versionsLoading } = usePackageVersions(provider, slug, {
257257
mc_versions: browserContext.cluster ? [browserContext.cluster.mc_version] : [],
258258
loaders: browserContext.cluster ? [browserContext.cluster.mc_loader] : [],
259259
limit: 1,
@@ -264,25 +264,31 @@ function InstallButton() {
264264
return versions.items[0];
265265
}, [browserContext.cluster, versions]);
266266

267-
function download() {
268-
if (!version || !browserContext.cluster || !includes(PROVIDERS, provider))
269-
return false;
270-
downloadPackage(browserContext.cluster, provider, version);
271-
}
267+
const download = useDownloadPackage(browserContext.cluster!, provider, version!, true);
268+
const downloadRef = useRef(download);
269+
useEffect(() => {
270+
downloadRef.current.reset();
271+
}, [browserContext.cluster]);
272+
273+
// function download() {
274+
// if (!version || !browserContext.cluster || !includes(PROVIDERS, provider))
275+
// return false;
276+
// downloadPackage(browserContext.cluster, provider, version);
277+
// }
272278

273279
return (
274280

275281
<div className="h-12 flex flex-row w-full relative">
276282
<Button
277283
className="max-w-full flex-1 rounded-r-none disabled:text-white/50 disabled:bg-blue-900"
278284
color="primary"
279-
isDisabled={!version}
280-
onClick={download}
285+
isDisabled={!version || download.isPending || download.isSuccess}
286+
onClick={() => download.mutate()}
281287
>
282288
<Download01Icon />
283289
<div className="w-full text-sm">
284-
{
285-
browserContext.cluster
290+
<Show when={download.isIdle}>
291+
{browserContext.cluster
286292
? version
287293
? (
288294
<span>
@@ -291,9 +297,24 @@ function InstallButton() {
291297
<span className="text-md font-semibold">{browserContext.cluster.name}</span>
292298
</span>
293299
)
294-
: `No matching version found`
295-
: 'Select a Cluster'
296-
}
300+
: versionsLoading ? 'Looking for a version...' : 'No matching version found'
301+
: 'Select a Cluster'}
302+
</Show>
303+
<Show when={download.isPending}>
304+
<span>
305+
Downloading latest to
306+
<br />
307+
<span className="text-md font-semibold">{browserContext.cluster?.name ?? 'Unknown'}</span>
308+
</span>
309+
</Show>
310+
<Show when={download.isSuccess}>
311+
<span>
312+
Installed latest into
313+
<br />
314+
<span className="text-md font-semibold">{browserContext.cluster?.name ?? 'Unknown'}</span>
315+
</span>
316+
</Show>
317+
297318
</div>
298319
</Button>
299320

@@ -390,18 +411,19 @@ function Versions() {
390411
itemsCount: versions?.total as unknown as number,
391412
itemsPerPage: versions?.limit as unknown as number,
392413
});
414+
const paginationRef = useRef(pagination);
393415
useEffect(() => {
394416
setOffset(pagination.offset);
395417
}, [pagination.offset]);
396418
useEffect(() => {
397-
pagination.reset();
419+
paginationRef.current.reset();
398420
}, [versions?.total]);
399421
return (
400-
<div className="flex flex-col">
422+
<div className="flex flex-col w-full">
401423
<div className="flex justify-between">
402424
<pagination.Navigation />
403425
</div>
404-
<Table className="border-separate border-spacing-x-none border-spacing-y-1">
426+
<Table className="border-separate border-spacing-x-none border-spacing-y-1 w-full">
405427
<TableHeader className="text-left">
406428
<Column className="pr-2" />
407429
<Column className="pr-4" isRowHeader>Name</Column>
@@ -425,7 +447,7 @@ function VersionRow({ version }: { version: ManagedVersion }) {
425447
if (!includes(PROVIDERS, provider))
426448
throw new Error('invalid provider');
427449
return (
428-
<Row className="my-2 bg-page-elevated px-4 [&>td]:py-4">
450+
<Row className="my-2 bg-page-elevated px-4 [&>td]:py-4 w-full">
429451
<Cell className="p-4 my-2 bg-component-bg rounded-l-xl">
430452
<Tooltip text={upperFirst(version.release_type)}>
431453
<div className={`${colorForType(version.release_type)} h-8 w-8 flex items-center justify-center rounded-md`}>

0 commit comments

Comments
 (0)