diff --git a/packages/ui/src/modules/app-store/app-page/dependencies.tsx b/packages/ui/src/modules/app-store/app-page/dependencies.tsx index a63c7a38a..32637948d 100644 --- a/packages/ui/src/modules/app-store/app-page/dependencies.tsx +++ b/packages/ui/src/modules/app-store/app-page/dependencies.tsx @@ -7,6 +7,7 @@ import {arrayIncludes} from 'ts-extras' import {AppIcon} from '@/components/app-icon' import {Loading} from '@/components/ui/loading' import {cn} from '@/lib/utils' +import {getAppStoreLink} from '@/modules/app-store/utils' import {useApps} from '@/providers/apps' import {useAllAvailableApps} from '@/providers/available-apps' import {installedStates, RegistryApp} from '@/trpc/trpc' @@ -69,13 +70,14 @@ const Dependency = ({ showDependencies?: (dependencyId?: string) => void }) => { const {t} = useTranslation() + const storeLink = getAppStoreLink(app) return (
- +
- +

{app.name}

{installed && } diff --git a/packages/ui/src/modules/app-store/select-dependencies-dialog.tsx b/packages/ui/src/modules/app-store/select-dependencies-dialog.tsx index 5a34353bd..435802752 100644 --- a/packages/ui/src/modules/app-store/select-dependencies-dialog.tsx +++ b/packages/ui/src/modules/app-store/select-dependencies-dialog.tsx @@ -17,6 +17,7 @@ import { } from '@/components/ui/dropdown-menu' import {ScrollArea} from '@/components/ui/scroll-area' import {cn} from '@/lib/utils' +import {getAppStoreLink} from '@/modules/app-store/utils' import {useApps} from '@/providers/apps' import {useAllAvailableApps} from '@/providers/available-apps' import {AppState, installedStates, RegistryApp} from '@/trpc/trpc' @@ -184,6 +185,7 @@ export function SelectDependencies({ @@ -205,6 +207,7 @@ export function SelectDependencies({ /> @@ -219,7 +222,17 @@ const listClass = tw`divide-y divide-white/6 overflow-hidden rounded-12 bg-white const listItemClass = tw`flex items-center pl-3 pr-4 h-[50px] text-[14px] font-medium -tracking-3 justify-between` const listItemClassWithDropdown = tw`flex items-center pl-3 pr-4 h-[60px] text-[14px] font-medium -tracking-3 justify-between` -function DependencyStateText({appId, appState, onClick}: {appId: string; appState: AppState; onClick?: () => void}) { +function DependencyStateText({ + appId, + app, + appState, + onClick, +}: { + appId: string + app?: RegistryApp + appState: AppState + onClick?: () => void +}) { const {t} = useTranslation() const buttonClass = 'w-[70px]' // Fixed width for both buttons @@ -233,9 +246,11 @@ function DependencyStateText({appId, appState, onClick}: {appId: string; appStat if (appState === 'not-installed') { return ( - // TODO: link to community app store if needed using `getAppStoreAppFromInstalledApp` () @@ -11,6 +11,15 @@ export function preloadFirstFewGalleryImages(app: RegistryApp) { app.gallery.slice(0, 3).map(preloadImage) } +// Returns the store page path for an app, linking community store apps to +// their community app store instead of the official Umbrel App Store +export function getAppStoreLink(app: Pick): string { + if (app.appStoreId && app.appStoreId !== UMBREL_APP_STORE_ID) { + return `/community-app-store/${app.appStoreId}/${app.id}` + } + return `/app-store/${app.id}` +} + export function getCategoryLabel(categoryId: string): string { const predefined = categoryDescriptionsKeyed[categoryId as Categoryish]