form-error.ts 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import type { Key } from "~/i18n"
  2. export const formError = {
  3. invalidPlan: "error.invalidPlan",
  4. workspaceRequired: "error.workspaceRequired",
  5. alreadySubscribed: "error.alreadySubscribed",
  6. limitRequired: "error.limitRequired",
  7. monthlyLimitInvalid: "error.monthlyLimitInvalid",
  8. workspaceNameRequired: "error.workspaceNameRequired",
  9. nameTooLong: "error.nameTooLong",
  10. emailRequired: "error.emailRequired",
  11. roleRequired: "error.roleRequired",
  12. idRequired: "error.idRequired",
  13. nameRequired: "error.nameRequired",
  14. providerRequired: "error.providerRequired",
  15. apiKeyRequired: "error.apiKeyRequired",
  16. modelRequired: "error.modelRequired",
  17. } as const
  18. const map = {
  19. [formError.invalidPlan]: "error.invalidPlan",
  20. [formError.workspaceRequired]: "error.workspaceRequired",
  21. [formError.alreadySubscribed]: "error.alreadySubscribed",
  22. [formError.limitRequired]: "error.limitRequired",
  23. [formError.monthlyLimitInvalid]: "error.monthlyLimitInvalid",
  24. [formError.workspaceNameRequired]: "error.workspaceNameRequired",
  25. [formError.nameTooLong]: "error.nameTooLong",
  26. [formError.emailRequired]: "error.emailRequired",
  27. [formError.roleRequired]: "error.roleRequired",
  28. [formError.idRequired]: "error.idRequired",
  29. [formError.nameRequired]: "error.nameRequired",
  30. [formError.providerRequired]: "error.providerRequired",
  31. [formError.apiKeyRequired]: "error.apiKeyRequired",
  32. [formError.modelRequired]: "error.modelRequired",
  33. "Invalid plan": "error.invalidPlan",
  34. "Workspace ID is required": "error.workspaceRequired",
  35. "Workspace ID is required.": "error.workspaceRequired",
  36. "This workspace already has a subscription": "error.alreadySubscribed",
  37. "Limit is required.": "error.limitRequired",
  38. "Set a valid monthly limit": "error.monthlyLimitInvalid",
  39. "Set a valid monthly limit.": "error.monthlyLimitInvalid",
  40. "Workspace name is required.": "error.workspaceNameRequired",
  41. "Name must be 255 characters or less.": "error.nameTooLong",
  42. "Email is required": "error.emailRequired",
  43. "Role is required": "error.roleRequired",
  44. "ID is required": "error.idRequired",
  45. "Name is required": "error.nameRequired",
  46. "Provider is required": "error.providerRequired",
  47. "API key is required": "error.apiKeyRequired",
  48. "Model is required": "error.modelRequired",
  49. "workspace.reload.error.paymentFailed": "workspace.reload.error.paymentFailed",
  50. "Payment failed": "workspace.reload.error.paymentFailed",
  51. "Payment failed.": "workspace.reload.error.paymentFailed",
  52. } as const satisfies Record<string, Key>
  53. export function formErrorReloadAmountMin(amount: number) {
  54. return `error.reloadAmountMin:${amount}`
  55. }
  56. export function formErrorReloadTriggerMin(amount: number) {
  57. return `error.reloadTriggerMin:${amount}`
  58. }
  59. export function localizeError(t: (key: Key, params?: Record<string, string | number>) => string, error?: string) {
  60. if (!error) return ""
  61. if (error.startsWith("error.reloadAmountMin:")) {
  62. const amount = Number(error.split(":")[1] ?? 0)
  63. return t("error.reloadAmountMin", { amount })
  64. }
  65. if (error.startsWith("error.reloadTriggerMin:")) {
  66. const amount = Number(error.split(":")[1] ?? 0)
  67. return t("error.reloadTriggerMin", { amount })
  68. }
  69. const amount = error.match(/^Reload amount must be at least \$(\d+)$/)
  70. if (amount) return t("error.reloadAmountMin", { amount: Number(amount[1]) })
  71. const trigger = error.match(/^Balance trigger must be at least \$(\d+)$/)
  72. if (trigger) return t("error.reloadTriggerMin", { amount: Number(trigger[1]) })
  73. const key = map[error as keyof typeof map]
  74. if (key) return t(key)
  75. return error
  76. }