@greatapps/common 1.1.806 → 1.1.808

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 (34) hide show
  1. package/dist/components/account/sections/affiliates/ReceivingAccountModal.mjs +56 -18
  2. package/dist/components/account/sections/affiliates/ReceivingAccountModal.mjs.map +1 -1
  3. package/dist/components/account/sections/affiliates/RequestWithdrawalSheet.mjs +30 -3
  4. package/dist/components/account/sections/affiliates/RequestWithdrawalSheet.mjs.map +1 -1
  5. package/dist/i18n/messages/en-us.mjs +9 -1
  6. package/dist/i18n/messages/en-us.mjs.map +1 -1
  7. package/dist/i18n/messages/es-es.mjs +9 -1
  8. package/dist/i18n/messages/es-es.mjs.map +1 -1
  9. package/dist/i18n/messages/pt-br.mjs +9 -1
  10. package/dist/i18n/messages/pt-br.mjs.map +1 -1
  11. package/dist/index.mjs +7 -1
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/testing/factories/affiliate.factory.mjs +24 -0
  14. package/dist/testing/factories/affiliate.factory.mjs.map +1 -0
  15. package/dist/testing/factories/index.mjs +4 -0
  16. package/dist/testing/factories/index.mjs.map +1 -1
  17. package/dist/testing/factories/withdrawal-limits.factory.mjs +18 -0
  18. package/dist/testing/factories/withdrawal-limits.factory.mjs.map +1 -0
  19. package/dist/utils/format/masks.mjs +6 -1
  20. package/dist/utils/format/masks.mjs.map +1 -1
  21. package/dist/utils/validators/pix-key.mjs +31 -0
  22. package/dist/utils/validators/pix-key.mjs.map +1 -0
  23. package/package.json +10 -9
  24. package/src/components/account/sections/affiliates/ReceivingAccountModal.tsx +75 -20
  25. package/src/components/account/sections/affiliates/RequestWithdrawalSheet.tsx +36 -3
  26. package/src/i18n/messages/en-us.ts +11 -0
  27. package/src/i18n/messages/es-es.ts +11 -0
  28. package/src/i18n/messages/pt-br.ts +11 -0
  29. package/src/index.ts +2 -0
  30. package/src/testing/factories/affiliate.factory.ts +22 -0
  31. package/src/testing/factories/index.ts +2 -0
  32. package/src/testing/factories/withdrawal-limits.factory.ts +16 -0
  33. package/src/utils/format/masks.ts +6 -2
  34. package/src/utils/validators/pix-key.ts +29 -0
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { useEffect, useMemo } from "react";
3
+ import { useEffect, useMemo, useState } from "react";
4
4
  import { Controller, useForm } from "react-hook-form";
5
5
  import { zodResolver } from "@hookform/resolvers/zod";
6
6
  import { useTranslations } from "next-intl";
@@ -12,12 +12,19 @@ import { FormField } from "../../../ui/form/FormField";
12
12
  import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../../../ui/overlay/Dialog";
13
13
  import { useCurrentAffiliate } from "../../../../modules/affiliates/hooks/use-current-affiliate.hook";
14
14
  import { useUpdateAffiliate } from "../../../../modules/affiliates/hooks/use-update-affiliate.hook";
15
- import { formatCPFCNPJ, formatDocument, normalizeCpfCnpjForStorage } from "../../../../utils/format/masks";
15
+ import {
16
+ formatCPFCNPJ,
17
+ formatDocument,
18
+ formatPixKey,
19
+ normalizeCpfCnpjForStorage
20
+ } from "../../../../utils/format/masks";
16
21
  import { isValidCNPJ, isValidCPF } from "../../../../utils/validators/common";
22
+ import {
23
+ AMBIGUOUS_PIX_KEY,
24
+ isPixKeyFromAnotherDocument,
25
+ normalizePixKeyForStorage
26
+ } from "../../../../utils/validators/pix-key";
17
27
  import { useAffiliateFlows } from "../../../../store/useAffiliateFlows";
