diff --git a/apps/web/src/components/config/ApiKeysCardEditor.tsx b/apps/web/src/components/config/ApiKeysCardEditor.tsx index 43dad11a6..f902bbcf5 100644 --- a/apps/web/src/components/config/ApiKeysCardEditor.tsx +++ b/apps/web/src/components/config/ApiKeysCardEditor.tsx @@ -6,7 +6,7 @@ import { usageServiceApi, type ApiKeyAlias, } from '@/services/api/usageService'; -import { useAuthStore, useNotificationStore } from '@/stores'; +import { useAuthStore, useConfigStore, useNotificationStore } from '@/stores'; import { usePanelFeatureAvailability } from '@/hooks/usePanelFeatureAvailability'; import { copyToClipboard } from '@/utils/clipboard'; import { maskApiKey } from '@/utils/format'; @@ -33,6 +33,7 @@ export const ApiKeysCardEditor = memo(function ApiKeysCardEditor({ const showNotification = useNotificationStore((state) => state.showNotification); const showConfirmation = useNotificationStore((state) => state.showConfirmation); const managementKey = useAuthStore((state) => state.managementKey); + const savedApiKeys = useConfigStore((state) => state.config?.apiKeys); const featureAvailability = usePanelFeatureAvailability(); const apiKeys = useMemo( () => @@ -459,7 +460,18 @@ export const ApiKeysCardEditor = memo(function ApiKeysCardEditor({ activeApiKeyHashes, cleanupDecision.allowOrphanAliasCleanup ); - showNotification(t('config_management.visual.api_keys.alias_saved'), 'success'); + const editingKeyHash = getApiKeyHash(editingKey); + const savedHashSet = new Set( + (savedApiKeys ?? []).map((k) => getApiKeyHash(k)) + ); + if (editingKeyHash && !savedHashSet.has(editingKeyHash)) { + showNotification( + t('config_management.visual.api_keys.alias_saved_key_not_in_cpa'), + 'warning' + ); + } else { + showNotification(t('config_management.visual.api_keys.alias_saved'), 'success'); + } closeAliasModal(); } catch (error) { setAliasFormError(getAliasErrorMessage(error)); diff --git a/apps/web/src/i18n/locales/en.json b/apps/web/src/i18n/locales/en.json index 723dd82e3..fcaaf4232 100644 --- a/apps/web/src/i18n/locales/en.json +++ b/apps/web/src/i18n/locales/en.json @@ -2559,6 +2559,7 @@ "alias_action": "Set Alias", "alias_title": "Set API Key Alias", "alias_saved": "API key alias saved", + "alias_saved_key_not_in_cpa": "Alias saved, but this key is not in the active CPA api-keys list yet. Add it to API Keys and save the configuration before clients can use it.", "alias_deleted": "API key alias deleted", "alias_delete": "Delete Alias", "alias_delete_title": "Delete API Key Alias", diff --git a/apps/web/src/i18n/locales/ru.json b/apps/web/src/i18n/locales/ru.json index 72d69f5b3..b36ea8e77 100644 --- a/apps/web/src/i18n/locales/ru.json +++ b/apps/web/src/i18n/locales/ru.json @@ -2559,6 +2559,7 @@ "alias_action": "Задать псевдоним", "alias_title": "Псевдоним API-ключа", "alias_saved": "Псевдоним API-ключа сохранён", + "alias_saved_key_not_in_cpa": "Псевдоним сохранён, но этот ключ ещё не добавлен в список api-keys CPA. Добавьте ключ в API Keys и сохраните конфигурацию, чтобы клиенты могли его использовать.", "alias_deleted": "Псевдоним API-ключа удалён", "alias_delete": "Удалить псевдоним", "alias_delete_title": "Удалить псевдоним API-ключа", diff --git a/apps/web/src/i18n/locales/zh-CN.json b/apps/web/src/i18n/locales/zh-CN.json index 2790eeff4..48d00b31e 100644 --- a/apps/web/src/i18n/locales/zh-CN.json +++ b/apps/web/src/i18n/locales/zh-CN.json @@ -2559,6 +2559,7 @@ "alias_action": "设置别名", "alias_title": "设置 API Key 别名", "alias_saved": "API Key 别名已保存", + "alias_saved_key_not_in_cpa": "别名已保存,但此密钥尚未添加到 CPA 的 api-keys 列表中。请先将密钥添加到 API Keys 并保存配置,否则客户端无法使用。", "alias_deleted": "API Key 别名已删除", "alias_delete": "删除别名", "alias_delete_title": "删除 API Key 别名", diff --git a/apps/web/src/i18n/locales/zh-TW.json b/apps/web/src/i18n/locales/zh-TW.json index e23306589..c629b9f20 100644 --- a/apps/web/src/i18n/locales/zh-TW.json +++ b/apps/web/src/i18n/locales/zh-TW.json @@ -2559,6 +2559,7 @@ "alias_action": "設定別名", "alias_title": "設定 API Key 別名", "alias_saved": "API Key 別名已保存", + "alias_saved_key_not_in_cpa": "別名已儲存,但此金鑰尚未加入 CPA 的 api-keys 清單中。請先將金鑰加入 API Keys 並儲存設定,否則客戶端無法使用。", "alias_deleted": "API Key 別名已刪除", "alias_delete": "刪除別名", "alias_delete_title": "刪除 API Key 別名",