@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.
- package/dist/components/account/sections/affiliates/ReceivingAccountModal.mjs +56 -18
- package/dist/components/account/sections/affiliates/ReceivingAccountModal.mjs.map +1 -1
- package/dist/components/account/sections/affiliates/RequestWithdrawalSheet.mjs +30 -3
- package/dist/components/account/sections/affiliates/RequestWithdrawalSheet.mjs.map +1 -1
- package/dist/i18n/messages/en-us.mjs +9 -1
- package/dist/i18n/messages/en-us.mjs.map +1 -1
- package/dist/i18n/messages/es-es.mjs +9 -1
- package/dist/i18n/messages/es-es.mjs.map +1 -1
- package/dist/i18n/messages/pt-br.mjs +9 -1
- package/dist/i18n/messages/pt-br.mjs.map +1 -1
- package/dist/index.mjs +7 -1
- package/dist/index.mjs.map +1 -1
- package/dist/testing/factories/affiliate.factory.mjs +24 -0
- package/dist/testing/factories/affiliate.factory.mjs.map +1 -0
- package/dist/testing/factories/index.mjs +4 -0
- package/dist/testing/factories/index.mjs.map +1 -1
- package/dist/testing/factories/withdrawal-limits.factory.mjs +18 -0
- package/dist/testing/factories/withdrawal-limits.factory.mjs.map +1 -0
- package/dist/utils/format/masks.mjs +6 -1
- package/dist/utils/format/masks.mjs.map +1 -1
- package/dist/utils/validators/pix-key.mjs +31 -0
- package/dist/utils/validators/pix-key.mjs.map +1 -0
- package/package.json +10 -9
- package/src/components/account/sections/affiliates/ReceivingAccountModal.tsx +75 -20
- package/src/components/account/sections/affiliates/RequestWithdrawalSheet.tsx +36 -3
- package/src/i18n/messages/en-us.ts +11 -0
- package/src/i18n/messages/es-es.ts +11 -0
- package/src/i18n/messages/pt-br.ts +11 -0
- package/src/index.ts +2 -0
- package/src/testing/factories/affiliate.factory.ts +22 -0
- package/src/testing/factories/index.ts +2 -0
- package/src/testing/factories/withdrawal-limits.factory.ts +16 -0
- package/src/utils/format/masks.ts +6 -2
- 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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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(
|
|
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: {
|