From 089fbd3e2691470a43654d70c1a04a407b0523e8 Mon Sep 17 00:00:00 2001 From: Szedann <65607498+Szedann@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:42:09 +0200 Subject: [PATCH] fix: browser category selector --- .../frontend/src/hooks/useBrowser.tsx | 22 ++++++++++--- .../frontend/src/routes/app/browser/index.tsx | 12 +++++-- .../frontend/src/routes/app/browser/route.tsx | 33 +++++++++++++++---- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/apps/onelauncher/frontend/src/hooks/useBrowser.tsx b/apps/onelauncher/frontend/src/hooks/useBrowser.tsx index 60fce83d..51be9ff1 100644 --- a/apps/onelauncher/frontend/src/hooks/useBrowser.tsx +++ b/apps/onelauncher/frontend/src/hooks/useBrowser.tsx @@ -1,17 +1,16 @@ -import type { ClusterModel } from '@/bindings.gen'; +import type { ClusterModel, Provider, SearchQuery } from '@/bindings.gen'; import { bindings } from '@/main'; import { PROVIDERS } from '@/utils'; import { useCommand } from '@onelauncher/common'; import { createContext, useContext, useMemo, useState } from 'react'; -type Provider = typeof PROVIDERS[number]; - export interface BrowserControllerType { cluster: ClusterModel | undefined; setCluster: (cluster: ClusterModel | undefined) => void; provider: Provider; setProvider: (provider: Provider) => void; - + query: SearchQuery; + setQuery: (query: SearchQuery) => void; search: () => void; } @@ -28,14 +27,23 @@ export function BrowserProvider(props: any) { const { children } = props; const [cluster, setCluster] = useState(undefined); const [provider, setProvider] = useState(PROVIDERS[0]); + const [query, setQuery] = useState({ + filters: null, + query: null, + limit: 18 as unknown as bigint, + offset: null, + sort: null, + }); const context = useMemo(() => ({ cluster, setCluster, provider, setProvider, + query, + setQuery, search: () => {}, - }), [cluster, provider]); + }), [cluster, provider, query]); return ( @@ -43,3 +51,7 @@ export function BrowserProvider(props: any) { ); } + +export function useBrowserSearch(provider: Provider, query: SearchQuery) { + return useCommand('searchPackages', () => bindings.core.searchPackages(provider, query)); +} diff --git a/apps/onelauncher/frontend/src/routes/app/browser/index.tsx b/apps/onelauncher/frontend/src/routes/app/browser/index.tsx index 9f8e8723..43cc0b81 100644 --- a/apps/onelauncher/frontend/src/routes/app/browser/index.tsx +++ b/apps/onelauncher/frontend/src/routes/app/browser/index.tsx @@ -1,7 +1,7 @@ import OneConfigLogo from '@/assets/logos/oneconfig.svg'; -import { useBrowserContext } from '@/hooks/useBrowser'; +import { useBrowserContext, useBrowserSearch } from '@/hooks/useBrowser'; import { Button, Show } from '@onelauncher/common/components'; -import { createFileRoute } from '@tanstack/react-router'; +import { createFileRoute, useSearch } from '@tanstack/react-router'; import { ChevronRightIcon } from '@untitled-theme/icons-react'; import { BrowserLayout } from './route'; @@ -20,6 +20,8 @@ function RouteComponent() { } function Featured() { + const context = useBrowserContext(); + const search = useBrowserSearch(context.provider, context.query); return (
@@ -48,6 +50,12 @@ function Featured() {
+ {search.status} + {search.isSuccess && ( + <> + {search.data.items.map(item =>

{item.name}

)} + + )}
); diff --git a/apps/onelauncher/frontend/src/routes/app/browser/route.tsx b/apps/onelauncher/frontend/src/routes/app/browser/route.tsx index fafa33b9..b15a71d6 100644 --- a/apps/onelauncher/frontend/src/routes/app/browser/route.tsx +++ b/apps/onelauncher/frontend/src/routes/app/browser/route.tsx @@ -1,10 +1,12 @@ +import type { Filters } from '@/bindings.gen'; import ProviderIcon from '@/components/content/ProviderIcon'; +import { BrowserProvider, useBrowserContext } from '@/hooks/useBrowser'; +import { useClusters } from '@/hooks/useCluster'; import { PROVIDERS } from '@/utils'; import { browserCategories } from '@/utils/browser'; -import { Button, Dropdown, Show, TextField } from '@onelauncher/common/components'; +import { Dropdown, Show, TextField } from '@onelauncher/common/components'; import { createFileRoute, Outlet } from '@tanstack/react-router'; import { SearchMdIcon } from '@untitled-theme/icons-react'; -import { memo } from 'react'; export const Route = createFileRoute('/app/browser')({ component: RouteComponent, @@ -70,9 +72,9 @@ function BrowserSidebar() {
Provider
- + context.setProvider(id as typeof context.provider)} selectedKey={context.provider}> {PROVIDERS.map(provider => ( - +
{provider} @@ -86,8 +88,23 @@ function BrowserSidebar() { ); } +const defaultFilters:Filters = { + categories: null, + game_versions: null, + loaders: null, + package_types: null +} + function BrowserCategories() { - const categories = browserCategories.byPackageType('mod', 'Modrinth'); + const context = useBrowserContext(); + const categories = browserCategories.byPackageType('mod', context.provider); + + function switchCategory(category:string){ + if(context.query.filters?.categories?.includes(category)) + context.setQuery({...context.query, filters: {...defaultFilters, ...context.query.filters, categories: (context.query.filters?.categories ?? []).filter(cat=>cat!==category)}}) + else + context.setQuery({...context.query, filters: {...defaultFilters, ...context.query.filters, categories: [...(context.query.filters?.categories ?? []), category]}}) + } return (
@@ -95,11 +112,13 @@ function BrowserCategories() {
-
Categories
+
Categories
{categories.map(category => (

switchCategory(category.id)} > {category.display}