@greatapps/common 1.1.676 → 1.1.678

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +8 -6
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs +20 -19
  4. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  5. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs +10 -11
  6. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  7. package/dist/components/account/DeleteAccountModal.mjs +34 -28
  8. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  9. package/dist/components/account/DisableTwoFactorAuthModal.mjs +7 -5
  10. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  11. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs +8 -9
  12. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  13. package/dist/components/account/TwoFactorAuthModal.mjs +22 -23
  14. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  15. package/dist/components/account/constants.mjs +4 -4
  16. package/dist/components/account/constants.mjs.map +1 -1
  17. package/dist/components/account/hooks/useChangeEmailForm.mjs +5 -3
  18. package/dist/components/account/hooks/useChangeEmailForm.mjs.map +1 -1
  19. package/dist/components/account/hooks/useChangePasswordForm.mjs +26 -3
  20. package/dist/components/account/hooks/useChangePasswordForm.mjs.map +1 -1
  21. package/dist/components/account/hooks/useChangePhoneForm.mjs +18 -9
  22. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  23. package/dist/components/account/hooks/useDisableTwoFactorAuthForm.mjs +26 -3
  24. package/dist/components/account/hooks/useDisableTwoFactorAuthForm.mjs.map +1 -1
  25. package/dist/components/account/hooks/useOtpVerification.mjs +19 -3
  26. package/dist/components/account/hooks/useOtpVerification.mjs.map +1 -1
  27. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs +27 -4
  28. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  29. package/dist/components/account/sections/ChangeEmailModal.mjs +25 -28
  30. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  31. package/dist/components/account/sections/ChangePasswordSection.mjs +8 -6
  32. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  33. package/dist/components/account/sections/ChangePhoneModal.mjs +24 -27
  34. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  35. package/dist/components/account/sections/MyProfileSection.mjs +37 -22
  36. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  37. package/dist/components/account/sections/PreferencesSection.mjs +48 -24
  38. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  39. package/dist/components/account/sections/SecuritySection.mjs +11 -9
  40. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  41. package/dist/components/account/sections/TokenSection.mjs +24 -8
  42. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  43. package/dist/components/layouts/NavBar.mjs +5 -3
  44. package/dist/components/layouts/NavBar.mjs.map +1 -1
  45. package/dist/components/layouts/NotificationsPopover.mjs +5 -3
  46. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  47. package/dist/components/layouts/ProfilePopover.mjs +6 -4
  48. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  49. package/dist/components/layouts/UsersSelectorPopover.mjs +9 -7
  50. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  51. package/dist/components/modals/BuyCreditsModal.mjs +17 -18
  52. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  53. package/dist/components/modals/CreditsDisabledModal.mjs +6 -4
  54. package/dist/components/modals/CreditsDisabledModal.mjs.map +1 -1
  55. package/dist/components/modals/PaidPlanRequiredModal.mjs +5 -3
  56. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  57. package/dist/components/modals/cards/AddCardModal.mjs +64 -46
  58. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  59. package/dist/components/modals/cards/CannotDeleteCardModal.mjs +9 -7
  60. package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -1
  61. package/dist/components/modals/cards/CardFormFields.mjs +65 -51
  62. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  63. package/dist/components/modals/cards/DeleteCardModal.mjs +10 -8
  64. package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -1
  65. package/dist/components/navigation/CancelledSubscriptionBanner.mjs +4 -2
  66. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  67. package/dist/components/navigation/OverdueInvoiceBanner.mjs +4 -2
  68. package/dist/components/navigation/OverdueInvoiceBanner.mjs.map +1 -1
  69. package/dist/components/navigation/PendingCancellationBanner.mjs +4 -6
  70. package/dist/components/navigation/PendingCancellationBanner.mjs.map +1 -1
  71. package/dist/components/navigation/ProjectSelectorPopover.mjs +8 -6
  72. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  73. package/dist/components/navigation/UpcomingInvoiceBanner.mjs +4 -6
  74. package/dist/components/navigation/UpcomingInvoiceBanner.mjs.map +1 -1
  75. package/dist/components/navigation/subcomponents/BottomLinks.mjs +5 -3
  76. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  77. package/dist/components/navigation/subcomponents/CreditsCard.mjs +3 -1
  78. package/dist/components/navigation/subcomponents/CreditsCard.mjs.map +1 -1
  79. package/dist/components/navigation/subcomponents/PlanCard.mjs +3 -1
  80. package/dist/components/navigation/subcomponents/PlanCard.mjs.map +1 -1
  81. package/dist/components/navigation/subcomponents/ProjectSelector.mjs +5 -3
  82. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  83. package/dist/components/pages/NotFoundPage.mjs +5 -3
  84. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  85. package/dist/components/pages/notifications/Notifications.mjs +13 -10
  86. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  87. package/dist/components/ui/buttons/CopyButton.mjs +9 -5
  88. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  89. package/dist/components/ui/data-display/CardItem.mjs +7 -5
  90. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  91. package/dist/components/ui/data-display/PaymentInfoCard.mjs +10 -8
  92. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  93. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  94. package/dist/components/ui/feedback/DefaultCircularProgress.mjs +3 -1
  95. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  96. package/dist/components/ui/form/ComboboxField.mjs +11 -6
  97. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  98. package/dist/components/ui/form/DatePicker.mjs +5 -2
  99. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  100. package/dist/components/ui/form/DateRangePicker.mjs +5 -2
  101. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  102. package/dist/components/ui/form/PhoneInput.mjs +5 -3
  103. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  104. package/dist/components/ui/form/SelectField.mjs +6 -3
  105. package/dist/components/ui/form/SelectField.mjs.map +1 -1
  106. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs +11 -18
  107. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  108. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs +6 -15
  109. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  110. package/dist/i18n/config.mjs +13 -0
  111. package/dist/i18n/config.mjs.map +1 -0
  112. package/dist/i18n/country-language.mjs +74 -0
  113. package/dist/i18n/country-language.mjs.map +1 -0
  114. package/dist/i18n/messages/en-us.mjs +495 -0
  115. package/dist/i18n/messages/en-us.mjs.map +1 -0
  116. package/dist/i18n/messages/es-es.mjs +495 -0
  117. package/dist/i18n/messages/es-es.mjs.map +1 -0
  118. package/dist/i18n/messages/index.mjs +16 -0
  119. package/dist/i18n/messages/index.mjs.map +1 -0
  120. package/dist/i18n/messages/pt-br.mjs +508 -0
  121. package/dist/i18n/messages/pt-br.mjs.map +1 -0
  122. package/dist/i18n/normalize.mjs +12 -0
  123. package/dist/i18n/normalize.mjs.map +1 -0
  124. package/dist/i18n/resolve-locale.mjs +42 -0
  125. package/dist/i18n/resolve-locale.mjs.map +1 -0
  126. package/dist/i18n.mjs +14 -0
  127. package/dist/i18n.mjs.map +1 -0
  128. package/dist/index.mjs +19 -3
  129. package/dist/index.mjs.map +1 -1
  130. package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs +20 -0
  131. package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs.map +1 -0
  132. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs +2 -1
  133. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -1
  134. package/dist/modules/images/utils/validate-image.mjs +8 -8
  135. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  136. package/dist/modules/plans/handlers/list-plans.handler.mjs +1 -1
  137. package/dist/modules/plans/handlers/list-plans.handler.mjs.map +1 -1
  138. package/dist/modules/plans/hooks/list-plans.hook.mjs +2 -2
  139. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  140. package/dist/modules/plans/services/plans.service.mjs +1 -1
  141. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  142. package/dist/modules/plans/types/plan.type.mjs +9 -2
  143. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  144. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs +66 -34
  145. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  146. package/dist/modules/projects/services/projects.service.mjs +9 -0
  147. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  148. package/dist/modules/subscriptions/utils/periodicity.mjs +20 -14
  149. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  150. package/dist/providers/auth.provider.mjs +9 -1
  151. package/dist/providers/auth.provider.mjs.map +1 -1
  152. package/dist/server.mjs +2 -0
  153. package/dist/server.mjs.map +1 -1
  154. package/dist/utils/format/currency.mjs +32 -4
  155. package/dist/utils/format/currency.mjs.map +1 -1
  156. package/dist/utils/intl/cookie-domain.mjs +17 -0
  157. package/dist/utils/intl/cookie-domain.mjs.map +1 -0
  158. package/dist/utils/intl/locale-cookie.mjs +13 -0
  159. package/dist/utils/intl/locale-cookie.mjs.map +1 -0
  160. package/dist/utils/intl/locales.mjs +3 -2
  161. package/dist/utils/intl/locales.mjs.map +1 -1
  162. package/package.json +7 -1
  163. package/src/components/account/ConfigurationsMyAccountModal.tsx +10 -6
  164. package/src/components/account/ConfirmDeleteAccountModal.tsx +22 -13
  165. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +12 -10
  166. package/src/components/account/DeleteAccountModal.tsx +34 -24
  167. package/src/components/account/DisableTwoFactorAuthModal.tsx +11 -6
  168. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +8 -6
  169. package/src/components/account/TwoFactorAuthModal.tsx +33 -29
  170. package/src/components/account/constants.ts +8 -5
  171. package/src/components/account/hooks/useChangeEmailForm.tsx +5 -3
  172. package/src/components/account/hooks/useChangePasswordForm.tsx +20 -6
  173. package/src/components/account/hooks/useChangePhoneForm.tsx +16 -10
  174. package/src/components/account/hooks/useDisableTwoFactorAuthForm.tsx +20 -6
  175. package/src/components/account/hooks/useOtpVerification.tsx +16 -4
  176. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +21 -7
  177. package/src/components/account/sections/ChangeEmailModal.tsx +35 -21
  178. package/src/components/account/sections/ChangePasswordSection.tsx +10 -6
  179. package/src/components/account/sections/ChangePhoneModal.tsx +50 -22
  180. package/src/components/account/sections/MyProfileSection.tsx +37 -23
  181. package/src/components/account/sections/PreferencesSection.tsx +52 -25
  182. package/src/components/account/sections/SecuritySection.tsx +19 -10
  183. package/src/components/account/sections/TokenSection.tsx +22 -10
  184. package/src/components/layouts/NavBar.tsx +5 -3
  185. package/src/components/layouts/NotificationsPopover.tsx +5 -3
  186. package/src/components/layouts/ProfilePopover.tsx +6 -4
  187. package/src/components/layouts/UsersSelectorPopover.tsx +9 -7
  188. package/src/components/modals/BuyCreditsModal.tsx +18 -16
  189. package/src/components/modals/CreditsDisabledModal.tsx +6 -6
  190. package/src/components/modals/PaidPlanRequiredModal.tsx +5 -3
  191. package/src/components/modals/cards/AddCardModal.tsx +89 -62
  192. package/src/components/modals/cards/CannotDeleteCardModal.tsx +9 -8
  193. package/src/components/modals/cards/CardFormFields.tsx +93 -75
  194. package/src/components/modals/cards/DeleteCardModal.tsx +10 -8
  195. package/src/components/navigation/CancelledSubscriptionBanner.tsx +4 -2
  196. package/src/components/navigation/OverdueInvoiceBanner.tsx +4 -2
  197. package/src/components/navigation/PendingCancellationBanner.tsx +4 -2
  198. package/src/components/navigation/ProjectSelectorPopover.tsx +8 -6
  199. package/src/components/navigation/UpcomingInvoiceBanner.tsx +4 -2
  200. package/src/components/navigation/subcomponents/BottomLinks.tsx +5 -3
  201. package/src/components/navigation/subcomponents/CreditsCard.tsx +3 -1
  202. package/src/components/navigation/subcomponents/PlanCard.tsx +3 -1
  203. package/src/components/navigation/subcomponents/ProjectSelector.tsx +5 -3
  204. package/src/components/pages/NotFoundPage.tsx +5 -3
  205. package/src/components/pages/notifications/Notifications.tsx +13 -10
  206. package/src/components/ui/buttons/CopyButton.tsx +10 -5
  207. package/src/components/ui/data-display/CardItem.tsx +7 -5
  208. package/src/components/ui/data-display/PaymentInfoCard.tsx +10 -8
  209. package/src/components/ui/feedback/CircularProgress.tsx +4 -0
  210. package/src/components/ui/feedback/DefaultCircularProgress.tsx +3 -1
  211. package/src/components/ui/form/ComboboxField.tsx +11 -6
  212. package/src/components/ui/form/DatePicker.tsx +5 -2
  213. package/src/components/ui/form/DateRangePicker.tsx +5 -2
  214. package/src/components/ui/form/PhoneInput.tsx +5 -3
  215. package/src/components/ui/form/SelectField.tsx +6 -3
  216. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +19 -11
  217. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +6 -5
  218. package/src/i18n/config.ts +17 -0
  219. package/src/i18n/country-language.ts +60 -0
  220. package/src/i18n/messages/en-us.ts +515 -0
  221. package/src/i18n/messages/es-es.ts +516 -0
  222. package/src/i18n/messages/index.ts +24 -0
  223. package/src/i18n/messages/pt-br.ts +539 -0
  224. package/src/i18n/normalize.ts +15 -0
  225. package/src/i18n/resolve-locale.ts +77 -0
  226. package/src/i18n.ts +10 -0
  227. package/src/index.ts +13 -2
  228. package/src/modules/accounts/hooks/use-currency-formatter.hook.tsx +32 -0
  229. package/src/modules/cards/hooks/handle-delete-card.hook.ts +8 -3
  230. package/src/modules/images/utils/validate-image.ts +23 -8
  231. package/src/modules/plans/handlers/list-plans.handler.ts +1 -1
  232. package/src/modules/plans/hooks/list-plans.hook.ts +2 -2
  233. package/src/modules/plans/services/plans.service.ts +1 -1
  234. package/src/modules/plans/types/plan.type.ts +9 -1
  235. package/src/modules/plans/utils/map-api-plan-to-ui.ts +115 -46
  236. package/src/modules/projects/services/projects.service.ts +12 -0
  237. package/src/modules/subscriptions/utils/periodicity.ts +29 -12
  238. package/src/providers/auth.provider.tsx +13 -1
  239. package/src/server.ts +2 -0
  240. package/src/utils/format/currency.ts +62 -7
  241. package/src/utils/intl/cookie-domain.ts +29 -0
  242. package/src/utils/intl/locale-cookie.ts +18 -0
  243. package/src/utils/intl/locales.ts +3 -2
