Selaa lähdekoodia

feat(notification): add error handling component

0xJacky 1 viikko sitten
vanhempi
commit
3d17514872

+ 80 - 1
app/src/components/Notification/detailRender.tsx

@@ -1,7 +1,86 @@
 import type { CustomRenderArgs } from '@uozi-admin/curd'
+import type { PropType } from 'vue'
+import type { CosyError } from '@/lib/http/types'
+import { defineComponent, ref } from 'vue'
 import { NotificationTypeT } from '@/constants'
+import { translateError } from '@/lib/http/error'
 import notifications from './notifications'
 
+// Helper function to parse and translate error
+async function parseError(response: string): Promise<string | null> {
+  try {
+    const errorData = JSON.parse(response) as CosyError
+    if (errorData.scope && errorData.code) {
+      return await translateError(errorData)
+    }
+  }
+  catch (error) {
+    console.error('Failed to parse error response:', error)
+  }
+  return null
+}
+
+// Create a component for error details to properly handle async translation
+const ErrorDetails = defineComponent({
+  props: {
+    response: {
+      type: [String, Object] as PropType<string | object>,
+      required: true,
+    },
+  },
+  setup(props) {
+    const translatedError = ref<string>('')
+    const isLoading = ref(true)
+
+    // Convert response to string if it's an object
+    const responseString = typeof props.response === 'string'
+      ? props.response
+      : JSON.stringify(props.response)
+
+    // Immediately start translation
+    parseError(responseString).then(result => {
+      if (result) {
+        translatedError.value = result
+      }
+      isLoading.value = false
+    })
+
+    return () => {
+      const parsedResponse = typeof props.response === 'string'
+        ? JSON.parse(props.response)
+        : props.response
+
+      return (
+        <div class="mt-2">
+          {/* 显示翻译后的错误信息(如果有) */}
+          {translatedError.value && (
+            <div class="text-red-500 font-medium mb-2">
+              {translatedError.value}
+            </div>
+          )}
+
+          {/* 显示翻译状态 */}
+          {isLoading.value && (
+            <div class="text-gray-500 text-sm mb-2">
+              {$gettext('Translating error...')}
+            </div>
+          )}
+
+          {/* 默认显示原始错误信息 */}
+          <details class="mt-2">
+            <summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800">
+              {$gettext('Error details')}
+            </summary>
+            <pre class="mt-2 p-2 bg-gray-100 rounded text-xs overflow-hidden whitespace-pre-wrap break-words max-w-full">
+              {JSON.stringify(parsedResponse, null, 2)}
+            </pre>
+          </details>
+        </div>
+      )
+    }
+  },
+})
+
 export function detailRender(args: Pick<CustomRenderArgs, 'record' | 'text'>) {
   try {
     return (
@@ -14,7 +93,7 @@ export function detailRender(args: Pick<CustomRenderArgs, 'record' | 'text'>) {
         </div>
         {args.record.details?.response && args.record.type !== NotificationTypeT.Success && (
           <div>
-            { JSON.stringify(args.record.details.response) }
+            <ErrorDetails response={args.record.details.response} />
           </div>
         )}
       </div>

+ 8 - 0
app/src/language/ar/app.po

@@ -1891,6 +1891,10 @@ msgstr "البيئات"
 msgid "Error"
 msgstr "خطأ"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "تفاصيل الخطأ"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "خطأ في تهيئة عارض الاختلافات"
@@ -5707,6 +5711,10 @@ msgstr ""
 "TOTP هو طريقة مصادقة ثنائية تستخدم خوارزمية كلمة مرور لمرة واحدة تعتمد على "
 "الوقت."
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "جاري ترجمة الخطأ..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "مهملات"

+ 8 - 0
app/src/language/de_DE/app.po

@@ -1915,6 +1915,10 @@ msgstr "Umgebungen"
 msgid "Error"
 msgstr "Fehler"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "Fehlerdetails"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "Fehler beim Initialisieren des Diff-Viewers"
@@ -5801,6 +5805,10 @@ msgstr ""
 "TOTP ist eine Zwei-Faktor-Authentifizierungsmethode, die einen "
 "zeitbasierten Einmalpasswortalgorithmus verwendet."
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "Fehler wird übersetzt..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "Mülleimer"

+ 8 - 0
app/src/language/en/app.po

@@ -1824,6 +1824,10 @@ msgstr ""
 msgid "Error"
 msgstr ""
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr ""
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr ""
@@ -5534,6 +5538,10 @@ msgid ""
 "password algorithm."
 msgstr ""
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr ""
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr ""

+ 8 - 0
app/src/language/es/app.po

@@ -1926,6 +1926,10 @@ msgstr "Entornos"
 msgid "Error"
 msgstr "Error"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "Detalles del error"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "Error al inicializar el visor de diferencias"
@@ -5809,6 +5813,10 @@ msgstr ""
 "TOTP es un método de autenticación de dos factores que utiliza un algoritmo "
 "de contraseña de un solo uso basado en el tiempo."
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "Traduciendo error..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "Basura"

+ 8 - 0
app/src/language/fr_FR/app.po

@@ -1922,6 +1922,10 @@ msgstr "Environnements"
 msgid "Error"
 msgstr "Erreur"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "Détails de l'erreur"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "Erreur lors de l'initialisation du visualiseur de différences"
@@ -5818,6 +5822,10 @@ msgstr ""
 "TOTP est une méthode d'authentification à deux facteurs qui utilise un "
 "algorithme de mot de passe à usage unique basé sur le temps."
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "Traduction de l'erreur..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "Corbeille"

+ 8 - 0
app/src/language/ja_JP/app.po

@@ -1858,6 +1858,10 @@ msgstr "環境"
 msgid "Error"
 msgstr "エラー"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "エラーの詳細"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "差分ビューアの初期化エラー"
@@ -5602,6 +5606,10 @@ msgid ""
 "password algorithm."
 msgstr "TOTP は、時間ベースのワンタイムパスワードアルゴリズムを使用する二要素認証方法です。"
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "エラーを翻訳中..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "ゴミ箱"

+ 9 - 1
app/src/language/ko_KR/app.po

@@ -1857,6 +1857,10 @@ msgstr "환경"
 msgid "Error"
 msgstr "오류"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "오류 세부 정보"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "차이점 뷰어 초기화 오류"
@@ -5138,7 +5142,7 @@ msgstr "인증서 동기화"
 
 #: src/components/Notification/notifications.ts:62
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
-msgstr "인증서 %{cert_name}을(를) %{env_name}(으)로 동기화하지 못했습니다"
+msgstr "인증서 %{cert_name}을(를) %{env_name} 동기화하지 못했습니다"
 
 #: src/components/Notification/notifications.ts:66
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
@@ -5595,6 +5599,10 @@ msgid ""
 "password algorithm."
 msgstr "TOTP는 시간 기반의 일회용 비밀번호 알고리즘을 사용하는 이중 인증 방법입니다."
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "오류 번역 중..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "휴지통"

+ 8 - 0
app/src/language/messages.pot

@@ -1802,6 +1802,10 @@ msgstr ""
 msgid "Error"
 msgstr ""
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr ""
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr ""
@@ -5421,6 +5425,10 @@ msgstr ""
 msgid "TOTP is a two-factor authentication method that uses a time-based one-time password algorithm."
 msgstr ""
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr ""
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr ""

+ 8 - 0
app/src/language/pt_PT/app.po

@@ -1903,6 +1903,10 @@ msgstr "Ambientes"
 msgid "Error"
 msgstr "Erro"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "Detalhes do erro"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "Erro ao inicializar o visualizador de diferenças"
@@ -5776,6 +5780,10 @@ msgstr ""
 "O TOTP é um método de autenticação de dois fatores que utiliza um algoritmo "
 "de palavra-passe única baseado no tempo."
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "A traduzir erro..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "Lixo"

+ 8 - 0
app/src/language/ru_RU/app.po

@@ -1908,6 +1908,10 @@ msgstr "Окружения"
 msgid "Error"
 msgstr "Ошибка"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "Детали ошибки"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "Ошибка инициализации просмотрщика различий"
@@ -5771,6 +5775,10 @@ msgstr ""
 "TOTP — это метод двухфакторной аутентификации, который использует алгоритм "
 "одноразового пароля на основе времени."
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "Перевод ошибки..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "Корзина"

+ 8 - 0
app/src/language/tr_TR/app.po

@@ -1902,6 +1902,10 @@ msgstr "Ortamlar"
 msgid "Error"
 msgstr "Hata"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "Hata detayları"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "Fark görüntüleyici başlatılırken hata"
@@ -5772,6 +5776,10 @@ msgstr ""
 "TOTP, zaman tabanlı tek kullanımlık şifre algoritması kullanan iki faktörlü "
 "bir kimlik doğrulama yöntemidir."
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "Hata çevriliyor..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "Çöp"

+ 8 - 0
app/src/language/uk_UA/app.po

@@ -1976,6 +1976,10 @@ msgstr "Середовища"
 msgid "Error"
 msgstr "Помилка"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "Деталі помилки"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "Помилка ініціалізації переглядача різниць"
@@ -5843,6 +5847,10 @@ msgstr ""
 "TOTP — це двофакторний метод автентифікації, який використовує алгоритм "
 "одноразового пароля на основі часу."
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "Переклад помилки..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "Кошик"

+ 8 - 0
app/src/language/vi_VN/app.po

@@ -1877,6 +1877,10 @@ msgstr "Môi trường"
 msgid "Error"
 msgstr "Lỗi"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "Chi tiết lỗi"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "Lỗi khởi tạo trình xem khác biệt"
@@ -5719,6 +5723,10 @@ msgstr ""
 "TOTP là một phương pháp xác thực hai yếu tố sử dụng thuật toán mật khẩu một "
 "lần dựa trên thời gian."
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "Đang dịch lỗi..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "Thùng rác"

+ 9 - 1
app/src/language/zh_CN/app.po

@@ -1849,6 +1849,10 @@ msgstr "环境"
 msgid "Error"
 msgstr "错误"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "错误详情"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "差异查看器初始化出错"
@@ -5125,7 +5129,7 @@ msgstr "同步证书"
 
 #: src/components/Notification/notifications.ts:62
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
-msgstr "证书 %{cert_name} 已成功同步到 %{env_name}"
+msgstr "同步证书 %{cert_name} 到 %{env_name} 失败"
 
 #: src/components/Notification/notifications.ts:66
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
@@ -5574,6 +5578,10 @@ msgid ""
 "password algorithm."
 msgstr "TOTP 是一种使用基于时间的一次性密码算法的双因素身份验证方法。"
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "正在翻译错误..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "回收站"

+ 9 - 1
app/src/language/zh_TW/app.po

@@ -1853,6 +1853,10 @@ msgstr "環境"
 msgid "Error"
 msgstr "錯誤"
 
+#: src/components/Notification/detailRender.tsx:72
+msgid "Error details"
+msgstr "錯誤詳情"
+
 #: src/components/ConfigHistory/DiffViewer.vue:138
 msgid "Error initializing diff viewer"
 msgstr "初始化差異檢視器時發生錯誤"
@@ -5131,7 +5135,7 @@ msgstr "同步憑證"
 
 #: src/components/Notification/notifications.ts:62
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
-msgstr "同步憑證 %{cert_name} 至 %{env_name} 失敗"
+msgstr "同步證書 %{cert_name} 到 %{env_name} 失敗"
 
 #: src/components/Notification/notifications.ts:66
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
@@ -5580,6 +5584,10 @@ msgid ""
 "password algorithm."
 msgstr "TOTP 是一種使用基於時間的一次性密碼演算法的多重因素驗證方法。"
 
+#: src/components/Notification/detailRender.tsx:65
+msgid "Translating error..."
+msgstr "正在翻譯錯誤..."
+
 #: src/language/curd.ts:20
 msgid "Trash"
 msgstr "垃圾桶"