@greatapps/common 1.1.673 → 1.1.675

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 (223) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +6 -8
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs +19 -20
  4. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  5. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs +11 -10
  6. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  7. package/dist/components/account/DeleteAccountModal.mjs +28 -34
  8. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  9. package/dist/components/account/DisableTwoFactorAuthModal.mjs +5 -7
  10. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  11. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs +9 -8
  12. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  13. package/dist/components/account/TwoFactorAuthModal.mjs +23 -22
  14. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  15. package/dist/components/account/hooks/useChangeEmailForm.mjs +3 -5
  16. package/dist/components/account/hooks/useChangeEmailForm.mjs.map +1 -1
  17. package/dist/components/account/hooks/useChangePasswordForm.mjs +3 -26
  18. package/dist/components/account/hooks/useChangePasswordForm.mjs.map +1 -1
  19. package/dist/components/account/hooks/useChangePhoneForm.mjs +9 -18
  20. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  21. package/dist/components/account/hooks/useDisableTwoFactorAuthForm.mjs +3 -26
  22. package/dist/components/account/hooks/useDisableTwoFactorAuthForm.mjs.map +1 -1
  23. package/dist/components/account/hooks/useOtpVerification.mjs +3 -19
  24. package/dist/components/account/hooks/useOtpVerification.mjs.map +1 -1
  25. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs +4 -27
  26. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  27. package/dist/components/account/sections/ChangeEmailModal.mjs +28 -25
  28. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  29. package/dist/components/account/sections/ChangePasswordSection.mjs +6 -8
  30. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  31. package/dist/components/account/sections/ChangePhoneModal.mjs +27 -24
  32. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  33. package/dist/components/account/sections/MyProfileSection.mjs +22 -37
  34. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  35. package/dist/components/account/sections/PreferencesSection.mjs +24 -48
  36. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  37. package/dist/components/account/sections/SecuritySection.mjs +9 -11
  38. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  39. package/dist/components/account/sections/TokenSection.mjs +8 -24
  40. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  41. package/dist/components/layouts/AppMobileNavBar.mjs +148 -2
  42. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  43. package/dist/components/layouts/NavBar.mjs +3 -5
  44. package/dist/components/layouts/NavBar.mjs.map +1 -1
  45. package/dist/components/layouts/NotificationsPopover.mjs +3 -5
  46. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  47. package/dist/components/layouts/ProfilePopover.mjs +4 -6
  48. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  49. package/dist/components/layouts/UsersSelectorPopover.mjs +7 -9
  50. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  51. package/dist/components/modals/BuyCreditsModal.mjs +18 -17
  52. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  53. package/dist/components/modals/CreditsDisabledModal.mjs +4 -6
  54. package/dist/components/modals/CreditsDisabledModal.mjs.map +1 -1
  55. package/dist/components/modals/PaidPlanRequiredModal.mjs +3 -5
  56. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  57. package/dist/components/modals/cards/AddCardModal.mjs +24 -27
  58. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  59. package/dist/components/modals/cards/CannotDeleteCardModal.mjs +7 -9
  60. package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -1
  61. package/dist/components/modals/cards/CardFormFields.mjs +22 -25
  62. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  63. package/dist/components/modals/cards/DeleteCardModal.mjs +8 -10
  64. package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -1
  65. package/dist/components/navigation/CancelledSubscriptionBanner.mjs +2 -4
  66. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  67. package/dist/components/navigation/OverdueInvoiceBanner.mjs +2 -4
  68. package/dist/components/navigation/OverdueInvoiceBanner.mjs.map +1 -1
  69. package/dist/components/navigation/PendingCancellationBanner.mjs +6 -4
  70. package/dist/components/navigation/PendingCancellationBanner.mjs.map +1 -1
  71. package/dist/components/navigation/ProjectSelectorPopover.mjs +6 -8
  72. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  73. package/dist/components/navigation/UpcomingInvoiceBanner.mjs +6 -4
  74. package/dist/components/navigation/UpcomingInvoiceBanner.mjs.map +1 -1
  75. package/dist/components/navigation/subcomponents/BottomLinks.mjs +3 -5
  76. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  77. package/dist/components/navigation/subcomponents/CreditsCard.mjs +1 -3
  78. package/dist/components/navigation/subcomponents/CreditsCard.mjs.map +1 -1
  79. package/dist/components/navigation/subcomponents/PlanCard.mjs +1 -3
  80. package/dist/components/navigation/subcomponents/PlanCard.mjs.map +1 -1
  81. package/dist/components/navigation/subcomponents/ProjectSelector.mjs +3 -5
  82. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  83. package/dist/components/pages/NotFoundPage.mjs +3 -5
  84. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  85. package/dist/components/pages/notifications/Notifications.mjs +10 -13
  86. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  87. package/dist/components/ui/buttons/CopyButton.mjs +5 -9
  88. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  89. package/dist/components/ui/data-display/CardItem.mjs +5 -7
  90. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  91. package/dist/components/ui/data-display/PaymentInfoCard.mjs +8 -10
  92. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  93. package/dist/components/ui/feedback/DefaultCircularProgress.mjs +1 -3
  94. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  95. package/dist/components/ui/form/ComboboxField.mjs +6 -11
  96. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  97. package/dist/components/ui/form/DatePicker.mjs +2 -5
  98. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  99. package/dist/components/ui/form/DateRangePicker.mjs +2 -5
  100. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  101. package/dist/components/ui/form/PhoneInput.mjs +3 -5
  102. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  103. package/dist/components/ui/form/SelectField.mjs +3 -6
  104. package/dist/components/ui/form/SelectField.mjs.map +1 -1
  105. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs +18 -11
  106. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  107. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs +15 -6
  108. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  109. package/dist/index.mjs +2 -16
  110. package/dist/index.mjs.map +1 -1
  111. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs +1 -2
  112. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -1
  113. package/dist/modules/plans/types/plan.type.mjs +0 -3
  114. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  115. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs +8 -15
  116. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  117. package/dist/providers/auth.provider.mjs +1 -9
  118. package/dist/providers/auth.provider.mjs.map +1 -1
  119. package/dist/server.mjs +0 -2
  120. package/dist/server.mjs.map +1 -1
  121. package/dist/utils/format/currency.mjs +4 -32
  122. package/dist/utils/format/currency.mjs.map +1 -1
  123. package/dist/utils/intl/locales.mjs +2 -3
  124. package/dist/utils/intl/locales.mjs.map +1 -1
  125. package/package.json +1 -7
  126. package/src/components/account/ConfigurationsMyAccountModal.tsx +6 -10
  127. package/src/components/account/ConfirmDeleteAccountModal.tsx +13 -22
  128. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +10 -12
  129. package/src/components/account/DeleteAccountModal.tsx +24 -34
  130. package/src/components/account/DisableTwoFactorAuthModal.tsx +6 -11
  131. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +6 -8
  132. package/src/components/account/TwoFactorAuthModal.tsx +29 -33
  133. package/src/components/account/hooks/useChangeEmailForm.tsx +3 -5
  134. package/src/components/account/hooks/useChangePasswordForm.tsx +6 -20
  135. package/src/components/account/hooks/useChangePhoneForm.tsx +10 -16
  136. package/src/components/account/hooks/useDisableTwoFactorAuthForm.tsx +6 -20
  137. package/src/components/account/hooks/useOtpVerification.tsx +4 -16
  138. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +7 -21
  139. package/src/components/account/sections/ChangeEmailModal.tsx +21 -35
  140. package/src/components/account/sections/ChangePasswordSection.tsx +6 -10
  141. package/src/components/account/sections/ChangePhoneModal.tsx +22 -50
  142. package/src/components/account/sections/MyProfileSection.tsx +23 -37
  143. package/src/components/account/sections/PreferencesSection.tsx +25 -52
  144. package/src/components/account/sections/SecuritySection.tsx +10 -19
  145. package/src/components/account/sections/TokenSection.tsx +10 -22
  146. package/src/components/layouts/AppMobileNavBar.tsx +154 -1
  147. package/src/components/layouts/NavBar.tsx +3 -5
  148. package/src/components/layouts/NotificationsPopover.tsx +3 -5
  149. package/src/components/layouts/ProfilePopover.tsx +4 -6
  150. package/src/components/layouts/UsersSelectorPopover.tsx +7 -9
  151. package/src/components/modals/BuyCreditsModal.tsx +16 -18
  152. package/src/components/modals/CreditsDisabledModal.tsx +6 -6
  153. package/src/components/modals/PaidPlanRequiredModal.tsx +3 -5
  154. package/src/components/modals/cards/AddCardModal.tsx +27 -29
  155. package/src/components/modals/cards/CannotDeleteCardModal.tsx +8 -9
  156. package/src/components/modals/cards/CardFormFields.tsx +22 -25
  157. package/src/components/modals/cards/DeleteCardModal.tsx +8 -10
  158. package/src/components/navigation/CancelledSubscriptionBanner.tsx +2 -4
  159. package/src/components/navigation/OverdueInvoiceBanner.tsx +2 -4
  160. package/src/components/navigation/PendingCancellationBanner.tsx +2 -4
  161. package/src/components/navigation/ProjectSelectorPopover.tsx +6 -8
  162. package/src/components/navigation/UpcomingInvoiceBanner.tsx +2 -4
  163. package/src/components/navigation/subcomponents/BottomLinks.tsx +3 -5
  164. package/src/components/navigation/subcomponents/CreditsCard.tsx +1 -3
  165. package/src/components/navigation/subcomponents/PlanCard.tsx +1 -3
  166. package/src/components/navigation/subcomponents/ProjectSelector.tsx +3 -5
  167. package/src/components/pages/NotFoundPage.tsx +3 -5
  168. package/src/components/pages/notifications/Notifications.tsx +10 -13
  169. package/src/components/ui/buttons/CopyButton.tsx +5 -10
  170. package/src/components/ui/data-display/CardItem.tsx +5 -7
  171. package/src/components/ui/data-display/PaymentInfoCard.tsx +8 -10
  172. package/src/components/ui/feedback/DefaultCircularProgress.tsx +1 -3
  173. package/src/components/ui/form/ComboboxField.tsx +6 -11
  174. package/src/components/ui/form/DatePicker.tsx +2 -5
  175. package/src/components/ui/form/DateRangePicker.tsx +2 -5
  176. package/src/components/ui/form/PhoneInput.tsx +3 -5
  177. package/src/components/ui/form/SelectField.tsx +3 -6
  178. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +11 -19
  179. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +5 -6
  180. package/src/index.ts +2 -12
  181. package/src/modules/cards/hooks/handle-delete-card.hook.ts +3 -8
  182. package/src/modules/plans/types/plan.type.ts +0 -3
  183. package/src/modules/plans/utils/map-api-plan-to-ui.ts +7 -30
  184. package/src/providers/auth.provider.tsx +1 -13
  185. package/src/server.ts +0 -2
  186. package/src/utils/format/currency.ts +7 -62
  187. package/src/utils/intl/locales.ts +2 -3
  188. package/dist/i18n/config.mjs +0 -13
  189. package/dist/i18n/config.mjs.map +0 -1
  190. package/dist/i18n/country-language.mjs +0 -74
  191. package/dist/i18n/country-language.mjs.map +0 -1
  192. package/dist/i18n/messages/en-us.mjs +0 -450
  193. package/dist/i18n/messages/en-us.mjs.map +0 -1
  194. package/dist/i18n/messages/es-es.mjs +0 -450
  195. package/dist/i18n/messages/es-es.mjs.map +0 -1
  196. package/dist/i18n/messages/index.mjs +0 -16
  197. package/dist/i18n/messages/index.mjs.map +0 -1
  198. package/dist/i18n/messages/pt-br.mjs +0 -463
  199. package/dist/i18n/messages/pt-br.mjs.map +0 -1
  200. package/dist/i18n/normalize.mjs +0 -12
  201. package/dist/i18n/normalize.mjs.map +0 -1
  202. package/dist/i18n/resolve-locale.mjs +0 -42
  203. package/dist/i18n/resolve-locale.mjs.map +0 -1
  204. package/dist/i18n.mjs +0 -14
  205. package/dist/i18n.mjs.map +0 -1
  206. package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs +0 -20
  207. package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs.map +0 -1
  208. package/dist/utils/intl/cookie-domain.mjs +0 -17
  209. package/dist/utils/intl/cookie-domain.mjs.map +0 -1
  210. package/dist/utils/intl/locale-cookie.mjs +0 -13
  211. package/dist/utils/intl/locale-cookie.mjs.map +0 -1
  212. package/src/i18n/config.ts +0 -17
  213. package/src/i18n/country-language.ts +0 -60
  214. package/src/i18n/messages/en-us.ts +0 -468
  215. package/src/i18n/messages/es-es.ts +0 -469
  216. package/src/i18n/messages/index.ts +0 -24
  217. package/src/i18n/messages/pt-br.ts +0 -492
  218. package/src/i18n/normalize.ts +0 -15
  219. package/src/i18n/resolve-locale.ts +0 -77
  220. package/src/i18n.ts +0 -10
  221. package/src/modules/accounts/hooks/use-currency-formatter.hook.tsx +0 -32
  222. package/src/utils/intl/cookie-domain.ts +0 -29
  223. package/src/utils/intl/locale-cookie.ts +0 -18
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
 
