Skip to content

Commit 3e6fca9

Browse files
authored
Merge branch 'onelauncher/main' into feat/account-select-context-menu
2 parents 1c13982 + 3390110 commit 3e6fca9

File tree

7 files changed

+506
-26
lines changed

7 files changed

+506
-26
lines changed

apps/onelauncher/frontend/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
"react": "catalog:",
3434
"react-aria-components": "catalog:",
3535
"react-dom": "catalog:",
36+
"react-markdown": "^10.1.0",
37+
"rehype-raw": "^7.0.0",
3638
"tailwind-merge": "catalog:",
3739
"tailwind-variants": "catalog:",
3840
"tailwindcss": "catalog:",
@@ -42,6 +44,7 @@
4244
"valtio": "catalog:"
4345
},
4446
"devDependencies": {
47+
"@tailwindcss/typography": "^0.5.16",
4548
"@tanstack/eslint-config": "catalog:",
4649
"@types/react": "catalog:",
4750
"@types/react-dom": "catalog:",

apps/onelauncher/frontend/src/components/overlay/Modal.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ import {
88

99
interface ModalProps extends DialogProps { }
1010

11-
function Modal({ className, ...props }: ModalProps) {
11+
function Modal({ ...props }: ModalProps) {
1212
return (
1313
<ModalOverlay className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4" isDismissable>
1414
<AriaModal>
15-
<AriaDialog className="" {...props} />
16-
15+
<AriaDialog {...props} />
1716
</AriaModal>
1817
</ModalOverlay>
1918
);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export function useBrowserSearch(provider: Provider, query: SearchQuery, options
6666
return useCommand('searchPackages', () => bindings.core.searchPackages(provider, validFilters ? query : { ...query, filters: null }), options);
6767
}
6868

69-
export function usePackageData(provider: Provider, slug: string, options?: Omit<UndefinedInitialDataOptions<ManagedPackage>, 'queryKey' | 'queryFn'> | undefined, key: false | BindingCommands | (string & {}) = 'getPackage') {
69+
export function usePackageData(provider: Provider, slug: string, options?: Omit<UndefinedInitialDataOptions<ManagedPackage>, 'queryKey' | 'queryFn'> | undefined, key: false | BindingCommands | (string & {}) = `getPackage.${provider}.${slug}`) {
7070
return useCommand(key, () => bindings.core.getPackage(provider, slug), options);
7171
}
7272

apps/onelauncher/frontend/src/routes/app/browser/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function RouteComponent() {
2828
function Featured() {
2929
// const context = useBrowserContext();
3030
const [provider, slug] = useMemo<[Provider, string]>(() => ['Modrinth', 'iris'], []);
31-
const featuredPackage = usePackageData(provider, slug, {}, 'getFeatured');
31+
const featuredPackage = usePackageData(provider, slug, {});
3232
const navigate = useNavigate();
3333
const featuredImageIndex = useMemo(() => featuredPackage.data?.gallery.findIndex(image => image.featured), [featuredPackage.data]);
3434
const [selectedImage, setSelectedImage] = useState(featuredImageIndex ?? 0);

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

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import type { ClusterModel, ManagedPackage, ManagedUser, ManagedVersion, Paginated, Provider } from '@/bindings.gen';
2+
import Modal from '@/components/overlay/Modal';
23
import { useBrowserContext, usePackageData, usePackageVersions } from '@/hooks/useBrowser';
34
import { useClusters } from '@/hooks/useCluster';
45
import { bindings } from '@/main';
56
import { abbreviateNumber, formatAsRelative, PROVIDERS } from '@/utils';
67
import { useCommand } from '@onelauncher/common';
7-
import { Button, Show, Tooltip } from '@onelauncher/common/components';
8+
import { Button, Popup, Show, Tooltip } from '@onelauncher/common/components';
89
import { createFileRoute, Link } from '@tanstack/react-router';
910
import { openUrl } from '@tauri-apps/plugin-opener';
1011
import { CalendarIcon, ChevronDownIcon, ChevronUpIcon, ClockRewindIcon, Download01Icon, File02Icon, LinkExternal01Icon } from '@untitled-theme/icons-react';
1112
import { createContext, useContext, useEffect, useMemo, useRef, useState } from 'react';
12-
import { Collection, ListBox, ListBoxItem, Popover, Select } from 'react-aria-components';
13+
import { Collection, ListBox, ListBoxItem, Popover, Pressable, Select, Tab, TabList, TabPanel, Tabs } from 'react-aria-components';
14+
import Markdown from 'react-markdown';
15+
import rehypeRaw from 'rehype-raw';
1316

1417
export const Route = createFileRoute('/app/browser/package/$provider/$slug')({
1518
component: RouteComponent,
@@ -33,7 +36,7 @@ function RouteComponent() {
3336
const { provider, slug } = Route.useParams();
3437
if (!includes(PROVIDERS, provider))
3538
throw new Error('Invalid provider');
36-
const packageData = usePackageData(provider, slug, {}, `getPackage.${provider}.${slug}`);
39+
const packageData = usePackageData(provider, slug, {});
3740
const browserContext = useBrowserContext();
3841
const { data: versions } = usePackageVersions(provider, slug, {
3942
mc_versions: browserContext.cluster ? [browserContext.cluster.mc_version] : null,
@@ -47,17 +50,39 @@ function RouteComponent() {
4750
<div className="h-full flex flex-1 flex-row items-start gap-x-4">
4851
<BrowserSidebar package={packageData.data!} />
4952

50-
<div className="min-h-full flex flex-1 flex-col items-start gap-y-4 pb-8">
51-
<div className="flex flex-none flex-row gap-x-1 rounded-lg bg-component-bg p-1">
52-
<Link params={{ provider, slug }} to="/app/browser/package/$provider/$slug">About</Link>
53-
<Link params={{ provider, slug }} to="/app/browser/package/$provider/$slug">Versions</Link>
54-
53+
<Tabs className="min-h-full flex flex-1 flex-col items-start gap-y-4 pb-8">
54+
<TabList className="flex flex-none flex-row gap-x-1 rounded-lg bg-component-bg p-1 w-min">
55+
<Tab className="uppercase p-2.5 text-trim rounded-md selected:bg-component-bg-pressed disabled:hidden" id="about">About</Tab>
56+
<Tab className="uppercase p-2.5 text-trim rounded-md selected:bg-component-bg-pressed disabled:hidden" id="versions">Versions</Tab>
57+
<Tab className="uppercase p-2.5 text-trim rounded-md selected:bg-component-bg-pressed disabled:hidden" id="gallery" isDisabled={packageData.data?.gallery.length === 0}>Gallery</Tab>
58+
</TabList>
59+
<div className="h-full min-h-full flex-1 w-full rounded-lg bg-component-bg p-3">
60+
<TabPanel className="prose prose-invert prose-sm max-w-none" id="about">
61+
<Markdown rehypePlugins={[rehypeRaw]}>{packageData.data?.body}</Markdown>
62+
</TabPanel>
63+
<TabPanel id="versions">
64+
versions
65+
</TabPanel>
66+
<TabPanel id="gallery" className="flex flex-wrap gap-2 justify-center">
67+
68+
{packageData.data?.gallery.map(item => (
69+
<Modal.Trigger key={item.url}>
70+
<Pressable>
71+
<div className='rounded-md overflow-hidden bg-component-bg-pressed outline-0 h-64 flex flex-col relative'>
72+
<img className='h-full' src={item.thumbnail_url} />
73+
{item.title && <div className='absolute w-full bottom-0 bg-component-bg-disabled/80 p-2'>{item.title}</div>}
74+
</div>
75+
</Pressable>
76+
<Modal className='w-full' >
77+
<img className='rounded-xl' src={item.url} />
78+
</Modal>
79+
</Modal.Trigger>
80+
))}
81+
82+
</TabPanel>
5583
</div>
84+
</Tabs>
5685

57-
<div className="h-full min-h-full w-full flex-1">
58-
59-
</div>
60-
</div>
6186
</div>
6287
</Show>
6388
</PackageContext>
@@ -74,7 +99,7 @@ function BrowserSidebar({ package: pkg }: { package: ManagedPackage }) {
7499

75100
return (
76101
<div className="sticky top-0 z-1 max-w-60 min-w-54 flex flex-col gap-y-4">
77-
<div className="min-h-72 flex flex-col overflow-hidden rounded-lg bg-component-bg">
102+
<div className="flex flex-col overflow-hidden rounded-lg bg-component-bg">
78103
<div className="relative h-28 flex items-center justify-center overflow-hidden">
79104
<img alt={`Icon for ${pkg.name}`} className="absolute z-0 max-w-none w-7/6 blur-xl" src={pkg.icon_url || ''} />
80105
<img alt={`Icon for ${pkg.name}`} className="relative z-1 aspect-ratio-square w-2/5 rounded-md image-render-auto" src={pkg.icon_url || ''} />

apps/onelauncher/frontend/src/styles/global.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
@import "tailwindcss";
2+
@plugin "@tailwindcss/typography";
23
@plugin "tailwindcss-react-aria-components";
34
@plugin "tailwindcss-animated";
45
@import "../../node_modules/@onelauncher/common/dist/theme.css";

0 commit comments

Comments
 (0)