@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.
- package/dist/components/account/ConfigurationsMyAccountModal.mjs +8 -6
- package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
- package/dist/components/account/ConfirmDeleteAccountModal.mjs +20 -19
- package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/ConfirmGlobalPreferencesModal.mjs +10 -11
- package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
- package/dist/components/account/DeleteAccountModal.mjs +34 -28
- package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/DisableTwoFactorAuthModal.mjs +7 -5
- package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
- package/dist/components/account/IsntPossibleDeleteAccountModal.mjs +8 -9
- package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/TwoFactorAuthModal.mjs +22 -23
- package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
- package/dist/components/account/constants.mjs +4 -4
- package/dist/components/account/constants.mjs.map +1 -1
- package/dist/components/account/hooks/useChangeEmailForm.mjs +5 -3
- package/dist/components/account/hooks/useChangeEmailForm.mjs.map +1 -1
- package/dist/components/account/hooks/useChangePasswordForm.mjs +26 -3
- package/dist/components/account/hooks/useChangePasswordForm.mjs.map +1 -1
- package/dist/components/account/hooks/useChangePhoneForm.mjs +18 -9
- package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
- package/dist/components/account/hooks/useDisableTwoFactorAuthForm.mjs +26 -3
- package/dist/components/account/hooks/useDisableTwoFactorAuthForm.mjs.map +1 -1
- package/dist/components/account/hooks/useOtpVerification.mjs +19 -3
- package/dist/components/account/hooks/useOtpVerification.mjs.map +1 -1
- package/dist/components/account/hooks/useTwoFactorAuthForm.mjs +27 -4
- package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
- package/dist/components/account/sections/ChangeEmailModal.mjs +25 -28
- package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
- package/dist/components/account/sections/ChangePasswordSection.mjs +8 -6
- package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
- package/dist/components/account/sections/ChangePhoneModal.mjs +24 -27
- package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
- package/dist/components/account/sections/MyProfileSection.mjs +37 -22
- package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
- package/dist/components/account/sections/PreferencesSection.mjs +48 -24
- package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
- package/dist/components/account/sections/SecuritySection.mjs +11 -9
- package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
- package/dist/components/account/sections/TokenSection.mjs +24 -8
- package/dist/components/account/sections/TokenSection.mjs.map +1 -1
- package/dist/components/layouts/NavBar.mjs +5 -3
- package/dist/components/layouts/NavBar.mjs.map +1 -1
- package/dist/components/layouts/NotificationsPopover.mjs +5 -3
- package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
- package/dist/components/layouts/ProfilePopover.mjs +6 -4
- package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
- package/dist/components/layouts/UsersSelectorPopover.mjs +9 -7
- package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
- package/dist/components/modals/BuyCreditsModal.mjs +17 -18
- package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
- package/dist/components/modals/CreditsDisabledModal.mjs +6 -4
- package/dist/components/modals/CreditsDisabledModal.mjs.map +1 -1
- package/dist/components/modals/PaidPlanRequiredModal.mjs +5 -3
- package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
- package/dist/components/modals/cards/AddCardModal.mjs +64 -46
- package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
- package/dist/components/modals/cards/CannotDeleteCardModal.mjs +9 -7
- package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -1
- package/dist/components/modals/cards/CardFormFields.mjs +65 -51
- package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
- package/dist/components/modals/cards/DeleteCardModal.mjs +10 -8
- package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -1
- package/dist/components/navigation/CancelledSubscriptionBanner.mjs +4 -2
- package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
- package/dist/components/navigation/OverdueInvoiceBanner.mjs +4 -2
- package/dist/components/navigation/OverdueInvoiceBanner.mjs.map +1 -1
- package/dist/components/navigation/PendingCancellationBanner.mjs +4 -6
- package/dist/components/navigation/PendingCancellationBanner.mjs.map +1 -1
- package/dist/components/navigation/ProjectSelectorPopover.mjs +8 -6
- package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
- package/dist/components/navigation/UpcomingInvoiceBanner.mjs +4 -6
- package/dist/components/navigation/UpcomingInvoiceBanner.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/BottomLinks.mjs +5 -3
- package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/CreditsCard.mjs +3 -1
- package/dist/components/navigation/subcomponents/CreditsCard.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/PlanCard.mjs +3 -1
- package/dist/components/navigation/subcomponents/PlanCard.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs +5 -3
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
- package/dist/components/pages/NotFoundPage.mjs +5 -3
- package/dist/components/pages/NotFoundPage.mjs.map +1 -1
- package/dist/components/pages/notifications/Notifications.mjs +13 -10
- package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
- package/dist/components/ui/buttons/CopyButton.mjs +9 -5
- package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
- package/dist/components/ui/data-display/CardItem.mjs +7 -5
- package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
- package/dist/components/ui/data-display/PaymentInfoCard.mjs +10 -8
- package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
- package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs +3 -1
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
- package/dist/components/ui/form/ComboboxField.mjs +11 -6
- package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
- package/dist/components/ui/form/DatePicker.mjs +5 -2
- package/dist/components/ui/form/DatePicker.mjs.map +1 -1
- package/dist/components/ui/form/DateRangePicker.mjs +5 -2
- package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
- package/dist/components/ui/form/PhoneInput.mjs +5 -3
- package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
- package/dist/components/ui/form/SelectField.mjs +6 -3
- package/dist/components/ui/form/SelectField.mjs.map +1 -1
- package/dist/components/widgets/ImageUpload/ImageCropModal.mjs +11 -18
- package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
- package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs +6 -15
- package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
- package/dist/i18n/config.mjs +13 -0
- package/dist/i18n/config.mjs.map +1 -0
- package/dist/i18n/country-language.mjs +74 -0
- package/dist/i18n/country-language.mjs.map +1 -0
- package/dist/i18n/messages/en-us.mjs +495 -0
- package/dist/i18n/messages/en-us.mjs.map +1 -0
- package/dist/i18n/messages/es-es.mjs +495 -0
- package/dist/i18n/messages/es-es.mjs.map +1 -0
- package/dist/i18n/messages/index.mjs +16 -0
- package/dist/i18n/messages/index.mjs.map +1 -0
- package/dist/i18n/messages/pt-br.mjs +508 -0
- package/dist/i18n/messages/pt-br.mjs.map +1 -0
- package/dist/i18n/normalize.mjs +12 -0
- package/dist/i18n/normalize.mjs.map +1 -0
- package/dist/i18n/resolve-locale.mjs +42 -0
- package/dist/i18n/resolve-locale.mjs.map +1 -0
- package/dist/i18n.mjs +14 -0
- package/dist/i18n.mjs.map +1 -0
- package/dist/index.mjs +19 -3
- package/dist/index.mjs.map +1 -1
- package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs +20 -0
- package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs.map +1 -0
- package/dist/modules/cards/hooks/handle-delete-card.hook.mjs +2 -1
- package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -1
- package/dist/modules/images/utils/validate-image.mjs +8 -8
- package/dist/modules/images/utils/validate-image.mjs.map +1 -1
- package/dist/modules/plans/handlers/list-plans.handler.mjs +1 -1
- package/dist/modules/plans/handlers/list-plans.handler.mjs.map +1 -1
- package/dist/modules/plans/hooks/list-plans.hook.mjs +2 -2
- package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
- package/dist/modules/plans/services/plans.service.mjs +1 -1
- package/dist/modules/plans/services/plans.service.mjs.map +1 -1
- package/dist/modules/plans/types/plan.type.mjs +9 -2
- package/dist/modules/plans/types/plan.type.mjs.map +1 -1
- package/dist/modules/plans/utils/map-api-plan-to-ui.mjs +66 -34
- package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
- package/dist/modules/projects/services/projects.service.mjs +9 -0
- package/dist/modules/projects/services/projects.service.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/periodicity.mjs +20 -14
- package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
- package/dist/providers/auth.provider.mjs +9 -1
- package/dist/providers/auth.provider.mjs.map +1 -1
- package/dist/server.mjs +2 -0
- package/dist/server.mjs.map +1 -1
- package/dist/utils/format/currency.mjs +32 -4
- package/dist/utils/format/currency.mjs.map +1 -1
- package/dist/utils/intl/cookie-domain.mjs +17 -0
- package/dist/utils/intl/cookie-domain.mjs.map +1 -0
- package/dist/utils/intl/locale-cookie.mjs +13 -0
- package/dist/utils/intl/locale-cookie.mjs.map +1 -0
- package/dist/utils/intl/locales.mjs +3 -2
- package/dist/utils/intl/locales.mjs.map +1 -1
- package/package.json +7 -1
- package/src/components/account/ConfigurationsMyAccountModal.tsx +10 -6
- package/src/components/account/ConfirmDeleteAccountModal.tsx +22 -13
- package/src/components/account/ConfirmGlobalPreferencesModal.tsx +12 -10
- package/src/components/account/DeleteAccountModal.tsx +34 -24
- package/src/components/account/DisableTwoFactorAuthModal.tsx +11 -6
- package/src/components/account/IsntPossibleDeleteAccountModal.tsx +8 -6
- package/src/components/account/TwoFactorAuthModal.tsx +33 -29
- package/src/components/account/constants.ts +8 -5
- package/src/components/account/hooks/useChangeEmailForm.tsx +5 -3
- package/src/components/account/hooks/useChangePasswordForm.tsx +20 -6
- package/src/components/account/hooks/useChangePhoneForm.tsx +16 -10
- package/src/components/account/hooks/useDisableTwoFactorAuthForm.tsx +20 -6
- package/src/components/account/hooks/useOtpVerification.tsx +16 -4
- package/src/components/account/hooks/useTwoFactorAuthForm.tsx +21 -7
- package/src/components/account/sections/ChangeEmailModal.tsx +35 -21
- package/src/components/account/sections/ChangePasswordSection.tsx +10 -6
- package/src/components/account/sections/ChangePhoneModal.tsx +50 -22
- package/src/components/account/sections/MyProfileSection.tsx +37 -23
- package/src/components/account/sections/PreferencesSection.tsx +52 -25
- package/src/components/account/sections/SecuritySection.tsx +19 -10
- package/src/components/account/sections/TokenSection.tsx +22 -10
- package/src/components/layouts/NavBar.tsx +5 -3
- package/src/components/layouts/NotificationsPopover.tsx +5 -3
- package/src/components/layouts/ProfilePopover.tsx +6 -4
- package/src/components/layouts/UsersSelectorPopover.tsx +9 -7
- package/src/components/modals/BuyCreditsModal.tsx +18 -16
- package/src/components/modals/CreditsDisabledModal.tsx +6 -6
- package/src/components/modals/PaidPlanRequiredModal.tsx +5 -3
- package/src/components/modals/cards/AddCardModal.tsx +89 -62
- package/src/components/modals/cards/CannotDeleteCardModal.tsx +9 -8
- package/src/components/modals/cards/CardFormFields.tsx +93 -75
- package/src/components/modals/cards/DeleteCardModal.tsx +10 -8
- package/src/components/navigation/CancelledSubscriptionBanner.tsx +4 -2
- package/src/components/navigation/OverdueInvoiceBanner.tsx +4 -2
- package/src/components/navigation/PendingCancellationBanner.tsx +4 -2
- package/src/components/navigation/ProjectSelectorPopover.tsx +8 -6
- package/src/components/navigation/UpcomingInvoiceBanner.tsx +4 -2
- package/src/components/navigation/subcomponents/BottomLinks.tsx +5 -3
- package/src/components/navigation/subcomponents/CreditsCard.tsx +3 -1
- package/src/components/navigation/subcomponents/PlanCard.tsx +3 -1
- package/src/components/navigation/subcomponents/ProjectSelector.tsx +5 -3
- package/src/components/pages/NotFoundPage.tsx +5 -3
- package/src/components/pages/notifications/Notifications.tsx +13 -10
- package/src/components/ui/buttons/CopyButton.tsx +10 -5
- package/src/components/ui/data-display/CardItem.tsx +7 -5
- package/src/components/ui/data-display/PaymentInfoCard.tsx +10 -8
- package/src/components/ui/feedback/CircularProgress.tsx +4 -0
- package/src/components/ui/feedback/DefaultCircularProgress.tsx +3 -1
- package/src/components/ui/form/ComboboxField.tsx +11 -6
- package/src/components/ui/form/DatePicker.tsx +5 -2
- package/src/components/ui/form/DateRangePicker.tsx +5 -2
- package/src/components/ui/form/PhoneInput.tsx +5 -3
- package/src/components/ui/form/SelectField.tsx +6 -3
- package/src/components/widgets/ImageUpload/ImageCropModal.tsx +19 -11
- package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +6 -5
- package/src/i18n/config.ts +17 -0
- package/src/i18n/country-language.ts +60 -0
- package/src/i18n/messages/en-us.ts +515 -0
- package/src/i18n/messages/es-es.ts +516 -0
- package/src/i18n/messages/index.ts +24 -0
- package/src/i18n/messages/pt-br.ts +539 -0
- package/src/i18n/normalize.ts +15 -0
- package/src/i18n/resolve-locale.ts +77 -0
- package/src/i18n.ts +10 -0
- package/src/index.ts +13 -2
- package/src/modules/accounts/hooks/use-currency-formatter.hook.tsx +32 -0
- package/src/modules/cards/hooks/handle-delete-card.hook.ts +8 -3
- package/src/modules/images/utils/validate-image.ts +23 -8
- package/src/modules/plans/handlers/list-plans.handler.ts +1 -1
- package/src/modules/plans/hooks/list-plans.hook.ts +2 -2
- package/src/modules/plans/services/plans.service.ts +1 -1
- package/src/modules/plans/types/plan.type.ts +9 -1
- package/src/modules/plans/utils/map-api-plan-to-ui.ts +115 -46
- package/src/modules/projects/services/projects.service.ts +12 -0
- package/src/modules/subscriptions/utils/periodicity.ts +29 -12
- package/src/providers/auth.provider.tsx +13 -1
- package/src/server.ts +2 -0
- package/src/utils/format/currency.ts +62 -7
- package/src/utils/intl/cookie-domain.ts +29 -0
- package/src/utils/intl/locale-cookie.ts +18 -0
- 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
|
|
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
|
|
311
|
-
|
|
312
|
-
|
|
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}>
|
|
325
|
+
{onSelectAnother && <Button onClick={onSelectAnother}>{translate('common.imageUpload.sendAnother')}</Button>}
|
|
318
326
|
<Button variant="secondary" onClick={handleCancel}>
|
|
319
|
-
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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
|
-
|
|
371
|
+
{translate('common.actions.confirm')}
|
|
364
372
|
</Button>
|
|
365
373
|
<Button variant="secondary" onClick={handleCancel}>
|
|
366
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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}>
|
|
54
|
+
<Button onClick={onSelectAnother}>{translate('common.imageUpload.sendAnother')}</Button>
|
|
54
55
|
<Button variant="secondary" onClick={onCancel}>
|
|
55
|
-
|
|
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
|
+
}
|