3
3
  import { IconBell, IconCheck, IconLoader2 } from '@tabler/icons-react';
4
- import { useTranslations } from 'next-intl';
5
4
  import { Button } from "../../ui/buttons/Button";
6
5
  import {
7
6
  Tabs,
@@ -35,7 +34,6 @@ function NotificationsList({
35
34
  hasNextPage: boolean;
36
35
  fetchNextPage: () => void;
37
36
  }) {
38
- const translate = useTranslations();
39
37
  const notifications = pages?.pages.flatMap((p) => p.data) ?? [];
40
38
 
41
39
  const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {
@@ -52,7 +50,7 @@ function NotificationsList({
52
50
  return (
53
51
  <div className="rounded-lg border border-zinc-200 bg-white">
54
52
  <div className="flex flex-col items-center justify-center py-16 gap-2">
55
- <span className="paragraph-medium-regular text-zinc-500">{translate('common.notifications.page.empty')}</span>
53
+ <span className="paragraph-medium-regular text-zinc-500">Nenhuma notificação encontrada.</span>
56
54
  </div>
57
55
  </div>
58
56
  );
@@ -82,7 +80,7 @@ function NotificationsList({
82
80
  actions={
83
81
  detailsUrl ? (
84
82
  <Button asChild variant="secondary" className="h-8! px-3! paragraph-small-semibold">
85
- <Link href={detailsUrl}>{translate('common.notifications.page.details')}</Link>
83
+ <Link href={detailsUrl}>Detalhes</Link>
86
84
  </Button>
87
85
  ) : undefined
88
86
  }
@@ -99,7 +97,6 @@ function NotificationsList({
99
97
  }
100
98
 
101
99
  export function NotificationPageContent() {
102
- const translate = useTranslations();
103
100
  const unreadNotifications = useInfiniteMessages({
104
101
  readed: false,
105
102
  type: "notification",
@@ -119,12 +116,12 @@ export function NotificationPageContent() {
119
116
  markAllAsRead(undefined, {
120
117
  onSuccess: () => {
121
118
  toast.custom((t) => (
122
- <Toast variant="success" message={translate('common.notifications.page.markAllSuccess')} toastId={t} />
119
+ <Toast variant="success" message="Todas as notificações foram marcadas como lidas" toastId={t} />
123
120
  ));
124
121
  },
125
122
  onError: () => {
126
123
  toast.custom((t) => (
127
- <Toast variant="error" message={translate('common.notifications.page.markAllError')} toastId={t} />
124
+ <Toast variant="error" message="Erro ao marcar notificações como lidas" toastId={t} />
128
125
  ));
129
126
  },
130
127
  });
@@ -135,10 +132,10 @@ export function NotificationPageContent() {
135
132
  <div className="flex items-center justify-between gap-4">
136
133
  <div className="flex flex-col gap-2">
137
134
  <h1 className="title-large-semibold text-gray-950">
138
- {translate('common.notifications.page.title')}
135
+ Notificações
139
136
  </h1>
140
137
  <p className="paragraph-small-regular text-gray-600 hidden lg:block">
141
- {translate('common.notifications.page.subtitle')}
138
+ Tenha controle total sobre páginas, experiências e conversões.
142
139
  </p>
143
140
  </div>
144
141
  <Button
@@ -148,8 +145,8 @@ export function NotificationPageContent() {
148
145
  disabled={isMarkingAll || totalUnread === 0}
149
146
  >
150
147
  {isMarkingAll ? <IconLoader2 size={20} className="animate-spin" /> : <IconCheck size={20} />}
151
- <span className="lg:block hidden">{translate('common.notifications.page.markAllReadDesktop')}</span>
152
- <span className="lg:hidden">{translate('common.notifications.page.markAllReadMobile')}</span>
148
+ <span className="lg:block hidden">Marcar todos como lidos</span>
149
+ <span className="lg:hidden">Marcar como lidos</span>
153
150
  </Button>
154
151
  </div>
155
152
  <Tabs
@@ -158,11 +155,11 @@ export function NotificationPageContent() {
158
155
  >
159
156
  <TabsList className="h-auto pb-0 bg-transparent">
160
157
  <TabsTrigger className="gap-2" value="all">
161
- {translate('common.notifications.page.tabAll')}{" "}
158
+ Todas as notificações{" "}
162
159
  <span className="text-gray-500">({totalAll})</span>
163
160
  </TabsTrigger>
164
161
  <TabsTrigger className="gap-2" value="unreads" disabled={totalUnread === 0}>
165
- {translate('common.notifications.page.tabUnread')}{" "}
162
+ Não lidas{" "}
166
163
  <span className="text-gray-500">({totalUnread})</span>
167
164
  </TabsTrigger>
168
165
  </TabsList>
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
 
3
- import { useTranslations } from 'next-intl';
4
3
  import { IconCheck, IconCopy } from '@tabler/icons-react';
5
4
  import { toast } from "sonner";
6
5
  import { Toast } from "../feedback/Toast";
@@ -20,22 +19,18 @@ export function CopyButton({
20
19
  textToCopy,
21
20
  size = 14,
22
21
  className,
23
- tooltipText,
24
- successMessage,
22
+ tooltipText = "Copiar link",
23
+ successMessage = "Link copiado",
25
24
  }: CopyButtonProps) {
26
- const translate = useTranslations();
27
- const resolvedTooltipText = tooltipText ?? translate('common.forms.copyButton.tooltipDefault');
28
- const resolvedSuccessMessage = successMessage ?? translate('common.forms.copyButton.successDefault');
29
-
30
25
  const { isCopied, copy } = useCopyToClipboard({
31
26
  onSuccess: () => {
32
27
  toast.custom((t) => (
33
- <Toast variant="success" message={resolvedSuccessMessage} toastId={t} />
28
+ <Toast variant="success" message={successMessage} toastId={t} />
34
29
  ));
35
30
  },
36
31
  onError: () => {
37
32
  toast.custom((t) => (
38
- <Toast variant="error" message={translate('common.forms.copyButton.errorMessage')} toastId={t} />
33
+ <Toast variant="error" message="Não foi possível copiar o link" toastId={t} />
39
34
  ));
40
35
  },
41
36
  });
@@ -53,7 +48,7 @@ export function CopyButton({
53
48
  {isCopied ? <IconCheck size={size} /> : <IconCopy size={size} />}
54
49
  </span>
55
50
  </TooltipTrigger>
56
- <TooltipContent>{isCopied ? translate('common.actions.copied') : resolvedTooltipText}</TooltipContent>
51
+ <TooltipContent>{isCopied ? "Copiado!" : tooltipText}</TooltipContent>
57
52
  </Tooltip>
58
53
  );
59
54
  }
@@ -10,7 +10,6 @@ import { CardBrandIcon } from './CardBrandIcons';
10
10
  import { useSetDefaultCard } from '../../../modules/cards/hooks/set-default-card.hook';
11
11
  import { useHandleDeleteCard } from '../../../modules/cards/hooks/handle-delete-card.hook';
12
12
  import type { Card } from '../../../modules/cards/types';
13
- import { useTranslations } from 'next-intl';
14
13
 
15
14
  type CardItemProps = {
16
15
  card: Card;
@@ -33,7 +32,6 @@ export function CardItem({
33
32
  onAfterDelete,
34
33
  onAfterSetDefault,
35
34
  }: CardItemProps) {
36
- const translate = useTranslations();
37
35
  const [popoverOpen, setPopoverOpen] = useState(false);
38
36
 
39
37
  const setDefaultCardMutation = useSetDefaultCard();
@@ -46,7 +44,7 @@ export function CardItem({
46
44
  toast.custom((t) => (
47
45
  <Toast
48
46
  variant="success"
49
- message={translate('common.cards.item.setDefaultSuccess')}
47
+ message="Cartão definido como padrão"
50
48
  toastId={t}
51
49
  />
52
50
  ));
@@ -56,7 +54,7 @@ export function CardItem({
56
54
  toast.custom((t) => (
57
55
  <Toast
58
56
  variant="error"
59
- message={translate('common.cards.item.setDefaultError')}
57
+ message="Erro ao definir cartão padrão"
60
58
  toastId={t}
61
59
  />
62
60
  ));
@@ -88,7 +86,7 @@ export function CardItem({
88
86
  </div>
89
87
  {card.is_default && (
90
88
  <span className="paragraph-xsmall-semibold text-zinc-600 bg-zinc-100 px-2 py-0.5 rounded-lg whitespace-nowrap">
91
- {translate('common.cards.item.defaultBadge')}
89
+ Padrão
92
90
  </span>
93
91
  )}
94
92
  <CardBrandIcon brand={card.brand} />
@@ -110,7 +108,7 @@ export function CardItem({
110
108
  {menuHasSetDefault && (
111
109
  <NavBarItem
112
110
  icon={<IconStar size={18} className="text-zinc-400" />}
113
- label={translate('common.cards.item.makeDefault')}
111
+ label="Tornar padrão"
114
112
  onClick={() => {
115
113
  setPopoverOpen(false);
116
114
  handleSetDefault();
@@ -120,7 +118,7 @@ export function CardItem({
120
118
  {menuHasDelete && (
121
119
  <NavBarItem
122
120
  icon={<IconTrash size={18} className="text-zinc-400" />}
123
- label={translate('common.actions.delete')}
121
+ label="Excluir"
124
122
  onClick={() => {
125
123
  setPopoverOpen(false);
126
124
  handleDeleteCard(card);
@@ -9,7 +9,6 @@ import { useCards } from '../../../modules/cards/hooks/cards.hook';
9
9
  import { useModalManager } from '../../../store/useModalManager';
10
10
  import { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';
11
11
  import type { Card } from '../../../modules/cards/types';
12
- import { useTranslations } from 'next-intl';
13
12
 
14
13
  type PaymentInfoCardProps = {
15
14
  email?: string;
@@ -30,7 +29,6 @@ export function PaymentInfoCard({
30
29
  hideDelete,
31
30
  hideSetDefault,
32
31
  }: PaymentInfoCardProps) {
33
- const translate = useTranslations();
34
32
  const isMobile = useIsMobile();
35
33
  const { openModal } = useModalManager();
36
34
  const isDefaultWl = useIsDefaultWhitelabel();
@@ -85,19 +83,19 @@ export function PaymentInfoCard({
85
83
  <div className="border border-zinc-200 rounded-lg overflow-hidden">
86
84
  {email && (
87
85
  <div className="flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3">
88
- <span className="paragraph-small-medium text-zinc-500 w-[100px]">{translate('common.cards.paymentInfo.email')}</span>
86
+ <span className="paragraph-small-medium text-zinc-500 w-[100px]">E-mail</span>
89
87
  <span className="paragraph-small-medium text-zinc-950 flex-1">{email}</span>
90
88
  </div>
91
89
  )}
92
90
  <div className="flex items-center h-[60px] px-4 gap-3">
93
- <span className="paragraph-small-medium text-zinc-500 w-[100px]">{translate('common.cards.paymentInfo.payment')}</span>
91
+ <span className="paragraph-small-medium text-zinc-500 w-[100px]">Pagamento</span>
94
92
  <button
95
93
  type="button"
96
94
  onClick={handleOpenAddCardModal}
97
95
  className="flex items-center h-8 px-2 paragraph-small-semibold text-zinc-950 border border-zinc-200 rounded-md hover:border-zinc-400 transition-colors cursor-pointer w-fit"
98
96
  >
99
97
  <IconPlus className="size-[18px]" />
100
- <span className="px-1.5">{translate('common.cards.paymentInfo.addCard')}</span>
98
+ <span className="px-1.5">Adicionar cartão</span>
101
99
  </button>
102
100
  </div>
103
101
  </div>
@@ -109,7 +107,7 @@ export function PaymentInfoCard({
109
107
  <div className="border border-zinc-200 rounded-lg overflow-hidden">
110
108
  {email && (
111
109
  <div className="flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3">
112
- <span className="paragraph-small-medium text-zinc-500 w-[100px]">{translate('common.cards.paymentInfo.email')}</span>
110
+ <span className="paragraph-small-medium text-zinc-500 w-[100px]">E-mail</span>
113
111
  <span className="paragraph-small-medium text-zinc-950 flex-1">{email}</span>
114
112
  </div>
115
113
  )}
@@ -120,7 +118,7 @@ export function PaymentInfoCard({
120
118
  >
121
119
  {!isExpanded ? (
122
120
  <>
123
- <span className="paragraph-small-medium text-zinc-500 w-[100px]">{translate('common.cards.paymentInfo.payment')}</span>
121
+ <span className="paragraph-small-medium text-zinc-500 w-[100px]">Pagamento</span>
124
122
  <div className="flex flex-col gap-0.5 flex-1 min-w-0">
125
123
  <span className="paragraph-small-semibold text-zinc-950 truncate">
126
124
  {selectedCard?.name}
@@ -137,7 +135,7 @@ export function PaymentInfoCard({
137
135
  ) : (
138
136
  <>
139
137
  <span className="paragraph-small-semibold text-zinc-950 flex-1">
140
- {translate('common.cards.paymentInfo.selectPaymentMethod')}
138
+ Selecione a forma de pagamento
141
139
  </span>
142
140
  <div className="size-8 flex items-center justify-center rounded-lg">
143
141
  <IconChevronDown className="size-[18px] text-zinc-500 rotate-180" />
@@ -172,7 +170,7 @@ export function PaymentInfoCard({
172
170
  : 'text-zinc-600 border border-zinc-200 hover:bg-zinc-50'
173
171
  }`}
174
172
  >
175
- {translate('common.cards.paymentInfo.manageCards')}
173
+ Gerenciar cartões
176
174
  </button>
177
175
  )}
178
176
  </div>
@@ -185,7 +183,7 @@ export function PaymentInfoCard({
185
183
  >
186
184
  <IconPlus className="size-[18px]" />
187
185
  <span className="px-1.5">
188
- {isExpanded ? translate('common.cards.paymentInfo.addCard') : translate('common.cards.paymentInfo.newPaymentMethod')}
186
+ {isExpanded ? 'Adicionar cartão' : 'Nova forma de pagamento'}
189
187
  </span>
190
188
  </button>
191
189
  </div>
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
 
3
- import { useTranslations } from 'next-intl';
4
3
  import {
5
4
  calculateRadius,
6
5
  calculateCircumference,
@@ -22,7 +21,6 @@ export default function DefaultCircularProgress({
22
21
  size = 62,
23
22
  strokeWidth = 3,
24
23
  }: CircularProgressProps) {
25
- const translate = useTranslations();
26
24
  const isDefaultWl = useIsDefaultWhitelabel();
27
25
  const radius = calculateRadius(size, strokeWidth);
28
26
  const circumference = calculateCircumference(radius);
@@ -37,7 +35,7 @@ export default function DefaultCircularProgress({
37
35
  aria-valuenow={current}
38
36
  aria-valuemin={0}
39
37
  aria-valuemax={total}
40
- aria-label={translate('common.forms.circularProgress.ariaLabel')}
38
+ aria-label="Progresso de exportação"
41
39
  >
42
40
  <svg width={size} height={size} className="absolute">
43
41
  <circle
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
 
3
3
  import { useState, useMemo } from 'react';
4
- import { useTranslations } from 'next-intl';
5
4
  import { IconCheck, IconChevronDown, IconSearch } from '@tabler/icons-react';
6
5
  import { Popover, PopoverContent, PopoverTrigger } from '../overlay/Popover';
7
6
  import { cn } from '../../../infra/utils/clsx';
@@ -29,9 +28,9 @@ interface ComboboxFieldProps {
29
28
  export function ComboboxField({
30
29
  options,
31
30
  label,
32
- placeholder,
33
- searchPlaceholder,
34
- emptyMessage,
31
+ placeholder = 'Selecione uma opção',
32
+ searchPlaceholder = 'Buscar...',
33
+ emptyMessage = 'Nenhuma opção encontrada.',
35
34
  value,
36
35
  onChange,
37
36
  disabled = false,
@@ -39,10 +38,6 @@ export function ComboboxField({
39
38
  className,
40
39
  containerClassName,
41
40
  }: ComboboxFieldProps) {
42
- const translate = useTranslations();
43
- const resolvedPlaceholder = placeholder ?? translate('common.forms.combobox.placeholder');
44
- const resolvedSearchPlaceholder = searchPlaceholder ?? translate('common.forms.combobox.searchPlaceholder');
45
- const resolvedEmptyMessage = emptyMessage ?? translate('common.forms.combobox.emptyMessage');
46
41
  const [open, setOpen] = useState(false);
47
42
  const [search, setSearch] = useState('');
48
43
 
@@ -95,7 +90,7 @@ export function ComboboxField({
95
90
  <span className={cn('truncate text-left', !selectedOption && 'text-gray-400')}>
96
91
  {selectedOption
97
92
  ? (selectedOption.displayValue ?? selectedOption.label)
98
- : resolvedPlaceholder}
93
+ : placeholder}
99
94
  </span>
100
95
  {icon ?? (
101
96
  <IconChevronDown
@@ -119,7 +114,7 @@ export function ComboboxField({
119
114
  <IconSearch className="size-4 shrink-0 opacity-50 text-gray-500" />
120
115
  <input
121
116
  autoFocus
122
- placeholder={resolvedSearchPlaceholder}
117
+ placeholder={searchPlaceholder}
123
118
  value={search}
124
119
  onChange={(e) => setSearch(e.target.value)}
125
120
  className="flex h-full w-full bg-transparent text-sm outline-none placeholder:text-gray-400 paragraph-small-medium text-gray-950"
@@ -128,7 +123,7 @@ export function ComboboxField({
128
123
 
129
124
  <div className="overflow-y-auto max-h-[280px] p-1">
130
125
  {filteredOptions.length === 0 ? (
131
- <p className="py-6 text-center paragraph-small-medium text-gray-500">{resolvedEmptyMessage}</p>
126
+ <p className="py-6 text-center paragraph-small-medium text-gray-500">{emptyMessage}</p>
132
127
  ) : (
133
128
  filteredOptions.map((option) => {
134
129
  const isSelected = value === option.value;
@@ -1,7 +1,6 @@
1
1
  "use client";
2
2
 
3
3
  import { useState, forwardRef, useEffect } from "react";
4
- import { useTranslations } from "next-intl";
5
4
  import { format } from "date-fns";
6
5
  import { Calendar } from "./Calendar";
7
6
  import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
@@ -24,11 +23,9 @@ interface DatePickerProps {
24
23
 
25
24
  export const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(
26
25
  (
27
- { value, onChange, placeholder, className, disabled },
26
+ { value, onChange, placeholder = "Selecione a data", className, disabled },
28
27
  ref,
29
28
  ) => {
30
- const translate = useTranslations();
31
- const resolvedPlaceholder = placeholder ?? translate('common.forms.datePicker.placeholder');
32
29
  const [open, setOpen] = useState(false);
33
30
  const [date, setDate] = useState<Date | undefined>(() => {
34
31
  return value ? isoParaDataLocal(value) : undefined;
@@ -54,7 +51,7 @@ export const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(
54
51
  }
55
52
  };
56
53
 
57
- const displayText = date ? format(date, "dd/MM/yyyy") : resolvedPlaceholder;
54
+ const displayText = date ? format(date, "dd/MM/yyyy") : placeholder;
58
55
 
59
56
  return (
60
57
  <Popover open={open} onOpenChange={setOpen}>
@@ -1,7 +1,6 @@
1
1
  "use client";
2
2
 
3
3
  import { useState, forwardRef, useEffect } from "react";
4
- import { useTranslations } from "next-intl";
5
4
  import { format } from "date-fns";
6
5
  import { IconCalendar } from '@tabler/icons-react';
7
6
  import { DateRange } from "react-day-picker";
@@ -25,9 +24,7 @@ interface DateRangePickerProps {
25
24
  }
26
25
 
27
26
  export const DateRangePicker = forwardRef<HTMLButtonElement, DateRangePickerProps>(
28
- ({ value, onChange, placeholder, className, disabled }, ref) => {
29
- const translate = useTranslations();
30
- const resolvedPlaceholder = placeholder ?? translate('common.forms.dateRangePicker.placeholder');
27
+ ({ value, onChange, placeholder = "Selecione o período", className, disabled }, ref) => {
31
28
  const [open, setOpen] = useState(false);
32
29
  const [range, setRange] = useState<DateRange | undefined>(() => {
33
30
  if (value?.from && value?.to) {
@@ -65,7 +62,7 @@ export const DateRangePicker = forwardRef<HTMLButtonElement, DateRangePickerProp
65
62
 
66
63
  const displayText = range?.from && range?.to
67
64
  ? `${format(range.from, "dd/MM/yyyy")} - ${format(range.to, "dd/MM/yyyy")}`
68
- : resolvedPlaceholder;
65
+ : placeholder;
69
66
 
70
67
  return (
71
68
  <Popover open={open} onOpenChange={setOpen}>
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
 
3
3
  import { useState, useEffect, useRef } from 'react';
4
- import { useTranslations } from 'next-intl';
5
4
  import { AsYouType, CountryCode } from 'libphonenumber-js';
6
5
  import { Input, Separator, Popover, PopoverTrigger, PopoverContent, cn } from '@greatapps/common';
7
6
  import { IconChevronDown, IconSearch } from '@tabler/icons-react';
@@ -42,7 +41,6 @@ export default function PhoneInput({
42
41
  classnameContainer,
43
42
  className,
44
43
  }: PhoneInputProps) {
45
- const translate = useTranslations();
46
44
  const parsed = parsePhoneValue(value ?? '');
47
45
  const [selectedCountry, setSelectedCountry] = useState<Country>(parsed.country);
48
46
  const [phoneNumber, setPhoneNumber] = useState(parsed.number);
@@ -117,7 +115,7 @@ export default function PhoneInput({
117
115
  {label && (
118
116
  <div className="flex items-center gap-1 paragraph-xsmall-semibold">
119
117
  <span className="text-zinc-600">{label}</span>
120
- {optional && <span className="text-zinc-500">{translate('common.forms.phoneInput.optional')}</span>}
118
+ {optional && <span className="text-zinc-500">(Opcional)</span>}
121
119
  {required && <span className="text-red-600">*</span>}
122
120
  </div>
123
121
  )}
@@ -150,7 +148,7 @@ export default function PhoneInput({
150
148
  <input
151
149
  type="text"
152
150
  className="flex-1 text-sm outline-none placeholder:text-zinc-400"
153
- placeholder={translate('common.forms.phoneInput.searchPlaceholder')}
151
+ placeholder="Buscar país..."
154
152
  value={search}
155
153
  onChange={(e) => setSearch(e.target.value)}
156
154
  autoFocus
@@ -177,7 +175,7 @@ export default function PhoneInput({
177
175
  </button>
178
176
  ))}
179
177
  {filtered.length === 0 && (
180
- <p className="text-sm text-zinc-500 p-3 text-center">{translate('common.forms.phoneInput.emptyMessage')}</p>
178
+ <p className="text-sm text-zinc-500 p-3 text-center">Nenhum país encontrado</p>
181
179
  )}
182
180
  </div>
183
181
  </PopoverContent>
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
 
3
3
  import React from 'react';
4
- import { useTranslations } from 'next-intl';
5
4
  import {
6
5
  Select,
7
6
  SelectContent,
@@ -42,7 +41,7 @@ export function SelectField({
42
41
  hintMessage,
43
42
  error = false,
44
43
  errorMessage,
45
- placeholder,
44
+ placeholder = 'Selecione uma opção',
46
45
  options,
47
46
  value,
48
47
  defaultValue,
@@ -52,8 +51,6 @@ export function SelectField({
52
51
  className,
53
52
  containerClassName,
54
53
  }: SelectFieldProps) {
55
- const translate = useTranslations();
56
- const resolvedPlaceholder = placeholder ?? translate('common.forms.select.placeholder');
57
54
  const handleValueChange = (selectedValue: string) => {
58
55
  if (!onChange) return;
59
56
  const selectedOption = options.find((option) => String(option.value) === selectedValue);
@@ -70,7 +67,7 @@ export function SelectField({
70
67
  {label && (
71
68
  <div className="flex items-center gap-1 paragraph-xsmall-semibold">
72
69
  <span className="text-gray-600">{label}</span>
73
- {optional && <span className="text-gray-500">{translate('common.forms.select.optional')}</span>}
70
+ {optional && <span className="text-gray-500">(Opcional)</span>}
74
71
  {required && <span className="text-red-600">*</span>}
75
72
  </div>
76
73
  )}
@@ -92,7 +89,7 @@ export function SelectField({
92
89
  )}
93
90
  icon={icon}
94
91
  >
95
- <SelectValue placeholder={resolvedPlaceholder}>
92
+ <SelectValue placeholder={placeholder}>
96
93
  {value !== undefined &&
97
94
  (() => {
98
95
  const selectedOption = options.find((opt) => String(opt.value) === String(value));
@@ -1,7 +1,6 @@
1
1
  'use client'
2
2
 
3
3
  import { useEffect, useRef, useState } from 'react'
4
- import { useTranslations } from 'next-intl'
5
4
  import ReactCrop, {
6
5
  type Crop,
7
6
  centerCrop,
@@ -179,7 +178,6 @@ export function ImageCropModal({
179
178
  fileName,
180
179
  onSelectAnother,
181
180
  }: ImageCropModalProps) {
182
- const translate = useTranslations()
183
181
  const imgRef = useRef<HTMLImageElement>(null)
184
182
  const [crop, setCrop] = useState<Crop>()
185
183
  const [imageSize, setImageSize] = useState({ width: 0, height: 0 })
@@ -303,28 +301,22 @@ export function ImageCropModal({
303
301
  <>
304
302
  <DialogHeader className="p-5">
305
303
  <DialogTitle className="text-center text-[16px]!">
306
- {dimensionText
307
- ? translate('common.imageUpload.tooSmallTitleWithDimension', { dimensionText })
308
- : translate('common.imageUpload.tooSmallTitleGeneric')}
304
+ {dimensionText ? `Foto menor que ${dimensionText}` : 'Foto muito pequena'}
309
305
  </DialogTitle>
310
306
  </DialogHeader>
311
307
 
312
308
  <div className="px-5 pb-5">
313
309
  <p className="paragraph-small-regular text-zinc-600 text-center">
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')}
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.
321
313
  </p>
322
314
  </div>
323
315
 
324
316
  <DialogFooter className="flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200">
325
- {onSelectAnother && <Button onClick={onSelectAnother}>{translate('common.imageUpload.sendAnother')}</Button>}
317
+ {onSelectAnother && <Button onClick={onSelectAnother}>Enviar outra</Button>}
326
318
  <Button variant="secondary" onClick={handleCancel}>
327
- {translate('common.actions.cancel')}
319
+ Cancelar
328
320
  </Button>
329
321
  </DialogFooter>
330
322
  </>
@@ -332,7 +324,7 @@ export function ImageCropModal({
332
324
  <>
333
325
  <DialogHeader className="p-5">
334
326
  <DialogTitle className="text-center text-[16px]!">
335
- {translate('common.imageUpload.cropTitle')}
327
+ Ajustar imagem
336
328
  </DialogTitle>
337
329
  </DialogHeader>
338
330
 
@@ -352,7 +344,7 @@ export function ImageCropModal({
352
344
  <img
353
345
  ref={imgRef}
354
346
  src={imageSrc}
355
- alt={translate('common.imageUpload.cropAlt')}
347
+ alt="Crop"
356
348
  onLoad={onCropImgLoad}
357
349
  draggable={false}
358
350
  className="max-h-[50vh] object-contain select-none"
@@ -362,16 +354,16 @@ export function ImageCropModal({
362
354
  </div>
363
355
 
364
356
  <p className="paragraph-small-regular text-zinc-500 text-center">
365
- {translate('common.imageUpload.cropHint')}
357
+ Arraste para ajustar a área de corte
366
358
  </p>
367
359
  </div>
368
360
 
369
361
  <DialogFooter className="flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200">
370
362
  <Button onClick={handleConfirm} disabled={imageStatus !== 'ok' || !crop}>
371
- {translate('common.actions.confirm')}
363
+ Confirmar
372
364
  </Button>
373
365
  <Button variant="secondary" onClick={handleCancel}>
374
- {translate('common.actions.cancel')}
366
+ Cancelar
375
367
  </Button>
376
368
  </DialogFooter>
377
369
  </>
@@ -1,6 +1,5 @@
1
1
  'use client'
2
2
 
3
- import { useTranslations } from 'next-intl'
4
3
  import {
5
4
  Dialog,
6
5
  DialogContent,
@@ -29,7 +28,6 @@ export function ImageTooSmallModal({
29
28
  onSelectAnother,
30
29
  onCancel,
31
30
  }: ImageTooSmallModalProps) {
32
- const translate = useTranslations()
33
31
  const dimensionText = `${minWidth}x${minHeight}px`
34
32
 
35
33
  return (
@@ -40,20 +38,21 @@ export function ImageTooSmallModal({
40
38
  >
41
39
  <DialogHeader className="p-5">
42
40
  <DialogTitle className="text-center text-[16px]!">
43
- {translate('common.imageUpload.tooSmallTitleWithDimension', { dimensionText })}
41
+ Foto menor que {dimensionText}
44
42
  </DialogTitle>
45
43
  </DialogHeader>
46
44
 
47
45
  <div className="px-5 pb-5">
48
46
  <p className="paragraph-small-regular text-zinc-600 text-center">
49
- {translate('common.imageUpload.tooSmallBodyFileWithDimension', { fileName, dimensionText })}
47
+ O arquivo "{fileName}" é menor que {dimensionText}. Faça envio de
48
+ uma imagem com pelo menos {dimensionText} para continuar.
50
49
  </p>
51
50
  </div>
52
51
 
53
52
  <DialogFooter className="flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200">
54
- <Button onClick={onSelectAnother}>{translate('common.imageUpload.sendAnother')}</Button>
53
+ <Button onClick={onSelectAnother}>Enviar outra</Button>
55
54
  <Button variant="secondary" onClick={onCancel}>
56
- {translate('common.actions.cancel')}
55
+ Cancelar
57
56
  </Button>
58
57
  </DialogFooter>
59
58
  </DialogContent>