@@ -1,6 +1,7 @@
1
1
  'use client'
2
2
 
3
3
  import { useEffect, useRef, useState } from 'react'
4
+ import { useTranslations } from 'next-intl'
4
5
  import ReactCrop, {
5
6
  type Crop,
6
7
  centerCrop,
@@ -178,6 +179,7 @@ export function ImageCropModal({
178
179
  fileName,
179
180
  onSelectAnother,
180
181
  }: ImageCropModalProps) {
182
+ const translate = useTranslations()
181
183
  const imgRef = useRef<HTMLImageElement>(null)
182
184
  const [crop, setCrop] = useState<Crop>()
183
185
  const [imageSize, setImageSize] = useState({ width: 0, height: 0 })
@@ -301,22 +303,28 @@ export function ImageCropModal({
301
303
  <>
302
304
  <DialogHeader className="p-5">
303
305
  <DialogTitle className="text-center text-[16px]!">
304
- {dimensionText ? `Foto menor que ${dimensionText}` : 'Foto muito pequena'}
306
+ {dimensionText
307
+ ? translate('common.imageUpload.tooSmallTitleWithDimension', { dimensionText })
308
+ : translate('common.imageUpload.tooSmallTitleGeneric')}
305
309
  </DialogTitle>
306
310
  </DialogHeader>
307
311
 
308
312
  <div className="px-5 pb-5">
309
313
  <p className="paragraph-small-regular text-zinc-600 text-center">
310
- {fileName ? `O arquivo "${fileName}"` : 'A imagem selecionada'} é menor
311
- {dimensionText ? ` que ${dimensionText}` : ' que o tamanho mínimo exigido'}.
312
- {' '}Faça envio de uma imagem {dimensionText ? `com pelo menos ${dimensionText}` : 'maior'} para continuar.
314
+ {fileName && dimensionText
315
+ ? translate('common.imageUpload.tooSmallBodyFileWithDimension', { fileName, dimensionText })
316
+ : fileName && !dimensionText
317
+ ? translate('common.imageUpload.tooSmallBodyFileGeneric', { fileName })
318
+ : !fileName && dimensionText
319
+ ? translate('common.imageUpload.tooSmallBodyNoFileWithDimension', { dimensionText })
320
+ : translate('common.imageUpload.tooSmallBodyNoFileGeneric')}
313
321
  </p>
314
322
  </div>
315
323
 
316
324
  <DialogFooter className="flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200">
317
- {onSelectAnother && <Button onClick={onSelectAnother}>Enviar outra</Button>}
325
+ {onSelectAnother && <Button onClick={onSelectAnother}>{translate('common.imageUpload.sendAnother')}</Button>}
318
326
  <Button variant="secondary" onClick={handleCancel}>
319
- Cancelar
327
+ {translate('common.actions.cancel')}
320
328
  </Button>
321
329
  </DialogFooter>
322
330
  </>
@@ -324,7 +332,7 @@ export function ImageCropModal({
324
332
  <>
325
333
  <DialogHeader className="p-5">
326
334
  <DialogTitle className="text-center text-[16px]!">
327
- Ajustar imagem
335
+ {translate('common.imageUpload.cropTitle')}
328
336
  </DialogTitle>
329
337
  </DialogHeader>
330
338
 
@@ -344,7 +352,7 @@ export function ImageCropModal({
344
352
  <img
345
353
  ref={imgRef}
346
354
  src={imageSrc}
347
- alt="Crop"
355
+ alt={translate('common.imageUpload.cropAlt')}
348
356
  onLoad={onCropImgLoad}
349
357
  draggable={false}
350
358
  className="max-h-[50vh] object-contain select-none"
@@ -354,16 +362,16 @@ export function ImageCropModal({
354
362
  </div>
355
363
 
356
364
  <p className="paragraph-small-regular text-zinc-500 text-center">
357
- Arraste para ajustar a área de corte
365
+ {translate('common.imageUpload.cropHint')}
358
366
  </p>
359
367
  </div>
360
368
 
361
369
  <DialogFooter className="flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200">
362
370
  <Button onClick={handleConfirm} disabled={imageStatus !== 'ok' || !crop}>
363
- Confirmar
371
+ {translate('common.actions.confirm')}
364
372
  </Button>
365
373
  <Button variant="secondary" onClick={handleCancel}>
366
- Cancelar
374
+ {translate('common.actions.cancel')}
367
375
  </Button>
368
376
  </DialogFooter>
369
377
  </>
@@ -1,5 +1,6 @@
1
1
  'use client'
2
2
 
3
+ import { useTranslations } from 'next-intl'
3
4
  import {
4
5
  Dialog,
5
6
  DialogContent,
@@ -28,6 +29,7 @@ export function ImageTooSmallModal({
28
29
  onSelectAnother,
29
30
  onCancel,
30
31
  }: ImageTooSmallModalProps) {
32
+ const translate = useTranslations()
31
33
  const dimensionText = `${minWidth}x${minHeight}px`
32
34
 
33
35
  return (
@@ -38,21 +40,20 @@ export function ImageTooSmallModal({
38
40
  >
39
41
  <DialogHeader className="p-5">
40
42
  <DialogTitle className="text-center text-[16px]!">
41
- Foto menor que {dimensionText}
43
+ {translate('common.imageUpload.tooSmallTitleWithDimension', { dimensionText })}
42
44
  </DialogTitle>
43
45
  </DialogHeader>
44
46
 
45
47
  <div className="px-5 pb-5">
46
48
  <p className="paragraph-small-regular text-zinc-600 text-center">
47
- O arquivo "{fileName}" é menor que {dimensionText}. Faça envio de
48
- uma imagem com pelo menos {dimensionText} para continuar.
49
+ {translate('common.imageUpload.tooSmallBodyFileWithDimension', { fileName, dimensionText })}
49
50
  </p>
50
51
  </div>
51
52
 
52
53
  <DialogFooter className="flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200">
53
- <Button onClick={onSelectAnother}>Enviar outra</Button>
54
+ <Button onClick={onSelectAnother}>{translate('common.imageUpload.sendAnother')}</Button>
54
55
  <Button variant="secondary" onClick={onCancel}>
55
- Cancelar
56
+ {translate('common.actions.cancel')}
56
57
  </Button>
57
58
  </DialogFooter>
58
59
  </DialogContent>
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Locales suportados pela plataforma GreatApps.
3
+ * Identificadores no padrão `idioma-REGIÃO` em minúsculas: `pt-br`, `en-us`, `es-es`.
4
+ */
5
+ export const LOCALES = ['pt-br', 'en-us', 'es-es'] as const;
6
+
7
+ export type Locale = (typeof LOCALES)[number];
8
+
9
+ /** Idioma padrão — fallback final (o produto nasce em pt-BR). */
10
+ export const DEFAULT_LOCALE: Locale = 'pt-br';
11
+
12
+ /** Nome do cookie onde o locale resolvido é persistido (convenção next-intl). */
13
+ export const LOCALE_COOKIE = 'NEXT_LOCALE';
14
+
15
+ export function isLocale(value: unknown): value is Locale {
16
+ return typeof value === 'string' && (LOCALES as readonly string[]).includes(value);
17
+ }
@@ -0,0 +1,60 @@
1
+ import { Locale } from './config';
2
+
3
+ /**
4
+ * Países de língua portuguesa (ISO 3166-1 alpha-2).
5
+ */
6
+ const PORTUGUESE_COUNTRIES = new Set<string>([
7
+ 'BR', // Brasil
8
+ 'PT', // Portugal
9
+ 'AO', // Angola
10
+ 'MZ', // Moçambique
11
+ 'CV', // Cabo Verde
12
+ 'GW', // Guiné-Bissau
13
+ 'ST', // São Tomé e Príncipe
14
+ 'TL', // Timor-Leste
15
+ ]);
16
+
17
+ /**
18
+ * Países de língua espanhola (ISO 3166-1 alpha-2).
19
+ */
20
+ const SPANISH_COUNTRIES = new Set<string>([
21
+ 'ES', // Espanha
22
+ 'MX', // México
23
+ 'AR', // Argentina
24
+ 'CO', // Colômbia
25
+ 'PE', // Peru
26
+ 'VE', // Venezuela
27
+ 'CL', // Chile
28
+ 'EC', // Equador
29
+ 'GT', // Guatemala
30
+ 'CU', // Cuba
31
+ 'BO', // Bolívia
32
+ 'DO', // República Dominicana
33
+ 'HN', // Honduras
34
+ 'PY', // Paraguai
35
+ 'SV', // El Salvador
36
+ 'NI', // Nicarágua
37
+ 'CR', // Costa Rica
38
+ 'PA', // Panamá
39
+ 'UY', // Uruguai
40
+ 'PR', // Porto Rico
41
+ 'GQ', // Guiné Equatorial
42
+ ]);
43
+
44
+ /**
45
+ * Infere o idioma a partir do código de país (ex.: header `CF-IPCountry` da Cloudflare
46
+ * ou `session.location.country` do JWT):
47
+ * - país lusófono → `pt`
48
+ * - país hispanófono → `es`
49
+ * - demais países → `en`
50
+ *
51
+ * Retorna `null` quando o país é desconhecido/ausente (deixa o fallback de locale decidir).
52
+ */
53
+ export function localeFromCountry(country?: string | null): Locale | null {
54
+ if (!country) return null;
55
+ const code = country.trim().toUpperCase();
56
+ if (code === 'XX' || code === 'T1') return null; // Cloudflare: desconhecido / Tor
57
+ if (PORTUGUESE_COUNTRIES.has(code)) return 'pt-br';
58
+ if (SPANISH_COUNTRIES.has(code)) return 'es-es';
59
+ return 'en-us';
60
+ }