@greatapps/common 1.1.671 → 1.1.673

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 (112) hide show
  1. package/dist/components/layouts/NavBar.mjs +5 -3
  2. package/dist/components/layouts/NavBar.mjs.map +1 -1
  3. package/dist/components/layouts/NotificationsPopover.mjs +5 -3
  4. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  5. package/dist/components/layouts/ProfilePopover.mjs +6 -4
  6. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  7. package/dist/components/layouts/UsersSelectorPopover.mjs +9 -7
  8. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  9. package/dist/components/modals/BuyCreditsModal.mjs +17 -18
  10. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  11. package/dist/components/modals/CreditsDisabledModal.mjs +6 -4
  12. package/dist/components/modals/CreditsDisabledModal.mjs.map +1 -1
  13. package/dist/components/modals/PaidPlanRequiredModal.mjs +5 -3
  14. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  15. package/dist/components/modals/cards/AddCardModal.mjs +27 -24
  16. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  17. package/dist/components/modals/cards/CannotDeleteCardModal.mjs +9 -7
  18. package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -1
  19. package/dist/components/modals/cards/CardFormFields.mjs +25 -22
  20. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  21. package/dist/components/modals/cards/DeleteCardModal.mjs +10 -8
  22. package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -1
  23. package/dist/components/navigation/CancelledSubscriptionBanner.mjs +4 -2
  24. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  25. package/dist/components/navigation/OverdueInvoiceBanner.mjs +4 -2
  26. package/dist/components/navigation/OverdueInvoiceBanner.mjs.map +1 -1
  27. package/dist/components/navigation/PendingCancellationBanner.mjs +4 -6
  28. package/dist/components/navigation/PendingCancellationBanner.mjs.map +1 -1
  29. package/dist/components/navigation/ProjectSelectorPopover.mjs +8 -6
  30. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  31. package/dist/components/navigation/UpcomingInvoiceBanner.mjs +4 -6
  32. package/dist/components/navigation/UpcomingInvoiceBanner.mjs.map +1 -1
  33. package/dist/components/navigation/subcomponents/BottomLinks.mjs +5 -3
  34. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  35. package/dist/components/navigation/subcomponents/CreditsCard.mjs +3 -1
  36. package/dist/components/navigation/subcomponents/CreditsCard.mjs.map +1 -1
  37. package/dist/components/navigation/subcomponents/PlanCard.mjs +3 -1
  38. package/dist/components/navigation/subcomponents/PlanCard.mjs.map +1 -1
  39. package/dist/components/navigation/subcomponents/ProjectSelector.mjs +5 -3
  40. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  41. package/dist/components/pages/NotFoundPage.mjs +5 -3
  42. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  43. package/dist/components/pages/notifications/Notifications.mjs +13 -10
  44. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  45. package/dist/components/ui/buttons/CopyButton.mjs +9 -5
  46. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  47. package/dist/components/ui/data-display/CardItem.mjs +7 -5
  48. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  49. package/dist/components/ui/data-display/PaymentInfoCard.mjs +10 -8
  50. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  51. package/dist/components/ui/feedback/DefaultCircularProgress.mjs +3 -1
  52. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  53. package/dist/components/ui/form/ComboboxField.mjs +11 -6
  54. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  55. package/dist/components/ui/form/DatePicker.mjs +5 -2
  56. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  57. package/dist/components/ui/form/DateRangePicker.mjs +5 -2
  58. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  59. package/dist/components/ui/form/PhoneInput.mjs +5 -3
  60. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  61. package/dist/components/ui/form/SelectField.mjs +6 -3
  62. package/dist/components/ui/form/SelectField.mjs.map +1 -1
  63. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs +11 -18
  64. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  65. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs +6 -15
  66. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  67. package/dist/i18n/messages/en-us.mjs +231 -0
  68. package/dist/i18n/messages/en-us.mjs.map +1 -1
  69. package/dist/i18n/messages/es-es.mjs +231 -0
  70. package/dist/i18n/messages/es-es.mjs.map +1 -1
  71. package/dist/i18n/messages/pt-br.mjs +239 -0
  72. package/dist/i18n/messages/pt-br.mjs.map +1 -1
  73. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs +2 -1
  74. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -1
  75. package/package.json +1 -1
  76. package/src/components/layouts/NavBar.tsx +5 -3
  77. package/src/components/layouts/NotificationsPopover.tsx +5 -3
  78. package/src/components/layouts/ProfilePopover.tsx +6 -4
  79. package/src/components/layouts/UsersSelectorPopover.tsx +9 -7
  80. package/src/components/modals/BuyCreditsModal.tsx +18 -16
  81. package/src/components/modals/CreditsDisabledModal.tsx +6 -6
  82. package/src/components/modals/PaidPlanRequiredModal.tsx +5 -3
  83. package/src/components/modals/cards/AddCardModal.tsx +29 -27
  84. package/src/components/modals/cards/CannotDeleteCardModal.tsx +9 -8
  85. package/src/components/modals/cards/CardFormFields.tsx +25 -22
  86. package/src/components/modals/cards/DeleteCardModal.tsx +10 -8
  87. package/src/components/navigation/CancelledSubscriptionBanner.tsx +4 -2
  88. package/src/components/navigation/OverdueInvoiceBanner.tsx +4 -2
  89. package/src/components/navigation/PendingCancellationBanner.tsx +4 -2
  90. package/src/components/navigation/ProjectSelectorPopover.tsx +8 -6
  91. package/src/components/navigation/UpcomingInvoiceBanner.tsx +4 -2
  92. package/src/components/navigation/subcomponents/BottomLinks.tsx +5 -3
  93. package/src/components/navigation/subcomponents/CreditsCard.tsx +3 -1
  94. package/src/components/navigation/subcomponents/PlanCard.tsx +3 -1
  95. package/src/components/navigation/subcomponents/ProjectSelector.tsx +5 -3
  96. package/src/components/pages/NotFoundPage.tsx +5 -3
  97. package/src/components/pages/notifications/Notifications.tsx +13 -10
  98. package/src/components/ui/buttons/CopyButton.tsx +10 -5
  99. package/src/components/ui/data-display/CardItem.tsx +7 -5
  100. package/src/components/ui/data-display/PaymentInfoCard.tsx +10 -8
  101. package/src/components/ui/feedback/DefaultCircularProgress.tsx +3 -1
  102. package/src/components/ui/form/ComboboxField.tsx +11 -6
  103. package/src/components/ui/form/DatePicker.tsx +5 -2
  104. package/src/components/ui/form/DateRangePicker.tsx +5 -2
  105. package/src/components/ui/form/PhoneInput.tsx +5 -3
  106. package/src/components/ui/form/SelectField.tsx +6 -3
  107. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +19 -11
  108. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +6 -5
  109. package/src/i18n/messages/en-us.ts +234 -0
  110. package/src/i18n/messages/es-es.ts +234 -0
  111. package/src/i18n/messages/pt-br.ts +248 -0
  112. package/src/modules/cards/hooks/handle-delete-card.hook.ts +8 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/modals/cards/CannotDeleteCardModal.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\nimport { Dialog, DialogContent, DialogTitle } from '../../ui/overlay/Dialog';\nimport { Button } from '../../ui/buttons/Button';\nimport { Toast } from '../../ui/feedback/Toast';\nimport { CardItem } from '../../ui/data-display/CardItem';\nimport { IconAlertTriangle, IconPlus } from '@tabler/icons-react';\nimport { toast } from 'sonner';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useCards } from '../../../modules/cards/hooks/cards.hook';\nimport { useActiveSubscription } from '../../../modules/subscriptions/hooks/find-active-subscription.hook';\nimport { useUpdateSubscriptionPayment } from '../../../modules/subscriptions/hooks/update-subscription-payment.hook';\nimport type { Card } from '../../../modules/cards/types';\n\nexport function CannotDeleteCardModal() {\n const { activeModal, modalData, closeModal, openModal } = useModalManager();\n const { data: cardsData } = useCards();\n const { mutateAsync: updatePayment } = useUpdateSubscriptionPayment();\n const { data: subscriptionData } = useActiveSubscription();\n const activeSubscription = subscriptionData?.data?.[0] ?? null;\n\n const isOpen = activeModal === 'cannotDeleteCardModal';\n const cardToDeleteId = modalData.cardId as string | undefined;\n\n const allCards = cardsData?.data ?? [];\n const cardToDelete = allCards.find((c) => c.id.toString() === cardToDeleteId);\n const availableCards = allCards.filter((c) => c.id.toString() !== cardToDeleteId);\n\n const handleSelectCard = useCallback(\n async (card: Card) => {\n if (!activeSubscription || !cardToDelete) return;\n\n try {\n await updatePayment({\n subscriptionId: activeSubscription.id,\n data: { id_card: card.id.toString(), payment_method: 1 },\n });\n\n closeModal();\n openModal('deleteCardModal', {\n cardId: cardToDelete.id.toString(),\n });\n } catch (error) {\n toast.custom(\n (t) => (\n <Toast\n variant=\"error\"\n message={\n error instanceof Error\n ? error.message\n : 'Erro ao atualizar cartão da assinatura'\n }\n toastId={t}\n />\n ),\n { duration: 5000 },\n );\n }\n },\n [updatePayment, activeSubscription, closeModal, openModal, cardToDelete],\n );\n\n const handleAddCard = useCallback(() => {\n closeModal();\n openModal('addCardModal', { showDefaultToggle: true });\n }, [openModal, closeModal]);\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && closeModal()}>\n <DialogTitle className=\"sr-only\">\n Não é possível excluir este cartão\n </DialogTitle>\n <DialogContent className=\"flex flex-col p-0 max-w-full sm:max-w-full border-0 rounded-t-2xl rounded-b-none h-dvh top-0 bottom-0 left-0 right-0 translate-x-0 translate-y-0 lg:max-w-[436px] lg:h-auto lg:max-h-[90vh] lg:rounded-lg lg:border lg:top-[50%] lg:left-[50%] lg:right-auto lg:bottom-auto lg:translate-x-[-50%] lg:translate-y-[-50%] overflow-hidden\">\n <div className=\"flex flex-col gap-5 p-4 lg:p-5\">\n <div className=\"flex items-center justify-center size-10 bg-red-50 rounded-lg\">\n <IconAlertTriangle className=\"size-6 text-red-500\" />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"paragraph-medium-semibold text-zinc-950\">\n Não é possível excluir este cartão\n </h2>\n <p className=\"paragraph-small-regular text-zinc-600\">\n Este cartão está em uso e tem uma assinatura ativa vinculada a ele.\n Selecione outro cartão como padrão ou adicione um novo.\n </p>\n </div>\n </div>\n\n {availableCards.length > 0 && (\n <div className=\"flex flex-col gap-3 px-4 lg:px-5 pb-4 lg:pb-5 overflow-y-auto max-h-[200px] flex-1 lg:flex-none\">\n <span className=\"paragraph-xsmall-semibold text-zinc-600\">\n Selecione um cartão como padrão:\n </span>\n {availableCards.map((card) => (\n <CardItem\n key={card.id}\n card={card}\n onSelect={() => handleSelectCard(card)}\n showMenu={false}\n />\n ))}\n </div>\n )}\n\n <div className=\"flex flex-row gap-2 p-4 lg:p-5 border-t border-zinc-200 mt-auto lg:mt-0\">\n <Button onClick={handleAddCard} className=\"h-10! flex-1\">\n <IconPlus size={20} />\n Adicionar novo cartão\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => closeModal()}\n className=\"h-10! flex-1\"\n >\n Cancelar\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/modals/cards/CannotDeleteCardModal.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\nimport { Dialog, DialogContent, DialogTitle } from '../../ui/overlay/Dialog';\nimport { Button } from '../../ui/buttons/Button';\nimport { Toast } from '../../ui/feedback/Toast';\nimport { CardItem } from '../../ui/data-display/CardItem';\nimport { IconAlertTriangle, IconPlus } from '@tabler/icons-react';\nimport { toast } from 'sonner';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useCards } from '../../../modules/cards/hooks/cards.hook';\nimport { useActiveSubscription } from '../../../modules/subscriptions/hooks/find-active-subscription.hook';\nimport { useUpdateSubscriptionPayment } from '../../../modules/subscriptions/hooks/update-subscription-payment.hook';\nimport type { Card } from '../../../modules/cards/types';\nimport { useTranslations } from 'next-intl';\n\nexport function CannotDeleteCardModal() {\n const translate = useTranslations();\n const { activeModal, modalData, closeModal, openModal } = useModalManager();\n const { data: cardsData } = useCards();\n const { mutateAsync: updatePayment } = useUpdateSubscriptionPayment();\n const { data: subscriptionData } = useActiveSubscription();\n const activeSubscription = subscriptionData?.data?.[0] ?? null;\n\n const isOpen = activeModal === 'cannotDeleteCardModal';\n const cardToDeleteId = modalData.cardId as string | undefined;\n\n const allCards = cardsData?.data ?? [];\n const cardToDelete = allCards.find((c) => c.id.toString() === cardToDeleteId);\n const availableCards = allCards.filter((c) => c.id.toString() !== cardToDeleteId);\n\n const handleSelectCard = useCallback(\n async (card: Card) => {\n if (!activeSubscription || !cardToDelete) return;\n\n try {\n await updatePayment({\n subscriptionId: activeSubscription.id,\n data: { id_card: card.id.toString(), payment_method: 1 },\n });\n\n closeModal();\n openModal('deleteCardModal', {\n cardId: cardToDelete.id.toString(),\n });\n } catch (error) {\n toast.custom(\n (t) => (\n <Toast\n variant=\"error\"\n message={\n error instanceof Error\n ? error.message\n : translate('common.cards.cannotDelete.errorUpdateCard')\n }\n toastId={t}\n />\n ),\n { duration: 5000 },\n );\n }\n },\n [updatePayment, activeSubscription, closeModal, openModal, cardToDelete],\n );\n\n const handleAddCard = useCallback(() => {\n closeModal();\n openModal('addCardModal', { showDefaultToggle: true });\n }, [openModal, closeModal]);\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && closeModal()}>\n <DialogTitle className=\"sr-only\">\n {translate('common.cards.cannotDelete.title')}\n </DialogTitle>\n <DialogContent className=\"flex flex-col p-0 max-w-full sm:max-w-full border-0 rounded-t-2xl rounded-b-none h-dvh top-0 bottom-0 left-0 right-0 translate-x-0 translate-y-0 lg:max-w-[436px] lg:h-auto lg:max-h-[90vh] lg:rounded-lg lg:border lg:top-[50%] lg:left-[50%] lg:right-auto lg:bottom-auto lg:translate-x-[-50%] lg:translate-y-[-50%] overflow-hidden\">\n <div className=\"flex flex-col gap-5 p-4 lg:p-5\">\n <div className=\"flex items-center justify-center size-10 bg-red-50 rounded-lg\">\n <IconAlertTriangle className=\"size-6 text-red-500\" />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"paragraph-medium-semibold text-zinc-950\">\n {translate('common.cards.cannotDelete.title')}\n </h2>\n <p className=\"paragraph-small-regular text-zinc-600\">\n {translate('common.cards.cannotDelete.description')}\n </p>\n </div>\n </div>\n\n {availableCards.length > 0 && (\n <div className=\"flex flex-col gap-3 px-4 lg:px-5 pb-4 lg:pb-5 overflow-y-auto max-h-[200px] flex-1 lg:flex-none\">\n <span className=\"paragraph-xsmall-semibold text-zinc-600\">\n {translate('common.cards.cannotDelete.selectDefault')}\n </span>\n {availableCards.map((card) => (\n <CardItem\n key={card.id}\n card={card}\n onSelect={() => handleSelectCard(card)}\n showMenu={false}\n />\n ))}\n </div>\n )}\n\n <div className=\"flex flex-row gap-2 p-4 lg:p-5 border-t border-zinc-200 mt-auto lg:mt-0\">\n <Button onClick={handleAddCard} className=\"h-10! flex-1\">\n <IconPlus size={20} />\n {translate('common.cards.cannotDelete.addNewCard')}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => closeModal()}\n className=\"h-10! flex-1\"\n >\n {translate('common.actions.cancel')}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
@@ -15,6 +15,7 @@ import {
15
15
  CardExpiryElement,
16
16
  CardNumberElement
17
17
  } from "@stripe/react-stripe-js";
18
+ import { useTranslations } from "next-intl";
18
19
  const stripeElementOptions = {
19
20
  style: {
20
21
  base: {
@@ -63,6 +64,7 @@ function CardFormFields({
63
64
  onStripeChange,
64
65
  stripeErrors
65
66
  }) {
67
+ const translate = useTranslations();
66
68
  const {
67
69
  register,
68
70
  watch,
@@ -74,15 +76,15 @@ function CardFormFields({
74
76
  /* @__PURE__ */ jsx(
75
77
  FormField,
76
78
  {
77
- label: "Nome impresso no cart\xE3o",
78
- placeholder: "Digite aqui",
79
+ label: translate("common.cards.form.nameOnCard"),
80
+ placeholder: translate("common.cards.form.typeHere"),
79
81
  ...register("name"),
80
82
  error: !!errors.name,
81
83
  errorMessage: errors.name?.message
82
84
  }
83
85
  ),
84
86
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
85
- /* @__PURE__ */ jsx("label", { className: "paragraph-xsmall-semibold text-zinc-600", children: "N\xFAmero do cart\xE3o" }),
87
+ /* @__PURE__ */ jsx("label", { className: "paragraph-xsmall-semibold text-zinc-600", children: translate("common.cards.form.cardNumber") }),
86
88
  /* @__PURE__ */ jsx("div", { className: "h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400 relative", children: /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx(
87
89
  CardNumberElement,
88
90
  {
@@ -94,7 +96,7 @@ function CardFormFields({
94
96
  ] }),
95
97
  /* @__PURE__ */ jsxs("div", { className: "flex gap-4", children: [
96
98
  /* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col gap-1.5", children: [
97
- /* @__PURE__ */ jsx("label", { className: "paragraph-xsmall-semibold text-zinc-600", children: "Data de validade" }),
99
+ /* @__PURE__ */ jsx("label", { className: "paragraph-xsmall-semibold text-zinc-600", children: translate("common.cards.form.cardExpiry") }),
98
100
  /* @__PURE__ */ jsx("div", { className: "h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400", children: /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx(
99
101
  CardExpiryElement,
100
102
  {
@@ -105,7 +107,7 @@ function CardFormFields({
105
107
  stripeErrors.cardExpiry && /* @__PURE__ */ jsx("p", { className: "paragraph-xsmall-semibold text-red-600", children: stripeErrors.cardExpiry })
106
108
  ] }),
107
109
  /* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col gap-1.5", children: [
108
- /* @__PURE__ */ jsx("label", { className: "paragraph-xsmall-semibold text-zinc-600", children: "CVC" }),
110
+ /* @__PURE__ */ jsx("label", { className: "paragraph-xsmall-semibold text-zinc-600", children: translate("common.cards.form.cardCvc") }),
109
111
  /* @__PURE__ */ jsx("div", { className: "h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400", children: /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx(
110
112
  CardCvcElement,
111
113
  {
@@ -119,8 +121,8 @@ function CardFormFields({
119
121
  /* @__PURE__ */ jsx(
120
122
  SelectField,
121
123
  {
122
- label: "Pa\xEDs",
123
- placeholder: "Selecione",
124
+ label: translate("common.cards.form.country"),
125
+ placeholder: translate("common.cards.form.select"),
124
126
  value: watch("country"),
125
127
  onChange: (value) => setValue("country", value),
126
128
  options: COUNTRIES.map((c) => ({ value: c.iso, label: c.name }))
@@ -130,8 +132,8 @@ function CardFormFields({
130
132
  /* @__PURE__ */ jsx(
131
133
  SelectField,
132
134
  {
133
- label: "Tipo de pessoa",
134
- placeholder: "Selecione",
135
+ label: translate("common.cards.form.personType"),
136
+ placeholder: translate("common.cards.form.select"),
135
137
  value: personType,
136
138
  onChange: (value) => {
137
139
  setValue("personType", value);
@@ -139,8 +141,8 @@ function CardFormFields({
139
141
  setValue("cnpj", "");
140
142
  },
141
143
  options: [
142
- { value: "pf", label: "Pessoa f\xEDsica" },
143
- { value: "pj", label: "Pessoa jur\xEDdica" }
144
+ { value: "pf", label: translate("common.cards.form.personTypePf") },
145
+ { value: "pj", label: translate("common.cards.form.personTypePj") }
144
146
  ],
145
147
  containerClassName: "flex-1"
146
148
  }
@@ -148,7 +150,7 @@ function CardFormFields({
148
150
  /* @__PURE__ */ jsx("div", { className: "flex-1", children: personType === "pj" ? /* @__PURE__ */ jsx(
149
151
  FormField,
150
152
  {
151
- label: "CNPJ",
153
+ label: translate("common.cards.form.cnpj"),
152
154
  placeholder: "__.___.___/____-__",
153
155
  ...register("cnpj", {
154
156
  onChange: (e) => {
@@ -161,7 +163,7 @@ function CardFormFields({
161
163
  ) : /* @__PURE__ */ jsx(
162
164
  FormField,
163
165
  {
164
- label: "CPF",
166
+ label: translate("common.cards.form.cpf"),
165
167
  placeholder: "___.___.___-__",
166
168
  ...register("cpf", {
167
169
  onChange: (e) => {
@@ -176,6 +178,7 @@ function CardFormFields({
176
178
  ] });
177
179
  }
178
180
  function BillingFormFields({ form }) {
181
+ const translate = useTranslations();
179
182
  const {
180
183
  register,
181
184
  setValue,
@@ -200,8 +203,8 @@ function BillingFormFields({ form }) {
200
203
  /* @__PURE__ */ jsx(
201
204
  FormField,
202
205
  {
203
- label: "Nome completo",
204
- placeholder: "Digite aqui",
206
+ label: translate("common.cards.form.fullName"),
207
+ placeholder: translate("common.cards.form.typeHere"),
205
208
  ...register("fullName"),
206
209
  error: !!errors.fullName,
207
210
  errorMessage: errors.fullName?.message
@@ -210,7 +213,7 @@ function BillingFormFields({ form }) {
210
213
  /* @__PURE__ */ jsx(
211
214
  FormField,
212
215
  {
213
- label: "CEP",
216
+ label: translate("common.cards.form.cep"),
214
217
  placeholder: "_____-___",
215
218
  ...register("cep", {
216
219
  onChange: (e) => handleCepChange(e.target.value)
@@ -223,7 +226,7 @@ function BillingFormFields({ form }) {
223
226
  /* @__PURE__ */ jsx("div", { className: "flex-[4]", children: /* @__PURE__ */ jsx(
224
227
  FormField,
225
228
  {
226
- label: "Endere\xE7o",
229
+ label: translate("common.cards.form.street"),
227
230
  placeholder: "",
228
231
  ...register("street"),
229
232
  error: !!errors.street,
@@ -233,7 +236,7 @@ function BillingFormFields({ form }) {
233
236
  /* @__PURE__ */ jsx("div", { className: "flex-[1]", children: /* @__PURE__ */ jsx(
234
237
  FormField,
235
238
  {
236
- label: "N\xFAmero",
239
+ label: translate("common.cards.form.streetNumber"),
237
240
  placeholder: "",
238
241
  ...register("streetNumber"),
239
242
  error: !!errors.streetNumber,
@@ -245,7 +248,7 @@ function BillingFormFields({ form }) {
245
248
  /* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsx(
246
249
  FormField,
247
250
  {
248
- label: "Cidade",
251
+ label: translate("common.cards.form.city"),
249
252
  placeholder: "",
250
253
  ...register("city"),
251
254
  error: !!errors.city,
@@ -255,7 +258,7 @@ function BillingFormFields({ form }) {
255
258
  /* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsx(
256
259
  FormField,
257
260
  {
258
- label: "UF",
261
+ label: translate("common.cards.form.state"),
259
262
  placeholder: "",
260
263
  ...register("state"),
261
264
  error: !!errors.state,
@@ -267,7 +270,7 @@ function BillingFormFields({ form }) {
267
270
  /* @__PURE__ */ jsx(
268
271
  FormField,
269
272
  {
270
- label: "Bairro",
273
+ label: translate("common.cards.form.neighborhood"),
271
274
  placeholder: "",
272
275
  ...register("neighborhood"),
273
276
  error: !!errors.neighborhood,
@@ -277,7 +280,7 @@ function BillingFormFields({ form }) {
277
280
  /* @__PURE__ */ jsx(
278
281
  FormField,
279
282
  {
280
- label: "Complemento",
283
+ label: translate("common.cards.form.complement"),
281
284
  optional: true,
282
285
  placeholder: "",
283
286
  ...register("complement"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/modals/cards/CardFormFields.tsx"],"sourcesContent":["\"use client\";\n\nimport { UseFormReturn } from \"react-hook-form\";\nimport { useViaCep } from \"../../../modules/accounts/hooks/useViaCep\";\nimport { FormField } from \"../../ui/form/FormField\";\nimport { SelectField } from \"../../ui/form/SelectField\";\nimport { COUNTRIES } from \"../../../utils/countries\";\nimport {\n formatCPF,\n formatCNPJ,\n formatPostalCode,\n} from \"../../../utils/format/masks\";\nimport z from \"zod\";\nimport {\n CardCvcElement,\n CardExpiryElement,\n CardNumberElement,\n} from \"@stripe/react-stripe-js\";\n\nconst stripeElementOptions = {\n style: {\n base: {\n fontSize: \"16px\",\n color: \"#030712\",\n fontFamily: \"Inter, sans-serif\",\n \"::placeholder\": {\n color: \"#9ca3af\",\n },\n },\n },\n};\n\nexport const cardFormSchema = z\n .object({\n name: z.string().min(1, \"Nome é obrigatório\"),\n country: z.string().min(1, \"País é obrigatório\"),\n personType: z.enum([\"pf\", \"pj\"]),\n cpf: z.string().optional(),\n cnpj: z.string().optional(),\n fullName: z.string().min(1, \"Nome completo é obrigatório\"),\n cep: z.string().min(9, \"CEP é obrigatório\"),\n street: z.string().min(1, \"Endereço é obrigatório\"),\n streetNumber: z.string().min(1, \"Número é obrigatório\"),\n city: z.string().min(1, \"Cidade é obrigatória\"),\n state: z.string().min(1, \"UF é obrigatório\"),\n neighborhood: z.string().min(1, \"Bairro é obrigatório\"),\n complement: z.string().optional(),\n })\n .refine(\n (data) => {\n if (data.personType === \"pf\") return !!data.cpf && data.cpf.length >= 14;\n return !!data.cnpj && data.cnpj.length >= 18;\n },\n {\n message: \"Documento é obrigatório\",\n path: [\"cpf\"],\n },\n );\n\nexport type CardFormData = z.infer<typeof cardFormSchema>;\n\nexport type StripeElementsStatus = {\n cardNumber: boolean;\n cardExpiry: boolean;\n cardCvc: boolean;\n};\n\nexport const STEP1_FIELDS = [\n \"name\",\n \"country\",\n \"personType\",\n \"cpf\",\n \"cnpj\",\n] as const;\n\ntype CardFormFieldsProps = {\n readonly form: UseFormReturn<CardFormData>;\n readonly onStripeChange: (\n field: keyof StripeElementsStatus,\n complete: boolean,\n ) => void;\n readonly stripeErrors: {\n cardNumber?: string;\n cardExpiry?: string;\n cardCvc?: string;\n };\n};\n\nexport function CardFormFields({\n form,\n onStripeChange,\n stripeErrors,\n}: CardFormFieldsProps) {\n const {\n register,\n watch,\n setValue,\n formState: { errors },\n } = form;\n\n const personType = watch(\"personType\");\n\n return (\n <div className=\"flex flex-col gap-5\">\n <FormField\n label=\"Nome impresso no cartão\"\n placeholder=\"Digite aqui\"\n {...register(\"name\")}\n error={!!errors.name}\n errorMessage={errors.name?.message}\n />\n\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">\n Número do cartão\n </label>\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400 relative\">\n <div className=\"w-full\">\n <CardNumberElement\n options={{ ...stripeElementOptions, showIcon: true }}\n onChange={(e: { complete: boolean }) =>\n onStripeChange(\"cardNumber\", e.complete)\n }\n />\n </div>\n </div>\n {stripeErrors.cardNumber && (\n <p className=\"paragraph-xsmall-semibold text-red-600\">\n {stripeErrors.cardNumber}\n </p>\n )}\n </div>\n\n <div className=\"flex gap-4\">\n <div className=\"flex-1 flex flex-col gap-1.5\">\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">\n Data de validade\n </label>\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400\">\n <div className=\"w-full\">\n <CardExpiryElement\n options={stripeElementOptions}\n onChange={(e: { complete: boolean }) =>\n onStripeChange(\"cardExpiry\", e.complete)\n }\n />\n </div>\n </div>\n {stripeErrors.cardExpiry && (\n <p className=\"paragraph-xsmall-semibold text-red-600\">\n {stripeErrors.cardExpiry}\n </p>\n )}\n </div>\n\n <div className=\"flex-1 flex flex-col gap-1.5\">\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">CVC</label>\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400\">\n <div className=\"w-full\">\n <CardCvcElement\n options={stripeElementOptions}\n onChange={(e: { complete: boolean }) =>\n onStripeChange(\"cardCvc\", e.complete)\n }\n />\n </div>\n </div>\n {stripeErrors.cardCvc && (\n <p className=\"paragraph-xsmall-semibold text-red-600\">\n {stripeErrors.cardCvc}\n </p>\n )}\n </div>\n </div>\n\n <SelectField\n label=\"País\"\n placeholder=\"Selecione\"\n value={watch(\"country\")}\n onChange={(value) => setValue(\"country\", value as string)}\n options={COUNTRIES.map((c) => ({ value: c.iso, label: c.name }))}\n />\n\n <div className=\"flex gap-4\">\n <SelectField\n label=\"Tipo de pessoa\"\n placeholder=\"Selecione\"\n value={personType}\n onChange={(value) => {\n setValue(\"personType\", value as \"pf\" | \"pj\");\n setValue(\"cpf\", \"\");\n setValue(\"cnpj\", \"\");\n }}\n options={[\n { value: \"pf\", label: \"Pessoa física\" },\n { value: \"pj\", label: \"Pessoa jurídica\" },\n ]}\n containerClassName=\"flex-1\"\n />\n <div className=\"flex-1\">\n {personType === \"pj\" ? (\n <FormField\n label=\"CNPJ\"\n placeholder=\"__.___.___/____-__\"\n {...register(\"cnpj\", {\n onChange: (e) => {\n setValue(\"cnpj\", formatCNPJ(e.target.value));\n },\n })}\n error={!!errors.cpf}\n errorMessage={errors.cpf?.message}\n />\n ) : (\n <FormField\n label=\"CPF\"\n placeholder=\"___.___.___-__\"\n {...register(\"cpf\", {\n onChange: (e) => {\n setValue(\"cpf\", formatCPF(e.target.value));\n },\n })}\n error={!!errors.cpf}\n errorMessage={errors.cpf?.message}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\ntype BillingFormFieldsProps = {\n readonly form: UseFormReturn<CardFormData>;\n};\n\nexport function BillingFormFields({ form }: BillingFormFieldsProps) {\n const {\n register,\n setValue,\n formState: { errors },\n } = form;\n\n const { mutateAsync: lookupCep } = useViaCep();\n\n const handleCepChange = (rawValue: string) => {\n const masked = formatPostalCode(rawValue);\n setValue(\"cep\", masked);\n\n const digits = rawValue.replace(/\\D/g, \"\");\n if (digits.length === 8) {\n lookupCep(digits)\n .then((data) => {\n setValue(\"street\", data.logradouro, { shouldValidate: true });\n setValue(\"neighborhood\", data.bairro, { shouldValidate: true });\n setValue(\"city\", data.localidade, { shouldValidate: true });\n setValue(\"state\", data.uf, { shouldValidate: true });\n })\n .catch(() => {\n // silently ignore — user can fill manually\n });\n }\n };\n\n return (\n <div className=\"flex flex-col gap-5\">\n <FormField\n label=\"Nome completo\"\n placeholder=\"Digite aqui\"\n {...register(\"fullName\")}\n error={!!errors.fullName}\n errorMessage={errors.fullName?.message}\n />\n\n <FormField\n label=\"CEP\"\n placeholder=\"_____-___\"\n {...register(\"cep\", {\n onChange: (e) => handleCepChange(e.target.value),\n })}\n error={!!errors.cep}\n errorMessage={errors.cep?.message}\n />\n\n <div className=\"flex gap-4\">\n <div className=\"flex-[4]\">\n <FormField\n label=\"Endereço\"\n placeholder=\"\"\n {...register(\"street\")}\n error={!!errors.street}\n errorMessage={errors.street?.message}\n />\n </div>\n <div className=\"flex-[1]\">\n <FormField\n label=\"Número\"\n placeholder=\"\"\n {...register(\"streetNumber\")}\n error={!!errors.streetNumber}\n errorMessage={errors.streetNumber?.message}\n />\n </div>\n </div>\n\n <div className=\"flex gap-4\">\n <div className=\"flex-1\">\n <FormField\n label=\"Cidade\"\n placeholder=\"\"\n {...register(\"city\")}\n error={!!errors.city}\n errorMessage={errors.city?.message}\n />\n </div>\n <div className=\"flex-1\">\n <FormField\n label=\"UF\"\n placeholder=\"\"\n {...register(\"state\")}\n error={!!errors.state}\n errorMessage={errors.state?.message}\n />\n </div>\n </div>\n\n <div className=\"flex gap-4\">\n <FormField\n label=\"Bairro\"\n placeholder=\"\"\n {...register(\"neighborhood\")}\n error={!!errors.neighborhood}\n errorMessage={errors.neighborhood?.message}\n />\n <FormField\n label=\"Complemento\"\n optional\n placeholder=\"\"\n {...register(\"complement\")}\n error={!!errors.complement}\n errorMessage={errors.complement?.message}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/modals/cards/CardFormFields.tsx"],"sourcesContent":["\"use client\";\n\nimport { UseFormReturn } from \"react-hook-form\";\nimport { useViaCep } from \"../../../modules/accounts/hooks/useViaCep\";\nimport { FormField } from \"../../ui/form/FormField\";\nimport { SelectField } from \"../../ui/form/SelectField\";\nimport { COUNTRIES } from \"../../../utils/countries\";\nimport {\n formatCPF,\n formatCNPJ,\n formatPostalCode,\n} from \"../../../utils/format/masks\";\nimport z from \"zod\";\nimport {\n CardCvcElement,\n CardExpiryElement,\n CardNumberElement,\n} from \"@stripe/react-stripe-js\";\nimport { useTranslations } from \"next-intl\";\n\nconst stripeElementOptions = {\n style: {\n base: {\n fontSize: \"16px\",\n color: \"#030712\",\n fontFamily: \"Inter, sans-serif\",\n \"::placeholder\": {\n color: \"#9ca3af\",\n },\n },\n },\n};\n\nexport const cardFormSchema = z\n .object({\n name: z.string().min(1, \"Nome é obrigatório\"),\n country: z.string().min(1, \"País é obrigatório\"),\n personType: z.enum([\"pf\", \"pj\"]),\n cpf: z.string().optional(),\n cnpj: z.string().optional(),\n fullName: z.string().min(1, \"Nome completo é obrigatório\"),\n cep: z.string().min(9, \"CEP é obrigatório\"),\n street: z.string().min(1, \"Endereço é obrigatório\"),\n streetNumber: z.string().min(1, \"Número é obrigatório\"),\n city: z.string().min(1, \"Cidade é obrigatória\"),\n state: z.string().min(1, \"UF é obrigatório\"),\n neighborhood: z.string().min(1, \"Bairro é obrigatório\"),\n complement: z.string().optional(),\n })\n .refine(\n (data) => {\n if (data.personType === \"pf\") return !!data.cpf && data.cpf.length >= 14;\n return !!data.cnpj && data.cnpj.length >= 18;\n },\n {\n message: \"Documento é obrigatório\",\n path: [\"cpf\"],\n },\n );\n\nexport type CardFormData = z.infer<typeof cardFormSchema>;\n\nexport type StripeElementsStatus = {\n cardNumber: boolean;\n cardExpiry: boolean;\n cardCvc: boolean;\n};\n\nexport const STEP1_FIELDS = [\n \"name\",\n \"country\",\n \"personType\",\n \"cpf\",\n \"cnpj\",\n] as const;\n\ntype CardFormFieldsProps = {\n readonly form: UseFormReturn<CardFormData>;\n readonly onStripeChange: (\n field: keyof StripeElementsStatus,\n complete: boolean,\n ) => void;\n readonly stripeErrors: {\n cardNumber?: string;\n cardExpiry?: string;\n cardCvc?: string;\n };\n};\n\nexport function CardFormFields({\n form,\n onStripeChange,\n stripeErrors,\n}: CardFormFieldsProps) {\n const translate = useTranslations();\n const {\n register,\n watch,\n setValue,\n formState: { errors },\n } = form;\n\n const personType = watch(\"personType\");\n\n return (\n <div className=\"flex flex-col gap-5\">\n <FormField\n label={translate('common.cards.form.nameOnCard')}\n placeholder={translate('common.cards.form.typeHere')}\n {...register(\"name\")}\n error={!!errors.name}\n errorMessage={errors.name?.message}\n />\n\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">\n {translate('common.cards.form.cardNumber')}\n </label>\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400 relative\">\n <div className=\"w-full\">\n <CardNumberElement\n options={{ ...stripeElementOptions, showIcon: true }}\n onChange={(e: { complete: boolean }) =>\n onStripeChange(\"cardNumber\", e.complete)\n }\n />\n </div>\n </div>\n {stripeErrors.cardNumber && (\n <p className=\"paragraph-xsmall-semibold text-red-600\">\n {stripeErrors.cardNumber}\n </p>\n )}\n </div>\n\n <div className=\"flex gap-4\">\n <div className=\"flex-1 flex flex-col gap-1.5\">\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">\n {translate('common.cards.form.cardExpiry')}\n </label>\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400\">\n <div className=\"w-full\">\n <CardExpiryElement\n options={stripeElementOptions}\n onChange={(e: { complete: boolean }) =>\n onStripeChange(\"cardExpiry\", e.complete)\n }\n />\n </div>\n </div>\n {stripeErrors.cardExpiry && (\n <p className=\"paragraph-xsmall-semibold text-red-600\">\n {stripeErrors.cardExpiry}\n </p>\n )}\n </div>\n\n <div className=\"flex-1 flex flex-col gap-1.5\">\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">{translate('common.cards.form.cardCvc')}</label>\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400\">\n <div className=\"w-full\">\n <CardCvcElement\n options={stripeElementOptions}\n onChange={(e: { complete: boolean }) =>\n onStripeChange(\"cardCvc\", e.complete)\n }\n />\n </div>\n </div>\n {stripeErrors.cardCvc && (\n <p className=\"paragraph-xsmall-semibold text-red-600\">\n {stripeErrors.cardCvc}\n </p>\n )}\n </div>\n </div>\n\n <SelectField\n label={translate('common.cards.form.country')}\n placeholder={translate('common.cards.form.select')}\n value={watch(\"country\")}\n onChange={(value) => setValue(\"country\", value as string)}\n options={COUNTRIES.map((c) => ({ value: c.iso, label: c.name }))}\n />\n\n <div className=\"flex gap-4\">\n <SelectField\n label={translate('common.cards.form.personType')}\n placeholder={translate('common.cards.form.select')}\n value={personType}\n onChange={(value) => {\n setValue(\"personType\", value as \"pf\" | \"pj\");\n setValue(\"cpf\", \"\");\n setValue(\"cnpj\", \"\");\n }}\n options={[\n { value: \"pf\", label: translate('common.cards.form.personTypePf') },\n { value: \"pj\", label: translate('common.cards.form.personTypePj') },\n ]}\n containerClassName=\"flex-1\"\n />\n <div className=\"flex-1\">\n {personType === \"pj\" ? (\n <FormField\n label={translate('common.cards.form.cnpj')}\n placeholder=\"__.___.___/____-__\"\n {...register(\"cnpj\", {\n onChange: (e) => {\n setValue(\"cnpj\", formatCNPJ(e.target.value));\n },\n })}\n error={!!errors.cpf}\n errorMessage={errors.cpf?.message}\n />\n ) : (\n <FormField\n label={translate('common.cards.form.cpf')}\n placeholder=\"___.___.___-__\"\n {...register(\"cpf\", {\n onChange: (e) => {\n setValue(\"cpf\", formatCPF(e.target.value));\n },\n })}\n error={!!errors.cpf}\n errorMessage={errors.cpf?.message}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\ntype BillingFormFieldsProps = {\n readonly form: UseFormReturn<CardFormData>;\n};\n\nexport function BillingFormFields({ form }: BillingFormFieldsProps) {\n const translate = useTranslations();\n const {\n register,\n setValue,\n formState: { errors },\n } = form;\n\n const { mutateAsync: lookupCep } = useViaCep();\n\n const handleCepChange = (rawValue: string) => {\n const masked = formatPostalCode(rawValue);\n setValue(\"cep\", masked);\n\n const digits = rawValue.replace(/\\D/g, \"\");\n if (digits.length === 8) {\n lookupCep(digits)\n .then((data) => {\n setValue(\"street\", data.logradouro, { shouldValidate: true });\n setValue(\"neighborhood\", data.bairro, { shouldValidate: true });\n setValue(\"city\", data.localidade, { shouldValidate: true });\n setValue(\"state\", data.uf, { shouldValidate: true });\n })\n .catch(() => {\n // silently ignore — user can fill manually\n });\n }\n };\n\n return (\n <div className=\"flex flex-col gap-5\">\n <FormField\n label={translate('common.cards.form.fullName')}\n placeholder={translate('common.cards.form.typeHere')}\n {...register(\"fullName\")}\n error={!!errors.fullName}\n errorMessage={errors.fullName?.message}\n />\n\n <FormField\n label={translate('common.cards.form.cep')}\n placeholder=\"_____-___\"\n {...register(\"cep\", {\n onChange: (e) => handleCepChange(e.target.value),\n })}\n error={!!errors.cep}\n errorMessage={errors.cep?.message}\n />\n\n <div className=\"flex gap-4\">\n <div className=\"flex-[4]\">\n <FormField\n label={translate('common.cards.form.street')}\n placeholder=\"\"\n {...register(\"street\")}\n error={!!errors.street}\n errorMessage={errors.street?.message}\n />\n </div>\n <div className=\"flex-[1]\">\n <FormField\n label={translate('common.cards.form.streetNumber')}\n placeholder=\"\"\n {...register(\"streetNumber\")}\n error={!!errors.streetNumber}\n errorMessage={errors.streetNumber?.message}\n />\n </div>\n </div>\n\n <div className=\"flex gap-4\">\n <div className=\"flex-1\">\n <FormField\n label={translate('common.cards.form.city')}\n placeholder=\"\"\n {...register(\"city\")}\n error={!!errors.city}\n errorMessage={errors.city?.message}\n />\n </div>\n <div className=\"flex-1\">\n <FormField\n label={translate('common.cards.form.state')}\n placeholder=\"\"\n {...register(\"state\")}\n error={!!errors.state}\n errorMessage={errors.state?.message}\n />\n </div>\n </div>\n\n <div className=\"flex gap-4\">\n <FormField\n label={translate('common.cards.form.neighborhood')}\n placeholder=\"\"\n {...register(\"neighborhood\")}\n error={!!errors.neighborhood}\n errorMessage={errors.neighborhood?.message}\n />\n <FormField\n label={translate('common.cards.form.complement')}\n optional\n placeholder=\"\"\n {...register(\"complement\")}\n error={!!errors.complement}\n errorMessage={errors.complement?.message}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -17,7 +17,9 @@ import { useModalManager } from "../../../store/useModalManager";
17
17
  import { useDeleteConfirmation } from "../../../modules/cards/hooks/delete-confirmation.hook";
18
18
  import { useDeleteCard } from "../../../modules/cards/hooks/delete-card.hook";
19
19
  import { useCards } from "../../../modules/cards/hooks/cards.hook";
20
+ import { useTranslations } from "next-intl";
20
21
  function DeleteCardModal() {
22
+ const translate = useTranslations();
21
23
  const { activeModal, modalData, closeModal } = useModalManager();
22
24
  const { form, isValidConfirmation, resetConfirmation } = useDeleteConfirmation();
23
25
  const deleteCard = useDeleteCard();
@@ -42,7 +44,7 @@ function DeleteCardModal() {
42
44
  {
43
45
  toastId: t,
44
46
  variant: "error",
45
- message: error instanceof Error ? error.message : "N\xE3o foi poss\xEDvel excluir o cart\xE3o"
47
+ message: error instanceof Error ? error.message : translate("common.cards.delete.errorToast")
46
48
  }
47
49
  ),
48
50
  { duration: 5e3 }
@@ -57,7 +59,7 @@ function DeleteCardModal() {
57
59
  Toast,
58
60
  {
59
61
  variant: "success",
60
- message: `O cart\xE3o \u2022\u2022\u2022\u2022 ${cardLastDigits} foi exclu\xEDdo com sucesso`,
62
+ message: translate("common.cards.delete.successToast", { digits: cardLastDigits }),
61
63
  toastId: t
62
64
  }
63
65
  ),
@@ -68,9 +70,9 @@ function DeleteCardModal() {
68
70
  /* @__PURE__ */ jsxs(DialogHeader, { className: "gap-4 text-left p-4 lg:p-5 pb-0 lg:pb-0", children: [
69
71
  /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center w-fit bg-red-50 rounded-lg p-2.5", children: /* @__PURE__ */ jsx(IconTrash, { size: 20, className: "text-red-500" }) }),
70
72
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
71
- /* @__PURE__ */ jsx(DialogTitle, { className: "paragraph-medium-semibold text-zinc-950", children: "Excluir cart\xE3o" }),
73
+ /* @__PURE__ */ jsx(DialogTitle, { className: "paragraph-medium-semibold text-zinc-950", children: translate("common.cards.delete.title") }),
72
74
  /* @__PURE__ */ jsxs(DialogDescription, { className: "paragraph-small-regular text-zinc-600", children: [
73
- "Deseja realmente excluir o cart\xE3o:",
75
+ translate("common.cards.delete.description"),
74
76
  " ",
75
77
  /* @__PURE__ */ jsxs("span", { className: "font-semibold text-zinc-950", children: [
76
78
  "\u2022\u2022\u2022\u2022 ",
@@ -83,9 +85,9 @@ function DeleteCardModal() {
83
85
  /* @__PURE__ */ jsx("div", { className: "px-4 lg:px-5 py-5", children: /* @__PURE__ */ jsx(
84
86
  FormField,
85
87
  {
86
- label: "Digite EXCLUIR abaixo",
88
+ label: translate("common.cards.delete.confirmLabel"),
87
89
  required: true,
88
- placeholder: "EXCLUIR",
90
+ placeholder: translate("common.cards.delete.confirmPlaceholder"),
89
91
  ...form.register("confirmText")
90
92
  }
91
93
  ) }),
@@ -98,7 +100,7 @@ function DeleteCardModal() {
98
100
  disabled: !isValidConfirmation,
99
101
  loading: form.formState.isSubmitting,
100
102
  className: "h-10!",
101
- children: form.formState.isSubmitting ? "Excluindo..." : "Excluir"
103
+ children: form.formState.isSubmitting ? translate("common.cards.delete.deleting") : translate("common.actions.delete")
102
104
  }
103
105
  ),
104
106
  /* @__PURE__ */ jsx(
@@ -109,7 +111,7 @@ function DeleteCardModal() {
109
111
  className: "h-10!",
110
112
  onClick: handleClose,
111
113
  disabled: form.formState.isSubmitting,
112
- children: "Cancelar"
114
+ children: translate("common.actions.cancel")
113
115
  }
114
116
  )
115
117
  ] })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/modals/cards/DeleteCardModal.tsx"],"sourcesContent":["'use client';\n\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from '../../ui/overlay/Dialog';\nimport { Button } from '../../ui/buttons/Button';\nimport { Separator } from '../../ui/data-display/Separator';\nimport { Toast } from '../../ui/feedback/Toast';\nimport { FormField } from '../../ui/form/FormField';\nimport { IconTrash } from '@tabler/icons-react';\nimport { toast } from 'sonner';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useDeleteConfirmation } from '../../../modules/cards/hooks/delete-confirmation.hook';\nimport { useDeleteCard } from '../../../modules/cards/hooks/delete-card.hook';\nimport { useCards } from '../../../modules/cards/hooks/cards.hook';\n\nexport function DeleteCardModal() {\n const { activeModal, modalData, closeModal } = useModalManager();\n const { form, isValidConfirmation, resetConfirmation } = useDeleteConfirmation();\n const deleteCard = useDeleteCard();\n const { data: cardsData } = useCards();\n\n const isOpen = activeModal === 'deleteCardModal';\n const cardId = modalData.cardId as string | undefined;\n const onSuccess = modalData.onSuccess as (() => void) | undefined;\n\n const card = cardsData?.data?.find((c) => c.id.toString() === cardId);\n const cardLastDigits = (card?.number ?? '').replaceAll(/\\D/g, '').slice(-4);\n\n const handleClose = () => {\n resetConfirmation();\n closeModal();\n };\n\n const onSubmit = async () => {\n if (!cardId) return;\n\n try {\n await deleteCard.mutateAsync(cardId);\n } catch (error) {\n toast.custom(\n (t) => (\n <Toast\n toastId={t}\n variant=\"error\"\n message={\n error instanceof Error\n ? error.message\n : 'Não foi possível excluir o cartão'\n }\n />\n ),\n { duration: 5000 },\n );\n return;\n }\n\n onSuccess?.();\n resetConfirmation();\n closeModal();\n\n toast.custom(\n (t) => (\n <Toast\n variant=\"success\"\n message={`O cartão •••• ${cardLastDigits} foi excluído com sucesso`}\n toastId={t}\n />\n ),\n { duration: 5000 },\n );\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"flex flex-col p-0! gap-0! max-w-[calc(100%-2rem)]! w-full sm:max-w-[400px]! lg:max-w-[410px]! rounded-lg border\">\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"flex flex-col\">\n <DialogHeader className=\"gap-4 text-left p-4 lg:p-5 pb-0 lg:pb-0\">\n <div className=\"flex items-center justify-center w-fit bg-red-50 rounded-lg p-2.5\">\n <IconTrash size={20} className=\"text-red-500\" />\n </div>\n <div className=\"flex flex-col gap-2\">\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950\">\n Excluir cartão\n </DialogTitle>\n <DialogDescription className=\"paragraph-small-regular text-zinc-600\">\n Deseja realmente excluir o cartão:{' '}\n <span className=\"font-semibold text-zinc-950\">\n •••• {cardLastDigits}\n </span>\n ?\n </DialogDescription>\n </div>\n </DialogHeader>\n\n <div className=\"px-4 lg:px-5 py-5\">\n <FormField\n label=\"Digite EXCLUIR abaixo\"\n required\n placeholder=\"EXCLUIR\"\n {...form.register('confirmText')}\n />\n </div>\n <Separator />\n <div className=\"flex flex-row items-center gap-2 p-4 lg:p-5\">\n <Button\n type=\"submit\"\n disabled={!isValidConfirmation}\n loading={form.formState.isSubmitting}\n className=\"h-10!\"\n >\n {form.formState.isSubmitting ? 'Excluindo...' : 'Excluir'}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"h-10!\"\n onClick={handleClose}\n disabled={form.formState.isSubmitting}\n >\n Cancelar\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/modals/cards/DeleteCardModal.tsx"],"sourcesContent":["'use client';\n\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from '../../ui/overlay/Dialog';\nimport { Button } from '../../ui/buttons/Button';\nimport { Separator } from '../../ui/data-display/Separator';\nimport { Toast } from '../../ui/feedback/Toast';\nimport { FormField } from '../../ui/form/FormField';\nimport { IconTrash } from '@tabler/icons-react';\nimport { toast } from 'sonner';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useDeleteConfirmation } from '../../../modules/cards/hooks/delete-confirmation.hook';\nimport { useDeleteCard } from '../../../modules/cards/hooks/delete-card.hook';\nimport { useCards } from '../../../modules/cards/hooks/cards.hook';\nimport { useTranslations } from 'next-intl';\n\nexport function DeleteCardModal() {\n const translate = useTranslations();\n const { activeModal, modalData, closeModal } = useModalManager();\n const { form, isValidConfirmation, resetConfirmation } = useDeleteConfirmation();\n const deleteCard = useDeleteCard();\n const { data: cardsData } = useCards();\n\n const isOpen = activeModal === 'deleteCardModal';\n const cardId = modalData.cardId as string | undefined;\n const onSuccess = modalData.onSuccess as (() => void) | undefined;\n\n const card = cardsData?.data?.find((c) => c.id.toString() === cardId);\n const cardLastDigits = (card?.number ?? '').replaceAll(/\\D/g, '').slice(-4);\n\n const handleClose = () => {\n resetConfirmation();\n closeModal();\n };\n\n const onSubmit = async () => {\n if (!cardId) return;\n\n try {\n await deleteCard.mutateAsync(cardId);\n } catch (error) {\n toast.custom(\n (t) => (\n <Toast\n toastId={t}\n variant=\"error\"\n message={\n error instanceof Error\n ? error.message\n : translate('common.cards.delete.errorToast')\n }\n />\n ),\n { duration: 5000 },\n );\n return;\n }\n\n onSuccess?.();\n resetConfirmation();\n closeModal();\n\n toast.custom(\n (t) => (\n <Toast\n variant=\"success\"\n message={translate('common.cards.delete.successToast', { digits: cardLastDigits })}\n toastId={t}\n />\n ),\n { duration: 5000 },\n );\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"flex flex-col p-0! gap-0! max-w-[calc(100%-2rem)]! w-full sm:max-w-[400px]! lg:max-w-[410px]! rounded-lg border\">\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"flex flex-col\">\n <DialogHeader className=\"gap-4 text-left p-4 lg:p-5 pb-0 lg:pb-0\">\n <div className=\"flex items-center justify-center w-fit bg-red-50 rounded-lg p-2.5\">\n <IconTrash size={20} className=\"text-red-500\" />\n </div>\n <div className=\"flex flex-col gap-2\">\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950\">\n {translate('common.cards.delete.title')}\n </DialogTitle>\n <DialogDescription className=\"paragraph-small-regular text-zinc-600\">\n {translate('common.cards.delete.description')}{' '}\n <span className=\"font-semibold text-zinc-950\">\n •••• {cardLastDigits}\n </span>\n ?\n </DialogDescription>\n </div>\n </DialogHeader>\n\n <div className=\"px-4 lg:px-5 py-5\">\n <FormField\n label={translate('common.cards.delete.confirmLabel')}\n required\n placeholder={translate('common.cards.delete.confirmPlaceholder')}\n {...form.register('confirmText')}\n />\n </div>\n <Separator />\n <div className=\"flex flex-row items-center gap-2 p-4 lg:p-5\">\n <Button\n type=\"submit\"\n disabled={!isValidConfirmation}\n loading={form.formState.isSubmitting}\n className=\"h-10!\"\n >\n {form.formState.isSubmitting ? translate('common.cards.delete.deleting') : translate('common.actions.delete')}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"h-10!\"\n onClick={handleClose}\n disabled={form.formState.isSubmitting}\n >\n {translate('common.actions.cancel')}\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
@@ -5,7 +5,9 @@ import { IconAlertOctagon, IconX } from "@tabler/icons-react";
5
5
  import { useActiveSubscription } from "../../modules/subscriptions/hooks/find-active-subscription.hook";
6
6
  import { toCalendarDate } from "../../infra/utils/date";
7
7
  import { getSubscriptionExpiryDate } from "../../modules/subscriptions/utils/get-subscription-expiry-date";
8
+ import { useTranslations } from "next-intl";
8
9
  function CancelledSubscriptionBanner({ onReactivate }) {
10
+ const translate = useTranslations();
9
11
  const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();
10
12
  const [visible, setVisible] = useState(true);
11
13
  const [animated, setAnimated] = useState(false);
@@ -27,7 +29,7 @@ function CancelledSubscriptionBanner({ onReactivate }) {
27
29
  children: [
28
30
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-1 w-full sm:w-auto", children: [
29
31
  /* @__PURE__ */ jsx(IconAlertOctagon, { size: 16, className: "text-white shrink-0" }),
30
- /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-white", children: "Assinatura cancelada! Suas p\xE1ginas foram retiradas do ar." })
32
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-white", children: translate("common.navigation.banners.cancelled.message") })
31
33
  ] }),
32
34
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start", children: [
33
35
  /* @__PURE__ */ jsx(
@@ -36,7 +38,7 @@ function CancelledSubscriptionBanner({ onReactivate }) {
36
38
  type: "button",
37
39
  className: "flex items-center justify-center p-1.5 cursor-pointer",
38
40
  onClick: onReactivate,
39
- children: /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-white underline", children: "Escolher um novo plano" })
41
+ children: /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-white underline", children: translate("common.navigation.banners.cancelled.choosePlan") })
40
42
  }
41
43
  ),
42
44
  /* @__PURE__ */ jsx("button", { type: "button", className: "cursor-pointer shrink-0", onClick: dismiss, children: /* @__PURE__ */ jsx(IconX, { size: 18, className: "text-red-200" }) })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/navigation/CancelledSubscriptionBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { IconAlertOctagon, IconX } from '@tabler/icons-react';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\nimport { toCalendarDate } from '../../infra/utils/date';\nimport { getSubscriptionExpiryDate } from '../../modules/subscriptions/utils/get-subscription-expiry-date';\n\ninterface CancelledSubscriptionBannerProps {\n onReactivate?: () => void;\n}\n\nexport function CancelledSubscriptionBanner({ onReactivate }: CancelledSubscriptionBannerProps) {\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n const [visible, setVisible] = useState(true);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => setAnimated(true), 50);\n return () => clearTimeout(timer);\n }, []);\n\n const dismiss = useCallback(() => setVisible(false), []);\n\n if (!visible) return null;\n if (subscription?.type === 'free' || subscription?.type === 'trial') return null;\n\n const today = toCalendarDate(new Date());\n const expiryDate = getSubscriptionExpiryDate(subscription);\n\n // Só mostra se há cancelamento E o período (com grace, no caso de client) já terminou.\n if (!today || !expiryDate || !subscription?.date_cancellation) return null;\n if (today.getTime() < expiryDate.getTime()) return null;\n\n return (\n <div className=\"fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0\">\n <div\n className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-red-500 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}\n >\n <div className=\"flex items-center gap-2 flex-1 w-full sm:w-auto\">\n <IconAlertOctagon size={16} className=\"text-white shrink-0\" />\n <span className=\"paragraph-xsmall-semibold text-white\">\n Assinatura cancelada! Suas páginas foram retiradas do ar.\n </span>\n </div>\n <div className=\"flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center p-1.5 cursor-pointer\"\n onClick={onReactivate}\n >\n <span className=\"paragraph-xsmall-semibold text-white underline\">\n Escolher um novo plano\n </span>\n </button>\n <button type=\"button\" className=\"cursor-pointer shrink-0\" onClick={dismiss}>\n <IconX size={18} className=\"text-red-200\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AAuCQ,SACE,KADF;AArCR,SAAS,UAAU,WAAW,mBAAmB;AACjD,SAAS,kBAAkB,aAAa;AACxC,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAC/B,SAAS,iCAAiC;AAMnC,SAAS,4BAA4B,EAAE,aAAa,GAAqC;AAC9F,QAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,sBAAsB;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,YAAY,IAAI,GAAG,EAAE;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,CAAC;AAEvD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,cAAc,SAAS,UAAU,cAAc,SAAS,QAAS,QAAO;AAE5E,QAAM,QAAQ,eAAe,oBAAI,KAAK,CAAC;AACvC,QAAM,aAAa,0BAA0B,YAAY;AAGzD,MAAI,CAAC,SAAS,CAAC,cAAc,CAAC,cAAc,kBAAmB,QAAO;AACtE,MAAI,MAAM,QAAQ,IAAI,WAAW,QAAQ,EAAG,QAAO;AAEnD,SACE,oBAAC,SAAI,WAAU,wGACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,8NAA8N,WAAW,mCAAmC,mBAAmB;AAAA,MAE1S;AAAA,6BAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,oBAAiB,MAAM,IAAI,WAAU,uBAAsB;AAAA,UAC5D,oBAAC,UAAK,WAAU,wCAAuC,0EAEvD;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,+EACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAET,8BAAC,UAAK,WAAU,kDAAiD,oCAEjE;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SACjE,8BAAC,SAAM,MAAM,IAAI,WAAU,gBAAe,GAC5C;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/navigation/CancelledSubscriptionBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { IconAlertOctagon, IconX } from '@tabler/icons-react';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\nimport { toCalendarDate } from '../../infra/utils/date';\nimport { getSubscriptionExpiryDate } from '../../modules/subscriptions/utils/get-subscription-expiry-date';\nimport { useTranslations } from 'next-intl';\n\ninterface CancelledSubscriptionBannerProps {\n onReactivate?: () => void;\n}\n\nexport function CancelledSubscriptionBanner({ onReactivate }: CancelledSubscriptionBannerProps) {\n const translate = useTranslations();\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n const [visible, setVisible] = useState(true);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => setAnimated(true), 50);\n return () => clearTimeout(timer);\n }, []);\n\n const dismiss = useCallback(() => setVisible(false), []);\n\n if (!visible) return null;\n if (subscription?.type === 'free' || subscription?.type === 'trial') return null;\n\n const today = toCalendarDate(new Date());\n const expiryDate = getSubscriptionExpiryDate(subscription);\n\n // Só mostra se há cancelamento E o período (com grace, no caso de client) já terminou.\n if (!today || !expiryDate || !subscription?.date_cancellation) return null;\n if (today.getTime() < expiryDate.getTime()) return null;\n\n return (\n <div className=\"fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0\">\n <div\n className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-red-500 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}\n >\n <div className=\"flex items-center gap-2 flex-1 w-full sm:w-auto\">\n <IconAlertOctagon size={16} className=\"text-white shrink-0\" />\n <span className=\"paragraph-xsmall-semibold text-white\">\n {translate('common.navigation.banners.cancelled.message')}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center p-1.5 cursor-pointer\"\n onClick={onReactivate}\n >\n <span className=\"paragraph-xsmall-semibold text-white underline\">\n {translate('common.navigation.banners.cancelled.choosePlan')}\n </span>\n </button>\n <button type=\"button\" className=\"cursor-pointer shrink-0\" onClick={dismiss}>\n <IconX size={18} className=\"text-red-200\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AAyCQ,SACE,KADF;AAvCR,SAAS,UAAU,WAAW,mBAAmB;AACjD,SAAS,kBAAkB,aAAa;AACxC,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAC/B,SAAS,iCAAiC;AAC1C,SAAS,uBAAuB;AAMzB,SAAS,4BAA4B,EAAE,aAAa,GAAqC;AAC9F,QAAM,YAAY,gBAAgB;AAClC,QAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,sBAAsB;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,YAAY,IAAI,GAAG,EAAE;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,CAAC;AAEvD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,cAAc,SAAS,UAAU,cAAc,SAAS,QAAS,QAAO;AAE5E,QAAM,QAAQ,eAAe,oBAAI,KAAK,CAAC;AACvC,QAAM,aAAa,0BAA0B,YAAY;AAGzD,MAAI,CAAC,SAAS,CAAC,cAAc,CAAC,cAAc,kBAAmB,QAAO;AACtE,MAAI,MAAM,QAAQ,IAAI,WAAW,QAAQ,EAAG,QAAO;AAEnD,SACE,oBAAC,SAAI,WAAU,wGACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,8NAA8N,WAAW,mCAAmC,mBAAmB;AAAA,MAE1S;AAAA,6BAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,oBAAiB,MAAM,IAAI,WAAU,uBAAsB;AAAA,UAC5D,oBAAC,UAAK,WAAU,wCACb,oBAAU,6CAA6C,GAC1D;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,+EACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAET,8BAAC,UAAK,WAAU,kDACb,oBAAU,gDAAgD,GAC7D;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SACjE,8BAAC,SAAM,MAAM,IAAI,WAAU,gBAAe,GAC5C;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
@@ -2,7 +2,9 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState, useEffect, useCallback } from "react";
4
4
  import { IconAlertTriangle, IconX } from "@tabler/icons-react";
5
+ import { useTranslations } from "next-intl";
5
6
  function OverdueInvoiceBanner({ onDetails }) {
7
+ const translate = useTranslations();
6
8
  const [visible, setVisible] = useState(true);
7
9
  const [animated, setAnimated] = useState(false);
8
10
  useEffect(() => {
@@ -18,7 +20,7 @@ function OverdueInvoiceBanner({ onDetails }) {
18
20
  children: [
19
21
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-1 w-full sm:w-auto", children: [
20
22
  /* @__PURE__ */ jsx(IconAlertTriangle, { size: 16, className: "text-white shrink-0" }),
21
- /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-white", children: "Sua assinatura est\xE1 atrasada e suas p\xE1ginas podem ser retiradas do ar a qualquer momento." })
23
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-white", children: translate("common.navigation.banners.overdue.message") })
22
24
  ] }),
23
25
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start", children: [
24
26
  /* @__PURE__ */ jsx(
@@ -27,7 +29,7 @@ function OverdueInvoiceBanner({ onDetails }) {
27
29
  type: "button",
28
30
  className: "flex items-center justify-center p-1.5 cursor-pointer",
29
31
  onClick: onDetails,
30
- children: /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-white underline", children: "Detalhes" })
32
+ children: /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-white underline", children: translate("common.navigation.banners.overdue.details") })
31
33
  }
32
34
  ),
33
35
  /* @__PURE__ */ jsx("button", { type: "button", className: "cursor-pointer shrink-0", onClick: dismiss, children: /* @__PURE__ */ jsx(IconX, { size: 18, className: "text-orange-200" }) })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/navigation/OverdueInvoiceBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { IconAlertTriangle, IconX } from '@tabler/icons-react';\n\ninterface OverdueInvoiceBannerProps {\n onDetails?: () => void;\n}\n\nexport function OverdueInvoiceBanner({ onDetails }: OverdueInvoiceBannerProps) {\n const [visible, setVisible] = useState(true);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => setAnimated(true), 50);\n return () => clearTimeout(timer);\n }, []);\n\n const dismiss = useCallback(() => setVisible(false), []);\n\n if (!visible) return null;\n\n return (\n <div className=\"fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0\">\n <div\n className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-orange-500 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}\n >\n <div className=\"flex items-center gap-2 flex-1 w-full sm:w-auto\">\n <IconAlertTriangle size={16} className=\"text-white shrink-0\" />\n <span className=\"paragraph-xsmall-semibold text-white\">\n Sua assinatura está atrasada e suas páginas podem ser retiradas do ar a qualquer momento.\n </span>\n </div>\n <div className=\"flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center p-1.5 cursor-pointer\"\n onClick={onDetails}\n >\n <span className=\"paragraph-xsmall-semibold text-white underline\">Detalhes</span>\n </button>\n <button type=\"button\" className=\"cursor-pointer shrink-0\" onClick={dismiss}>\n <IconX size={18} className=\"text-orange-200\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AA2BQ,SACE,KADF;AAzBR,SAAS,UAAU,WAAW,mBAAmB;AACjD,SAAS,mBAAmB,aAAa;AAMlC,SAAS,qBAAqB,EAAE,UAAU,GAA8B;AAC7E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,YAAY,IAAI,GAAG,EAAE;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,CAAC;AAEvD,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,oBAAC,SAAI,WAAU,wGACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,iOAAiO,WAAW,mCAAmC,mBAAmB;AAAA,MAE7S;AAAA,6BAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,qBAAkB,MAAM,IAAI,WAAU,uBAAsB;AAAA,UAC7D,oBAAC,UAAK,WAAU,wCAAuC,6GAEvD;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,+EACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAET,8BAAC,UAAK,WAAU,kDAAiD,sBAAQ;AAAA;AAAA,UAC3E;AAAA,UACA,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SACjE,8BAAC,SAAM,MAAM,IAAI,WAAU,mBAAkB,GAC/C;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/navigation/OverdueInvoiceBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { IconAlertTriangle, IconX } from '@tabler/icons-react';\nimport { useTranslations } from 'next-intl';\n\ninterface OverdueInvoiceBannerProps {\n onDetails?: () => void;\n}\n\nexport function OverdueInvoiceBanner({ onDetails }: OverdueInvoiceBannerProps) {\n const translate = useTranslations();\n const [visible, setVisible] = useState(true);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => setAnimated(true), 50);\n return () => clearTimeout(timer);\n }, []);\n\n const dismiss = useCallback(() => setVisible(false), []);\n\n if (!visible) return null;\n\n return (\n <div className=\"fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0\">\n <div\n className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-orange-500 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}\n >\n <div className=\"flex items-center gap-2 flex-1 w-full sm:w-auto\">\n <IconAlertTriangle size={16} className=\"text-white shrink-0\" />\n <span className=\"paragraph-xsmall-semibold text-white\">\n {translate('common.navigation.banners.overdue.message')}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center p-1.5 cursor-pointer\"\n onClick={onDetails}\n >\n <span className=\"paragraph-xsmall-semibold text-white underline\">{translate('common.navigation.banners.overdue.details')}</span>\n </button>\n <button type=\"button\" className=\"cursor-pointer shrink-0\" onClick={dismiss}>\n <IconX size={18} className=\"text-orange-200\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AA6BQ,SACE,KADF;AA3BR,SAAS,UAAU,WAAW,mBAAmB;AACjD,SAAS,mBAAmB,aAAa;AACzC,SAAS,uBAAuB;AAMzB,SAAS,qBAAqB,EAAE,UAAU,GAA8B;AAC7E,QAAM,YAAY,gBAAgB;AAClC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,YAAY,IAAI,GAAG,EAAE;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,CAAC;AAEvD,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,oBAAC,SAAI,WAAU,wGACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,iOAAiO,WAAW,mCAAmC,mBAAmB;AAAA,MAE7S;AAAA,6BAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,qBAAkB,MAAM,IAAI,WAAU,uBAAsB;AAAA,UAC7D,oBAAC,UAAK,WAAU,wCACb,oBAAU,2CAA2C,GACxD;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,+EACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAET,8BAAC,UAAK,WAAU,kDAAkD,oBAAU,2CAA2C,GAAE;AAAA;AAAA,UAC3H;AAAA,UACA,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SACjE,8BAAC,SAAM,MAAM,IAAI,WAAU,mBAAkB,GAC/C;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
@@ -3,10 +3,12 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState, useEffect, useCallback } from "react";
4
4
  import { IconAlertTriangle, IconX } from "@tabler/icons-react";
5
5
  import { formatShortDate } from "../../infra/utils/date";
6
+ import { useTranslations } from "next-intl";
6
7
  function PendingCancellationBanner({
7
8
  limitDate,
8
9
  onReactivate
9
10
  }) {
11
+ const translate = useTranslations();
10
12
  const [visible, setVisible] = useState(true);
11
13
  const [animated, setAnimated] = useState(false);
12
14
  useEffect(() => {
@@ -23,11 +25,7 @@ function PendingCancellationBanner({
23
25
  children: [
24
26
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-1 w-full sm:w-auto", children: [
25
27
  /* @__PURE__ */ jsx(IconAlertTriangle, { size: 16, className: "text-zinc-950 shrink-0" }),
26
- /* @__PURE__ */ jsxs("span", { className: "paragraph-xsmall-semibold text-zinc-950", children: [
27
- "Sua assinatura foi cancelada, voc\xEA possui at\xE9 ",
28
- formattedLimitDate,
29
- " com suas p\xE1ginas online."
30
- ] })
28
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-zinc-950", children: translate("common.navigation.banners.pending.message", { limitDate: formattedLimitDate ?? "" }) })
31
29
  ] }),
32
30
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start", children: [
33
31
  /* @__PURE__ */ jsx(
@@ -36,7 +34,7 @@ function PendingCancellationBanner({
36
34
  type: "button",
37
35
  className: "flex items-center justify-center p-1.5 cursor-pointer",
38
36
  onClick: onReactivate,
39
- children: /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-zinc-950 underline", children: "Reativar assinatura" })
37
+ children: /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-zinc-950 underline", children: translate("common.navigation.banners.pending.reactivate") })
40
38
  }
41
39
  ),
42
40
  /* @__PURE__ */ jsx("button", { type: "button", className: "cursor-pointer shrink-0", onClick: dismiss, children: /* @__PURE__ */ jsx(IconX, { size: 18, className: "text-zinc-700" }) })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/navigation/PendingCancellationBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { IconAlertTriangle, IconX } from '@tabler/icons-react';\nimport { formatShortDate } from '../../infra/utils/date';\n\ninterface PendingCancellationBannerProps {\n limitDate?: Date | null;\n onReactivate?: () => void;\n}\n\nexport function PendingCancellationBanner({\n limitDate,\n onReactivate,\n}: PendingCancellationBannerProps) {\n const [visible, setVisible] = useState(true);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => setAnimated(true), 50);\n return () => clearTimeout(timer);\n }, []);\n\n const dismiss = useCallback(() => setVisible(false), []);\n\n if (!visible) return null;\n\n const formattedLimitDate = formatShortDate(limitDate);\n\n return (\n <div className=\"fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0\">\n <div\n className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-yellow-400 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}\n >\n <div className=\"flex items-center gap-2 flex-1 w-full sm:w-auto\">\n <IconAlertTriangle size={16} className=\"text-zinc-950 shrink-0\" />\n <span className=\"paragraph-xsmall-semibold text-zinc-950\">\n Sua assinatura foi cancelada, você possui até {formattedLimitDate} com suas páginas online.\n </span>\n </div>\n <div className=\"flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center p-1.5 cursor-pointer\"\n onClick={onReactivate}\n >\n <span className=\"paragraph-xsmall-semibold text-zinc-950 underline\">\n Reativar assinatura\n </span>\n </button>\n <button type=\"button\" className=\"cursor-pointer shrink-0\" onClick={dismiss}>\n <IconX size={18} className=\"text-zinc-700\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AAmCU,cACA,YADA;AAjCV,SAAS,UAAU,WAAW,mBAAmB;AACjD,SAAS,mBAAmB,aAAa;AACzC,SAAS,uBAAuB;AAOzB,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,YAAY,IAAI,GAAG,EAAE;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,CAAC;AAEvD,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,qBAAqB,gBAAgB,SAAS;AAEpD,SACE,oBAAC,SAAI,WAAU,wGACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,iOAAiO,WAAW,mCAAmC,mBAAmB;AAAA,MAE7S;AAAA,6BAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,qBAAkB,MAAM,IAAI,WAAU,0BAAyB;AAAA,UAChE,qBAAC,UAAK,WAAU,2CAA0C;AAAA;AAAA,YACT;AAAA,YAAmB;AAAA,aACpE;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,+EACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAET,8BAAC,UAAK,WAAU,qDAAoD,iCAEpE;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SACjE,8BAAC,SAAM,MAAM,IAAI,WAAU,iBAAgB,GAC7C;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/navigation/PendingCancellationBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { IconAlertTriangle, IconX } from '@tabler/icons-react';\nimport { formatShortDate } from '../../infra/utils/date';\nimport { useTranslations } from 'next-intl';\n\ninterface PendingCancellationBannerProps {\n limitDate?: Date | null;\n onReactivate?: () => void;\n}\n\nexport function PendingCancellationBanner({\n limitDate,\n onReactivate,\n}: PendingCancellationBannerProps) {\n const translate = useTranslations();\n const [visible, setVisible] = useState(true);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => setAnimated(true), 50);\n return () => clearTimeout(timer);\n }, []);\n\n const dismiss = useCallback(() => setVisible(false), []);\n\n if (!visible) return null;\n\n const formattedLimitDate = formatShortDate(limitDate);\n\n return (\n <div className=\"fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0\">\n <div\n className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-yellow-400 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}\n >\n <div className=\"flex items-center gap-2 flex-1 w-full sm:w-auto\">\n <IconAlertTriangle size={16} className=\"text-zinc-950 shrink-0\" />\n <span className=\"paragraph-xsmall-semibold text-zinc-950\">\n {translate('common.navigation.banners.pending.message', { limitDate: formattedLimitDate ?? '' })}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center p-1.5 cursor-pointer\"\n onClick={onReactivate}\n >\n <span className=\"paragraph-xsmall-semibold text-zinc-950 underline\">\n {translate('common.navigation.banners.pending.reactivate')}\n </span>\n </button>\n <button type=\"button\" className=\"cursor-pointer shrink-0\" onClick={dismiss}>\n <IconX size={18} className=\"text-zinc-700\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AAoCQ,SACE,KADF;AAlCR,SAAS,UAAU,WAAW,mBAAmB;AACjD,SAAS,mBAAmB,aAAa;AACzC,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAOzB,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,YAAY,gBAAgB;AAClC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,YAAY,IAAI,GAAG,EAAE;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,CAAC;AAEvD,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,qBAAqB,gBAAgB,SAAS;AAEpD,SACE,oBAAC,SAAI,WAAU,wGACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,iOAAiO,WAAW,mCAAmC,mBAAmB;AAAA,MAE7S;AAAA,6BAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,qBAAkB,MAAM,IAAI,WAAU,0BAAyB;AAAA,UAChE,oBAAC,UAAK,WAAU,2CACb,oBAAU,6CAA6C,EAAE,WAAW,sBAAsB,GAAG,CAAC,GACjG;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,+EACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAET,8BAAC,UAAK,WAAU,qDACb,oBAAU,8CAA8C,GAC3D;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SACjE,8BAAC,SAAM,MAAM,IAAI,WAAU,iBAAgB,GAC7C;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}