diff --git a/web/app/components/app/create-app-modal/index.spec.tsx b/web/app/components/app/create-app-modal/index.spec.tsx index 8c368df62c..75d650742d 100644 --- a/web/app/components/app/create-app-modal/index.spec.tsx +++ b/web/app/components/app/create-app-modal/index.spec.tsx @@ -5,7 +5,7 @@ import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest' import { trackEvent } from '@/app/components/base/amplitude' import { ToastContext } from '@/app/components/base/toast' -import { NEED_REFRESH_APP_LIST_KEY } from '@/config' +import { MARKETPLACE_URL_PREFIX, NEED_REFRESH_APP_LIST_KEY } from '@/config' import { useAppContext } from '@/context/app-context' import { useProviderContext } from '@/context/provider-context' import { createApp } from '@/service/apps' @@ -159,4 +159,16 @@ describe('CreateAppModal', () => { expect(mockNotify).toHaveBeenCalledWith({ type: 'error', message: 'boom' }) expect(onClose).not.toHaveBeenCalled() }) + + it('renders community explore link with marketplace templates URL', async () => { + renderModal() + + await waitFor(() => { + expect(screen.getByRole('link', { name: 'app.newApp.orExploreCommunity' })).toBeInTheDocument() + }) + const link = screen.getByRole('link', { name: 'app.newApp.orExploreCommunity' }) + expect(link).toHaveAttribute('href', `${MARKETPLACE_URL_PREFIX.replace(/\/$/, '')}/templates`) + expect(link).toHaveAttribute('target', '_blank') + expect(link).toHaveAttribute('rel', 'noopener noreferrer') + }) }) diff --git a/web/app/components/app/create-app-modal/index.tsx b/web/app/components/app/create-app-modal/index.tsx index c1ea5b9b18..12d4a98d8f 100644 --- a/web/app/components/app/create-app-modal/index.tsx +++ b/web/app/components/app/create-app-modal/index.tsx @@ -21,7 +21,7 @@ import CustomSelect from '@/app/components/base/select/custom' import Textarea from '@/app/components/base/textarea' import { ToastContext } from '@/app/components/base/toast' import AppsFull from '@/app/components/billing/apps-full-in-dialog' -import { NEED_REFRESH_APP_LIST_KEY } from '@/config' +import { MARKETPLACE_URL_PREFIX, NEED_REFRESH_APP_LIST_KEY } from '@/config' import { STORAGE_KEYS } from '@/config/storage-keys' import { useAppContext } from '@/context/app-context' import { useProviderContext } from '@/context/provider-context' @@ -49,6 +49,8 @@ type RuntimeOption = { recommended?: boolean } +const marketplaceTemplatesUrl = `${MARKETPLACE_URL_PREFIX.replace(/\/$/, '')}/templates` + function CreateApp({ onClose, onSuccess, onCreateFromTemplate, defaultAppMode }: CreateAppProps) { const { t } = useTranslation() const { push } = useRouter() @@ -332,11 +334,21 @@ function CreateApp({ onClose, onSuccess, onCreateFromTemplate, defaultAppMode }: {isAppsFull && }
-
- {t('newApp.noIdeaTip', { ns: 'app' })} -
- +
+
+ {t('newApp.noIdeaTip', { ns: 'app' })} +
+ +
+ + {t('newApp.orExploreCommunity', { ns: 'app' })} +
diff --git a/web/i18n/en-US/app.json b/web/i18n/en-US/app.json index 07e58910f3..b300c96136 100644 --- a/web/i18n/en-US/app.json +++ b/web/i18n/en-US/app.json @@ -176,6 +176,7 @@ "newApp.noTemplateFound": "No templates found", "newApp.noTemplateFoundTip": "Try searching using different keywords.", "newApp.optional": "Optional", + "newApp.orExploreCommunity": "or explore the community", "newApp.previewDemo": "Preview demo", "newApp.recommended": "RECOMMENDED", "newApp.runtimeLabel": "Runtime", diff --git a/web/i18n/zh-Hans/app.json b/web/i18n/zh-Hans/app.json index deadcc2f9e..730304c4fe 100644 --- a/web/i18n/zh-Hans/app.json +++ b/web/i18n/zh-Hans/app.json @@ -174,6 +174,7 @@ "newApp.noTemplateFound": "未找到模板", "newApp.noTemplateFoundTip": "请尝试使用不同的关键字进行搜索。", "newApp.optional": "可选", + "newApp.orExploreCommunity": "或探索社区", "newApp.previewDemo": "预览 Demo", "newApp.recommended": "推荐", "newApp.runtimeLabel": "运行时", diff --git a/web/i18n/zh-Hant/app.json b/web/i18n/zh-Hant/app.json index 9e5794529f..f15a00638c 100644 --- a/web/i18n/zh-Hant/app.json +++ b/web/i18n/zh-Hant/app.json @@ -173,6 +173,7 @@ "newApp.noTemplateFound": "未找到範本", "newApp.noTemplateFoundTip": "嘗試使用不同的關鍵字進行搜索。", "newApp.optional": "自選", + "newApp.orExploreCommunity": "或探索社群", "newApp.previewDemo": "預覽 Demo", "newApp.showTemplates": "我想從範例模板中選擇", "newApp.startFromBlank": "建立空白應用",