diff --git a/apps/onelauncher/frontend/src/hooks/useBrowser.tsx b/apps/onelauncher/frontend/src/hooks/useBrowser.tsx index 5294de7d..03c9689f 100644 --- a/apps/onelauncher/frontend/src/hooks/useBrowser.tsx +++ b/apps/onelauncher/frontend/src/hooks/useBrowser.tsx @@ -1,21 +1,49 @@ import type { ClusterModel } from '@/bindings.gen'; -import { createContext } from 'react'; +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; search: () => void; } -const browserContext = createContext(null); +const BrowserContext = createContext(null); + +export function useBrowserContext() { + const context = useContext(BrowserContext); + if (!context) + throw new Error('useBrowserContext must be used within a BrowserProvider'); + return context; +} export function BrowserProvider(props: any) { const { children } = props; + const [cluster, setCluster] = useState(undefined); + const [provider, setProvider] = useState(PROVIDERS[0]); + + const context = useMemo(() => ({ + cluster, + setCluster, + provider, + setProvider, + search: () => {}, + }), [cluster, provider]); return ( - + {children} - + ); } + +export function useFeatured() { + useCommand(); +} diff --git a/apps/onelauncher/frontend/src/hooks/useCluster.ts b/apps/onelauncher/frontend/src/hooks/useCluster.ts index 3c44c542..b9db6006 100644 --- a/apps/onelauncher/frontend/src/hooks/useCluster.ts +++ b/apps/onelauncher/frontend/src/hooks/useCluster.ts @@ -3,7 +3,7 @@ import { bindings } from '@/main'; import { useCommand } from '@onelauncher/common'; import { useEffect, useState } from 'react'; -function useRecentCluster() { +export function useRecentCluster() { const result = useCommand('getClusters', bindings.core.getClusters); const [cluster, setCluster] = useState(); @@ -40,4 +40,15 @@ function useRecentCluster() { return cluster; } -export default useRecentCluster; +export function useClusters() { + const result = useCommand('getClusters', bindings.core.getClusters); + const [clusters, setClusters] = useState | undefined>(); + + useEffect(() => { + if (!result.data) + return; + setClusters(result.data); + }, [result.data]); + + return clusters; +} diff --git a/apps/onelauncher/frontend/src/routes/app/browser/index.tsx b/apps/onelauncher/frontend/src/routes/app/browser/index.tsx index 799f24d6..9f8e8723 100644 --- a/apps/onelauncher/frontend/src/routes/app/browser/index.tsx +++ b/apps/onelauncher/frontend/src/routes/app/browser/index.tsx @@ -1,4 +1,5 @@ import OneConfigLogo from '@/assets/logos/oneconfig.svg'; +import { useBrowserContext } from '@/hooks/useBrowser'; import { Button, Show } from '@onelauncher/common/components'; import { createFileRoute } from '@tanstack/react-router'; import { ChevronRightIcon } from '@untitled-theme/icons-react'; diff --git a/apps/onelauncher/frontend/src/routes/app/browser/route.tsx b/apps/onelauncher/frontend/src/routes/app/browser/route.tsx index 4f5a3972..66b17009 100644 --- a/apps/onelauncher/frontend/src/routes/app/browser/route.tsx +++ b/apps/onelauncher/frontend/src/routes/app/browser/route.tsx @@ -1,3 +1,5 @@ +import { BrowserProvider, useBrowserContext } from '@/hooks/useBrowser'; +import { useClusters } from '@/hooks/useCluster'; import { PROVIDERS } from '@/utils'; import { Button, Dropdown, Show, TextField } from '@onelauncher/common/components'; import { createFileRoute, Outlet } from '@tanstack/react-router'; @@ -9,9 +11,11 @@ export const Route = createFileRoute('/app/browser')({ function RouteComponent() { return ( -
- -
+ +
+ +
+
); } @@ -42,20 +46,30 @@ export function BrowserLayout(props: any) { } function BrowserSidebar() { + const context = useBrowserContext(); + const clusters = useClusters(); return (
Active Cluster
-
Provider
- + context.setProvider(provider as typeof context.provider)} selectedKey={context.provider}> {/* {provider => ( @@ -65,7 +79,9 @@ function BrowserSidebar() { )} */} {PROVIDERS.map(provider => ( - {provider} + + {provider} + ))}
diff --git a/apps/onelauncher/frontend/src/routes/app/index.tsx b/apps/onelauncher/frontend/src/routes/app/index.tsx index ebf1efc9..03328bda 100644 --- a/apps/onelauncher/frontend/src/routes/app/index.tsx +++ b/apps/onelauncher/frontend/src/routes/app/index.tsx @@ -2,7 +2,7 @@ import type { ClusterModel } from '@/bindings.gen'; import DefaultBanner from '@/assets/images/default_banner.png'; import DefaultInstancePhoto from '@/assets/images/default_instance_cover.jpg'; import { NewClusterCreate } from '@/components/launcher/cluster/ClusterCreation'; -import useRecentCluster from '@/hooks/useCluster'; +import { useRecentCluster } from '@/hooks/useCluster'; import { bindings } from '@/main'; import { formatAsDuration, upperFirst } from '@/utils'; import { useCommand } from '@onelauncher/common'; diff --git a/apps/onelauncher/frontend/src/utils/index.ts b/apps/onelauncher/frontend/src/utils/index.ts index a2d9d486..9b4f923f 100644 --- a/apps/onelauncher/frontend/src/utils/index.ts +++ b/apps/onelauncher/frontend/src/utils/index.ts @@ -1,4 +1,4 @@ -export const LAUNCHER_IMPORT_TYPES: Array = [ +export const LAUNCHER_IMPORT_TYPES = [ 'PrismLauncher', 'Curseforge', // 'Modrinth', @@ -10,7 +10,7 @@ export const LAUNCHER_IMPORT_TYPES: Array = [ // 'Technic' ] as const; -export const LOADERS: Array = [ +export const LOADERS = [ 'vanilla', 'forge', 'neoforge', @@ -18,8 +18,8 @@ export const LOADERS: Array = [ 'fabric', 'legacyfabric', ] as const; -export const PROVIDERS: Array = ['Modrinth', 'Curseforge', 'SkyClient'] as const; -export const PACKAGE_TYPES: Array = ['mod', 'resourcepack', 'datapack', 'shaderpack'] as const; +export const PROVIDERS = ['Modrinth', 'Curseforge', 'SkyClient'] as const; +export const PACKAGE_TYPES = ['mod', 'resourcepack', 'datapack', 'shaderpack'] as const; export function pluralize(n: number, word: string, locale: string = 'en'): string { const pluralRules = new Intl.PluralRules(locale);