@greatapps/common 1.1.807 → 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 (28) hide show
  1. package/dist/components/account/sections/affiliates/ReceivingAccountModal.mjs +6 -2
  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 +4 -1
  6. package/dist/i18n/messages/en-us.mjs.map +1 -1
  7. package/dist/i18n/messages/es-es.mjs +4 -1
  8. package/dist/i18n/messages/es-es.mjs.map +1 -1
  9. package/dist/i18n/messages/pt-br.mjs +4 -1
  10. package/dist/i18n/messages/pt-br.mjs.map +1 -1
  11. package/dist/index.mjs +2 -1
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/testing/factories/index.mjs +2 -0
  14. package/dist/testing/factories/index.mjs.map +1 -1
  15. package/dist/testing/factories/withdrawal-limits.factory.mjs +18 -0
  16. package/dist/testing/factories/withdrawal-limits.factory.mjs.map +1 -0
  17. package/dist/utils/validators/pix-key.mjs +4 -0
  18. package/dist/utils/validators/pix-key.mjs.map +1 -1
  19. package/package.json +1 -1
  20. package/src/components/account/sections/affiliates/ReceivingAccountModal.tsx +6 -2
  21. package/src/components/account/sections/affiliates/RequestWithdrawalSheet.tsx +36 -3
  22. package/src/i18n/messages/en-us.ts +5 -0
  23. package/src/i18n/messages/es-es.ts +5 -0
  24. package/src/i18n/messages/pt-br.ts +5 -0
  25. package/src/index.ts +1 -1
  26. package/src/testing/factories/index.ts +1 -0
  27. package/src/testing/factories/withdrawal-limits.factory.ts +16 -0
  28. package/src/utils/validators/pix-key.ts +4 -0
@@ -19,7 +19,11 @@ import {
19
19
  normalizeCpfCnpjForStorage
20
20
  } from "../../../../utils/format/masks";
21
21
  import { isValidCNPJ, isValidCPF } from "../../../../utils/validators/common";
22
- import { AMBIGUOUS_PIX_KEY, normalizePixKeyForStorage } from "../../../../utils/validators/pix-key";
22
+ import {
23
+ AMBIGUOUS_PIX_KEY,
24
+ isPixKeyFromAnotherDocument,
25
+ normalizePixKeyForStorage
26
+ } from "../../../../utils/validators/pix-key";
23
27
  import { useAffiliateFlows } from "../../../../store/useAffiliateFlows";
24
28
  function ReceivingAccountModal() {
25
29
  const translate = useTranslations();
@@ -69,7 +73,7 @@ function ReceivingAccountModal() {
69
73
  });
70
74
  return;
71
75
  }
72
- if (typeof pix === "string" && /^\d+$/.test(pix) && pix !== digits) {
76
+ if (typeof pix === "string" && isPixKeyFromAnotherDocument(pix, digits)) {
73
77
  ctx.addIssue({
74
78
  code: z.ZodIssueCode.custom,
75
79
  path: ["pix"],
@@ -1 +1 @@
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 { AMBIGUOUS_PIX_KEY, normalizePixKeyForStorage } 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' && /^\\d+$/.test(pix) && 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":[]}
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",