@greatapps/common 1.1.676 → 1.1.677
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/AppMobileNavBar.mjs +2 -148
- package/dist/components/layouts/AppMobileNavBar.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 +494 -0
- package/dist/i18n/messages/en-us.mjs.map +1 -0
- package/dist/i18n/messages/es-es.mjs +494 -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 +507 -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/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 +5 -1
- package/dist/modules/plans/types/plan.type.mjs.map +1 -1
- package/dist/modules/plans/utils/map-api-plan-to-ui.mjs +61 -35
- 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/AppMobileNavBar.tsx +1 -154
- 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 +514 -0
- package/src/i18n/messages/es-es.ts +515 -0
- package/src/i18n/messages/index.ts +24 -0
- package/src/i18n/messages/pt-br.ts +538 -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/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 +4 -0
- package/src/modules/plans/utils/map-api-plan-to-ui.ts +109 -47
- 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,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { useTranslations } from 'next-intl';
|
|
3
4
|
import { IconChevronLeft, IconX, IconMessage } from '@tabler/icons-react';
|
|
4
5
|
import { Button } from '../../ui/buttons/Button';
|
|
5
6
|
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
|
|
@@ -20,6 +21,7 @@ interface ChangePhoneModalProps {
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
24
|
+
const translate = useTranslations();
|
|
23
25
|
const { user } = useAuth();
|
|
24
26
|
const invalidateUser = useInvalidateUser();
|
|
25
27
|
|
|
@@ -70,7 +72,7 @@ export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
|
70
72
|
reset: resetOtp,
|
|
71
73
|
} = useOtpVerification({
|
|
72
74
|
onSuccess: handleSuccess,
|
|
73
|
-
successMessage: '
|
|
75
|
+
successMessage: translate('common.account.changePhone.phoneChanged'),
|
|
74
76
|
validateFn: async (token) => {
|
|
75
77
|
const result = await confirmPhoneChangeAction(token, submittedPhone.local, submittedPhone.ddi);
|
|
76
78
|
return result.success;
|
|
@@ -108,7 +110,7 @@ export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
|
108
110
|
<IconChevronLeft size={20} className="text-gray-950" />
|
|
109
111
|
</Button>
|
|
110
112
|
<DialogTitle className="paragraph-medium-semibold text-gray-950 text-center flex-1">
|
|
111
|
-
|
|
113
|
+
{translate('common.account.changePhone.titleEdit')}
|
|
112
114
|
</DialogTitle>
|
|
113
115
|
<Button variant="ghost" className="size-8! p-0" onClick={handleClose}>
|
|
114
116
|
<IconX size={18} className="text-gray-500" />
|
|
@@ -117,11 +119,17 @@ export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
|
117
119
|
) : (
|
|
118
120
|
<>
|
|
119
121
|
<DialogHeader className="sr-only">
|
|
120
|
-
<DialogTitle>
|
|
122
|
+
<DialogTitle>
|
|
123
|
+
{hasExistingPhone
|
|
124
|
+
? translate('common.account.changePhone.titleEdit')
|
|
125
|
+
: translate('common.account.changePhone.titleAdd')}
|
|
126
|
+
</DialogTitle>
|
|
121
127
|
</DialogHeader>
|
|
122
128
|
<div className="flex items-center justify-center px-4 py-3 relative border-b border-gray-200 lg:border-b-0">
|
|
123
129
|
<span className="paragraph-medium-semibold text-gray-950 text-center">
|
|
124
|
-
{hasExistingPhone
|
|
130
|
+
{hasExistingPhone
|
|
131
|
+
? translate('common.account.changePhone.titleEdit')
|
|
132
|
+
: translate('common.account.changePhone.titleAdd')}
|
|
125
133
|
</span>
|
|
126
134
|
<Button
|
|
127
135
|
variant="ghost"
|
|
@@ -150,10 +158,14 @@ export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
|
150
158
|
</div>
|
|
151
159
|
|
|
152
160
|
<div className="flex flex-col gap-1">
|
|
153
|
-
<h3 className="paragraph-medium-semibold text-gray-950">
|
|
161
|
+
<h3 className="paragraph-medium-semibold text-gray-950">
|
|
162
|
+
{translate('common.account.otp.validationCode')}
|
|
163
|
+
</h3>
|
|
154
164
|
<p className="paragraph-small-regular text-gray-600">
|
|
155
|
-
|
|
156
|
-
|
|
165
|
+
{translate.rich('common.account.changePhone.sentCodeTo', {
|
|
166
|
+
phone: currentPhoneDisplay,
|
|
167
|
+
b: (chunks) => <span className="font-semibold text-gray-950">{chunks}</span>,
|
|
168
|
+
})}
|
|
157
169
|
</p>
|
|
158
170
|
</div>
|
|
159
171
|
|
|
@@ -170,7 +182,9 @@ export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
|
170
182
|
</InputOTPGroup>
|
|
171
183
|
</InputOTP>
|
|
172
184
|
{hasError && (
|
|
173
|
-
<p className="paragraph-small-regular text-red-500">
|
|
185
|
+
<p className="paragraph-small-regular text-red-500">
|
|
186
|
+
{translate('common.account.otp.incorrectCode')}
|
|
187
|
+
</p>
|
|
174
188
|
)}
|
|
175
189
|
</div>
|
|
176
190
|
|
|
@@ -180,14 +194,16 @@ export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
|
180
194
|
onClick={handleResend}
|
|
181
195
|
className="paragraph-small-medium text-gray-950 underline cursor-pointer hover:text-gray-700 w-fit"
|
|
182
196
|
>
|
|
183
|
-
|
|
197
|
+
{translate('common.account.otp.resend')}
|
|
184
198
|
</button>
|
|
185
199
|
) : (
|
|
186
200
|
<p className="paragraph-small-regular text-gray-500">
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
201
|
+
{translate.rich('common.account.otp.resendIn', {
|
|
202
|
+
time: formatTimer(timer),
|
|
203
|
+
b: (chunks) => (
|
|
204
|
+
<span className="paragraph-small-semibold text-gray-950">{chunks}</span>
|
|
205
|
+
),
|
|
206
|
+
})}
|
|
191
207
|
</p>
|
|
192
208
|
)}
|
|
193
209
|
</div>
|
|
@@ -196,10 +212,12 @@ export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
|
196
212
|
|
|
197
213
|
<div className="flex items-center justify-between px-4 lg:px-5 py-4 lg:py-5 mt-auto lg:mt-0">
|
|
198
214
|
<Button variant="secondary" className="h-10!" type="button" onClick={handleClose}>
|
|
199
|
-
|
|
215
|
+
{translate('common.actions.cancel')}
|
|
200
216
|
</Button>
|
|
201
217
|
<Button className="h-10!" type="submit" disabled={!isValidLength || isLoading}>
|
|
202
|
-
{isLoading
|
|
218
|
+
{isLoading
|
|
219
|
+
? translate('common.account.otp.validating')
|
|
220
|
+
: translate('common.account.changePhone.confirm')}
|
|
203
221
|
</Button>
|
|
204
222
|
</div>
|
|
205
223
|
</form>
|
|
@@ -208,17 +226,23 @@ export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
|
208
226
|
<div className="flex flex-col gap-5 lg:gap-6 px-4 lg:px-5 py-5 lg:py-6 flex-1 lg:flex-none">
|
|
209
227
|
<div className="flex flex-col gap-1">
|
|
210
228
|
<span className="paragraph-medium-semibold text-gray-950">
|
|
211
|
-
{hasExistingPhone
|
|
229
|
+
{hasExistingPhone
|
|
230
|
+
? translate('common.account.changePhone.updateTitle')
|
|
231
|
+
: translate('common.account.changePhone.addTitle')}
|
|
212
232
|
</span>
|
|
213
233
|
<span className="paragraph-small-regular text-gray-600">
|
|
214
234
|
{hasExistingPhone
|
|
215
|
-
? '
|
|
216
|
-
: '
|
|
235
|
+
? translate('common.account.changePhone.updateDescription')
|
|
236
|
+
: translate('common.account.changePhone.addDescription')}
|
|
217
237
|
</span>
|
|
218
238
|
</div>
|
|
219
239
|
|
|
220
240
|
<PhoneInput
|
|
221
|
-
label={
|
|
241
|
+
label={
|
|
242
|
+
hasExistingPhone
|
|
243
|
+
? translate('common.account.changePhone.newNumber')
|
|
244
|
+
: translate('common.account.changePhone.numberLabel')
|
|
245
|
+
}
|
|
222
246
|
placeholder="(00) 0 0000-0000"
|
|
223
247
|
value={phoneValue}
|
|
224
248
|
onChange={handlePhoneChange}
|
|
@@ -229,12 +253,16 @@ export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
|
229
253
|
|
|
230
254
|
<div className="flex items-center justify-between p-4 lg:p-5 border-t border-gray-200 mt-auto lg:mt-0">
|
|
231
255
|
<Button variant="secondary" className="h-10!" type="button" onClick={handleClose}>
|
|
232
|
-
|
|
256
|
+
{translate('common.actions.cancel')}
|
|
233
257
|
</Button>
|
|
234
258
|
<Button className="h-10!" type="submit" disabled={isSubmitting}>
|
|
235
259
|
{isSubmitting
|
|
236
|
-
?
|
|
237
|
-
|
|
260
|
+
? hasExistingPhone
|
|
261
|
+
? translate('common.actions.sending')
|
|
262
|
+
: translate('common.actions.saving')
|
|
263
|
+
: hasExistingPhone
|
|
264
|
+
? translate('common.actions.continue')
|
|
265
|
+
: translate('common.actions.save')}
|
|
238
266
|
</Button>
|
|
239
267
|
</div>
|
|
240
268
|
</form>
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useRef } from 'react';
|
|
4
4
|
import Image from 'next/image';
|
|
5
|
+
import { useTranslations } from 'next-intl';
|
|
5
6
|
import { useForm } from 'react-hook-form';
|
|
6
7
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
7
8
|
import { toast } from 'sonner';
|
|
@@ -26,6 +27,13 @@ interface MyProfileSectionProps {
|
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps) {
|
|
30
|
+
const translate = useTranslations();
|
|
31
|
+
const genderOptions = GENDER_OPTIONS.map((option) => ({
|
|
32
|
+
...option,
|
|
33
|
+
label: translate(
|
|
34
|
+
`common.account.profile.genderOptions.${option.value === 'masculino' ? 'male' : 'female'}`,
|
|
35
|
+
),
|
|
36
|
+
}));
|
|
29
37
|
const { user } = useAuth();
|
|
30
38
|
const updateAccountUser = useUpdateAccountUser();
|
|
31
39
|
const fileInputRef = useRef<HTMLInputElement>(null);
|
|
@@ -86,16 +94,20 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
86
94
|
form.reset(data);
|
|
87
95
|
setSelectedPhoto(null);
|
|
88
96
|
setPhotoRemoved(false);
|
|
89
|
-
toast.custom((
|
|
90
|
-
<Toast
|
|
97
|
+
toast.custom((toastId) => (
|
|
98
|
+
<Toast
|
|
99
|
+
variant="success"
|
|
100
|
+
message={translate('common.account.profile.savedSuccess')}
|
|
101
|
+
toastId={toastId}
|
|
102
|
+
/>
|
|
91
103
|
));
|
|
92
104
|
onClose();
|
|
93
105
|
} catch (error) {
|
|
94
|
-
toast.custom((
|
|
106
|
+
toast.custom((toastId) => (
|
|
95
107
|
<Toast
|
|
96
108
|
variant="error"
|
|
97
|
-
message={error instanceof Error ? error.message : '
|
|
98
|
-
toastId={
|
|
109
|
+
message={error instanceof Error ? error.message : translate('common.account.profile.saveError')}
|
|
110
|
+
toastId={toastId}
|
|
99
111
|
/>
|
|
100
112
|
));
|
|
101
113
|
}
|
|
@@ -113,14 +125,14 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
113
125
|
/>
|
|
114
126
|
<div className="absolute inset-0 overflow-y-auto overscroll-contain px-4 pb-20 lg:p-5 lg:static lg:flex-1 lg:min-h-0 lg:overscroll-auto flex flex-col gap-5 lg:gap-6">
|
|
115
127
|
<span className="paragraph-medium-semibold text-gray-950 hidden lg:block">
|
|
116
|
-
|
|
128
|
+
{translate('common.account.profile.title')}
|
|
117
129
|
</span>
|
|
118
130
|
<div className="flex flex-col gap-5">
|
|
119
131
|
<div className="flex items-center gap-4">
|
|
120
132
|
{avatarPreview ? (
|
|
121
133
|
<Image
|
|
122
134
|
src={avatarPreview}
|
|
123
|
-
alt=
|
|
135
|
+
alt={translate('common.account.profile.avatarAlt')}
|
|
124
136
|
width={48}
|
|
125
137
|
height={48}
|
|
126
138
|
className="size-12 rounded-full object-cover cursor-pointer"
|
|
@@ -142,7 +154,7 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
142
154
|
type="button"
|
|
143
155
|
onClick={() => fileInputRef.current?.click()}
|
|
144
156
|
>
|
|
145
|
-
|
|
157
|
+
{translate('common.account.profile.changePhoto')}
|
|
146
158
|
</Button>
|
|
147
159
|
<Button
|
|
148
160
|
type="button"
|
|
@@ -160,7 +172,7 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
160
172
|
type="button"
|
|
161
173
|
onClick={() => fileInputRef.current?.click()}
|
|
162
174
|
>
|
|
163
|
-
|
|
175
|
+
{translate('common.account.profile.changePhoto')}
|
|
164
176
|
</Button>
|
|
165
177
|
)}
|
|
166
178
|
</div>
|
|
@@ -169,31 +181,31 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
169
181
|
<div className="flex flex-col gap-4">
|
|
170
182
|
<div className="flex gap-4">
|
|
171
183
|
<FormField
|
|
172
|
-
label=
|
|
173
|
-
placeholder=
|
|
184
|
+
label={translate('common.account.profile.name')}
|
|
185
|
+
placeholder={translate('common.account.profile.namePlaceholder')}
|
|
174
186
|
error={!!errors.name}
|
|
175
187
|
errorMessage={errors.name?.message}
|
|
176
188
|
{...register('name')}
|
|
177
189
|
/>
|
|
178
190
|
<FormField
|
|
179
|
-
label=
|
|
180
|
-
placeholder=
|
|
191
|
+
label={translate('common.account.profile.lastName')}
|
|
192
|
+
placeholder={translate('common.account.profile.lastNamePlaceholder')}
|
|
181
193
|
error={!!errors.last_name}
|
|
182
194
|
errorMessage={errors.last_name?.message}
|
|
183
195
|
{...register('last_name')}
|
|
184
196
|
/>
|
|
185
197
|
</div>
|
|
186
198
|
<SelectField
|
|
187
|
-
label=
|
|
188
|
-
placeholder=
|
|
189
|
-
options={
|
|
199
|
+
label={translate('common.account.profile.gender')}
|
|
200
|
+
placeholder={translate('common.account.profile.genderPlaceholder')}
|
|
201
|
+
options={genderOptions}
|
|
190
202
|
value={watch('gender')}
|
|
191
203
|
className="h-10!"
|
|
192
204
|
onChange={(value) => setValue('gender', value as string)}
|
|
193
205
|
/>
|
|
194
206
|
<div className="relative">
|
|
195
207
|
<PhoneInput
|
|
196
|
-
label=
|
|
208
|
+
label={translate('common.account.profile.phone')}
|
|
197
209
|
value={user?.phone ?? ''}
|
|
198
210
|
disabled
|
|
199
211
|
classnameContainer="bg-gray-50 border-0!"
|
|
@@ -203,7 +215,7 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
203
215
|
className="absolute right-3 top-5.5 h-10 flex items-center paragraph-xsmall-semibold text-gray-950 underline cursor-pointer"
|
|
204
216
|
onClick={() => setChangePhoneOpen(true)}
|
|
205
217
|
>
|
|
206
|
-
|
|
218
|
+
{translate('common.account.profile.change')}
|
|
207
219
|
</button>
|
|
208
220
|
</div>
|
|
209
221
|
</div>
|
|
@@ -211,11 +223,13 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
211
223
|
<Separator />
|
|
212
224
|
|
|
213
225
|
<div className="flex flex-col gap-4">
|
|
214
|
-
<span className="paragraph-medium-semibold text-gray-600">
|
|
226
|
+
<span className="paragraph-medium-semibold text-gray-600">
|
|
227
|
+
{translate('common.account.profile.accessData')}
|
|
228
|
+
</span>
|
|
215
229
|
<div className="relative">
|
|
216
230
|
<div className='cursor-not-allowed'>
|
|
217
231
|
<FormField
|
|
218
|
-
label=
|
|
232
|
+
label={translate('common.account.profile.email')}
|
|
219
233
|
value={user?.email ?? ''}
|
|
220
234
|
disabled
|
|
221
235
|
classnameContainer="bg-gray-50 border-0!"
|
|
@@ -226,7 +240,7 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
226
240
|
className="absolute right-3 top-5.5 h-10 flex items-center paragraph-xsmall-semibold text-gray-950 underline cursor-pointer"
|
|
227
241
|
onClick={() => setChangeEmailOpen(true)}
|
|
228
242
|
>
|
|
229
|
-
|
|
243
|
+
{translate('common.account.profile.change')}
|
|
230
244
|
</button>
|
|
231
245
|
</div>
|
|
232
246
|
</div>
|
|
@@ -247,10 +261,10 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
247
261
|
onClose();
|
|
248
262
|
}}
|
|
249
263
|
>
|
|
250
|
-
|
|
264
|
+
{translate('common.actions.cancel')}
|
|
251
265
|
</Button>
|
|
252
266
|
<Button className="h-10! cursor-pointer" type="submit" disabled={isSubmitting}>
|
|
253
|
-
{isSubmitting ? '
|
|
267
|
+
{isSubmitting ? translate('common.actions.saving') : translate('common.actions.saveChanges')}
|
|
254
268
|
</Button>
|
|
255
269
|
</div>
|
|
256
270
|
</form>
|
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import { useForm } from 'react-hook-form';
|
|
5
|
+
import { useTranslations, useLocale } from 'next-intl';
|
|
6
|
+
import { useRouter } from 'next/navigation';
|
|
5
7
|
import { toast } from 'sonner';
|
|
6
8
|
import { IconLock } from '@tabler/icons-react';
|
|
7
9
|
import { cn } from '../../../infra/utils/clsx';
|
|
10
|
+
import type { Locale } from '../../../i18n/config';
|
|
11
|
+
import { setLocaleCookie } from '../../../utils/intl/locale-cookie';
|
|
8
12
|
import { Button } from '../../ui/buttons/Button';
|
|
9
13
|
import { Separator } from '../../ui/data-display/Separator';
|
|
10
14
|
import { Toast } from '../../ui/feedback/Toast';
|
|
@@ -13,6 +17,7 @@ import { ComboboxField } from '../../ui/form/ComboboxField';
|
|
|
13
17
|
import { SelectField } from '../../ui/form/SelectField';
|
|
14
18
|
import ConfirmGlobalPreferencesModal from '../ConfirmGlobalPreferencesModal';
|
|
15
19
|
import { useAuth } from '../../../providers/auth.provider';
|
|
20
|
+
import { useWhitelabel } from '../../../providers/whitelabel.provider';
|
|
16
21
|
import { UserProfile } from '../../../modules/users/schema';
|
|
17
22
|
import type { UpdateAccountRequest } from '../../../modules/accounts/types';
|
|
18
23
|
import {
|
|
@@ -41,9 +46,27 @@ interface PreferencesSectionProps {
|
|
|
41
46
|
}
|
|
42
47
|
|
|
43
48
|
export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
49
|
+
// Padrão raiz: um único `translate` chamado pela chave inteira (`common.<modulo>.<chave>`).
|
|
50
|
+
const translate = useTranslations();
|
|
51
|
+
// Exceção: chave dinâmica (option.value) numa lista → namespace escopado.
|
|
52
|
+
const translateLanguage = useTranslations('common.languages');
|
|
53
|
+
const currentLocale = useLocale();
|
|
54
|
+
const router = useRouter();
|
|
44
55
|
const { data: timezones = [] } = useTimezones();
|
|
45
56
|
const { data: currencies = [] } = useCurrencies();
|
|
46
57
|
const { user, account } = useAuth();
|
|
58
|
+
const { whitelabel } = useWhitelabel();
|
|
59
|
+
const languageOptions = LANGUAGE_OPTIONS.map((option) => ({
|
|
60
|
+
...option,
|
|
61
|
+
label: translateLanguage(option.value as Locale),
|
|
62
|
+
displayValue: translateLanguage(option.value as Locale),
|
|
63
|
+
}));
|
|
64
|
+
const timeFormatOptions = TIME_FORMAT_OPTIONS.map((option) => ({
|
|
65
|
+
...option,
|
|
66
|
+
label: translate(
|
|
67
|
+
`common.preferences.timeFormatOptions.${option.value === '24h' ? 'h24' : 'h12'}`,
|
|
68
|
+
),
|
|
69
|
+
}));
|
|
47
70
|
const isOwner = user?.profile === UserProfile.owner;
|
|
48
71
|
const canEditPreferences = isOwner || user?.profile === UserProfile.admin;
|
|
49
72
|
const updateAccountUser = useUpdateAccountUser();
|
|
@@ -74,7 +97,7 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
74
97
|
companyName: account.name ?? '',
|
|
75
98
|
language: LANGUAGE_OPTIONS.find(
|
|
76
99
|
(o) => o.apiValue === user.language?.toLowerCase()
|
|
77
|
-
)?.value ?? 'pt-
|
|
100
|
+
)?.value ?? 'pt-br',
|
|
78
101
|
currency: account.currency,
|
|
79
102
|
timezone: account.timezone,
|
|
80
103
|
timeFormat: '24h',
|
|
@@ -98,16 +121,20 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
98
121
|
}
|
|
99
122
|
|
|
100
123
|
reset(data);
|
|
101
|
-
toast.custom((
|
|
102
|
-
<Toast variant="success" message=
|
|
124
|
+
toast.custom((toastId) => (
|
|
125
|
+
<Toast variant="success" message={translate('common.preferences.savedSuccess')} toastId={toastId} />
|
|
103
126
|
));
|
|
104
127
|
onClose();
|
|
128
|
+
if (data.language !== currentLocale) {
|
|
129
|
+
setLocaleCookie(data.language, whitelabel?.domain);
|
|
130
|
+
router.refresh();
|
|
131
|
+
}
|
|
105
132
|
} catch (error) {
|
|
106
|
-
toast.custom((
|
|
133
|
+
toast.custom((toastId) => (
|
|
107
134
|
<Toast
|
|
108
135
|
variant="error"
|
|
109
|
-
message={error instanceof Error ? error.message : '
|
|
110
|
-
toastId={
|
|
136
|
+
message={error instanceof Error ? error.message : translate('common.preferences.saveError')}
|
|
137
|
+
toastId={toastId}
|
|
111
138
|
/>
|
|
112
139
|
));
|
|
113
140
|
} finally {
|
|
@@ -148,12 +175,12 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
148
175
|
<>
|
|
149
176
|
<form onSubmit={handleSubmit(onSubmit)} className="flex flex-col h-full">
|
|
150
177
|
<div className="overflow-y-auto overscroll-contain px-4 pb-4 lg:p-5 flex flex-col gap-5 lg:gap-6 flex-1">
|
|
151
|
-
<span className="paragraph-medium-semibold text-gray-950">
|
|
178
|
+
<span className="paragraph-medium-semibold text-gray-950">{translate('common.preferences.title')}</span>
|
|
152
179
|
<div className="flex flex-col gap-8">
|
|
153
180
|
<div className="flex flex-col lg:flex-row items-center gap-3">
|
|
154
181
|
<FormField
|
|
155
|
-
label=
|
|
156
|
-
placeholder=
|
|
182
|
+
label={translate('common.preferences.companyName')}
|
|
183
|
+
placeholder={translate('common.preferences.companyNamePlaceholder')}
|
|
157
184
|
classnameContainer={cn('w-full', !isOwner && 'cursor-not-allowed opacity-50')}
|
|
158
185
|
value={watch('companyName')}
|
|
159
186
|
onChange={(e) => setValue('companyName', e.target.value, { shouldDirty: true })}
|
|
@@ -163,18 +190,18 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
163
190
|
|
|
164
191
|
<div className="flex flex-col lg:flex-row items-center gap-3">
|
|
165
192
|
<ComboboxField
|
|
166
|
-
label=
|
|
167
|
-
placeholder=
|
|
168
|
-
searchPlaceholder=
|
|
193
|
+
label={translate('common.preferences.language')}
|
|
194
|
+
placeholder={translate('common.preferences.languagePlaceholder')}
|
|
195
|
+
searchPlaceholder={translate('common.preferences.languageSearch')}
|
|
169
196
|
containerClassName="w-full"
|
|
170
|
-
options={
|
|
197
|
+
options={languageOptions}
|
|
171
198
|
value={watch('language')}
|
|
172
199
|
onChange={(value) => setValue('language', value, { shouldDirty: true })}
|
|
173
200
|
/>
|
|
174
201
|
<ComboboxField
|
|
175
|
-
label=
|
|
176
|
-
placeholder=
|
|
177
|
-
searchPlaceholder=
|
|
202
|
+
label={translate('common.preferences.currency')}
|
|
203
|
+
placeholder={translate('common.preferences.currencyPlaceholder')}
|
|
204
|
+
searchPlaceholder={translate('common.preferences.currencySearch')}
|
|
178
205
|
containerClassName="w-full"
|
|
179
206
|
options={currencies}
|
|
180
207
|
value={watch('currency')}
|
|
@@ -187,12 +214,12 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
187
214
|
<Separator />
|
|
188
215
|
|
|
189
216
|
<div className="flex flex-col gap-4">
|
|
190
|
-
<span className="paragraph-medium-semibold text-gray-950">
|
|
217
|
+
<span className="paragraph-medium-semibold text-gray-950">{translate('common.preferences.timeDisplay')}</span>
|
|
191
218
|
<div className="flex flex-col lg:flex-row items-center gap-3">
|
|
192
219
|
<ComboboxField
|
|
193
|
-
label=
|
|
194
|
-
placeholder=
|
|
195
|
-
searchPlaceholder=
|
|
220
|
+
label={translate('common.preferences.timezone')}
|
|
221
|
+
placeholder={translate('common.preferences.timezonePlaceholder')}
|
|
222
|
+
searchPlaceholder={translate('common.preferences.timezoneSearch')}
|
|
196
223
|
containerClassName="w-full"
|
|
197
224
|
options={timezones}
|
|
198
225
|
value={watch('timezone')}
|
|
@@ -201,11 +228,11 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
201
228
|
disabled={!canEditPreferences}
|
|
202
229
|
/>
|
|
203
230
|
<SelectField
|
|
204
|
-
label=
|
|
205
|
-
placeholder=
|
|
231
|
+
label={translate('common.preferences.timeFormat')}
|
|
232
|
+
placeholder={translate('common.preferences.timeFormatPlaceholder')}
|
|
206
233
|
className="h-10!"
|
|
207
234
|
containerClassName="w-full"
|
|
208
|
-
options={
|
|
235
|
+
options={timeFormatOptions}
|
|
209
236
|
value={watch('timeFormat')}
|
|
210
237
|
onChange={(value) =>
|
|
211
238
|
setValue('timeFormat', value as string, { shouldDirty: true })
|
|
@@ -230,10 +257,10 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
230
257
|
onClose();
|
|
231
258
|
}}
|
|
232
259
|
>
|
|
233
|
-
|
|
260
|
+
{translate('common.actions.cancel')}
|
|
234
261
|
</Button>
|
|
235
262
|
<Button className="h-10!" type="submit" disabled={isSaving}>
|
|
236
|
-
{isSaving ? '
|
|
263
|
+
{isSaving ? translate('common.actions.saving') : translate('common.actions.saveChanges')}
|
|
237
264
|
</Button>
|
|
238
265
|
</div>
|
|
239
266
|
</form>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { IconAlertTriangle, IconBrandGoogleFilled } from '@tabler/icons-react';
|
|
4
|
+
import { useTranslations } from 'next-intl';
|
|
4
5
|
import { toast } from 'sonner';
|
|
5
6
|
import { useQueryClient } from '@tanstack/react-query';
|
|
6
7
|
import { useAuth } from '../../../providers/auth.provider';
|
|
@@ -18,6 +19,7 @@ interface SecuritySectionProps {
|
|
|
18
19
|
export function SecuritySection({
|
|
19
20
|
onDeleteAccount,
|
|
20
21
|
}: SecuritySectionProps) {
|
|
22
|
+
const translate = useTranslations();
|
|
21
23
|
const { user } = useAuth();
|
|
22
24
|
const queryClient = useQueryClient();
|
|
23
25
|
const { mutateAsync: unlinkGoogle, isPending: isUnlinking } = useUnlinkGoogle();
|
|
@@ -32,14 +34,16 @@ export function SecuritySection({
|
|
|
32
34
|
queryClient.invalidateQueries({ queryKey: USER_QUERY_KEY });
|
|
33
35
|
} catch (error) {
|
|
34
36
|
const message =
|
|
35
|
-
error instanceof Error ? error.message : '
|
|
36
|
-
toast.custom((
|
|
37
|
+
error instanceof Error ? error.message : translate('common.account.security.unlinkError');
|
|
38
|
+
toast.custom((toastId) => <Toast variant="error" message={message} toastId={toastId} />);
|
|
37
39
|
}
|
|
38
40
|
};
|
|
39
41
|
|
|
40
42
|
return (
|
|
41
43
|
<div className="h-full overflow-y-auto overscroll-contain px-4 pb-20 lg:p-5 lg:pt-5 flex flex-col gap-5 lg:gap-6 lg:pb-31 lg:overscroll-auto">
|
|
42
|
-
<span className="paragraph-medium-semibold text-gray-950 hidden lg:block">
|
|
44
|
+
<span className="paragraph-medium-semibold text-gray-950 hidden lg:block">
|
|
45
|
+
{translate('common.account.security.title')}
|
|
46
|
+
</span>
|
|
43
47
|
|
|
44
48
|
{hasGoogleLinked && (
|
|
45
49
|
<div className="flex flex-col items-center lg:items-start gap-4">
|
|
@@ -48,10 +52,11 @@ export function SecuritySection({
|
|
|
48
52
|
</div>
|
|
49
53
|
|
|
50
54
|
<div className="flex flex-col gap-2">
|
|
51
|
-
<span className="paragraph-medium-semibold text-gray-950">
|
|
55
|
+
<span className="paragraph-medium-semibold text-gray-950">
|
|
56
|
+
{translate('common.account.security.googleLinkedTitle')}
|
|
57
|
+
</span>
|
|
52
58
|
<span className="paragraph-small-regular text-gray-600">
|
|
53
|
-
|
|
54
|
-
redefinir uma senha de acesso por e-mail.
|
|
59
|
+
{translate('common.account.security.googleLinkedDescription')}
|
|
55
60
|
</span>
|
|
56
61
|
</div>
|
|
57
62
|
|
|
@@ -61,7 +66,9 @@ export function SecuritySection({
|
|
|
61
66
|
className="paragraph-small-semibold text-zinc-700 bg-zinc-100 rounded-lg px-3 py-2 cursor-pointer hover:bg-zinc-200 transition-colors w-fit disabled:opacity-50 disabled:cursor-not-allowed"
|
|
62
67
|
onClick={handleUnlinkGoogle}
|
|
63
68
|
>
|
|
64
|
-
{isUnlinking
|
|
69
|
+
{isUnlinking
|
|
70
|
+
? translate('common.account.security.unlinking')
|
|
71
|
+
: translate('common.account.security.unlinkGoogle')}
|
|
65
72
|
</button>
|
|
66
73
|
</div>
|
|
67
74
|
)}
|
|
@@ -72,9 +79,11 @@ export function SecuritySection({
|
|
|
72
79
|
</div>
|
|
73
80
|
|
|
74
81
|
<div className="flex flex-col gap-2">
|
|
75
|
-
<span className="paragraph-medium-semibold text-gray-950">
|
|
82
|
+
<span className="paragraph-medium-semibold text-gray-950">
|
|
83
|
+
{translate('common.account.deleteAccount.title')}
|
|
84
|
+
</span>
|
|
76
85
|
<span className="paragraph-small-regular text-gray-600">
|
|
77
|
-
|
|
86
|
+
{translate('common.account.security.deleteAccountDescription')}
|
|
78
87
|
</span>
|
|
79
88
|
</div>
|
|
80
89
|
|
|
@@ -84,7 +93,7 @@ export function SecuritySection({
|
|
|
84
93
|
className="paragraph-small-semibold text-red-600 bg-red-50 rounded-lg px-3 py-2 cursor-pointer hover:bg-red-100 transition-colors w-fit"
|
|
85
94
|
onClick={onDeleteAccount}
|
|
86
95
|
>
|
|
87
|
-
|
|
96
|
+
{translate('common.account.security.deleteMyAccount')}
|
|
88
97
|
</button>
|
|
89
98
|
)}
|
|
90
99
|
</div>
|