18
- const EMAIL_KEY = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
19
- const RANDOM_KEY = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
20
- const PHONE_KEY = /^\+\d{11,14}$/;
21
28
  function ReceivingAccountModal() {
22
29
  const translate = useTranslations();
23
30
  const translateModal = useTranslations("common.account.workspace.affiliates.bankAccount");
@@ -28,10 +35,25 @@ function ReceivingAccountModal() {
28
35
  const updateAffiliate = useUpdateAffiliate();
29
36
  const schema = useMemo(
30
37
  () => z.object({
31
- pix: z.string().min(1, translateModal("validationPix")),
38
+ pix: z.string().trim().min(1, translateModal("validationPix")),
32
39
  holder_name: z.string().min(1, translateModal("validationHolder")),
33
40
  holder_document: z.string().min(1, translateModal("validationDocument"))
34
41
  }).superRefine((data, ctx) => {
42
+ const pix = normalizePixKeyForStorage(data.pix, data.holder_document);
43
+ if (data.pix && pix === null) {
44
+ ctx.addIssue({
45
+ code: z.ZodIssueCode.custom,
46
+ path: ["pix"],
47
+ message: translateModal("validationPixInvalid")
48
+ });
49
+ }
50
+ if (pix === AMBIGUOUS_PIX_KEY) {
51
+ ctx.addIssue({
52
+ code: z.ZodIssueCode.custom,
53
+ path: ["pix"],
54
+ message: translateModal("pixAmbiguousQuestion")
55
+ });
56
+ }
35
57
  const digits = data.holder_document.replace(/\D/g, "");
36
58
  if (!digits) return;
37
59
  if (digits.length !== 11 && digits.length !== 14) {
@@ -51,14 +73,7 @@ function ReceivingAccountModal() {
51
73
  });
52
74
  return;
53
75
  }
54
- const pix = data.pix.trim();
55
- if (EMAIL_KEY.test(pix) || RANDOM_KEY.test(pix) || PHONE_KEY.test(pix.replace(/[\s().-]/g, ""))) {
56
- return;
57
- }
58
- const pixDigits = pix.replace(/\D/g, "");
59
- const pixIsCnpj = pixDigits.length === 14 && isValidCNPJ(pixDigits);
60
- const pixIsCpf = pixDigits.length === 11 && isValidCPF(pixDigits);
61
- if ((pixIsCnpj || pixIsCpf) && pixDigits !== digits) {
76
+ if (typeof pix === "string" && isPixKeyFromAnotherDocument(pix, digits)) {
62
77
  ctx.addIssue({
63
78
  code: z.ZodIssueCode.custom,
64
79
  path: ["pix"],
@@ -73,6 +88,7 @@ function ReceivingAccountModal() {
73
88
  mode: "onChange",
74
89
  defaultValues: { pix: "", holder_name: "", holder_document: "" }
75
90
  });
91
+ const [declaredCpfPix, setDeclaredCpfPix] = useState(null);
76
92
  const resetForm = form.reset;
77
93
  useEffect(() => {
78
94
  if (!isOpen || !affiliate) return;
@@ -84,15 +100,17 @@ function ReceivingAccountModal() {
84
100
  }, [isOpen, affiliate, resetForm]);
85
101
  const handleClose = () => {
86
102
  form.reset();
103
+ setDeclaredCpfPix(null);
87
104
  close();
88
105
  };
89
106
  const onSubmit = async (data) => {
90
- if (!affiliate) return;
107
+ const pix = normalizePixKeyForStorage(data.pix, data.holder_document);
108
+ if (!affiliate || typeof pix !== "string") return;
91
109
  try {
92
110
  await updateAffiliate.mutateAsync({
93
111
  ...data,
94
112
  holder_document: normalizeCpfCnpjForStorage(data.holder_document),
95
- pix: normalizeCpfCnpjForStorage(data.pix),
113
+ pix,
96
114
  bank: "",
97
115
  agency: "",
98
116
  account: ""
@@ -104,7 +122,21 @@ function ReceivingAccountModal() {
104
122
  toast.custom((toastId) => /* @__PURE__ */ jsx(Toast, { variant: "error", message, toastId }));
105
123
  }
106
124
  };
107
- const isCnpjHolder = form.watch("holder_document").replace(/\D/g, "").length === 14;
125
+ const holderDocument = form.watch("holder_document");
126
+ const pixValue = form.watch("pix");
127
+ const isCnpjHolder = holderDocument.replace(/\D/g, "").length === 14;
128
+ const pixPreview = normalizePixKeyForStorage(pixValue, holderDocument);
129
+ const isPixAmbiguous = pixPreview === AMBIGUOUS_PIX_KEY;
130
+ const isPixDeclaredCpf = isPixAmbiguous && declaredCpfPix === pixValue;
131
+ const handleConfirmMobile = () => {
132
+ form.setValue("pix", formatPixKey(`+55${pixValue.replace(/\D/g, "")}`), {
133
+ shouldValidate: true,
134
+ shouldDirty: true
135
+ });
136
+ };
137
+ const handleConfirmCpf = () => {
138
+ setDeclaredCpfPix(pixValue);
139
+ };
108
140
  return /* @__PURE__ */ jsx(Dialog, { open: isOpen, onOpenChange: (nextOpen) => !nextOpen && handleClose(), children: /* @__PURE__ */ jsxs(
109
141
  DialogContent,
110
142
  {
@@ -121,10 +153,15 @@ function ReceivingAccountModal() {
121
153
  placeholder: translateModal("pixKeyPlaceholder"),
122
154
  required: true,
123
155
  error: !!form.formState.errors.pix,
124
- errorMessage: form.formState.errors.pix?.message,
156
+ errorMessage: isPixDeclaredCpf ? translateModal("validationPixDocumentMismatch") : form.formState.errors.pix?.message,
157
+ hintMessage: typeof pixPreview === "string" ? translateModal("pixKeyPreview", { value: formatPixKey(pixPreview) }) : void 0,
125
158
  ...form.register("pix")
126
159
  }
127
160
  ),
161
+ isPixAmbiguous && !isPixDeclaredCpf && /* @__PURE__ */ jsxs("div", { className: "flex gap-2 -mt-3", children: [
162
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: handleConfirmMobile, children: translateModal("pixAmbiguousMobile") }),
163
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: handleConfirmCpf, children: translateModal("pixAmbiguousCpf") })
164
+ ] }),
128
165
  /* @__PURE__ */ jsx("p", { className: "paragraph-xsmall-medium text-zinc-500 -mt-3", children: translateModal("pixKeyHint") }),
129
166
  isCnpjHolder && /* @__PURE__ */ jsx("p", { className: "paragraph-xsmall-medium text-zinc-500 -mt-3", children: translateModal("pixCnpjInvoiceNotice") }),
130
167
  /* @__PURE__ */ jsx(
@@ -143,6 +180,7 @@ function ReceivingAccountModal() {
143
180
  {
144
181
  name: "holder_document",
145
182
  control: form.control,
183
+ rules: { deps: ["pix"] },
146
184
  render: ({ field, fieldState }) => /* @__PURE__ */ jsx(
147
185
  FormField,
148
186
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/account/sections/affiliates/ReceivingAccountModal.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useMemo } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useTranslations } from 'next-intl';\nimport { toast } from 'sonner';\nimport z from 'zod';\nimport { Button } from '../../../ui/buttons/Button';\nimport { Toast } from '../../../ui/feedback/Toast';\nimport { FormField } from '../../../ui/form/FormField';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../../ui/overlay/Dialog';\nimport { useCurrentAffiliate } from '../../../../modules/affiliates/hooks/use-current-affiliate.hook';\nimport { useUpdateAffiliate } from '../../../../modules/affiliates/hooks/use-update-affiliate.hook';\nimport { formatCPFCNPJ, formatDocument, normalizeCpfCnpjForStorage } from '../../../../utils/format/masks';\nimport { isValidCNPJ, isValidCPF } from '../../../../utils/validators/common';\nimport { useAffiliateFlows } from '../../../../store/useAffiliateFlows';\n\ntype ReceivingAccountFormData = {\n pix: string;\n holder_name: string;\n holder_document: string;\n};\n\nconst EMAIL_KEY = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst RANDOM_KEY = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst PHONE_KEY = /^\\+\\d{11,14}$/;\n\n/** Cadastro da conta de recebimento do afiliado: chave PIX e titular. */\nexport function ReceivingAccountModal() {\n const translate = useTranslations();\n const translateModal = useTranslations('common.account.workspace.affiliates.bankAccount');\n const isOpen = useAffiliateFlows((state) => state.isReceivingAccountOpen);\n const close = useAffiliateFlows((state) => state.closeReceivingAccount);\n const { data: affiliateData } = useCurrentAffiliate();\n const affiliate = affiliateData?.data;\n const updateAffiliate = useUpdateAffiliate();\n\n const schema = useMemo(\n () =>\n z\n .object({\n pix: z.string().min(1, translateModal('validationPix')),\n holder_name: z.string().min(1, translateModal('validationHolder')),\n holder_document: z.string().min(1, translateModal('validationDocument')),\n })\n .superRefine((data, ctx) => {\n // O documento do titular decide PF x PJ pela contagem de dígitos, e é ele que vai para a\n // instituição no saque — tamanho certo com dígito verificador errado passa aqui e só\n // falha no pagamento.\n const digits = data.holder_document.replace(/\\D/g, '');\n if (!digits) return;\n\n if (digits.length !== 11 && digits.length !== 14) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['holder_document'],\n message: translateModal('validationDocumentLength'),\n });\n return;\n }\n\n const isValid = digits.length === 14 ? isValidCNPJ(digits) : isValidCPF(digits);\n if (!isValid) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['holder_document'],\n message:\n digits.length === 14\n ? translateModal('validationCnpjChecksum')\n : translateModal('validationCpfChecksum'),\n });\n return;\n }\n\n const pix = data.pix.trim();\n if (EMAIL_KEY.test(pix) || RANDOM_KEY.test(pix) || PHONE_KEY.test(pix.replace(/[\\s().-]/g, ''))) {\n return;\n }\n\n const pixDigits = pix.replace(/\\D/g, '');\n const pixIsCnpj = pixDigits.length === 14 && isValidCNPJ(pixDigits);\n const pixIsCpf = pixDigits.length === 11 && isValidCPF(pixDigits);\n if ((pixIsCnpj || pixIsCpf) && pixDigits !== digits) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['pix'],\n message: translateModal('validationPixDocumentMismatch'),\n });\n }\n }),\n [translateModal]\n );\n\n const form = useForm<ReceivingAccountFormData>({\n resolver: zodResolver(schema),\n mode: 'onChange',\n defaultValues: { pix: '', holder_name: '', holder_document: '' },\n });\n\n const resetForm = form.reset;\n\n useEffect(() => {\n if (!isOpen || !affiliate) return;\n resetForm({\n pix: affiliate.pix ?? '',\n holder_name: affiliate.holder_name ?? '',\n holder_document: affiliate.holder_document ? formatDocument(affiliate.holder_document) : '',\n });\n }, [isOpen, affiliate, resetForm]);\n\n const handleClose = () => {\n form.reset();\n close();\n };\n\n const onSubmit = async (data: ReceivingAccountFormData) => {\n if (!affiliate) return;\n\n try {\n await updateAffiliate.mutateAsync({\n ...data,\n holder_document: normalizeCpfCnpjForStorage(data.holder_document),\n pix: normalizeCpfCnpjForStorage(data.pix),\n bank: '',\n agency: '',\n account: '',\n });\n toast.custom((toastId) => (\n <Toast variant=\"success\" message={translateModal('saveSuccess')} toastId={toastId} />\n ));\n handleClose();\n } catch (error) {\n const message = error instanceof Error ? error.message : translateModal('saveError');\n toast.custom((toastId) => <Toast variant=\"error\" message={message} toastId={toastId} />);\n }\n };\n\n const isCnpjHolder = form.watch('holder_document').replace(/\\D/g, '').length === 14;\n\n return (\n <Dialog open={isOpen} onOpenChange={(nextOpen) => !nextOpen && handleClose()}>\n <DialogContent\n onOpenAutoFocus={(event) => event.preventDefault()}\n className=\"flex flex-col p-0 gap-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-lg 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-y-auto [scrollbar-width:auto] [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-zinc-300\"\n >\n <DialogHeader className=\"h-16 flex items-center justify-center px-5 border-b border-zinc-200 lg:border-b-0\">\n <DialogTitle className=\"text-center paragraph-medium-semibold\">\n {translateModal('dialogTitle')}\n </DialogTitle>\n </DialogHeader>\n\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"flex flex-col flex-1 lg:flex-none\">\n <div className=\"px-4 lg:px-5 pb-4 lg:pb-5 mt-4 lg:mt-5 flex-1 lg:flex-none flex flex-col gap-5\">\n <FormField\n label={translateModal('pixKeyLabel')}\n placeholder={translateModal('pixKeyPlaceholder')}\n required\n error={!!form.formState.errors.pix}\n errorMessage={form.formState.errors.pix?.message}\n {...form.register('pix')}\n />\n <p className=\"paragraph-xsmall-medium text-zinc-500 -mt-3\">{translateModal('pixKeyHint')}</p>\n {isCnpjHolder && (\n <p className=\"paragraph-xsmall-medium text-zinc-500 -mt-3\">\n {translateModal('pixCnpjInvoiceNotice')}\n </p>\n )}\n <FormField\n label={translateModal('holderNameLabel')}\n placeholder={translateModal('holderNamePlaceholder')}\n required\n error={!!form.formState.errors.holder_name}\n errorMessage={form.formState.errors.holder_name?.message}\n {...form.register('holder_name')}\n />\n <Controller\n name=\"holder_document\"\n control={form.control}\n render={({ field, fieldState }) => (\n <FormField\n label={translateModal('holderDocumentLabel')}\n placeholder={translateModal('holderDocumentPlaceholder')}\n required\n error={!!fieldState.error}\n errorMessage={fieldState.error?.message}\n value={field.value}\n onChange={(event) => field.onChange(formatCPFCNPJ(event.target.value))}\n />\n )}\n />\n </div>\n\n <div className=\"flex justify-between gap-2 p-4 lg:p-5 border-t border-zinc-200 mt-auto lg:mt-0\">\n <Button variant=\"secondary\" type=\"button\" onClick={handleClose} className=\"h-10!\">\n {translate('common.actions.cancel')}\n </Button>\n <Button\n type=\"submit\"\n className=\"h-10!\"\n disabled={!form.formState.isValid}\n loading={form.formState.isSubmitting}\n >\n {form.formState.isSubmitting\n ? translate('common.actions.saving')\n : translate('common.actions.save')}\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/account/sections/affiliates/ReceivingAccountModal.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useMemo, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useTranslations } from 'next-intl';\nimport { toast } from 'sonner';\nimport z from 'zod';\nimport { Button } from '../../../ui/buttons/Button';\nimport { Toast } from '../../../ui/feedback/Toast';\nimport { FormField } from '../../../ui/form/FormField';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../../ui/overlay/Dialog';\nimport { useCurrentAffiliate } from '../../../../modules/affiliates/hooks/use-current-affiliate.hook';\nimport { useUpdateAffiliate } from '../../../../modules/affiliates/hooks/use-update-affiliate.hook';\nimport {\n formatCPFCNPJ,\n formatDocument,\n formatPixKey,\n normalizeCpfCnpjForStorage,\n} from '../../../../utils/format/masks';\nimport { isValidCNPJ, isValidCPF } from '../../../../utils/validators/common';\nimport {\n AMBIGUOUS_PIX_KEY,\n isPixKeyFromAnotherDocument,\n normalizePixKeyForStorage,\n} from '../../../../utils/validators/pix-key';\nimport { useAffiliateFlows } from '../../../../store/useAffiliateFlows';\n\ntype ReceivingAccountFormData = {\n pix: string;\n holder_name: string;\n holder_document: string;\n};\n\n/** Cadastro da conta de recebimento do afiliado: chave PIX e titular. */\nexport function ReceivingAccountModal() {\n const translate = useTranslations();\n const translateModal = useTranslations('common.account.workspace.affiliates.bankAccount');\n const isOpen = useAffiliateFlows((state) => state.isReceivingAccountOpen);\n const close = useAffiliateFlows((state) => state.closeReceivingAccount);\n const { data: affiliateData } = useCurrentAffiliate();\n const affiliate = affiliateData?.data;\n const updateAffiliate = useUpdateAffiliate();\n\n const schema = useMemo(\n () =>\n z\n .object({\n pix: z.string().trim().min(1, translateModal('validationPix')),\n holder_name: z.string().min(1, translateModal('validationHolder')),\n holder_document: z.string().min(1, translateModal('validationDocument')),\n })\n .superRefine((data, ctx) => {\n const pix = normalizePixKeyForStorage(data.pix, data.holder_document);\n if (data.pix && pix === null) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['pix'],\n message: translateModal('validationPixInvalid'),\n });\n }\n\n if (pix === AMBIGUOUS_PIX_KEY) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['pix'],\n message: translateModal('pixAmbiguousQuestion'),\n });\n }\n\n // O documento do titular decide PF x PJ pela contagem de dígitos, e é ele que vai para a\n // instituição no saque — tamanho certo com dígito verificador errado passa aqui e só\n // falha no pagamento.\n const digits = data.holder_document.replace(/\\D/g, '');\n if (!digits) return;\n\n if (digits.length !== 11 && digits.length !== 14) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['holder_document'],\n message: translateModal('validationDocumentLength'),\n });\n return;\n }\n\n const isValid = digits.length === 14 ? isValidCNPJ(digits) : isValidCPF(digits);\n if (!isValid) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['holder_document'],\n message:\n digits.length === 14\n ? translateModal('validationCnpjChecksum')\n : translateModal('validationCpfChecksum'),\n });\n return;\n }\n\n if (typeof pix === 'string' && isPixKeyFromAnotherDocument(pix, digits)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['pix'],\n message: translateModal('validationPixDocumentMismatch'),\n });\n }\n }),\n [translateModal]\n );\n\n const form = useForm<ReceivingAccountFormData>({\n resolver: zodResolver(schema),\n mode: 'onChange',\n defaultValues: { pix: '', holder_name: '', holder_document: '' },\n });\n\n const [declaredCpfPix, setDeclaredCpfPix] = useState<string | null>(null);\n\n const resetForm = form.reset;\n\n useEffect(() => {\n if (!isOpen || !affiliate) return;\n resetForm({\n pix: affiliate.pix ?? '',\n holder_name: affiliate.holder_name ?? '',\n holder_document: affiliate.holder_document ? formatDocument(affiliate.holder_document) : '',\n });\n }, [isOpen, affiliate, resetForm]);\n\n const handleClose = () => {\n form.reset();\n setDeclaredCpfPix(null);\n close();\n };\n\n const onSubmit = async (data: ReceivingAccountFormData) => {\n const pix = normalizePixKeyForStorage(data.pix, data.holder_document);\n if (!affiliate || typeof pix !== 'string') return;\n\n try {\n await updateAffiliate.mutateAsync({\n ...data,\n holder_document: normalizeCpfCnpjForStorage(data.holder_document),\n pix,\n bank: '',\n agency: '',\n account: '',\n });\n toast.custom((toastId) => (\n <Toast variant=\"success\" message={translateModal('saveSuccess')} toastId={toastId} />\n ));\n handleClose();\n } catch (error) {\n const message = error instanceof Error ? error.message : translateModal('saveError');\n toast.custom((toastId) => <Toast variant=\"error\" message={message} toastId={toastId} />);\n }\n };\n\n const holderDocument = form.watch('holder_document');\n const pixValue = form.watch('pix');\n const isCnpjHolder = holderDocument.replace(/\\D/g, '').length === 14;\n const pixPreview = normalizePixKeyForStorage(pixValue, holderDocument);\n const isPixAmbiguous = pixPreview === AMBIGUOUS_PIX_KEY;\n const isPixDeclaredCpf = isPixAmbiguous && declaredCpfPix === pixValue;\n\n const handleConfirmMobile = () => {\n form.setValue('pix', formatPixKey(`+55${pixValue.replace(/\\D/g, '')}`), {\n shouldValidate: true,\n shouldDirty: true,\n });\n };\n\n const handleConfirmCpf = () => {\n setDeclaredCpfPix(pixValue);\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(nextOpen) => !nextOpen && handleClose()}>\n <DialogContent\n onOpenAutoFocus={(event) => event.preventDefault()}\n className=\"flex flex-col p-0 gap-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-lg 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-y-auto [scrollbar-width:auto] [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-zinc-300\"\n >\n <DialogHeader className=\"h-16 flex items-center justify-center px-5 border-b border-zinc-200 lg:border-b-0\">\n <DialogTitle className=\"text-center paragraph-medium-semibold\">\n {translateModal('dialogTitle')}\n </DialogTitle>\n </DialogHeader>\n\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"flex flex-col flex-1 lg:flex-none\">\n <div className=\"px-4 lg:px-5 pb-4 lg:pb-5 mt-4 lg:mt-5 flex-1 lg:flex-none flex flex-col gap-5\">\n <FormField\n label={translateModal('pixKeyLabel')}\n placeholder={translateModal('pixKeyPlaceholder')}\n required\n error={!!form.formState.errors.pix}\n errorMessage={\n isPixDeclaredCpf\n ? translateModal('validationPixDocumentMismatch')\n : form.formState.errors.pix?.message\n }\n hintMessage={\n typeof pixPreview === 'string'\n ? translateModal('pixKeyPreview', { value: formatPixKey(pixPreview) })\n : undefined\n }\n {...form.register('pix')}\n />\n {isPixAmbiguous && !isPixDeclaredCpf && (\n <div className=\"flex gap-2 -mt-3\">\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onClick={handleConfirmMobile}>\n {translateModal('pixAmbiguousMobile')}\n </Button>\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onClick={handleConfirmCpf}>\n {translateModal('pixAmbiguousCpf')}\n </Button>\n </div>\n )}\n <p className=\"paragraph-xsmall-medium text-zinc-500 -mt-3\">{translateModal('pixKeyHint')}</p>\n {isCnpjHolder && (\n <p className=\"paragraph-xsmall-medium text-zinc-500 -mt-3\">\n {translateModal('pixCnpjInvoiceNotice')}\n </p>\n )}\n <FormField\n label={translateModal('holderNameLabel')}\n placeholder={translateModal('holderNamePlaceholder')}\n required\n error={!!form.formState.errors.holder_name}\n errorMessage={form.formState.errors.holder_name?.message}\n {...form.register('holder_name')}\n />\n <Controller\n name=\"holder_document\"\n control={form.control}\n rules={{ deps: ['pix'] }}\n render={({ field, fieldState }) => (\n <FormField\n label={translateModal('holderDocumentLabel')}\n placeholder={translateModal('holderDocumentPlaceholder')}\n required\n error={!!fieldState.error}\n errorMessage={fieldState.error?.message}\n value={field.value}\n onChange={(event) => field.onChange(formatCPFCNPJ(event.target.value))}\n />\n )}\n />\n </div>\n\n <div className=\"flex justify-between gap-2 p-4 lg:p-5 border-t border-zinc-200 mt-auto lg:mt-0\">\n <Button variant=\"secondary\" type=\"button\" onClick={handleClose} className=\"h-10!\">\n {translate('common.actions.cancel')}\n </Button>\n <Button\n type=\"submit\"\n className=\"h-10!\"\n disabled={!form.formState.isValid}\n loading={form.formState.isSubmitting}\n >\n {form.formState.isSubmitting\n ? translate('common.actions.saving')\n : translate('common.actions.save')}\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
@@ -23,6 +23,11 @@ import {
23
23
  parseCurrencyToNumber
24
24
  } from "../../../../utils/format/currency";
25
25
  import { formatDocument, formatPixKey } from "../../../../utils/format/masks";
26
+ import {
27
+ AMBIGUOUS_PIX_KEY,
28
+ isPixKeyFromAnotherDocument,
29
+ normalizePixKeyForStorage
30
+ } from "../../../../utils/validators/pix-key";
26
31
  import { formatFileSize, isPDFFile } from "../../../../utils/file/index";
27
32
  import { useUploadProgress } from "../../../../hooks/useUploadProgress";
28
33
  import useIsMobile from "../../../../hooks/useIsMobile";
@@ -126,6 +131,11 @@ function RequestWithdrawalSheet() {
126
131
  const minWithdrawal = limits?.minValue ?? MIN_WITHDRAWAL;
127
132
  const requiresInvoice = limits?.requiresInvoice ?? false;
128
133
  const hasReceivingAccount = !!(affiliate?.pix && affiliate?.holder_name && affiliate?.holder_document);
134
+ const holderDocument = affiliate?.holder_document ?? "";
135
+ const storedPixKey = affiliate?.pix ? normalizePixKeyForStorage(affiliate.pix, holderDocument) : void 0;
136
+ const isPixKeyInvalid = storedPixKey === null || storedPixKey === AMBIGUOUS_PIX_KEY;
137
+ const isPixKeyMismatch = typeof storedPixKey === "string" && isPixKeyFromAnotherDocument(storedPixKey, holderDocument);
138
+ const hasPixKeyIssue = isPixKeyInvalid || isPixKeyMismatch;
129
139
  const minValueLabel = minWithdrawal.toFixed(2).replace(".", ",");
130
140
  const withdrawalSchema = useMemo(
131
141
  () => buildWithdrawalSchema(availableToWithdraw, minWithdrawal, {
@@ -255,15 +265,31 @@ function RequestWithdrawalSheet() {
255
265
  ] }),
256
266
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
257
267
  /* @__PURE__ */ jsx("span", { className: "w-40 text-zinc-950 paragraph-small-medium", children: translateSheet("pixKeyLabel") }),
258
- /* @__PURE__ */ jsx("span", { className: "w-full text-zinc-600 paragraph-small-regular truncate", children: affiliate?.pix ? formatPixKey(affiliate.pix) : "\u2014" })
268
+ /* @__PURE__ */ jsx(
269
+ "span",
270
+ {
271
+ className: cn(
272
+ "w-full paragraph-small-regular truncate",
273
+ hasPixKeyIssue ? "text-red-600" : "text-zinc-600"
274
+ ),
275
+ children: affiliate?.pix ? hasPixKeyIssue ? affiliate.pix : formatPixKey(affiliate.pix) : "\u2014"
276
+ }
277
+ )
259
278
  ] }),
260
279
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
261
280
  /* @__PURE__ */ jsx("span", { className: "w-40 text-zinc-950 paragraph-small-medium", children: translateSheet("holderDocumentLabel") }),
262
281
  /* @__PURE__ */ jsx("span", { className: "w-full text-zinc-600 paragraph-small-regular truncate", children: affiliate?.holder_document ? formatDocument(affiliate.holder_document) : "\u2014" })
263
282
  ] })
283
+ ] }),
284
+ hasPixKeyIssue && /* @__PURE__ */ jsxs("div", { role: "alert", className: "flex flex-col gap-3 rounded-lg bg-red-50 p-4", children: [
285
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
286
+ /* @__PURE__ */ jsx(IconAlertTriangle, { size: 20, className: "text-red-600 shrink-0 mt-0.5" }),
287
+ /* @__PURE__ */ jsx("p", { className: "paragraph-small-medium text-zinc-950", children: isPixKeyInvalid ? translateSheet("pixKeyInvalidWarning") : translateSheet("pixKeyMismatchWarning") })
288
+ ] }),
289
+ /* @__PURE__ */ jsx(Button, { className: "h-10! w-fit", type: "button", onClick: openReceivingAccount, children: translateSheet("updateReceivingAccountButton") })
264
290
  ] })
