From 698bfb065f44df596300dc49ce9f1986b72e4f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?MisakaKumomi=20=E5=BE=A1=E5=9D=82=E4=BA=91=E8=A7=81?= <447f@misaka.org> Date: Fri, 29 Aug 2025 03:16:07 +0800 Subject: [PATCH] feat: ollama setting pages now has validating animation (#523) --- .../src/pages/settings/providers/ollama.vue | 111 +++++++++++------- packages/i18n/src/locales/en/settings.yaml | 3 + .../i18n/src/locales/zh-Hans/settings.yaml | 3 + .../stage-ui/src/components/Misc/Alert.vue | 28 ++++- 4 files changed, 99 insertions(+), 46 deletions(-) diff --git a/apps/stage-web/src/pages/settings/providers/ollama.vue b/apps/stage-web/src/pages/settings/providers/ollama.vue index b4b4143d2..4ae7f2656 100644 --- a/apps/stage-web/src/pages/settings/providers/ollama.vue +++ b/apps/stage-web/src/pages/settings/providers/ollama.vue @@ -20,6 +20,7 @@ const { t } = useI18n() const router = useRouter() const providersStore = useProvidersStore() const { providers } = storeToRefs(providersStore) as { providers: RemovableRef> } +const loading = ref(0) // Get provider metadata const providerId = 'ollama' @@ -74,6 +75,11 @@ watch(headers, (headers) => { }) async function refetch() { + loading.value++ + // service startup time + const startValidationTimestamp = performance.now() + let finalValidationMessage = '' + try { const validationResult = await providerMetadata.value.validators.validateProviderConfig({ baseUrl: baseUrl.value, @@ -84,16 +90,25 @@ async function refetch() { }) if (!validationResult.valid) { - validationMessage.value = t('settings.dialogs.onboarding.validationError', { + finalValidationMessage = t('settings.dialogs.onboarding.validationError', { error: validationResult.reason, }) } + else { + finalValidationMessage = '' + } } catch (error) { - validationMessage.value = t('settings.dialogs.onboarding.validationError', { + finalValidationMessage = t('settings.dialogs.onboarding.validationError', { error: error instanceof Error ? error.message : String(error), }) } + finally { + setTimeout(() => { + loading.value-- + validationMessage.value = finalValidationMessage + }, 500 - (performance.now() - startValidationTimestamp)) + } } watch([baseUrl, headers], refetch, { immediate: true }) @@ -122,47 +137,59 @@ function handleResetSettings() { diff --git a/packages/i18n/src/locales/en/settings.yaml b/packages/i18n/src/locales/en/settings.yaml index f8e78ffde..2a52c2fd2 100644 --- a/packages/i18n/src/locales/en/settings.yaml +++ b/packages/i18n/src/locales/en/settings.yaml @@ -334,6 +334,9 @@ pages: placeholder: Input Cloudflare API Key title: Cloudflare Workers AI common: + status: + validating: Validating + valid: Configuration seems to be valid. fields: field: pitch: diff --git a/packages/i18n/src/locales/zh-Hans/settings.yaml b/packages/i18n/src/locales/zh-Hans/settings.yaml index dce87df2b..1eebf539f 100644 --- a/packages/i18n/src/locales/zh-Hans/settings.yaml +++ b/packages/i18n/src/locales/zh-Hans/settings.yaml @@ -305,6 +305,9 @@ pages: placeholder: 请输入 Cloudflare Workers AI 的 API Key title: Workers AI common: + status: + validating: 正在验证配置 + valid: 配置似乎有效。 fields: field: pitch: diff --git a/packages/stage-ui/src/components/Misc/Alert.vue b/packages/stage-ui/src/components/Misc/Alert.vue index 748704757..cca6bc3fe 100644 --- a/packages/stage-ui/src/components/Misc/Alert.vue +++ b/packages/stage-ui/src/components/Misc/Alert.vue @@ -1,16 +1,24 @@