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]