265
291
  ] }),
266
- limits && !limits.canWithdraw ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 bg-zinc-50 rounded-lg p-4", children: [
292
+ limits && !limits.canWithdraw && !hasPixKeyIssue ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 bg-zinc-50 rounded-lg p-4", children: [
267
293
  /* @__PURE__ */ jsx("div", { className: "size-8 bg-white rounded-lg shadow-[0px_2px_10px_0px_rgba(26,26,26,0.05)] flex items-center justify-center", children: /* @__PURE__ */ jsx(IconAlertTriangle, { size: 18, className: "text-amber-500" }) }),
268
294
  /* @__PURE__ */ jsx("p", { className: "paragraph-small-medium text-zinc-950", children: translateSheet("blockedTitle") }),
269
295
  /* @__PURE__ */ jsx("p", { className: "paragraph-small-regular text-zinc-600", children: translateSheet("blockedDescription") }),
@@ -287,6 +313,7 @@ function RequestWithdrawalSheet() {
287
313
  FormField,
288
314
  {
289
315
  required: true,
316
+ disabled: hasPixKeyIssue,
290
317
  label: translateSheet("withdrawalValueLabel"),
291
318
  placeholder: translateSheet("withdrawalValuePlaceholder"),
292
319
  inputMode: "numeric",
@@ -398,7 +425,7 @@ function RequestWithdrawalSheet() {
398
425
  {
399
426
  className: "h-10!",
400
427
  type: "submit",
401
- disabled: !affiliate || !limits || !hasReceivingAccount || !withdrawalAmount || withdrawalAmount < minWithdrawal || toCents(withdrawalAmount) > toCents(availableToWithdraw) || requiresInvoice && !attachmentFile || !limits.canWithdraw || requestDeposit.isPending,
428
+ disabled: !affiliate || !limits || !hasReceivingAccount || hasPixKeyIssue || !withdrawalAmount || withdrawalAmount < minWithdrawal || toCents(withdrawalAmount) > toCents(availableToWithdraw) || requiresInvoice && !attachmentFile || !limits.canWithdraw || requestDeposit.isPending,
402
429
  loading: requestDeposit.isPending,
403
430
  children: translateSheet("submitButton")
404
431
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/account/sections/affiliates/RequestWithdrawalSheet.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useMemo, useRef, useState, type ChangeEvent, type DragEvent } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { IconAlertTriangle, IconInfoCircle, IconPencil, IconUpload, IconX } from '@tabler/icons-react';\nimport { useTranslations } from 'next-intl';\nimport { toast } from 'sonner';\nimport z from 'zod';\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 { Dialog, DialogContent } from '../../../ui/overlay/Dialog';\nimport { Sheet, SheetContent, SheetFooter, SheetHeader, SheetTitle } from '../../../ui/overlay/Sheet';\nimport { useCurrentAffiliate } from '../../../../modules/affiliates/hooks/use-current-affiliate.hook';\nimport { useRequestDeposit } from '../../../../modules/affiliates/hooks/use-request-deposit.hook';\nimport { useWithdrawalLimits } from '../../../../modules/affiliates/hooks/use-withdrawal-limits.hook';\nimport { AFFILIATE_FINANCE_EMAIL } from '../../../../modules/affiliates/constants/affiliate.constants';\nimport {\n formatCurrency,\n formatCurrencyNumber,\n parseCurrencyToNumber,\n} from '../../../../utils/format/currency';\nimport { formatDocument, formatPixKey } from '../../../../utils/format/masks';\nimport { formatFileSize, isPDFFile } from '../../../../utils/file/index';\nimport { useUploadProgress } from '../../../../hooks/useUploadProgress';\nimport useIsMobile from '../../../../hooks/useIsMobile';\nimport { useIsDefaultWhitelabel } from '../../../../providers/whitelabel.provider';\nimport { cn } from '../../../../infra/utils/clsx';\nimport { useAffiliateFlows } from '../../../../store/useAffiliateFlows';\n\nconst MIN_WITHDRAWAL = 25;\n\n/** Compara em centavos: o saldo vem do backend em reais e a comparação direta erra no arredondamento. */\nconst toCents = (value: number) => Math.round(value * 100);\n\nfunction readFileAsBase64DataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(new Error('read-file-failed'));\n reader.readAsDataURL(file);\n });\n}\n\nfunction buildWithdrawalSchema(maxAvailable: number, minWithdrawal: number, messages: {\n required: string;\n minValue: string;\n maxBalance: string;\n}) {\n return z.object({\n value: z\n .string()\n .min(1, messages.required)\n .refine((value) => parseCurrencyToNumber(value) >= minWithdrawal, { message: messages.minValue })\n .refine((value) => toCents(parseCurrencyToNumber(value)) <= toCents(maxAvailable), {\n message: messages.maxBalance,\n }),\n });\n}\n\ntype WithdrawalFormData = { value: string };\n\nfunction PdfFileIcon() {\n return (\n <svg width=\"24\" height=\"27\" viewBox=\"0 0 24 27\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.5 1H4.5A2.5 2.5 0 0 0 2 3.5v20A2.5 2.5 0 0 0 4.5 26h15a2.5 2.5 0 0 0 2.5-2.5V8.5L14.5 1Z\"\n fill=\"#fff\"\n stroke=\"#D4D4D8\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M14 1.5V8.5h7\" stroke=\"#D4D4D8\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <rect x=\"4\" y=\"13\" width=\"16\" height=\"9\" rx=\"2\" fill=\"#E11D48\" />\n <text x=\"12\" y=\"19.5\" textAnchor=\"middle\" fill=\"#fff\" fontSize=\"6\" fontWeight=\"700\" fontFamily=\"sans-serif\">\n PDF\n </text>\n </svg>\n );\n}\n\nfunction UploadedPdfFile({ file, onRemove }: { file: File; onRemove: () => void }) {\n const translateSheet = useTranslations('common.account.workspace.affiliates.withdrawal');\n const { progress } = useUploadProgress({ interval: 80, increment: 10 });\n const fileNameWithoutExtension = file.name.replace(/\\.[^/.]+$/, '');\n const fileExtension = file.name.split('.').pop()?.toUpperCase() || '';\n\n return (\n <div className=\"flex flex-col gap-3 bg-[#f8f8f7] rounded-lg\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center size-12.5 shrink-0 bg-white border border-zinc-200 rounded-lg\">\n <PdfFileIcon />\n </div>\n <div className=\"flex flex-col gap-0.5 min-w-0 flex-1\">\n <span className=\"paragraph-small-medium text-zinc-950 truncate\">{fileNameWithoutExtension}</span>\n <span className=\"paragraph-xsmall-medium text-zinc-500\">\n .{fileExtension} <span className=\"text-zinc-500/40\">•</span> {formatFileSize(file.size)}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"flex items-center justify-center size-8 shrink-0 rounded-lg hover:bg-zinc-100 hover:cursor-pointer transition-colors\"\n aria-label={translateSheet('removeAttachmentAriaLabel')}\n >\n <IconX size={18} className=\"text-zinc-500\" />\n </button>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex-1 h-1.5 bg-white rounded-full overflow-hidden\">\n <div\n className=\"bg-zinc-950 h-full rounded-full transition-all duration-100\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <span className=\"paragraph-xsmall-medium text-zinc-500 shrink-0\">{progress}%</span>\n </div>\n </div>\n );\n}\n\n/** Solicitação de saque do saldo de afiliado, com conta de recebimento, limites e nota fiscal. */\nexport function RequestWithdrawalSheet() {\n const translate = useTranslations();\n const translateSheet = useTranslations('common.account.workspace.affiliates.withdrawal');\n const isMobile = useIsMobile();\n const isDefaultWhitelabel = useIsDefaultWhitelabel();\n\n const isOpen = useAffiliateFlows((state) => state.isWithdrawalOpen);\n const close = useAffiliateFlows((state) => state.closeWithdrawal);\n const openReceivingAccount = useAffiliateFlows((state) => state.openReceivingAccount);\n\n const { data: affiliateData } = useCurrentAffiliate();\n const affiliate = affiliateData?.data;\n const { data: limitsData } = useWithdrawalLimits({ enabled: isOpen && !!affiliate });\n const limits = limitsData?.data;\n const requestDeposit = useRequestDeposit();\n\n const balance = Number(affiliate?.balance ?? 0);\n const availableToWithdraw = limits?.availableToWithdraw ?? balance;\n const minWithdrawal = limits?.minValue ?? MIN_WITHDRAWAL;\n const requiresInvoice = limits?.requiresInvoice ?? false;\n const hasReceivingAccount = !!(affiliate?.pix && affiliate?.holder_name && affiliate?.holder_document);\n\n const minValueLabel = minWithdrawal.toFixed(2).replace('.', ',');\n\n const withdrawalSchema = useMemo(\n () =>\n buildWithdrawalSchema(availableToWithdraw, minWithdrawal, {\n required: translateSheet('validationRequired'),\n minValue: translateSheet('validationMinValue', { minValue: minValueLabel }),\n maxBalance: translateSheet('validationMaxBalance', {\n balance: formatCurrencyNumber(availableToWithdraw),\n }),\n }),\n [availableToWithdraw, minWithdrawal, minValueLabel, translateSheet]\n );\n\n const form = useForm<WithdrawalFormData>({\n resolver: zodResolver(withdrawalSchema),\n defaultValues: { value: '' },\n });\n\n const watchedValue = form.watch('value');\n const withdrawalAmount = parseCurrencyToNumber(watchedValue || '') || 0;\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [showUploadArea, setShowUploadArea] = useState(false);\n const [attachmentFile, setAttachmentFile] = useState<File | null>(null);\n const [attachmentBase64, setAttachmentBase64] = useState<string | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [showConfirmDialog, setShowConfirmDialog] = useState(false);\n const [pendingWithdrawalValue, setPendingWithdrawalValue] = useState<string | null>(null);\n\n const handlePdfFile = useCallback(\n async (file: File) => {\n if (!isPDFFile(file)) {\n toast.custom((toastId) => (\n <Toast variant=\"error\" message={translateSheet('errorPdfOnly')} toastId={toastId} />\n ));\n return;\n }\n setAttachmentFile(file);\n setAttachmentBase64(await readFileAsBase64DataUrl(file));\n },\n [translateSheet]\n );\n\n const handleFileInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (file) handlePdfFile(file);\n event.target.value = '';\n },\n [handlePdfFile]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent) => {\n event.preventDefault();\n setIsDragging(false);\n const file = event.dataTransfer.files?.[0];\n if (file) handlePdfFile(file);\n },\n [handlePdfFile]\n );\n\n const handleRemoveAttachment = useCallback(() => {\n setAttachmentFile(null);\n setAttachmentBase64(null);\n }, []);\n\n const handleClose = () => {\n form.reset({ value: '' });\n setShowUploadArea(false);\n handleRemoveAttachment();\n setShowConfirmDialog(false);\n setPendingWithdrawalValue(null);\n close();\n };\n\n const executeWithdrawal = async (value: string, attachment: string | null) => {\n if (!affiliate) return;\n\n try {\n const result = await requestDeposit.mutateAsync({\n value: parseCurrencyToNumber(value),\n ...(attachment ? { attachment } : {}),\n });\n toast.custom((toastId) => <Toast variant=\"success\" message={result.message} toastId={toastId} />);\n handleClose();\n } catch (error) {\n const message = error instanceof Error ? error.message : translateSheet('errorRequestDeposit');\n toast.custom((toastId) => <Toast variant=\"error\" message={message} toastId={toastId} />);\n }\n };\n\n const handleConfirmWithdrawal = async () => {\n if (pendingWithdrawalValue === null) return;\n setShowConfirmDialog(false);\n await executeWithdrawal(pendingWithdrawalValue, attachmentBase64);\n setPendingWithdrawalValue(null);\n };\n\n const infoBoxClasses = cn(\n 'flex items-center gap-3 text-zinc-950 rounded-lg p-4',\n isDefaultWhitelabel ? 'bg-cyan-50' : 'bg-zinc-50'\n );\n\n return (\n <>\n <Sheet open={isOpen} onOpenChange={(nextOpen) => !nextOpen && handleClose()}>\n <SheetContent\n side={isMobile ? 'bottom' : 'right'}\n className={cn(\n isMobile\n ? 'h-dvh w-full max-w-full rounded-none pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]'\n : 'h-screen max-w-[480px]! w-[480px]!',\n 'data-[state=open]:max-h-none data-[state=open]:h-dvh'\n )}\n >\n <SheetHeader className=\"border-b border-zinc-200\">\n <SheetTitle className=\"text-zinc-950 paragraph-medium-semibold\">\n {translateSheet('sheetTitle')}\n </SheetTitle>\n </SheetHeader>\n\n <form\n onSubmit={form.handleSubmit((data) => {\n setPendingWithdrawalValue(data.value);\n setShowConfirmDialog(true);\n })}\n className=\"flex flex-col flex-1 overflow-hidden\"\n >\n <div className=\"flex flex-col gap-6 px-5 py-5 overflow-y-auto [scrollbar-width:auto] [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-zinc-300 flex-1\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-500 paragraph-small-semibold\">\n {translateSheet('availableBalance')}\n </span>\n <span className=\"text-green-600 paragraph-medium-semibold\">\n {formatCurrencyNumber(balance)}\n </span>\n </div>\n\n <Separator />\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"paragraph-small-regular text-zinc-600\">\n {translateSheet('receivingAccount')}\n </span>\n <Button variant=\"secondary\" className=\"h-8!\" type=\"button\" onClick={openReceivingAccount}>\n <IconPencil />\n {translate('common.actions.edit')}\n </Button>\n </div>\n <div className=\"flex flex-col rounded-lg bg-zinc-50 p-4 gap-4\">\n <div className=\"flex items-center gap-3\">\n <span className=\"w-40 text-zinc-950 paragraph-small-medium\">\n {translateSheet('holderLabel')}\n </span>\n <span className=\"w-full text-zinc-600 paragraph-small-regular\">\n {affiliate?.holder_name ?? '—'}\n </span>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"w-40 text-zinc-950 paragraph-small-medium\">\n {translateSheet('pixKeyLabel')}\n </span>\n <span className=\"w-full text-zinc-600 paragraph-small-regular truncate\">\n {affiliate?.pix ? formatPixKey(affiliate.pix) : '—'}\n </span>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"w-40 text-zinc-950 paragraph-small-medium\">\n {translateSheet('holderDocumentLabel')}\n </span>\n <span className=\"w-full text-zinc-600 paragraph-small-regular truncate\">\n {affiliate?.holder_document ? formatDocument(affiliate.holder_document) : '—'}\n </span>\n </div>\n </div>\n </div>\n\n {limits && !limits.canWithdraw ? (\n <div className=\"flex flex-col gap-3 bg-zinc-50 rounded-lg p-4\">\n <div className=\"size-8 bg-white rounded-lg shadow-[0px_2px_10px_0px_rgba(26,26,26,0.05)] flex items-center justify-center\">\n <IconAlertTriangle size={18} className=\"text-amber-500\" />\n </div>\n <p className=\"paragraph-small-medium text-zinc-950\">{translateSheet('blockedTitle')}</p>\n <p className=\"paragraph-small-regular text-zinc-600\">\n {translateSheet('blockedDescription')}\n </p>\n <Button\n variant=\"secondary\"\n className=\"h-10! w-fit\"\n type=\"button\"\n onClick={openReceivingAccount}\n >\n {translateSheet('blockedEditAccountButton')}\n </Button>\n </div>\n ) : (\n <>\n <Controller\n name=\"value\"\n control={form.control}\n render={({ field, fieldState }) => (\n <FormField\n required\n label={translateSheet('withdrawalValueLabel')}\n placeholder={translateSheet('withdrawalValuePlaceholder')}\n inputMode=\"numeric\"\n hintMessage={translateSheet('withdrawalValueHint', { minValue: minValueLabel })}\n value={field.value}\n onChange={(event) => {\n const raw = event.target.value.replace(/\\D/g, '');\n if (!raw) return field.onChange('');\n field.onChange(formatCurrency(raw));\n }}\n error={!!fieldState.error}\n errorMessage={fieldState.error?.message}\n />\n )}\n />\n\n {limits?.personType === 'cpf' && (\n <div className={infoBoxClasses}>\n <IconInfoCircle size={16} className=\"shrink-0\" />\n <span className=\"paragraph-small-semibold\">\n {translateSheet('cpfMonthlyLimit', {\n value: formatCurrencyNumber(limits.maxValuePerMonth ?? 0),\n })}{' '}\n <span className=\"text-zinc-600 paragraph-small-regular\">\n {translateSheet('cpfMonthlyRemaining', {\n value: formatCurrencyNumber(limits.monthlyRemaining ?? 0),\n })}\n </span>\n </span>\n </div>\n )}\n\n {limits?.personType === 'cnpj' && requiresInvoice && (\n <div className=\"flex flex-col gap-3 bg-zinc-50 rounded-lg p-4\">\n <div className=\"size-8 bg-white rounded-lg shadow-[0px_2px_10px_0px_rgba(26,26,26,0.05)] flex items-center justify-center\">\n <IconAlertTriangle size={18} className=\"text-amber-500\" />\n </div>\n <p className=\"paragraph-small-medium text-zinc-950\">\n {translateSheet('invoiceWarningCnpj')}\n </p>\n\n {!showUploadArea && !attachmentFile && (\n <Button\n variant=\"secondary\"\n className=\"h-10! w-fit\"\n type=\"button\"\n onClick={() => setShowUploadArea(true)}\n >\n {translateSheet('attachInvoiceButton')}\n <IconUpload size={20} />\n </Button>\n )}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"application/pdf\"\n className=\"hidden\"\n onChange={handleFileInputChange}\n />\n\n {showUploadArea && !attachmentFile && (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => fileInputRef.current?.click()}\n onKeyDown={(event) => event.key === 'Enter' && fileInputRef.current?.click()}\n onDragOver={(event) => {\n event.preventDefault();\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={handleDrop}\n className={cn(\n 'flex flex-col items-center justify-center gap-3.5 p-14 border-2 border-dashed rounded-lg cursor-pointer transition-colors hover:border-zinc-400',\n isDragging ? 'border-zinc-400 bg-zinc-100' : 'border-zinc-200 bg-white'\n )}\n >\n <div className=\"flex items-center justify-center size-14 bg-zinc-100 rounded-lg\">\n <IconUpload size={24} className=\"text-zinc-600\" />\n </div>\n <p className=\"paragraph-small-regular text-zinc-500 text-center\">\n {translateSheet('uploadAreaText')}{' '}\n <span className=\"paragraph-small-medium text-zinc-950\">\n {translateSheet('uploadAreaExt')}\n </span>\n </p>\n </div>\n )}\n\n {attachmentFile && (\n <UploadedPdfFile file={attachmentFile} onRemove={handleRemoveAttachment} />\n )}\n </div>\n )}\n </>\n )}\n\n <div className={infoBoxClasses}>\n <IconInfoCircle size={16} className=\"shrink-0\" />\n <span className=\"paragraph-small-semibold\">\n {translateSheet('processingInfo')}{' '}\n <span className=\"text-zinc-600 paragraph-small-regular\">\n {translateSheet('processingInfoSub')}\n </span>\n </span>\n </div>\n\n <div className={infoBoxClasses}>\n <IconInfoCircle size={16} className=\"shrink-0\" />\n <span className=\"paragraph-small-semibold\">\n {translateSheet('contactInfo')}{' '}\n <span className=\"text-zinc-600 paragraph-small-regular\">{AFFILIATE_FINANCE_EMAIL}</span>\n </span>\n </div>\n </div>\n\n <SheetFooter className=\"flex-row items-center justify-between border-t border-zinc-200 shrink-0\">\n <Button variant=\"secondary\" className=\"h-10!\" type=\"button\" onClick={handleClose}>\n {translate('common.actions.cancel')}\n </Button>\n <Button\n className=\"h-10!\"\n type=\"submit\"\n disabled={\n !affiliate ||\n !limits ||\n !hasReceivingAccount ||\n !withdrawalAmount ||\n withdrawalAmount < minWithdrawal ||\n toCents(withdrawalAmount) > toCents(availableToWithdraw) ||\n (requiresInvoice && !attachmentFile) ||\n !limits.canWithdraw ||\n requestDeposit.isPending\n }\n loading={requestDeposit.isPending}\n >\n {translateSheet('submitButton')}\n </Button>\n </SheetFooter>\n </form>\n </SheetContent>\n </Sheet>\n\n {pendingWithdrawalValue && (\n <Dialog open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <DialogContent className=\"flex flex-col p-0! gap-0! max-w-[calc(100%-2rem)]! w-full sm:max-w-[400px]! lg:max-w-[420px]! rounded-lg border\">\n <div className=\"flex flex-col gap-5 p-4 lg:p-5\">\n <span className=\"paragraph-medium-semibold text-zinc-950\">{translateSheet('reviewTitle')}</span>\n\n <div className=\"flex flex-col gap-3 bg-zinc-50 rounded-lg p-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-600 paragraph-small-medium\">\n {translateSheet('reviewValueLabel')}\n </span>\n <span className=\"text-zinc-950 paragraph-small-semibold\">\n {formatCurrencyNumber(parseCurrencyToNumber(pendingWithdrawalValue))}\n </span>\n </div>\n <div className=\"h-px bg-zinc-200\" />\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-600 paragraph-small-medium\">\n {translateSheet('holderLabel')}\n </span>\n <span className=\"text-zinc-950 paragraph-small-regular\">\n {affiliate?.holder_name ?? '—'}\n </span>\n </div>\n <div className=\"h-px bg-zinc-200\" />\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-600 paragraph-small-medium\">\n {translateSheet('reviewPixLabel')}\n </span>\n <span className=\"text-zinc-950 paragraph-small-regular truncate\">\n {affiliate?.pix ? formatPixKey(affiliate.pix) : '—'}\n </span>\n </div>\n <div className=\"h-px bg-zinc-200\" />\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-600 paragraph-small-medium\">\n {translateSheet('reviewDeadlineLabel')}\n </span>\n <span className=\"text-zinc-950 paragraph-small-regular\">\n {translateSheet('reviewDeadlineValue')}\n </span>\n </div>\n {limits?.personType === 'cnpj' && attachmentFile && (\n <>\n <div className=\"h-px bg-zinc-200\" />\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-600 paragraph-small-medium\">\n {translateSheet('reviewInvoiceLabel')}\n </span>\n <span className=\"text-zinc-950 paragraph-small-regular\">{attachmentFile.name}</span>\n </div>\n </>\n )}\n </div>\n\n <div className=\"flex flex-col gap-4 bg-amber-50 rounded-lg p-4\">\n <div className=\"flex items-start gap-3\">\n <IconAlertTriangle size={20} className=\"text-amber-600 shrink-0 mt-0.5\" />\n <p className=\"paragraph-small-regular text-zinc-950\">{translateSheet('reviewWarning')}</p>\n </div>\n </div>\n </div>\n\n <div className=\"h-px bg-zinc-200\" />\n\n <div className=\"flex flex-row items-center gap-2 p-4 lg:p-5\">\n <Button\n className=\"h-10 w-fit\"\n onClick={handleConfirmWithdrawal}\n loading={requestDeposit.isPending}\n >\n {translateSheet('reviewConfirmButton')}\n </Button>\n <Button\n variant=\"secondary\"\n className=\"h-10 w-fit\"\n onClick={() => setShowConfirmDialog(false)}\n >\n {translate('common.actions.back')}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )}\n </>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components/account/sections/affiliates/RequestWithdrawalSheet.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useMemo, useRef, useState, type ChangeEvent, type DragEvent } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { IconAlertTriangle, IconInfoCircle, IconPencil, IconUpload, IconX } from '@tabler/icons-react';\nimport { useTranslations } from 'next-intl';\nimport { toast } from 'sonner';\nimport z from 'zod';\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 { Dialog, DialogContent } from '../../../ui/overlay/Dialog';\nimport { Sheet, SheetContent, SheetFooter, SheetHeader, SheetTitle } from '../../../ui/overlay/Sheet';\nimport { useCurrentAffiliate } from '../../../../modules/affiliates/hooks/use-current-affiliate.hook';\nimport { useRequestDeposit } from '../../../../modules/affiliates/hooks/use-request-deposit.hook';\nimport { useWithdrawalLimits } from '../../../../modules/affiliates/hooks/use-withdrawal-limits.hook';\nimport { AFFILIATE_FINANCE_EMAIL } from '../../../../modules/affiliates/constants/affiliate.constants';\nimport {\n formatCurrency,\n formatCurrencyNumber,\n parseCurrencyToNumber,\n} from '../../../../utils/format/currency';\nimport { formatDocument, formatPixKey } from '../../../../utils/format/masks';\nimport {\n AMBIGUOUS_PIX_KEY,\n isPixKeyFromAnotherDocument,\n normalizePixKeyForStorage,\n} from '../../../../utils/validators/pix-key';\nimport { formatFileSize, isPDFFile } from '../../../../utils/file/index';\nimport { useUploadProgress } from '../../../../hooks/useUploadProgress';\nimport useIsMobile from '../../../../hooks/useIsMobile';\nimport { useIsDefaultWhitelabel } from '../../../../providers/whitelabel.provider';\nimport { cn } from '../../../../infra/utils/clsx';\nimport { useAffiliateFlows } from '../../../../store/useAffiliateFlows';\n\nconst MIN_WITHDRAWAL = 25;\n\n/** Compara em centavos: o saldo vem do backend em reais e a comparação direta erra no arredondamento. */\nconst toCents = (value: number) => Math.round(value * 100);\n\nfunction readFileAsBase64DataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(new Error('read-file-failed'));\n reader.readAsDataURL(file);\n });\n}\n\nfunction buildWithdrawalSchema(maxAvailable: number, minWithdrawal: number, messages: {\n required: string;\n minValue: string;\n maxBalance: string;\n}) {\n return z.object({\n value: z\n .string()\n .min(1, messages.required)\n .refine((value) => parseCurrencyToNumber(value) >= minWithdrawal, { message: messages.minValue })\n .refine((value) => toCents(parseCurrencyToNumber(value)) <= toCents(maxAvailable), {\n message: messages.maxBalance,\n }),\n });\n}\n\ntype WithdrawalFormData = { value: string };\n\nfunction PdfFileIcon() {\n return (\n <svg width=\"24\" height=\"27\" viewBox=\"0 0 24 27\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.5 1H4.5A2.5 2.5 0 0 0 2 3.5v20A2.5 2.5 0 0 0 4.5 26h15a2.5 2.5 0 0 0 2.5-2.5V8.5L14.5 1Z\"\n fill=\"#fff\"\n stroke=\"#D4D4D8\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M14 1.5V8.5h7\" stroke=\"#D4D4D8\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <rect x=\"4\" y=\"13\" width=\"16\" height=\"9\" rx=\"2\" fill=\"#E11D48\" />\n <text x=\"12\" y=\"19.5\" textAnchor=\"middle\" fill=\"#fff\" fontSize=\"6\" fontWeight=\"700\" fontFamily=\"sans-serif\">\n PDF\n </text>\n </svg>\n );\n}\n\nfunction UploadedPdfFile({ file, onRemove }: { file: File; onRemove: () => void }) {\n const translateSheet = useTranslations('common.account.workspace.affiliates.withdrawal');\n const { progress } = useUploadProgress({ interval: 80, increment: 10 });\n const fileNameWithoutExtension = file.name.replace(/\\.[^/.]+$/, '');\n const fileExtension = file.name.split('.').pop()?.toUpperCase() || '';\n\n return (\n <div className=\"flex flex-col gap-3 bg-[#f8f8f7] rounded-lg\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center size-12.5 shrink-0 bg-white border border-zinc-200 rounded-lg\">\n <PdfFileIcon />\n </div>\n <div className=\"flex flex-col gap-0.5 min-w-0 flex-1\">\n <span className=\"paragraph-small-medium text-zinc-950 truncate\">{fileNameWithoutExtension}</span>\n <span className=\"paragraph-xsmall-medium text-zinc-500\">\n .{fileExtension} <span className=\"text-zinc-500/40\">•</span> {formatFileSize(file.size)}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"flex items-center justify-center size-8 shrink-0 rounded-lg hover:bg-zinc-100 hover:cursor-pointer transition-colors\"\n aria-label={translateSheet('removeAttachmentAriaLabel')}\n >\n <IconX size={18} className=\"text-zinc-500\" />\n </button>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex-1 h-1.5 bg-white rounded-full overflow-hidden\">\n <div\n className=\"bg-zinc-950 h-full rounded-full transition-all duration-100\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <span className=\"paragraph-xsmall-medium text-zinc-500 shrink-0\">{progress}%</span>\n </div>\n </div>\n );\n}\n\n/** Solicitação de saque do saldo de afiliado, com conta de recebimento, limites e nota fiscal. */\nexport function RequestWithdrawalSheet() {\n const translate = useTranslations();\n const translateSheet = useTranslations('common.account.workspace.affiliates.withdrawal');\n const isMobile = useIsMobile();\n const isDefaultWhitelabel = useIsDefaultWhitelabel();\n\n const isOpen = useAffiliateFlows((state) => state.isWithdrawalOpen);\n const close = useAffiliateFlows((state) => state.closeWithdrawal);\n const openReceivingAccount = useAffiliateFlows((state) => state.openReceivingAccount);\n\n const { data: affiliateData } = useCurrentAffiliate();\n const affiliate = affiliateData?.data;\n const { data: limitsData } = useWithdrawalLimits({ enabled: isOpen && !!affiliate });\n const limits = limitsData?.data;\n const requestDeposit = useRequestDeposit();\n\n const balance = Number(affiliate?.balance ?? 0);\n const availableToWithdraw = limits?.availableToWithdraw ?? balance;\n const minWithdrawal = limits?.minValue ?? MIN_WITHDRAWAL;\n const requiresInvoice = limits?.requiresInvoice ?? false;\n const hasReceivingAccount = !!(affiliate?.pix && affiliate?.holder_name && affiliate?.holder_document);\n\n const holderDocument = affiliate?.holder_document ?? '';\n const storedPixKey = affiliate?.pix ? normalizePixKeyForStorage(affiliate.pix, holderDocument) : undefined;\n const isPixKeyInvalid = storedPixKey === null || storedPixKey === AMBIGUOUS_PIX_KEY;\n const isPixKeyMismatch = typeof storedPixKey === 'string' && isPixKeyFromAnotherDocument(storedPixKey, holderDocument);\n const hasPixKeyIssue = isPixKeyInvalid || isPixKeyMismatch;\n\n const minValueLabel = minWithdrawal.toFixed(2).replace('.', ',');\n\n const withdrawalSchema = useMemo(\n () =>\n buildWithdrawalSchema(availableToWithdraw, minWithdrawal, {\n required: translateSheet('validationRequired'),\n minValue: translateSheet('validationMinValue', { minValue: minValueLabel }),\n maxBalance: translateSheet('validationMaxBalance', {\n balance: formatCurrencyNumber(availableToWithdraw),\n }),\n }),\n [availableToWithdraw, minWithdrawal, minValueLabel, translateSheet]\n );\n\n const form = useForm<WithdrawalFormData>({\n resolver: zodResolver(withdrawalSchema),\n defaultValues: { value: '' },\n });\n\n const watchedValue = form.watch('value');\n const withdrawalAmount = parseCurrencyToNumber(watchedValue || '') || 0;\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [showUploadArea, setShowUploadArea] = useState(false);\n const [attachmentFile, setAttachmentFile] = useState<File | null>(null);\n const [attachmentBase64, setAttachmentBase64] = useState<string | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [showConfirmDialog, setShowConfirmDialog] = useState(false);\n const [pendingWithdrawalValue, setPendingWithdrawalValue] = useState<string | null>(null);\n\n const handlePdfFile = useCallback(\n async (file: File) => {\n if (!isPDFFile(file)) {\n toast.custom((toastId) => (\n <Toast variant=\"error\" message={translateSheet('errorPdfOnly')} toastId={toastId} />\n ));\n return;\n }\n setAttachmentFile(file);\n setAttachmentBase64(await readFileAsBase64DataUrl(file));\n },\n [translateSheet]\n );\n\n const handleFileInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (file) handlePdfFile(file);\n event.target.value = '';\n },\n [handlePdfFile]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent) => {\n event.preventDefault();\n setIsDragging(false);\n const file = event.dataTransfer.files?.[0];\n if (file) handlePdfFile(file);\n },\n [handlePdfFile]\n );\n\n const handleRemoveAttachment = useCallback(() => {\n setAttachmentFile(null);\n setAttachmentBase64(null);\n }, []);\n\n const handleClose = () => {\n form.reset({ value: '' });\n setShowUploadArea(false);\n handleRemoveAttachment();\n setShowConfirmDialog(false);\n setPendingWithdrawalValue(null);\n close();\n };\n\n const executeWithdrawal = async (value: string, attachment: string | null) => {\n if (!affiliate) return;\n\n try {\n const result = await requestDeposit.mutateAsync({\n value: parseCurrencyToNumber(value),\n ...(attachment ? { attachment } : {}),\n });\n toast.custom((toastId) => <Toast variant=\"success\" message={result.message} toastId={toastId} />);\n handleClose();\n } catch (error) {\n const message = error instanceof Error ? error.message : translateSheet('errorRequestDeposit');\n toast.custom((toastId) => <Toast variant=\"error\" message={message} toastId={toastId} />);\n }\n };\n\n const handleConfirmWithdrawal = async () => {\n if (pendingWithdrawalValue === null) return;\n setShowConfirmDialog(false);\n await executeWithdrawal(pendingWithdrawalValue, attachmentBase64);\n setPendingWithdrawalValue(null);\n };\n\n const infoBoxClasses = cn(\n 'flex items-center gap-3 text-zinc-950 rounded-lg p-4',\n isDefaultWhitelabel ? 'bg-cyan-50' : 'bg-zinc-50'\n );\n\n return (\n <>\n <Sheet open={isOpen} onOpenChange={(nextOpen) => !nextOpen && handleClose()}>\n <SheetContent\n side={isMobile ? 'bottom' : 'right'}\n className={cn(\n isMobile\n ? 'h-dvh w-full max-w-full rounded-none pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]'\n : 'h-screen max-w-[480px]! w-[480px]!',\n 'data-[state=open]:max-h-none data-[state=open]:h-dvh'\n )}\n >\n <SheetHeader className=\"border-b border-zinc-200\">\n <SheetTitle className=\"text-zinc-950 paragraph-medium-semibold\">\n {translateSheet('sheetTitle')}\n </SheetTitle>\n </SheetHeader>\n\n <form\n onSubmit={form.handleSubmit((data) => {\n setPendingWithdrawalValue(data.value);\n setShowConfirmDialog(true);\n })}\n className=\"flex flex-col flex-1 overflow-hidden\"\n >\n <div className=\"flex flex-col gap-6 px-5 py-5 overflow-y-auto [scrollbar-width:auto] [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-zinc-300 flex-1\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-500 paragraph-small-semibold\">\n {translateSheet('availableBalance')}\n </span>\n <span className=\"text-green-600 paragraph-medium-semibold\">\n {formatCurrencyNumber(balance)}\n </span>\n </div>\n\n <Separator />\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"paragraph-small-regular text-zinc-600\">\n {translateSheet('receivingAccount')}\n </span>\n <Button variant=\"secondary\" className=\"h-8!\" type=\"button\" onClick={openReceivingAccount}>\n <IconPencil />\n {translate('common.actions.edit')}\n </Button>\n </div>\n <div className=\"flex flex-col rounded-lg bg-zinc-50 p-4 gap-4\">\n <div className=\"flex items-center gap-3\">\n <span className=\"w-40 text-zinc-950 paragraph-small-medium\">\n {translateSheet('holderLabel')}\n </span>\n <span className=\"w-full text-zinc-600 paragraph-small-regular\">\n {affiliate?.holder_name ?? '—'}\n </span>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"w-40 text-zinc-950 paragraph-small-medium\">\n {translateSheet('pixKeyLabel')}\n </span>\n <span\n className={cn(\n 'w-full paragraph-small-regular truncate',\n hasPixKeyIssue ? 'text-red-600' : 'text-zinc-600'\n )}\n >\n {affiliate?.pix ? (hasPixKeyIssue ? affiliate.pix : formatPixKey(affiliate.pix)) : '—'}\n </span>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"w-40 text-zinc-950 paragraph-small-medium\">\n {translateSheet('holderDocumentLabel')}\n </span>\n <span className=\"w-full text-zinc-600 paragraph-small-regular truncate\">\n {affiliate?.holder_document ? formatDocument(affiliate.holder_document) : '—'}\n </span>\n </div>\n </div>\n {hasPixKeyIssue && (\n <div role=\"alert\" className=\"flex flex-col gap-3 rounded-lg bg-red-50 p-4\">\n <div className=\"flex items-start gap-3\">\n <IconAlertTriangle size={20} className=\"text-red-600 shrink-0 mt-0.5\" />\n <p className=\"paragraph-small-medium text-zinc-950\">\n {isPixKeyInvalid\n ? translateSheet('pixKeyInvalidWarning')\n : translateSheet('pixKeyMismatchWarning')}\n </p>\n </div>\n <Button className=\"h-10! w-fit\" type=\"button\" onClick={openReceivingAccount}>\n {translateSheet('updateReceivingAccountButton')}\n </Button>\n </div>\n )}\n </div>\n\n {limits && !limits.canWithdraw && !hasPixKeyIssue ? (\n <div className=\"flex flex-col gap-3 bg-zinc-50 rounded-lg p-4\">\n <div className=\"size-8 bg-white rounded-lg shadow-[0px_2px_10px_0px_rgba(26,26,26,0.05)] flex items-center justify-center\">\n <IconAlertTriangle size={18} className=\"text-amber-500\" />\n </div>\n <p className=\"paragraph-small-medium text-zinc-950\">{translateSheet('blockedTitle')}</p>\n <p className=\"paragraph-small-regular text-zinc-600\">\n {translateSheet('blockedDescription')}\n </p>\n <Button\n variant=\"secondary\"\n className=\"h-10! w-fit\"\n type=\"button\"\n onClick={openReceivingAccount}\n >\n {translateSheet('blockedEditAccountButton')}\n </Button>\n </div>\n ) : (\n <>\n <Controller\n name=\"value\"\n control={form.control}\n render={({ field, fieldState }) => (\n <FormField\n required\n disabled={hasPixKeyIssue}\n label={translateSheet('withdrawalValueLabel')}\n placeholder={translateSheet('withdrawalValuePlaceholder')}\n inputMode=\"numeric\"\n hintMessage={translateSheet('withdrawalValueHint', { minValue: minValueLabel })}\n value={field.value}\n onChange={(event) => {\n const raw = event.target.value.replace(/\\D/g, '');\n if (!raw) return field.onChange('');\n field.onChange(formatCurrency(raw));\n }}\n error={!!fieldState.error}\n errorMessage={fieldState.error?.message}\n />\n )}\n />\n\n {limits?.personType === 'cpf' && (\n <div className={infoBoxClasses}>\n <IconInfoCircle size={16} className=\"shrink-0\" />\n <span className=\"paragraph-small-semibold\">\n {translateSheet('cpfMonthlyLimit', {\n value: formatCurrencyNumber(limits.maxValuePerMonth ?? 0),\n })}{' '}\n <span className=\"text-zinc-600 paragraph-small-regular\">\n {translateSheet('cpfMonthlyRemaining', {\n value: formatCurrencyNumber(limits.monthlyRemaining ?? 0),\n })}\n </span>\n </span>\n </div>\n )}\n\n {limits?.personType === 'cnpj' && requiresInvoice && (\n <div className=\"flex flex-col gap-3 bg-zinc-50 rounded-lg p-4\">\n <div className=\"size-8 bg-white rounded-lg shadow-[0px_2px_10px_0px_rgba(26,26,26,0.05)] flex items-center justify-center\">\n <IconAlertTriangle size={18} className=\"text-amber-500\" />\n </div>\n <p className=\"paragraph-small-medium text-zinc-950\">\n {translateSheet('invoiceWarningCnpj')}\n </p>\n\n {!showUploadArea && !attachmentFile && (\n <Button\n variant=\"secondary\"\n className=\"h-10! w-fit\"\n type=\"button\"\n onClick={() => setShowUploadArea(true)}\n >\n {translateSheet('attachInvoiceButton')}\n <IconUpload size={20} />\n </Button>\n )}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"application/pdf\"\n className=\"hidden\"\n onChange={handleFileInputChange}\n />\n\n {showUploadArea && !attachmentFile && (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => fileInputRef.current?.click()}\n onKeyDown={(event) => event.key === 'Enter' && fileInputRef.current?.click()}\n onDragOver={(event) => {\n event.preventDefault();\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={handleDrop}\n className={cn(\n 'flex flex-col items-center justify-center gap-3.5 p-14 border-2 border-dashed rounded-lg cursor-pointer transition-colors hover:border-zinc-400',\n isDragging ? 'border-zinc-400 bg-zinc-100' : 'border-zinc-200 bg-white'\n )}\n >\n <div className=\"flex items-center justify-center size-14 bg-zinc-100 rounded-lg\">\n <IconUpload size={24} className=\"text-zinc-600\" />\n </div>\n <p className=\"paragraph-small-regular text-zinc-500 text-center\">\n {translateSheet('uploadAreaText')}{' '}\n <span className=\"paragraph-small-medium text-zinc-950\">\n {translateSheet('uploadAreaExt')}\n </span>\n </p>\n </div>\n )}\n\n {attachmentFile && (\n <UploadedPdfFile file={attachmentFile} onRemove={handleRemoveAttachment} />\n )}\n </div>\n )}\n </>\n )}\n\n <div className={infoBoxClasses}>\n <IconInfoCircle size={16} className=\"shrink-0\" />\n <span className=\"paragraph-small-semibold\">\n {translateSheet('processingInfo')}{' '}\n <span className=\"text-zinc-600 paragraph-small-regular\">\n {translateSheet('processingInfoSub')}\n </span>\n </span>\n </div>\n\n <div className={infoBoxClasses}>\n <IconInfoCircle size={16} className=\"shrink-0\" />\n <span className=\"paragraph-small-semibold\">\n {translateSheet('contactInfo')}{' '}\n <span className=\"text-zinc-600 paragraph-small-regular\">{AFFILIATE_FINANCE_EMAIL}</span>\n </span>\n </div>\n </div>\n\n <SheetFooter className=\"flex-row items-center justify-between border-t border-zinc-200 shrink-0\">\n <Button variant=\"secondary\" className=\"h-10!\" type=\"button\" onClick={handleClose}>\n {translate('common.actions.cancel')}\n </Button>\n <Button\n className=\"h-10!\"\n type=\"submit\"\n disabled={\n !affiliate ||\n !limits ||\n !hasReceivingAccount ||\n hasPixKeyIssue ||\n !withdrawalAmount ||\n withdrawalAmount < minWithdrawal ||\n toCents(withdrawalAmount) > toCents(availableToWithdraw) ||\n (requiresInvoice && !attachmentFile) ||\n !limits.canWithdraw ||\n requestDeposit.isPending\n }\n loading={requestDeposit.isPending}\n >\n {translateSheet('submitButton')}\n </Button>\n </SheetFooter>\n </form>\n </SheetContent>\n </Sheet>\n\n {pendingWithdrawalValue && (\n <Dialog open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <DialogContent className=\"flex flex-col p-0! gap-0! max-w-[calc(100%-2rem)]! w-full sm:max-w-[400px]! lg:max-w-[420px]! rounded-lg border\">\n <div className=\"flex flex-col gap-5 p-4 lg:p-5\">\n <span className=\"paragraph-medium-semibold text-zinc-950\">{translateSheet('reviewTitle')}</span>\n\n <div className=\"flex flex-col gap-3 bg-zinc-50 rounded-lg p-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-600 paragraph-small-medium\">\n {translateSheet('reviewValueLabel')}\n </span>\n <span className=\"text-zinc-950 paragraph-small-semibold\">\n {formatCurrencyNumber(parseCurrencyToNumber(pendingWithdrawalValue))}\n </span>\n </div>\n <div className=\"h-px bg-zinc-200\" />\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-600 paragraph-small-medium\">\n {translateSheet('holderLabel')}\n </span>\n <span className=\"text-zinc-950 paragraph-small-regular\">\n {affiliate?.holder_name ?? '—'}\n </span>\n </div>\n <div className=\"h-px bg-zinc-200\" />\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-600 paragraph-small-medium\">\n {translateSheet('reviewPixLabel')}\n </span>\n <span className=\"text-zinc-950 paragraph-small-regular truncate\">\n {affiliate?.pix ? formatPixKey(affiliate.pix) : '—'}\n </span>\n </div>\n <div className=\"h-px bg-zinc-200\" />\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-600 paragraph-small-medium\">\n {translateSheet('reviewDeadlineLabel')}\n </span>\n <span className=\"text-zinc-950 paragraph-small-regular\">\n {translateSheet('reviewDeadlineValue')}\n </span>\n </div>\n {limits?.personType === 'cnpj' && attachmentFile && (\n <>\n <div className=\"h-px bg-zinc-200\" />\n <div className=\"flex items-center justify-between\">\n <span className=\"text-zinc-600 paragraph-small-medium\">\n {translateSheet('reviewInvoiceLabel')}\n </span>\n <span className=\"text-zinc-950 paragraph-small-regular\">{attachmentFile.name}</span>\n </div>\n </>\n )}\n </div>\n\n <div className=\"flex flex-col gap-4 bg-amber-50 rounded-lg p-4\">\n <div className=\"flex items-start gap-3\">\n <IconAlertTriangle size={20} className=\"text-amber-600 shrink-0 mt-0.5\" />\n <p className=\"paragraph-small-regular text-zinc-950\">{translateSheet('reviewWarning')}</p>\n </div>\n </div>\n </div>\n\n <div className=\"h-px bg-zinc-200\" />\n\n <div className=\"flex flex-row items-center gap-2 p-4 lg:p-5\">\n <Button\n className=\"h-10 w-fit\"\n onClick={handleConfirmWithdrawal}\n loading={requestDeposit.isPending}\n >\n {translateSheet('reviewConfirmButton')}\n </Button>\n <Button\n variant=\"secondary\"\n className=\"h-10 w-fit\"\n onClick={() => setShowConfirmDialog(false)}\n >\n {translate('common.actions.back')}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )}\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -509,7 +509,10 @@ const messages = {
509
509
  reviewConfirmButton: "Confirm withdrawal",
510
510
  blockedTitle: "Fix your receiving account",
511
511
  blockedDescription: "The registered Pix key is a tax ID that differs from the account holder document. Update the key or the document to request withdrawals again.",
512
- blockedEditAccountButton: "Edit receiving account"
512
+ blockedEditAccountButton: "Edit receiving account",
513
+ pixKeyInvalidWarning: "Your Pix key is invalid. Update your receiving details to request a withdrawal.",
514
+ pixKeyMismatchWarning: "The Pix key does not match the account holder CPF/CNPJ. Update your receiving details to request a withdrawal.",
515
+ updateReceivingAccountButton: "Update receiving details"
513
516
  },
514
517
  bankAccount: {
515
518
  dialogTitle: "Receiving account",
@@ -529,6 +532,11 @@ const messages = {
529
532
  validationCpfChecksum: "Invalid CPF \u2014 check the verification digits",
530
533
  validationCnpjChecksum: "Invalid CNPJ \u2014 check the verification digits",
531
534
  validationPixDocumentMismatch: "The Pix key is a tax ID that differs from the account holder document. Use a key for the same document or fix the holder tax ID.",
535
+ validationPixInvalid: "Invalid Pix key. Use a CPF, CNPJ, mobile number with area code, email or random key.",
536
+ pixKeyPreview: "Will be saved as: {value}",
537
+ pixAmbiguousQuestion: "Is this number a mobile phone or a CPF?",
538
+ pixAmbiguousMobile: "Mobile",
539
+ pixAmbiguousCpf: "CPF",
532
540
  pixCnpjInvoiceNotice: "Company account: withdrawals require a PDF invoice and do not use the individual monthly limit."
533
541
  },
534
542
  noBankAccount: {