error.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import type { CosyError, CosyErrorRecord } from './types'
  2. import { message } from 'ant-design-vue'
  3. const errors: Record<string, CosyErrorRecord> = {}
  4. export function registerError(scope: string, record: CosyErrorRecord) {
  5. errors[scope] = record
  6. }
  7. // Add new dedupe utility
  8. interface MessageDedupe {
  9. error: (content: string, duration?: number) => void
  10. }
  11. export function useMessageDedupe(interval = 5000): MessageDedupe {
  12. const lastMessages = new Map<string, number>()
  13. return {
  14. async error(content, duration = 5) {
  15. const now = Date.now()
  16. if (!lastMessages.has(content) || (now - (lastMessages.get(content) || 0)) > interval) {
  17. lastMessages.set(content, now)
  18. message.error(content, duration)
  19. }
  20. },
  21. }
  22. }
  23. export function handleApiError(err: CosyError, dedupe: MessageDedupe) {
  24. if (err?.scope) {
  25. // check if already register
  26. if (!errors[err.scope]) {
  27. try {
  28. // Dynamic import error files
  29. import(`@/constants/errors/${err.scope}.ts`)
  30. .then(error => {
  31. registerError(err.scope!, error.default)
  32. displayErrorMessage(err, dedupe)
  33. })
  34. .catch(() => {
  35. dedupe.error($gettext(err?.message ?? 'Server error'))
  36. })
  37. }
  38. catch {
  39. dedupe.error($gettext(err?.message ?? 'Server error'))
  40. }
  41. }
  42. else {
  43. displayErrorMessage(err, dedupe)
  44. }
  45. }
  46. else {
  47. dedupe.error($gettext(err?.message ?? 'Server error'))
  48. }
  49. }
  50. function displayErrorMessage(err: CosyError, dedupe: MessageDedupe) {
  51. const msg = errors?.[err.scope ?? '']?.[err.code ?? '']
  52. if (msg) {
  53. // if err has params
  54. if (err?.params && err.params.length > 0) {
  55. let res = msg()
  56. err.params.forEach((param, index) => {
  57. res = res.replaceAll(`{${index}}`, param)
  58. })
  59. dedupe.error(res)
  60. }
  61. else {
  62. dedupe.error(msg())
  63. }
  64. }
  65. else {
  66. dedupe.error($gettext(err?.message ?? 'Server error'))
  67. }
  68. }