@asteby/storefront-react 0.23.0 → 0.24.0
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/account.cjs +88 -3
- package/dist/account.cjs.map +1 -1
- package/dist/account.d.cts +34 -2
- package/dist/account.d.ts +34 -2
- package/dist/account.js +89 -5
- package/dist/account.js.map +1 -1
- package/dist/{chunk-VE7WQPMY.js → chunk-5XYQLOE3.js} +18 -4
- package/dist/chunk-5XYQLOE3.js.map +1 -0
- package/dist/fiscal-server.cjs +8 -9
- package/dist/fiscal-server.cjs.map +1 -1
- package/dist/fiscal-server.d.cts +8 -5
- package/dist/fiscal-server.d.ts +8 -5
- package/dist/fiscal-server.js +8 -9
- package/dist/fiscal-server.js.map +1 -1
- package/dist/fiscal.cjs +46 -7
- package/dist/fiscal.cjs.map +1 -1
- package/dist/fiscal.d.cts +31 -6
- package/dist/fiscal.d.ts +31 -6
- package/dist/fiscal.js +32 -7
- package/dist/fiscal.js.map +1 -1
- package/dist/{types-CZ3PleG6.d.cts → types-Cgx_65eM.d.cts} +13 -1
- package/dist/{types-CZ3PleG6.d.ts → types-Cgx_65eM.d.ts} +13 -1
- package/package.json +2 -2
- package/dist/chunk-VE7WQPMY.js.map +0 -1
package/dist/fiscal.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/checkout/fields.tsx","../src/context.tsx","../src/locale.ts","../src/fiscal/format.ts","../src/fiscal/messages.ts","../src/fiscal/identity-fields.tsx","../src/fiscal/extraction.ts","../src/fiscal/use-camera-qr.ts","../src/fiscal/document-reader.tsx","../src/dialog.tsx","../src/fiscal/scan-tax-document.tsx","../src/fiscal/invoice-toggle.tsx","../src/fiscal/invoice-status-card.tsx"],"names":["useRef","useEffect","jsxs","jsx","createContext","useContext","ES","EN","useId","useState","useMemo","first","Fragment","useCallback","inv"],"mappings":"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","file":"fiscal.cjs","sourcesContent":["/**\n * Form fields of a checkout with inline validation: a labelled field that shows its own error under it, a focusable\n * error summary for the submit, and one hook that reads the browser's own constraint validation (`required`, `type`,\n * `pattern`, `minLength`...) so the rules stay in the HTML and the page keeps working without JavaScript (then the\n * browser explains the errors itself).\n *\n * WCAG 2.2: errors are identified in text next to the field (3.3.1), linked with `aria-describedby` and `aria-invalid`,\n * and the summary takes focus and links to every field (3.3.1 / 2.4.3). Validation runs when the buyer leaves a field\n * that has a value, and clears as soon as it is fixed: it never nags while typing.\n */\nimport { useEffect, useRef, useState, type InputHTMLAttributes, type ReactNode, type RefObject, type SelectHTMLAttributes } from 'react'\n\nexport type FieldMessages = {\n valueMissing: string\n /** Required radio group (delivery, payment). */\n choiceMissing: string\n email: string\n tel: string\n pattern: string\n /** `{n}` = minimum length. */\n tooShort: string\n /** A field the server rejected. */\n server: string\n /** Error summary title, `{n}` = number of fields. */\n summaryOne: string\n summaryMany: string\n optional: string\n}\n\nconst ES: FieldMessages = {\n valueMissing: 'Completa este campo.',\n choiceMissing: 'Elige una opción.',\n email: 'Escribe un correo válido, por ejemplo nombre@correo.com.',\n tel: 'Escribe un teléfono válido.',\n pattern: 'Revisa el formato.',\n tooShort: 'Escribe al menos {n} caracteres.',\n server: 'Revisa este campo.',\n summaryOne: 'Revisa 1 campo para continuar',\n summaryMany: 'Revisa {n} campos para continuar',\n optional: '(opcional)',\n}\n\nconst EN: FieldMessages = {\n valueMissing: 'Fill in this field.',\n choiceMissing: 'Choose an option.',\n email: 'Enter a valid email, like name@example.com.',\n tel: 'Enter a valid phone number.',\n pattern: 'Check the format.',\n tooShort: 'Enter at least {n} characters.',\n server: 'Check this field.',\n summaryOne: 'Check 1 field to continue',\n summaryMany: 'Check {n} fields to continue',\n optional: '(optional)',\n}\n\n/** Messages for a locale (`es*` default, `en*`), with optional overrides. */\nexport function fieldMessages(locale?: string | null, overrides?: Partial<FieldMessages> | null): FieldMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\n/** Field name -> error text. */\nexport type FieldErrors = Record<string, string>\n\nexport type ErrorSummaryItem = { name: string; id: string; label: string; message: string }\n\ntype Control = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n\nconst isControl = (el: EventTarget | null): el is Control =>\n !!el && typeof (el as Element).tagName === 'string' && ['INPUT', 'SELECT', 'TEXTAREA'].includes((el as Element).tagName) && !!(el as Control).name\n\n/**\n * The error text for a control, from its validity. A control can bring its own text with `data-sf-error` (any\n * failure) or `title` (pattern mismatch, the HTML convention).\n */\nexport function validationMessage(el: Control, m: FieldMessages = ES): string | null {\n const v = el.validity\n if (!v || v.valid) return null\n const own = el.getAttribute('data-sf-error')\n if (own) return own\n if (v.valueMissing) return el instanceof HTMLInputElement && (el.type === 'radio' || el.type === 'checkbox') ? m.choiceMissing : m.valueMissing\n if (v.typeMismatch && el instanceof HTMLInputElement) return el.type === 'email' ? m.email : el.type === 'tel' ? m.tel : m.pattern\n if (v.patternMismatch) return el.getAttribute('title') || (el instanceof HTMLInputElement && el.type === 'tel' ? m.tel : m.pattern)\n if (v.tooShort && el instanceof HTMLInputElement) return m.tooShort.replace('{n}', String(el.minLength))\n return el.validationMessage || m.pattern\n}\n\n/** Visible name of a control: its `<label>`, `aria-label`, or the legend of its group (radios). */\nfunction labelOf(el: Control): string {\n if (el instanceof HTMLInputElement && el.type === 'radio') {\n const legend = el.closest('fieldset')?.querySelector('legend')\n if (legend?.textContent) return legend.textContent.trim()\n }\n const text = el.labels?.[0]?.getAttribute('data-sf-label') ?? el.labels?.[0]?.textContent ?? el.getAttribute('aria-label') ?? el.name\n return text.trim()\n}\n\nexport type UseFieldErrorsOptions = {\n locale?: string\n messages?: Partial<FieldMessages>\n /** Fields the server rejected (e.g. from the action), shown with `serverMessages[name]` or the generic text. */\n serverFields?: Iterable<string> | null\n serverMessages?: Record<string, string> | null\n}\n\nexport type FieldErrorsState = {\n errors: FieldErrors\n /** Non-null after a submit with problems (or with server errors): render it in `<ErrorSummary>`. */\n summary: ErrorSummaryItem[] | null\n /** Changes every time a new summary appears, so `<ErrorSummary>` focuses it again. */\n summaryKey: number\n clear: () => void\n}\n\n/**\n * Inline validation for the page `<form>`. Listens to the form (no wrapping component): leaving a field with a value\n * checks it; typing in a field with an error clears it when fixed; a submit or `reportValidity()` with problems\n * collects them (the browser's bubbles are replaced by the inline texts) for the summary.\n */\nexport function useFieldErrors(formRef: RefObject<HTMLFormElement | null>, options: UseFieldErrorsOptions = {}): FieldErrorsState {\n const m = fieldMessages(options.locale, options.messages)\n const live = useRef(m)\n live.current = m\n const server = [...(options.serverFields ?? [])]\n const serverKey = server.join('|')\n const [errors, setErrors] = useState<FieldErrors>(() => Object.fromEntries(server.map((n) => [n, options.serverMessages?.[n] ?? m.server])))\n const [summary, setSummary] = useState<ErrorSummaryItem[] | null>(null)\n const [summaryKey, setSummaryKey] = useState(0)\n\n // Server errors (a new action result): inline texts plus a summary.\n useEffect(() => {\n if (!server.length) return\n const form = formRef.current\n const items: ErrorSummaryItem[] = []\n const next: FieldErrors = {}\n for (const name of server) {\n const msg = options.serverMessages?.[name] ?? live.current.server\n next[name] = msg\n const el = form?.elements.namedItem(name)\n const ctl = el && 'length' in el && !(el instanceof HTMLSelectElement) ? ((el as RadioNodeList)[0] as Control | undefined) : (el as Control | null)\n if (ctl) items.push({ name, id: ctl.id || name, label: labelOf(ctl), message: msg })\n }\n setErrors((e) => ({ ...e, ...next }))\n if (items.length) {\n setSummary(items)\n setSummaryKey((k) => k + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [serverKey])\n\n useEffect(() => {\n const form = formRef.current\n if (!form) return\n let batch: Control[] | null = null\n const set = (name: string, msg: string | null) =>\n setErrors((e) => {\n if (msg === null) {\n if (!(name in e)) return e\n const { [name]: _gone, ...rest } = e\n return rest\n }\n return e[name] === msg ? e : { ...e, [name]: msg }\n })\n const onBlur = (ev: FocusEvent) => {\n const el = ev.target\n if (!isControl(el) || (el instanceof HTMLInputElement && (el.type === 'radio' || el.type === 'checkbox' || el.type === 'hidden'))) return\n // Leaving an empty field you only tabbed through is not an error yet; it is at submit.\n if (!el.value) return\n set(el.name, validationMessage(el, live.current))\n }\n const onInput = (ev: Event) => {\n const el = ev.target\n if (!isControl(el)) return\n setErrors((e) => {\n if (!(el.name in e)) return e\n const msg = el.validity.valid ? null : validationMessage(el, live.current)\n if (msg !== null) return e // keep the text until the field is fixed (no flicker while typing)\n const { [el.name]: _gone, ...rest } = e\n return rest\n })\n }\n const onInvalid = (ev: Event) => {\n const el = ev.target\n if (!isControl(el)) return\n ev.preventDefault() // the inline text replaces the browser bubble\n if (!batch) {\n batch = []\n queueMicrotask(() => {\n const list = batch ?? []\n batch = null\n const seen = new Set<string>()\n const items: ErrorSummaryItem[] = []\n const next: FieldErrors = {}\n for (const c of list) {\n if (seen.has(c.name)) continue\n seen.add(c.name)\n const msg = validationMessage(c, live.current) ?? live.current.valueMissing\n next[c.name] = msg\n items.push({ name: c.name, id: c.id || c.name, label: labelOf(c), message: msg })\n }\n setErrors((e) => ({ ...e, ...next }))\n setSummary(items)\n setSummaryKey((k) => k + 1)\n })\n }\n batch.push(el)\n }\n form.addEventListener('focusout', onBlur)\n form.addEventListener('input', onInput)\n form.addEventListener('change', onInput)\n form.addEventListener('invalid', onInvalid, true)\n return () => {\n form.removeEventListener('focusout', onBlur)\n form.removeEventListener('input', onInput)\n form.removeEventListener('change', onInput)\n form.removeEventListener('invalid', onInvalid, true)\n }\n }, [formRef])\n\n // The summary follows the fixes: a field fixed after the submit leaves the list.\n const shown = summary ? summary.filter((s) => s.name in errors).map((s) => ({ ...s, message: errors[s.name]! })) : null\n return {\n errors,\n summary: shown && shown.length ? shown : null,\n summaryKey,\n clear: () => {\n setErrors({})\n setSummary(null)\n },\n }\n}\n\nexport type ErrorSummaryProps = {\n items: readonly ErrorSummaryItem[] | null\n /** Changes when a new summary must take focus (`useFieldErrors().summaryKey`). */\n focusKey?: number\n locale?: string\n messages?: Partial<FieldMessages>\n title?: ReactNode\n className?: string\n classNames?: Partial<Record<'title' | 'list' | 'link', string>>\n}\n\n/**\n * The list of problems after a submit, above the form: `role=\"alert\"`, takes focus, one link per field (moves the\n * focus to it). Renders nothing without items.\n */\nexport function ErrorSummary({ items, focusKey, locale, messages, title, className, classNames: cx = {} }: ErrorSummaryProps) {\n const ref = useRef<HTMLDivElement>(null)\n const m = fieldMessages(locale, messages)\n const has = !!items && items.length > 0\n useEffect(() => {\n if (has) ref.current?.focus()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [focusKey])\n if (!has) return null\n const n = items!.length\n return (\n <div ref={ref} role=\"alert\" tabIndex={-1} className={className} data-sf-error-summary aria-labelledby=\"sf-error-summary-title\">\n <p id=\"sf-error-summary-title\" className={cx.title} data-sf-error-summary-title>\n {title ?? (n === 1 ? m.summaryOne : m.summaryMany.replace('{n}', String(n)))}\n </p>\n <ul className={cx.list}>\n {items!.map((it) => (\n <li key={it.name}>\n <a\n href={`#${it.id}`}\n className={cx.link}\n onClick={(e) => {\n const el = document.getElementById(it.id)\n if (!el) return\n e.preventDefault()\n el.focus()\n el.scrollIntoView?.({ block: 'center' })\n }}\n >\n {it.label}: {it.message}\n </a>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nexport type CheckoutFieldClassNames = Partial<Record<'root' | 'label' | 'optional' | 'input' | 'hint' | 'error', string>>\n\ntype BaseFieldProps = {\n name: string\n label: string\n /** Field id. Default: the name. */\n id?: string\n /** Error text (from `useFieldErrors().errors[name]` or the server). */\n error?: string | null\n /** Help under the label (\"we only use it for the delivery\"). */\n hint?: ReactNode\n /** Marks the label \"(optional)\" and drops `required`. */\n optional?: boolean\n classNames?: CheckoutFieldClassNames\n locale?: string\n messages?: Partial<FieldMessages>\n}\n\nexport type CheckoutFieldProps = BaseFieldProps & Omit<InputHTMLAttributes<HTMLInputElement>, 'name' | 'id'> & { as?: 'input' }\nexport type CheckoutSelectProps = BaseFieldProps & Omit<SelectHTMLAttributes<HTMLSelectElement>, 'name' | 'id'> & { as: 'select'; children: ReactNode }\n\n/**\n * One labelled field: label (with \"(optional)\"), hint, the control and its error text, wired with `aria-describedby`\n * and `aria-invalid`. Required unless `optional`. `as=\"select\"` renders a `<select>` with the given options.\n */\nexport function CheckoutField(props: CheckoutFieldProps | CheckoutSelectProps) {\n const { name, label, id = name, error, hint, optional = false, classNames: cx = {}, locale, messages, ...rest } = props\n const m = fieldMessages(locale, messages)\n const hintId = hint ? `${id}-hint` : undefined\n const errorId = `${id}-error`\n const describedBy = [hintId, error ? errorId : undefined].filter(Boolean).join(' ') || undefined\n const common = {\n id,\n name,\n required: !optional,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': describedBy,\n className: cx.input,\n 'data-sf-field-control': '',\n } as const\n return (\n <div className={cx.root} data-sf-field data-invalid={error ? '' : undefined}>\n <label htmlFor={id} className={cx.label} data-sf-label={label}>\n {label}\n {optional ? (\n <span className={cx.optional} data-sf-field-optional>\n {' '}\n {m.optional}\n </span>\n ) : null}\n </label>\n {hint ? (\n <p id={hintId} className={cx.hint} data-sf-field-hint>\n {hint}\n </p>\n ) : null}\n {rest.as === 'select' ? (\n (() => {\n const { as: _as, children, ...select } = rest\n return (\n <select {...select} {...common}>\n {children}\n </select>\n )\n })()\n ) : (\n (() => {\n const { as: _as, ...input } = rest as CheckoutFieldProps\n return <input {...input} {...common} />\n })()\n )}\n {/* Reserved only when there is an error: the text sits right under its field. */}\n {error ? (\n <p id={errorId} className={cx.error} data-sf-field-error>\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n","import { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { createStorefrontClient, type Shop, type StorefrontClient, type StorefrontClientOptions } from '@asteby/storefront'\n\nexport type StorefrontContextValue = {\n /** Client for browser-side calls (use a public `pk_` token). */\n client: StorefrontClient | null\n shop: Shop | null\n /** BCP 47 locale used for formatting (defaults to `shop.locale`, then `es-MX`). */\n locale: string\n /** ISO 4217 currency (defaults to `shop.currency_code`, then `MXN`). */\n currency: string\n}\n\nconst StorefrontContext = createContext<StorefrontContextValue | null>(null)\n\nexport type StorefrontProviderProps = {\n /** A ready client. Takes precedence over `config`. */\n client?: StorefrontClient\n /** Options to create the browser client (use a `pk_` token). */\n config?: StorefrontClientOptions\n /** Shop info loaded on the server (root loader). */\n shop?: Shop | null\n locale?: string\n currency?: string\n children?: ReactNode\n}\n\n/**\n * Makes the storefront client, shop, locale and currency available to the\n * tree. SSR-safe: creating the client does not touch `window`.\n */\nexport function StorefrontProvider({ client, config, shop = null, locale, currency, children }: StorefrontProviderProps) {\n const configKey = config ? `${config.baseUrl}|${config.token}|${config.locale ?? ''}|${config.customerToken ?? ''}` : ''\n const resolvedClient = useMemo(\n () => client ?? (config ? createStorefrontClient(config) : null),\n [client, configKey],\n )\n const value = useMemo<StorefrontContextValue>(\n () => ({\n client: resolvedClient,\n shop,\n locale: locale ?? config?.locale ?? shop?.locale ?? 'es-MX',\n currency: currency ?? shop?.currency_code ?? 'MXN',\n }),\n [resolvedClient, shop, locale, currency, config?.locale],\n )\n return <StorefrontContext.Provider value={value}>{children}</StorefrontContext.Provider>\n}\n\n/** Storefront context. Throws outside `<StorefrontProvider>`. */\nexport function useStorefront(): StorefrontContextValue {\n const ctx = useContext(StorefrontContext)\n if (!ctx) throw new Error('useStorefront must be used inside <StorefrontProvider>')\n return ctx\n}\n\n/** Storefront context or `null` outside a provider (for components that work standalone). */\nexport function useOptionalStorefront(): StorefrontContextValue | null {\n return useContext(StorefrontContext)\n}\n\n/** The client from context; throws when the provider has none. */\nexport function useStorefrontClient(): StorefrontClient {\n const { client } = useStorefront()\n if (!client) throw new Error('<StorefrontProvider> needs a `client` or `config` for browser-side calls')\n return client\n}\n","import { useOptionalStorefront } from './context.js'\n\n/** Locale of a component: its own prop, else the `StorefrontProvider`'s, else `es-MX`. */\nexport function useResolvedLocale(locale?: string | null): string {\n const sf = useOptionalStorefront()\n return locale ?? sf?.locale ?? 'es-MX'\n}\n","/**\n * Pure helpers over the region's fiscal catalog (`Region.fiscal_id`). They know no country: the tax id format, the\n * regimes, the invoice uses and the postal code format are all data.\n */\nimport type { InvoiceRequest, Region, RegionFiscalEntry, RegionFiscalId } from '@asteby/storefront'\nimport type { FiscalFieldName, FiscalFieldValues } from './types.js'\n\nexport type FiscalRegion = Pick<Region, 'address'> & { fiscal_id?: RegionFiscalId }\n\n/** Uppercase, no spaces, hyphens or dots: how a tax id is compared and sent. */\nexport function normalizeTaxId(raw: string): string {\n return raw.replace(/[\\s\\-.]/g, '').toUpperCase()\n}\n\n/** Masks a tax id for display and logs: first 2 and last 3 characters stay (`PE********ABC`). */\nexport function maskTaxId(taxId: string): string {\n const v = taxId.trim()\n return v.length <= 5 ? '*'.repeat(v.length) : `${v.slice(0, 2)}${'*'.repeat(v.length - 5)}${v.slice(-3)}`\n}\n\nconst compile = (pattern: string | undefined): RegExp | null => {\n if (!pattern) return null\n try {\n return new RegExp(pattern)\n } catch {\n return null\n }\n}\n\n/** `null` when the tax id is valid for the region (its pattern or one of its generic ids); otherwise why not. */\nexport function taxIdProblem(fid: RegionFiscalId | undefined, raw: string): 'required' | 'format' | null {\n const v = normalizeTaxId(raw)\n if (!v) return 'required'\n if (!fid) return null\n if (fid.generic_ids.includes(v)) return null\n const re = compile(fid.pattern)\n return re && !re.test(v) ? 'format' : null\n}\n\nexport function postalCodeProblem(region: FiscalRegion, raw: string): 'required' | 'format' | null {\n const v = raw.trim()\n if (!v) return 'required'\n const re = compile(region.address?.postal_code?.pattern)\n return re && !re.test(v) ? 'format' : null\n}\n\n/**\n * Builds the function that tells a person type from a tax id when the region does not publish one. Pass the length\n * of the tax id per type, e.g. `personTypeByLength({ individual: 13, company: 12 })`. Without a function the regimes\n * are not narrowed by person type (the server still checks the combination).\n */\nexport function personTypeByLength(lengths: Record<string, number>): (taxId: string) => string | null {\n return (taxId) => {\n const n = normalizeTaxId(taxId).length\n return Object.keys(lengths).find((t) => lengths[t] === n) ?? null\n }\n}\n\n/**\n * Tells a person type from a tax id with the region's own patterns (`fiscal_id.person_patterns`, DATA of the region\n * pack). `null` when the region publishes none or none matches. A pattern that does not compile is ignored.\n */\nexport function personTypeFromPatterns(fid: RegionFiscalId | undefined, taxId: string): string | null {\n const patterns = fid?.person_patterns\n if (!patterns) return null\n const v = normalizeTaxId(taxId)\n for (const type of Object.keys(patterns).sort()) {\n const re = compile(patterns[type])\n if (re?.test(v)) return type\n }\n return null\n}\n\n/** The function to use for the person type: the store's override, else the region's patterns. */\nexport function personTypeResolver(fid: RegionFiscalId | undefined, override?: (taxId: string) => string | null): (taxId: string) => string | null {\n return override ?? ((taxId) => personTypeFromPatterns(fid, taxId))\n}\n\n/**\n * The invoice use to suggest for a regime, from region data only: the organization's `default_invoice_use` when the\n * regime admits it, else the first use whose `suggested_for_regimes` lists the regime (and whose `allowed_regimes`\n * admits it). `null` when the region suggests nothing: then nothing is preselected. A suggestion, never a rule.\n */\nexport function suggestInvoiceUse(fid: RegionFiscalId | undefined, regime: string | null | undefined): string | null {\n if (!fid || !regime) return null\n const allowed = usesFor(fid, regime)\n const preferred = fid.default_invoice_use\n if (preferred && allowed.some((u) => u.code === preferred)) return preferred\n return allowed.find((u) => u.suggested_for_regimes?.includes(regime))?.code ?? null\n}\n\n/** Regimes that fit a person type (all when the type is unknown). */\nexport function regimesFor(fid: RegionFiscalId | undefined, personType: string | null): RegionFiscalEntry[] {\n const all = fid?.regimes ?? []\n if (!personType) return all\n return all.filter((r) => r.person_types.length === 0 || r.person_types.includes(personType))\n}\n\n/** Invoice uses a regime admits (all when no regime is chosen yet). */\nexport function usesFor(fid: RegionFiscalId | undefined, regime: string | null | undefined): RegionFiscalEntry[] {\n const all = fid?.invoice_uses ?? []\n if (!regime) return all\n return all.filter((u) => !u.allowed_regimes || u.allowed_regimes.length === 0 || u.allowed_regimes.includes(regime))\n}\n\nexport type FiscalProblem = 'required' | 'format' | 'unknown' | 'person_type' | 'use_not_allowed'\n\n/** Client-side check of the whole form against the region; the server stays the authority. */\nexport function validateFiscalValues(\n region: FiscalRegion,\n v: Partial<FiscalFieldValues>,\n personTypeOverride?: (taxId: string) => string | null,\n): Partial<Record<FiscalFieldName, FiscalProblem>> {\n const fid = region.fiscal_id\n const personTypeOf = personTypeResolver(fid, personTypeOverride)\n const out: Partial<Record<FiscalFieldName, FiscalProblem>> = {}\n const tax = taxIdProblem(fid, v.tax_id ?? '')\n if (tax) out.tax_id = tax\n if (!(v.legal_name ?? '').trim()) out.legal_name = 'required'\n if (postalCodeProblem(region, v.postal_code ?? '')) out.postal_code = postalCodeProblem(region, v.postal_code ?? '')!\n const regime = v.tax_regime ?? ''\n if (!regime) out.tax_regime = 'required'\n else if (fid) {\n const entry = fid.regimes.find((r) => r.code === regime)\n if (!entry) out.tax_regime = 'unknown'\n else if (!tax && !fid.generic_ids.includes(normalizeTaxId(v.tax_id ?? ''))) {\n const person = personTypeOf?.(v.tax_id ?? '') ?? null\n if (person && entry.person_types.length > 0 && !entry.person_types.includes(person)) out.tax_regime = 'person_type'\n }\n }\n const use = v.use ?? ''\n if (!use) out.use = 'required'\n else if (fid) {\n const entry = fid.invoice_uses.find((u) => u.code === use)\n if (!entry) out.use = 'unknown'\n else if (regime && entry.allowed_regimes && entry.allowed_regimes.length > 0 && !entry.allowed_regimes.includes(regime)) out.use = 'use_not_allowed'\n }\n return out\n}\n\n/** Form values -> the API's `InvoiceRequest` (without `document`). */\nexport function toInvoiceRequest(v: Partial<FiscalFieldValues>, countryCode?: string): InvoiceRequest {\n return {\n requested: true,\n tax_id: normalizeTaxId(v.tax_id ?? ''),\n legal_name: (v.legal_name ?? '').trim(),\n tax_regime: v.tax_regime ?? '',\n use: v.use ?? '',\n postal_code: (v.postal_code ?? '').trim(),\n ...(countryCode ? { country_code: countryCode } : {}),\n }\n}\n\n/** `label_en` for English locales when the region has it. */\nexport function entryLabel(e: RegionFiscalEntry, locale?: string | null): string {\n return (locale ?? 'es-MX').toLowerCase().startsWith('en') && e.label_en ? e.label_en : e.label\n}\n","/** Texts of the fiscal components. Spanish (es-MX) by default, English with `en*`, any locale with `messages`. */\nimport type { FiscalReadError } from './types.js'\n\nexport type DeepPartial<T> = { [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K] }\n\nexport type FiscalMessages = {\n fields: {\n legend: string\n taxId: string\n taxIdHint: string\n legalName: string\n /** Used when the region publishes no help for the legal name. */\n legalNameHint: string\n postalCode: string\n postalCodeHint: string\n regime: string\n regimeHint: string\n regimeChoose: string\n regimeFromDocument: string\n use: string\n useHint: string\n useChoose: string\n /** `{document}` = the document's name. */\n fromDocument: string\n /** Mark on an invoice use the region suggested (an editable preselection). */\n suggested: string\n errors: {\n required: string\n taxIdFormat: string\n postalFormat: string\n unknown: string\n personType: string\n useNotAllowed: string\n }\n }\n reader: {\n /** `{document}`. */\n title: string\n dropHint: string\n dropActive: string\n choose: string\n obtain: string\n privacyBrowser: string\n privacyServer: string\n uploadServer: string\n manual: string\n reading: string\n cancel: string\n done: string\n reviewTitle: string\n reviewHint: string\n confirm: string\n changeFile: string\n saveToAccount: string\n saveConsent: string\n warnings: { qrMismatch: string; stale: string; regimeMissing: string; fieldsMissing: string; qrPartial: string }\n /** Reading a photo or the camera (the region's `image_mode`). `{document}` where noted. */\n scan: {\n title: string\n photo: string\n photoHint: string\n camera: string\n cameraTitle: string\n cameraGuide: string\n cameraStarting: string\n cameraRead: string\n cameraDenied: string\n cameraUnavailable: string\n closeCamera: string\n choosePhoto: string\n /** Button that opens the sheet; `{document}` is the document's label. */\n open: string\n manual: string\n close: string\n }\n errors: Record<FiscalReadError, string>\n summaryTitleOne: string\n summaryTitleMany: string\n }\n toggle: {\n label: string\n payDefault: string\n payAndInvoice: string\n profileTitle: string\n change: string\n useOther: string\n useSaved: string\n manualTitle: string\n unavailable: string\n privacy: string\n fieldsOf: { taxId: string; legalName: string; postalCode: string; regime: string; use: string }\n }\n status: {\n title: string\n request: string\n requestHelp: string\n awaitingTitle: string\n awaitingBody: string\n processingTitle: string\n processingBody: string\n processingSlow: string\n refresh: string\n issuedTitle: string\n issuedBody: string\n folio: string\n pdf: string\n xml: string\n needsDataTitle: string\n needsDataBody: string\n correct: string\n reviewTitle: string\n reviewBody: string\n contact: string\n contactBy: string\n windowTitle: string\n windowBody: string\n unavailableTitle: string\n unavailableBody: string\n cancelledTitle: string\n cancelledBody: string\n /** `reason_code` -> cause for the buyer. `default` when unknown. */\n reasons: Record<string, string>\n }\n server: { errors: Record<string, string> }\n}\n\nconst ES: FiscalMessages = {\n fields: {\n legend: 'Datos fiscales',\n taxId: 'RFC',\n taxIdHint: 'Se escribe en mayúsculas y sin espacios.',\n legalName: 'Nombre o razón social',\n legalNameHint: 'Escríbelo tal como aparece en tu registro fiscal.',\n postalCode: 'Código postal fiscal',\n postalCodeHint: 'El de tu domicilio fiscal, que puede ser distinto al de entrega.',\n regime: 'Régimen fiscal',\n regimeHint: 'Solo mostramos los que aplican a tu tipo de persona.',\n regimeChoose: 'Elige tu régimen',\n regimeFromDocument: 'Tu documento menciona más de un régimen. Elige el que usarás para esta factura.',\n use: 'Uso de la factura',\n useHint: 'Solo mostramos los usos que admite tu régimen.',\n useChoose: 'Elige el uso',\n fromDocument: 'De tu {document}',\n suggested: 'Sugerido',\n errors: {\n required: 'Completa este campo.',\n taxIdFormat: 'Revisa el formato: {kind} no válido.',\n postalFormat: 'Escribe un código postal válido, por ejemplo {example}.',\n unknown: 'Elige una opción de la lista.',\n personType: 'Este régimen no corresponde a tu tipo de persona.',\n useNotAllowed: 'Este uso no está disponible con el régimen elegido.',\n },\n },\n reader: {\n title: 'Sube tu {document}',\n dropHint: 'Arrastra el PDF aquí o toca para elegirlo',\n dropActive: 'Suelta el archivo para leerlo',\n choose: 'Elegir archivo',\n obtain: 'Descárgala aquí',\n privacyBrowser: 'La leemos en tu dispositivo. No guardamos el archivo, solo los datos que confirmes.',\n privacyServer: 'La procesamos y la descartamos al terminar. Solo guardamos los datos que confirmes.',\n uploadServer: 'Leer mi archivo',\n manual: 'Captura tus datos a mano',\n reading: 'Leyendo tu {document}…',\n cancel: 'Cancelar',\n done: 'Listo. Revisa tus datos.',\n reviewTitle: 'Revisa tus datos',\n reviewHint: 'Puedes corregir cualquier campo antes de continuar.',\n confirm: 'Usar estos datos',\n changeFile: 'Subir otro archivo',\n saveToAccount: 'Guardar en mi cuenta para la próxima',\n saveConsent: 'Guardaremos estos datos en tu cuenta para facturar más rápido. Puedes borrarlos cuando quieras.',\n warnings: {\n qrMismatch: 'El código QR de tu documento no coincide con los datos leídos. Revisa con calma tu RFC y tu nombre.',\n stale: 'Tu documento tiene {days} días de emitido. Si algo cambió en tu registro, descarga uno nuevo.',\n regimeMissing: 'No pudimos detectar tu régimen. Elígelo de la lista.',\n fieldsMissing: 'No encontramos algunos datos en el documento. Complétalos para continuar.',\n qrPartial: 'Del código QR solo leímos tu identificador fiscal. Completa los demás datos o sube el PDF.',\n },\n scan: {\n title: 'Escanea tu {document}',\n photo: 'Tomar foto del QR',\n photoHint: 'Enfoca el código QR de tu documento.',\n camera: 'Escanear con la cámara',\n cameraTitle: 'Apunta al código QR',\n cameraGuide: 'Centra el código QR dentro del marco.',\n cameraStarting: 'Abriendo la cámara…',\n cameraRead: 'Código leído',\n cameraDenied: 'No pudimos usar la cámara. Elige una foto o sube el PDF.',\n cameraUnavailable: 'Este dispositivo no permite usar la cámara aquí. Elige una foto o sube el PDF.',\n closeCamera: 'Cerrar la cámara',\n choosePhoto: 'Elegir una foto',\n open: 'Escanear {document}',\n manual: 'Capturar a mano',\n close: 'Cerrar',\n },\n errors: {\n not_pdf: 'Ese archivo no es un PDF. Sube el PDF que descargaste o captura tus datos a mano.',\n too_large: 'El archivo pesa más de {size}. Sube el PDF original o captura tus datos a mano.',\n no_text: 'Este PDF parece una imagen escaneada y no podemos leerlo. Captura tus datos a mano.',\n password: 'Este PDF tiene contraseña y no podemos abrirlo. Descárgalo de nuevo sin contraseña o captura tus datos a mano.',\n unreadable: 'No pudimos leer este archivo. Inténtalo con otro o captura tus datos a mano.',\n no_qr: 'No encontramos el código QR en la foto. Acércate, evita reflejos o sube el PDF.',\n not_image: 'Ese archivo no es una foto que podamos leer. Toma otra foto o sube el PDF.',\n },\n summaryTitleOne: 'Revisa 1 campo para continuar',\n summaryTitleMany: 'Revisa {n} campos para continuar',\n },\n toggle: {\n label: 'Necesito factura (CFDI)',\n payDefault: 'Pagar',\n payAndInvoice: 'Pagar y facturar',\n profileTitle: 'Facturaremos con estos datos',\n change: 'Cambiar',\n useOther: 'Usar otros datos',\n useSaved: 'Usar mis datos guardados',\n manualTitle: 'Datos de facturación',\n unavailable: 'Esta tienda todavía no factura en línea.',\n privacy: 'Usamos estos datos solo para emitir tu factura.',\n fieldsOf: { taxId: 'RFC', legalName: 'Nombre o razón social', postalCode: 'Código postal fiscal', regime: 'Régimen', use: 'Uso' },\n },\n status: {\n title: 'Factura',\n request: 'Solicitar factura',\n requestHelp: '¿Necesitas factura de este pedido?',\n awaitingTitle: 'Esperando tu pago',\n awaitingBody: 'Cuando se acredite tu pago emitimos la factura. Con OXXO o transferencia puede tardar un poco.',\n processingTitle: 'Estamos generando tu factura',\n processingBody: 'Suele tardar menos de un minuto. Esta página se actualiza sola.',\n processingSlow: 'Sigue en proceso. Puedes cerrar esta página: tu factura aparecerá aquí cuando esté lista.',\n refresh: 'Actualizar',\n issuedTitle: 'Tu factura está lista',\n issuedBody: 'Descárgala cuando la necesites. Los enlaces vencen en 15 minutos; vuelve a abrir esta página para generar nuevos.',\n folio: 'Folio fiscal',\n pdf: 'Descargar PDF',\n xml: 'Descargar XML',\n needsDataTitle: 'Faltan datos para tu factura',\n needsDataBody: 'No pudimos emitirla con los datos que nos diste.',\n correct: 'Corregir y reintentar',\n reviewTitle: 'La tienda está revisando tu factura',\n reviewBody: 'Necesita una revisión del negocio. No tienes que hacer nada más; si tarda, escríbenos.',\n contact: 'Contactar a la tienda',\n contactBy: 'Escríbenos a {contact} con tu número de pedido.',\n windowTitle: 'Ya pasó el plazo para facturar',\n windowBody: 'Este pedido está fuera del plazo para pedir factura. Si necesitas ayuda, contacta a la tienda.',\n unavailableTitle: 'Factura no disponible',\n unavailableBody: 'Esta tienda no emite factura de este pedido. Si la necesitas, contáctala.',\n cancelledTitle: 'Factura cancelada',\n cancelledBody: 'Esta factura fue cancelada. Si necesitas una nueva, contacta a la tienda.',\n reasons: {\n 'invoice.tax_id': 'El RFC no es válido.',\n 'invoice.legal_name': 'El nombre o la razón social no coincide con tu registro.',\n 'invoice.tax_regime': 'El régimen fiscal no es válido para tus datos.',\n 'invoice.postal_code': 'El código postal fiscal no es válido.',\n 'invoice.use': 'El uso de la factura no es válido con tu régimen.',\n default: 'Revisa tus datos fiscales y vuelve a intentarlo.',\n },\n },\n server: {\n errors: {\n validation: 'Revisa este campo.',\n required: 'Completa este campo.',\n invalid: 'El valor no es válido.',\n },\n },\n}\n\nconst EN: FiscalMessages = {\n fields: {\n legend: 'Tax details',\n taxId: 'Tax ID',\n taxIdHint: 'Uppercase, without spaces.',\n legalName: 'Legal name',\n legalNameHint: 'Write it as it appears in your tax registration.',\n postalCode: 'Tax postal code',\n postalCodeHint: 'The one of your tax address, which can differ from the delivery address.',\n regime: 'Tax regime',\n regimeHint: 'We only list the ones that apply to your kind of taxpayer.',\n regimeChoose: 'Choose your regime',\n regimeFromDocument: 'Your document lists more than one regime. Choose the one for this invoice.',\n use: 'Invoice use',\n useHint: 'We only list the uses your regime admits.',\n useChoose: 'Choose the use',\n fromDocument: 'From your {document}',\n suggested: 'Suggested',\n errors: {\n required: 'Fill in this field.',\n taxIdFormat: 'Check the format: not a valid {kind}.',\n postalFormat: 'Enter a valid postal code, like {example}.',\n unknown: 'Choose an option from the list.',\n personType: 'This regime does not match your kind of taxpayer.',\n useNotAllowed: 'This use is not available with the chosen regime.',\n },\n },\n reader: {\n title: 'Upload your {document}',\n dropHint: 'Drag the PDF here or tap to choose it',\n dropActive: 'Drop the file to read it',\n choose: 'Choose file',\n obtain: 'Get it here',\n privacyBrowser: 'We read it on your device. We do not keep the file, only the details you confirm.',\n privacyServer: 'We process it and discard it when done. We only keep the details you confirm.',\n uploadServer: 'Read my file',\n manual: 'Enter your details by hand',\n reading: 'Reading your {document}…',\n cancel: 'Cancel',\n done: 'Done. Review your details.',\n reviewTitle: 'Review your details',\n reviewHint: 'You can fix any field before continuing.',\n confirm: 'Use these details',\n changeFile: 'Upload another file',\n saveToAccount: 'Save to my account for next time',\n saveConsent: 'We will save these details to your account to invoice faster. You can delete them any time.',\n warnings: {\n qrMismatch: 'The QR code of your document does not match what we read. Check your tax ID and name carefully.',\n stale: 'Your document was issued {days} days ago. If something changed in your registration, download a new one.',\n regimeMissing: 'We could not detect your regime. Choose it from the list.',\n fieldsMissing: 'We did not find some details in the document. Fill them in to continue.',\n qrPartial: 'The QR code only gave us your tax ID. Fill in the rest or upload the PDF.',\n },\n scan: {\n title: 'Scan your {document}',\n photo: 'Take a photo of the QR',\n photoHint: 'Point at the QR code of your document.',\n camera: 'Scan with the camera',\n cameraTitle: 'Point at the QR code',\n cameraGuide: 'Center the QR code inside the frame.',\n cameraStarting: 'Opening the camera…',\n cameraRead: 'Code read',\n cameraDenied: 'We could not use the camera. Choose a photo or upload the PDF.',\n cameraUnavailable: 'This device does not allow the camera here. Choose a photo or upload the PDF.',\n closeCamera: 'Close the camera',\n choosePhoto: 'Choose a photo',\n open: 'Scan {document}',\n manual: 'Enter by hand',\n close: 'Close',\n },\n errors: {\n not_pdf: 'That file is not a PDF. Upload the PDF you downloaded or enter your details by hand.',\n too_large: 'The file is larger than {size}. Upload the original PDF or enter your details by hand.',\n no_text: 'This PDF looks like a scanned image and we cannot read it. Enter your details by hand.',\n password: 'This PDF is password protected and we cannot open it. Download it again without a password or enter your details by hand.',\n unreadable: 'We could not read this file. Try another one or enter your details by hand.',\n no_qr: 'We could not find the QR code in the photo. Move closer, avoid glare or upload the PDF.',\n not_image: 'That file is not a photo we can read. Take another photo or upload the PDF.',\n },\n summaryTitleOne: 'Check 1 field to continue',\n summaryTitleMany: 'Check {n} fields to continue',\n },\n toggle: {\n label: 'I need an invoice',\n payDefault: 'Pay',\n payAndInvoice: 'Pay and invoice',\n profileTitle: 'We will invoice with these details',\n change: 'Change',\n useOther: 'Use other details',\n useSaved: 'Use my saved details',\n manualTitle: 'Invoice details',\n unavailable: 'This store does not invoice online yet.',\n privacy: 'We only use these details to issue your invoice.',\n fieldsOf: { taxId: 'Tax ID', legalName: 'Legal name', postalCode: 'Tax postal code', regime: 'Regime', use: 'Use' },\n },\n status: {\n title: 'Invoice',\n request: 'Request invoice',\n requestHelp: 'Do you need an invoice for this order?',\n awaitingTitle: 'Waiting for your payment',\n awaitingBody: 'We issue the invoice once your payment clears. Cash and bank transfers can take a while.',\n processingTitle: 'We are generating your invoice',\n processingBody: 'It usually takes under a minute. This page updates by itself.',\n processingSlow: 'Still in progress. You can close this page: your invoice will show up here when it is ready.',\n refresh: 'Refresh',\n issuedTitle: 'Your invoice is ready',\n issuedBody: 'Download it whenever you need. The links expire in 15 minutes; reopen this page for new ones.',\n folio: 'Tax folio',\n pdf: 'Download PDF',\n xml: 'Download XML',\n needsDataTitle: 'Your invoice needs more details',\n needsDataBody: 'We could not issue it with the details you gave us.',\n correct: 'Fix and retry',\n reviewTitle: 'The store is reviewing your invoice',\n reviewBody: 'It needs a review by the business. You do not need to do anything else; if it takes long, write to us.',\n contact: 'Contact the store',\n contactBy: 'Write to {contact} with your order number.',\n windowTitle: 'The invoicing period has ended',\n windowBody: 'This order is outside the period to request an invoice. If you need help, contact the store.',\n unavailableTitle: 'Invoice not available',\n unavailableBody: 'This store does not issue an invoice for this order. If you need one, contact them.',\n cancelledTitle: 'Invoice cancelled',\n cancelledBody: 'This invoice was cancelled. If you need a new one, contact the store.',\n reasons: {\n 'invoice.tax_id': 'The tax ID is not valid.',\n 'invoice.legal_name': 'The legal name does not match your registration.',\n 'invoice.tax_regime': 'The tax regime is not valid for your details.',\n 'invoice.postal_code': 'The tax postal code is not valid.',\n 'invoice.use': 'The invoice use is not valid with your regime.',\n default: 'Check your tax details and try again.',\n },\n },\n server: {\n errors: {\n validation: 'Check this field.',\n required: 'Fill in this field.',\n invalid: 'The value is not valid.',\n },\n },\n}\n\nconst merge = <T extends Record<string, unknown>>(base: T, over: DeepPartial<T> | undefined): T => {\n if (!over) return base\n const out: Record<string, unknown> = { ...base }\n for (const [k, v] of Object.entries(over)) {\n if (v === undefined) continue\n const b = base[k]\n out[k] = typeof v === 'object' && v !== null && !Array.isArray(v) && typeof b === 'object' && b !== null ? merge(b as Record<string, unknown>, v as DeepPartial<Record<string, unknown>>) : v\n }\n return out as T\n}\n\n/** Messages for a locale (`es*` default, `en*`), with optional overrides (merged level by level). */\nexport function fiscalMessages(locale?: string | null, overrides?: DeepPartial<FiscalMessages> | null): FiscalMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? merge(base, overrides) : base\n}\n\n/** `{name}` placeholders. */\nexport function fill(template: string, vars: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (m, k: string) => (k in vars ? String(vars[k]) : m))\n}\n","/**\n * The fiscal data of an invoice: tax id, legal name, tax postal code, regime and invoice use. Everything comes from the\n * region (`Region.fiscal_id`): the tax id's name and format, the regimes (narrowed by person type when the shop says how\n * to tell it), the uses (narrowed by the chosen regime) and the postal code format. Nothing here names a country.\n *\n * Plain HTML controls named `<prefix>.<field>` (default `invoice.tax_id`, `invoice.legal_name`...), so the fields work\n * inside any `<form>`, with or without JavaScript; with JavaScript the region's rules also run as the buyer types.\n */\nimport { useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { CheckoutField, type CheckoutFieldClassNames, type FieldErrors } from '../checkout/fields.js'\nimport { useResolvedLocale } from '../locale.js'\nimport { entryLabel, normalizeTaxId, personTypeResolver, regimesFor, suggestInvoiceUse, usesFor, validateFiscalValues, type FiscalProblem, type FiscalRegion } from './format.js'\nimport { fill, fiscalMessages, type DeepPartial, type FiscalMessages } from './messages.js'\nimport type { FiscalFieldName, FiscalFieldValues } from './types.js'\n\nexport type FiscalIdentityFieldsClassNames = CheckoutFieldClassNames & Partial<Record<'fieldset' | 'legend' | 'mark' | 'radios' | 'radio', string>>\n\nexport type FiscalIdentityFieldsProps = {\n region: FiscalRegion\n /** Initial values (and, when they change, the new values: e.g. after a document is read). */\n values?: Partial<FiscalFieldValues>\n onChange?: (values: FiscalFieldValues) => void\n /** Fields that were filled from a document: they get the \"From your {document}\" mark and stay editable. */\n fromDocument?: readonly FiscalFieldName[]\n /** Short noun of the document for the mark (\"constancia\"). Default: nothing specific (\"tu documento\"). */\n documentName?: string\n /** The document listed these regimes: show only them, as radios. */\n regimeCandidates?: readonly string[]\n /** Errors by control name (`invoice.tax_regime`), from the server or `useFieldErrors`. */\n errors?: FieldErrors\n namePrefix?: string\n /** Prefix of the control ids (default: generated). */\n idPrefix?: string\n /**\n * Overrides how a person type is told from a tax id (to narrow the regimes). Default: the region's own patterns\n * (`fiscal_id.person_patterns`); with neither, the regimes are not narrowed (the server still checks).\n */\n personTypeOf?: (taxId: string) => string | null\n /** The invoice use in `values` came from the region's suggestion (a document was read): it gets the \"Suggested\" mark. */\n suggestedUse?: string | null\n disabled?: boolean\n locale?: string\n messages?: DeepPartial<FiscalMessages>\n classNames?: FiscalIdentityFieldsClassNames\n /** Hides the fieldset legend (when the caller already has a heading). */\n hideLegend?: boolean\n}\n\nconst FIELDS: FiscalFieldName[] = ['tax_id', 'legal_name', 'postal_code', 'tax_regime', 'use']\nconst EMPTY: FiscalFieldValues = { tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '' }\n\nfunction problemText(m: FiscalMessages['fields'], region: FiscalRegion, field: FiscalFieldName, p: FiscalProblem): string {\n const e = m.errors\n switch (p) {\n case 'required':\n return e.required\n case 'format':\n return field === 'tax_id'\n ? fill(e.taxIdFormat, { kind: region.fiscal_id?.label ?? '' })\n : fill(e.postalFormat, { example: region.address?.postal_code?.example ?? '' })\n case 'person_type':\n return e.personType\n case 'use_not_allowed':\n return e.useNotAllowed\n default:\n return e.unknown\n }\n}\n\nexport function FiscalIdentityFields({\n region,\n values,\n onChange,\n fromDocument = [],\n documentName,\n regimeCandidates,\n errors = {},\n namePrefix = 'invoice',\n idPrefix,\n personTypeOf: personTypeOverride,\n suggestedUse,\n disabled,\n locale: localeProp,\n messages,\n classNames: cx = {},\n hideLegend,\n}: FiscalIdentityFieldsProps) {\n const locale = useResolvedLocale(localeProp)\n const all = fiscalMessages(locale, messages)\n const m = all.fields\n const fid = region.fiscal_id\n const reactId = useId()\n const base = idPrefix ?? `sf-fiscal-${reactId.replace(/:/g, '')}`\n const [v, setV] = useState<FiscalFieldValues>({ ...EMPTY, ...values })\n const [shown, setShown] = useState<ReadonlySet<FiscalFieldName>>(new Set())\n // The use the region suggested when the regime was chosen here (cleared as soon as the buyer picks one).\n const [autoUse, setAutoUse] = useState<string | null>(null)\n const personTypeOf = useMemo(() => personTypeResolver(region.fiscal_id, personTypeOverride), [region.fiscal_id, personTypeOverride])\n const root = useRef<HTMLFieldSetElement>(null)\n const valuesKey = JSON.stringify(values ?? null)\n const first = useRef(true)\n\n // New values from outside (a document was read): take them.\n useEffect(() => {\n if (first.current) {\n first.current = false\n return\n }\n setV({ ...EMPTY, ...values })\n setShown(new Set())\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valuesKey])\n\n const set = (patch: Partial<FiscalFieldValues>) => {\n const next = { ...v, ...patch }\n // A use the new regime does not admit is dropped, not silently kept.\n if (patch.tax_regime !== undefined && next.use && !usesFor(fid, next.tax_regime).some((u) => u.code === next.use)) next.use = ''\n // A regime was chosen and no use yet: the region's suggestion (if it has one) is preselected, marked and editable.\n if (patch.tax_regime !== undefined && !next.use) {\n const suggestion = suggestInvoiceUse(fid, next.tax_regime)\n if (suggestion) {\n next.use = suggestion\n setAutoUse(suggestion)\n } else setAutoUse(null)\n } else if (patch.use !== undefined) setAutoUse(null)\n setV(next)\n onChange?.(next)\n }\n\n const person = personTypeOf(v.tax_id)\n const taxIdOk = !validateFiscalValues(region, { tax_id: v.tax_id }, personTypeOf).tax_id\n const problems = useMemo(() => validateFiscalValues(region, v, personTypeOf), [region, v, personTypeOf])\n const candidates = regimeCandidates?.length ? regimeCandidates : null\n const regimes = useMemo(() => {\n const list = regimesFor(fid, taxIdOk ? person : null)\n if (candidates) return (fid?.regimes ?? []).filter((r) => candidates.includes(r.code))\n // Never hide the regime already chosen.\n return v.tax_regime && !list.some((r) => r.code === v.tax_regime) ? [...list, ...(fid?.regimes ?? []).filter((r) => r.code === v.tax_regime)] : list\n }, [fid, person, taxIdOk, candidates, v.tax_regime])\n const uses = useMemo(() => usesFor(fid, v.tax_regime), [fid, v.tax_regime])\n\n // Rules that block the submit (format, combination) are exposed to the browser's own validation.\n useEffect(() => {\n const el = root.current\n if (!el) return\n for (const f of FIELDS) {\n const ctl = el.querySelector<HTMLInputElement | HTMLSelectElement>(`[name=\"${namePrefix}.${f}\"]`)\n const p = problems[f]\n ctl?.setCustomValidity?.(p && p !== 'required' ? problemText(m, region, f, p) : '')\n }\n })\n\n const name = (f: FiscalFieldName) => `${namePrefix}.${f}`\n const err = (f: FiscalFieldName): string | null => {\n const external = errors[name(f)]\n if (external) return external\n const p = problems[f]\n return shown.has(f) && p && p !== 'required' ? problemText(m, region, f, p) : null\n }\n const touch = (f: FiscalFieldName) => {\n if (v[f] && !shown.has(f)) setShown((s) => new Set(s).add(f))\n }\n const doc = documentName ?? ''\n const mark = (f: FiscalFieldName): ReactNode =>\n fromDocument.includes(f) && (v[f] || (f === 'tax_regime' && candidates)) ? (\n <span className={cx.mark} data-sf-from-document>\n <span aria-hidden=\"true\">✓ </span>\n {fill(m.fromDocument, { document: doc || (locale.toLowerCase().startsWith('en') ? 'document' : 'documento') })}\n </span>\n ) : null\n const hint = (f: FiscalFieldName, text: string | undefined): ReactNode => {\n const mk = mark(f)\n if (!mk) return text\n return text ? (\n <>\n {mk} · {text}\n </>\n ) : (\n mk\n )\n }\n const postalExample = region.address?.postal_code?.example\n const numericPostal = !!postalExample && /^\\d+$/.test(postalExample)\n\n return (\n <fieldset ref={root} className={cx.fieldset} disabled={disabled} data-sf-fiscal-fields style={{ border: 0, padding: 0, margin: 0, minInlineSize: 0 }}>\n <legend className={cx.legend} hidden={hideLegend ? true : undefined} style={hideLegend ? undefined : { padding: 0 }}>\n {m.legend}\n </legend>\n <CheckoutField\n name={name('tax_id')}\n id={`${base}-tax_id`}\n label={fid?.label || m.taxId}\n hint={hint('tax_id', m.taxIdHint)}\n value={v.tax_id}\n onChange={(e) => set({ tax_id: normalizeTaxId(e.target.value) })}\n onBlur={() => touch('tax_id')}\n error={err('tax_id')}\n classNames={cx}\n autoComplete=\"off\"\n autoCapitalize=\"characters\"\n spellCheck={false}\n inputMode=\"text\"\n enterKeyHint=\"next\"\n maxLength={20}\n locale={locale}\n />\n <CheckoutField\n name={name('legal_name')}\n id={`${base}-legal_name`}\n label={m.legalName}\n hint={hint('legal_name', m.legalNameHint)}\n value={v.legal_name}\n onChange={(e) => set({ legal_name: e.target.value })}\n onBlur={() => touch('legal_name')}\n error={err('legal_name')}\n classNames={cx}\n autoComplete=\"organization\"\n enterKeyHint=\"next\"\n maxLength={254}\n locale={locale}\n />\n <CheckoutField\n name={name('postal_code')}\n id={`${base}-postal_code`}\n label={m.postalCode}\n hint={hint('postal_code', m.postalCodeHint)}\n value={v.postal_code}\n onChange={(e) => set({ postal_code: e.target.value.trim() })}\n onBlur={() => touch('postal_code')}\n error={err('postal_code')}\n classNames={cx}\n autoComplete=\"postal-code\"\n inputMode={numericPostal ? 'numeric' : 'text'}\n placeholder={postalExample}\n enterKeyHint=\"next\"\n maxLength={12}\n locale={locale}\n />\n {candidates ? (\n <fieldset className={cx.radios} data-sf-fiscal-regimes aria-describedby={err('tax_regime') ? `${base}-regime-error` : undefined} style={{ border: 0, padding: 0, margin: 0, minInlineSize: 0 }}>\n <legend className={cx.label} data-sf-label={m.regime}>\n {m.regime}\n </legend>\n <p className={cx.hint} data-sf-field-hint>\n {mark('tax_regime')} · {m.regimeFromDocument}\n </p>\n {regimes.map((r, i) => (\n <label key={r.code} className={cx.radio} data-sf-fiscal-radio>\n <input\n type=\"radio\"\n id={i === 0 ? `${base}-tax_regime` : undefined}\n name={name('tax_regime')}\n value={r.code}\n checked={v.tax_regime === r.code}\n required\n onChange={() => set({ tax_regime: r.code })}\n />\n <span>\n {entryLabel(r, locale)} <span data-sf-fiscal-code>({r.code})</span>\n </span>\n </label>\n ))}\n {err('tax_regime') ? (\n <p id={`${base}-regime-error`} className={cx.error} data-sf-field-error>\n {err('tax_regime')}\n </p>\n ) : null}\n </fieldset>\n ) : (\n <CheckoutField\n as=\"select\"\n name={name('tax_regime')}\n id={`${base}-tax_regime`}\n label={m.regime}\n hint={hint('tax_regime', m.regimeHint)}\n value={v.tax_regime}\n onChange={(e) => set({ tax_regime: e.target.value })}\n onBlur={() => touch('tax_regime')}\n error={err('tax_regime')}\n classNames={cx}\n locale={locale}\n >\n <option value=\"\">{m.regimeChoose}</option>\n {regimes.map((r) => (\n <option key={r.code} value={r.code}>\n {r.code} · {entryLabel(r, locale)}\n </option>\n ))}\n </CheckoutField>\n )}\n <CheckoutField\n as=\"select\"\n name={name('use')}\n id={`${base}-use`}\n label={m.use}\n hint={\n v.use && (v.use === autoUse || v.use === suggestedUse) ? (\n <>\n <span className={cx.mark} data-sf-suggested>\n {m.suggested}\n </span>{' '}\n · {m.useHint}\n </>\n ) : (\n m.useHint\n )\n }\n value={v.use}\n onChange={(e) => set({ use: e.target.value })}\n onBlur={() => touch('use')}\n error={err('use')}\n classNames={cx}\n locale={locale}\n >\n <option value=\"\">{m.useChoose}</option>\n {uses.map((u) => (\n <option key={u.code} value={u.code}>\n {u.code} · {entryLabel(u, locale)}\n </option>\n ))}\n </CheckoutField>\n </fieldset>\n )\n}\n","/** Turns what the engine read into what the UI shows. Shared by the browser reader and the server upload. */\nimport type { FiscalDocumentEvidence } from '@asteby/storefront'\nimport type { IdentityExtraction } from '@asteby/storefront/fiscal-document'\nimport { normalizeTaxId } from './format.js'\nimport type { FiscalExtractionSummary, FiscalFieldName } from './types.js'\n\nconst first = (v: string | string[] | undefined): string => (Array.isArray(v) ? (v[0] ?? '') : (v ?? ''))\n\n/** `evidence` comes from `buildDocumentEvidence`. Only the conventional fields are kept: nothing else can leak. */\nexport function summarizeExtraction(x: IdentityExtraction, evidence: FiscalDocumentEvidence, validRegimes?: Iterable<string>): FiscalExtractionSummary {\n const f = x.fields\n const valid = validRegimes ? new Set(validRegimes) : null\n const raw = f.tax_regime\n const candidates = (Array.isArray(raw) ? raw : raw ? [raw] : []).filter((c) => !valid || valid.has(c))\n const values: FiscalExtractionSummary['values'] = {}\n const from: FiscalFieldName[] = []\n const put = (name: FiscalFieldName, v: string) => {\n if (!v) return\n values[name] = v\n from.push(name)\n }\n put('tax_id', normalizeTaxId(first(f.tax_id)))\n put('legal_name', first(f.legal_name).trim())\n put('postal_code', first(f.postal_code).trim())\n if (candidates.length === 1) put('tax_regime', candidates[0]!)\n else if (candidates.length > 1) from.push('tax_regime')\n return {\n kind: x.kind,\n values,\n regime_candidates: candidates,\n from_document: from,\n qr_match: x.qr.match,\n stale: x.stale,\n age_days: x.age_days,\n missing: [...x.missing],\n evidence,\n }\n}\n","/**\n * Live QR reading with the device camera. Nothing is recorded or stored: the frames are read in memory by\n * `decodeImageQr` (loaded on demand, so a page that never opens the camera pays 0 bytes for it) and the stream is\n * stopped when the scanner closes, when the component unmounts or when the page is hidden.\n */\nimport { useCallback, useEffect, useRef, useState, type RefObject } from 'react'\n\nexport type CameraQrStatus =\n /** Not running. */\n | 'idle'\n /** Waiting for the permission or for the first frame. */\n | 'starting'\n | 'scanning'\n /** The buyer (or the browser) refused the camera. */\n | 'denied'\n /** No `getUserMedia` here (old browser, insecure page). */\n | 'unsupported'\n\nexport type UseCameraQrOptions = {\n /** Start (true) or stop (false) the camera. */\n active: boolean\n /** The QR text read. Called once; the camera stops right after. */\n onCode: (text: string) => void\n /** Milliseconds between two reading attempts (default 250). */\n intervalMs?: number\n}\n\nexport type UseCameraQr = {\n videoRef: RefObject<HTMLVideoElement | null>\n status: CameraQrStatus\n /** Stops the stream now. */\n stop: () => void\n}\n\ntype MediaDevicesLike = { getUserMedia(c: unknown): Promise<MediaStream> }\n\nexport function cameraSupported(): boolean {\n return typeof navigator !== 'undefined' && typeof (navigator as { mediaDevices?: MediaDevicesLike }).mediaDevices?.getUserMedia === 'function'\n}\n\nexport function useCameraQr({ active, onCode, intervalMs = 250 }: UseCameraQrOptions): UseCameraQr {\n const videoRef = useRef<HTMLVideoElement | null>(null)\n const [status, setStatus] = useState<CameraQrStatus>('idle')\n const streamRef = useRef<MediaStream | null>(null)\n const onCodeRef = useRef(onCode)\n onCodeRef.current = onCode\n\n const stop = useCallback(() => {\n for (const track of streamRef.current?.getTracks() ?? []) track.stop()\n streamRef.current = null\n const v = videoRef.current\n if (v) v.srcObject = null\n setStatus((s) => (s === 'denied' || s === 'unsupported' ? s : 'idle'))\n }, [])\n\n useEffect(() => {\n if (!active) return\n if (!cameraSupported()) {\n setStatus('unsupported')\n return\n }\n let cancelled = false\n let timer: ReturnType<typeof setInterval> | undefined\n let busy = false\n setStatus('starting')\n\n const onHidden = () => {\n if (document.visibilityState === 'hidden') stop()\n }\n document.addEventListener('visibilitychange', onHidden)\n\n ;(async () => {\n let stream: MediaStream\n try {\n stream = await (navigator as unknown as { mediaDevices: MediaDevicesLike }).mediaDevices.getUserMedia({ video: { facingMode: { ideal: 'environment' } }, audio: false })\n } catch {\n if (!cancelled) setStatus('denied')\n return\n }\n if (cancelled) {\n for (const t of stream.getTracks()) t.stop()\n return\n }\n streamRef.current = stream\n const video = videoRef.current\n if (!video) {\n for (const t of stream.getTracks()) t.stop()\n streamRef.current = null\n return\n }\n video.srcObject = stream\n video.muted = true\n void video.play?.().catch(() => undefined)\n setStatus('scanning')\n const eng = await import('@asteby/storefront/fiscal-document')\n timer = setInterval(async () => {\n if (busy || cancelled || !videoRef.current || videoRef.current.readyState < 2) return\n busy = true\n try {\n const text = await eng.decodeImageQr(videoRef.current)\n if (text && !cancelled) {\n cancelled = true\n clearInterval(timer)\n stop()\n onCodeRef.current(text)\n }\n } catch {\n /* a frame that cannot be read is not an error: the next one may */\n } finally {\n busy = false\n }\n }, intervalMs)\n })()\n\n return () => {\n cancelled = true\n if (timer) clearInterval(timer)\n document.removeEventListener('visibilitychange', onHidden)\n for (const t of streamRef.current?.getTracks() ?? []) t.stop()\n streamRef.current = null\n if (videoRef.current) videoRef.current.srcObject = null\n }\n }, [active, intervalMs, stop])\n\n return { videoRef, status, stop }\n}\n","/**\n * \"Upload your tax document\" flow: the buyer drops the PDF the tax authority gave them, we read it ON THEIR DEVICE\n * (pdf.js is loaded only when a file is chosen, never in the main bundle), they review the prefilled fields and confirm.\n * The file is never uploaded or kept; only the fields the buyer confirms leave, plus minimal evidence of where they came\n * from (`buildDocumentEvidence`). Fields the region lists in `discard_fields` (ids, street...) are never shown or kept.\n *\n * Without JavaScript the same control posts the file to the shop's action (`createInvoiceAction`, intent\n * `extract-document`), which reads it in memory, discards it and sends back `data` to review.\n *\n * When the region lets a PHOTO of the document be read (`image_mode`: `qr_only` | `full`) the buyer can also take a\n * picture of its QR or scan it live with the camera. A QR carries only the tax id and the id of the document: the\n * rest is asked for (or the PDF is uploaded). The image and the camera frames never leave the device.\n *\n * Everything country-specific is the region's `IdentityDocumentSpec`: label, where to get it, accepted types, size,\n * rules, freshness. The component only knows \"a document with fiscal data\".\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type DragEvent, type ReactNode } from 'react'\nimport type { FiscalDocumentEvidence, IdentityDocumentSpec } from '@asteby/storefront'\nimport { ErrorSummary, type ErrorSummaryItem, type FieldErrors } from '../checkout/fields.js'\nimport { useResolvedLocale } from '../locale.js'\nimport { summarizeExtraction } from './extraction.js'\nimport { personTypeResolver, suggestInvoiceUse, validateFiscalValues, type FiscalRegion } from './format.js'\nimport { FiscalIdentityFields, type FiscalIdentityFieldsClassNames } from './identity-fields.js'\nimport { fill, fiscalMessages, type DeepPartial, type FiscalMessages } from './messages.js'\nimport { cameraSupported, useCameraQr } from './use-camera-qr.js'\nimport type { FiscalActionData, FiscalExtractionSummary, FiscalFieldName, FiscalFieldValues, FiscalReadError } from './types.js'\n\nexport type FiscalReaderResult = {\n values: FiscalFieldValues\n /** Where the data came from; `null` when the buyer typed everything. */\n evidence: FiscalDocumentEvidence | null\n /** The buyer asked to save the data to their account (`canSave`). */\n save: boolean\n}\n\nexport type IdentityDocumentReaderClassNames = FiscalIdentityFieldsClassNames &\n Partial<Record<'root' | 'zone' | 'zoneActive' | 'button' | 'link' | 'privacy' | 'status' | 'error' | 'warning' | 'notice' | 'actions' | 'primary' | 'secondary' | 'summary', string>>\n\nexport type IdentityDocumentReaderProps = {\n region: FiscalRegion\n /** The document to read. Default: the first of `region.fiscal_id.documents`. */\n document?: IdentityDocumentSpec\n /**\n * URL of the pdf.js worker (`pdf.worker.mjs` from `pdfjs-dist/legacy/build`) that YOUR site serves. There is no\n * default and no CDN: without it the browser cannot read the file and the buyer is sent to manual entry.\n */\n workerSrc?: string\n /** The buyer confirmed the reviewed data. */\n onConfirm: (result: FiscalReaderResult) => void\n /** The buyer chose to type their data. Default: the review form opens empty. */\n onManual?: () => void\n /** Values to start the review with (e.g. a saved profile). */\n initialValues?: Partial<FiscalFieldValues>\n /** Result of the server (no-JS upload): when it carries an `extraction` or an error, it is shown. */\n data?: FiscalActionData | null\n /** The shop has a signed-in buyer: offer \"Save to my account\". */\n canSave?: boolean\n /** Enables the no-JS upload (a button that posts the file to the action with `intent=extract-document`). */\n serverUpload?: boolean\n /** Short noun of the document for texts (\"constancia\"). Default: the spec's label in lowercase. */\n documentName?: string\n personTypeOf?: (taxId: string) => string | null\n /** Clock for tests. */\n now?: () => Date\n namePrefix?: string\n locale?: string\n messages?: DeepPartial<FiscalMessages>\n classNames?: IdentityDocumentReaderClassNames\n /** Label of the confirm button. */\n confirmLabel?: ReactNode\n}\n\ntype Phase =\n | { kind: 'idle' }\n | { kind: 'reading'; fileName: string }\n | { kind: 'camera' }\n | { kind: 'review'; extraction: FiscalExtractionSummary | null; revision: number }\n | { kind: 'error'; code: FiscalReadError; sizeLimit?: number }\n\nconst isPdf = (f: File, accept: string[]) => {\n const okType = f.type ? accept.some((a) => a === f.type) || f.type === 'application/pdf' : false\n return okType || /\\.pdf$/i.test(f.name)\n}\n\nconst isImage = (f: File) => f.type.startsWith('image/') || /\\.(jpe?g|png|webp|heic|heif)$/i.test(f.name)\n\nconst mib = (bytes: number) => `${Math.round((bytes / (1024 * 1024)) * 10) / 10} MB`\n\nexport function IdentityDocumentReader(props: IdentityDocumentReaderProps) {\n const { region, workerSrc, onConfirm, onManual, initialValues, data, canSave, serverUpload, personTypeOf, now, namePrefix = 'invoice', messages, classNames: cx = {}, confirmLabel } = props\n const locale = useResolvedLocale(props.locale)\n const all = fiscalMessages(locale, messages)\n const m = all.reader\n const spec = props.document ?? region.fiscal_id?.documents?.[0]\n const reactId = useId().replace(/:/g, '')\n const inputId = `sf-reader-${reactId}-file`\n const helpId = `sf-reader-${reactId}-help`\n const documentName = props.documentName ?? (spec?.label ?? 'document').toLowerCase()\n\n const fromServer = data?.extraction ?? null\n const serverError = data && !data.ok && data.error && ['not_pdf', 'too_large', 'no_text', 'password', 'unreadable'].includes(data.error.code) ? (data.error.code as FiscalReadError) : null\n const [phase, setPhase] = useState<Phase>(() =>\n fromServer ? { kind: 'review', extraction: fromServer, revision: 0 } : serverError ? { kind: 'error', code: serverError, sizeLimit: spec?.max_bytes } : { kind: 'idle' },\n )\n const [dragging, setDragging] = useState(false)\n const [live, setLive] = useState('')\n const [values, setValues] = useState<FiscalFieldValues>({ tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '', ...initialValues, ...(fromServer?.values ?? {}) })\n const [save, setSave] = useState(false)\n const [summary, setSummary] = useState<ErrorSummaryItem[] | null>(null)\n const [summaryKey, setSummaryKey] = useState(0)\n const [hydrated, setHydrated] = useState(false)\n const abort = useRef<AbortController | null>(null)\n const fileInput = useRef<HTMLInputElement>(null)\n const errorRef = useRef<HTMLDivElement>(null)\n const reviewRef = useRef<HTMLHeadingElement>(null)\n\n useEffect(() => setHydrated(true), [])\n useEffect(() => () => abort.current?.abort(), [])\n // A new answer from the server (the buyer posted a file without JS and the page came back).\n useEffect(() => {\n if (!fromServer) return\n setValues((cur) => {\n const next = { ...cur, ...fromServer.values }\n const suggestion = next.tax_regime && !next.use ? suggestInvoiceUse(region.fiscal_id, next.tax_regime) : null\n if (suggestion) {\n next.use = suggestion\n setSuggestedUse(suggestion)\n }\n return next\n })\n setPhase({ kind: 'review', extraction: fromServer, revision: 1 })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromServer])\n useEffect(() => {\n if (phase.kind === 'error') errorRef.current?.focus()\n if (phase.kind === 'review' && phase.revision > 0) reviewRef.current?.focus()\n }, [phase])\n\n // The file picker takes the document's files (PDF); photos have their own control (`image_mode`).\n const accept = useMemo(() => {\n const files = (spec?.accept ?? []).filter((a) => !a.startsWith('image/'))\n return files.length ? files.join(',') : 'application/pdf'\n }, [spec])\n const imageMode = spec?.image_mode && spec.image_mode !== 'none' ? spec.image_mode : null\n const photoInput = useRef<HTMLInputElement>(null)\n const [suggestedUse, setSuggestedUse] = useState<string | null>(null)\n const cameraActive = phase.kind === 'camera' \n const fieldErrors: FieldErrors = useMemo(() => {\n const out: FieldErrors = {}\n for (const [k, v] of Object.entries(data?.fieldErrors ?? {})) out[k] = all.server.errors[v] ?? v\n return out\n }, [data, all.server.errors])\n\n const cancel = useCallback(() => {\n abort.current?.abort()\n abort.current = null\n setPhase({ kind: 'idle' })\n setLive('')\n }, [])\n\n const openManual = useCallback(() => {\n onManual?.()\n setPhase({ kind: 'review', extraction: null, revision: 1 })\n setLive('')\n }, [onManual])\n\n /** Puts what the engine read (a PDF, or only a QR) in the form, with the region's suggested use when it has one. */\n const showExtraction = useCallback(\n (sum: FiscalExtractionSummary) => {\n const base = { tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '', ...sum.values }\n const suggestion = base.tax_regime ? suggestInvoiceUse(region.fiscal_id, base.tax_regime) : null\n if (suggestion && !base.use) base.use = suggestion\n setSuggestedUse(suggestion && base.use === suggestion ? suggestion : null)\n setValues(base)\n setSummary(null)\n setPhase({ kind: 'review', extraction: sum, revision: 1 })\n setLive(m.done)\n },\n [region.fiscal_id, m.done],\n )\n\n /** The text of a QR (a photo, or a live frame) -> the fields it carries. Never blocks: no tax id means \"no QR of this document\". */\n const readQr = useCallback(\n async (text: string | null) => {\n if (!spec) return\n if (!text) return setPhase({ kind: 'error', code: 'no_qr' })\n const eng = await import('@asteby/storefront/fiscal-document')\n const x = eng.extractIdentityDocument('', spec, {\n catalogs: region.fiscal_id ? eng.catalogsFromRegion(region.fiscal_id) : {},\n qr: text,\n ...(now ? { now: now() } : {}),\n })\n if (!x.fields.tax_id) return setPhase({ kind: 'error', code: 'no_qr' })\n const evidence = eng.buildDocumentEvidence(x, { sha256: null, source: 'qr' })\n showExtraction(summarizeExtraction(x, evidence, region.fiscal_id?.regimes.map((r) => r.code)))\n },\n [spec, region, now, showExtraction],\n )\n\n const readImage = useCallback(\n async (file: File) => {\n if (!spec) return\n if (file.size > spec.max_bytes) return setPhase({ kind: 'error', code: 'too_large', sizeLimit: spec.max_bytes })\n const ctl = new AbortController()\n abort.current = ctl\n setPhase({ kind: 'reading', fileName: file.name })\n setLive(fill(m.reading, { document: documentName }))\n try {\n const eng = await import('@asteby/storefront/fiscal-document')\n const text = await eng.decodeImageQr(file, { maxBytes: spec.max_bytes, signal: ctl.signal })\n if (ctl.signal.aborted) return\n await readQr(text)\n } catch (err) {\n if (ctl.signal.aborted) return\n const code = (err as { code?: string } | null)?.code\n setLive('')\n setPhase({ kind: 'error', code: code === 'too_large' ? 'too_large' : code === 'not_image' ? 'not_image' : 'unreadable', sizeLimit: spec.max_bytes })\n } finally {\n if (abort.current === ctl) abort.current = null\n if (photoInput.current) photoInput.current.value = ''\n }\n },\n [spec, documentName, m.reading, readQr],\n )\n\n const camera = useCameraQr({\n active: cameraActive,\n onCode: (text) => {\n // \"Code read. Review your details\": one announcement for the camera path (the review has its own focus).\n void readQr(text)\n .then(() => setLive(`${m.scan.cameraRead}. ${m.done}`))\n .catch(() => setPhase({ kind: 'error', code: 'unreadable' }))\n },\n })\n\n const read = useCallback(\n async (file: File) => {\n if (!spec) return\n if (imageMode && isImage(file)) return readImage(file)\n if (!isPdf(file, spec.accept ?? [])) return setPhase({ kind: 'error', code: 'not_pdf' })\n if (file.size > spec.max_bytes) return setPhase({ kind: 'error', code: 'too_large', sizeLimit: spec.max_bytes })\n const ctl = new AbortController()\n abort.current = ctl\n setPhase({ kind: 'reading', fileName: file.name })\n setLive(fill(m.reading, { document: documentName }))\n try {\n // On demand: pdf.js is not in the main bundle, it loads here.\n const eng = await import('@asteby/storefront/fiscal-document')\n const { text, sha256 } = await eng.readPdfText(file, {\n maxBytes: spec.max_bytes,\n ...(spec.max_pages ? { maxPages: spec.max_pages } : {}),\n ...(workerSrc ? { workerSrc } : {}),\n signal: ctl.signal,\n })\n if (ctl.signal.aborted) return\n // The QR is a best-effort cross-check; it never blocks.\n const qr = await eng.decodePdfQr(file, { ...(workerSrc ? { workerSrc } : {}), signal: ctl.signal }).catch(() => null)\n if (ctl.signal.aborted) return\n const x = eng.extractIdentityDocument(text, spec, {\n catalogs: region.fiscal_id ? eng.catalogsFromRegion(region.fiscal_id) : {},\n qr,\n ...(now ? { now: now() } : {}),\n })\n const evidence = eng.buildDocumentEvidence(x, { sha256, source: 'pdf_client' })\n const sum = summarizeExtraction(x, evidence, region.fiscal_id?.regimes.map((r) => r.code))\n showExtraction(sum)\n } catch (err) {\n if (ctl.signal.aborted) return\n const code = (err as { code?: string } | null)?.code\n setLive('')\n setPhase({\n kind: 'error',\n code: code === 'not_pdf' || code === 'too_large' || code === 'no_text' || code === 'password' ? code : 'unreadable',\n sizeLimit: spec.max_bytes,\n })\n } finally {\n if (abort.current === ctl) abort.current = null\n if (fileInput.current) fileInput.current.value = ''\n }\n },\n [spec, workerSrc, region, now, documentName, m.reading, imageMode, readImage, showExtraction],\n )\n\n if (!spec) return null\n\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n setDragging(false)\n const f = e.dataTransfer?.files?.[0]\n if (f) void read(f)\n }\n\n const confirm = () => {\n const problems = validateFiscalValues(region, values, personTypeResolver(region.fiscal_id, personTypeOf))\n const keys = Object.keys(problems) as FiscalFieldName[]\n if (keys.length) {\n const labels: Record<FiscalFieldName, string> = {\n tax_id: region.fiscal_id?.label || all.fields.taxId,\n legal_name: all.fields.legalName,\n postal_code: all.fields.postalCode,\n tax_regime: all.fields.regime,\n use: all.fields.use,\n }\n const item = (f: FiscalFieldName): ErrorSummaryItem => {\n const p = problems[f]!\n const msg =\n p === 'required'\n ? all.fields.errors.required\n : p === 'format'\n ? f === 'tax_id'\n ? fill(all.fields.errors.taxIdFormat, { kind: region.fiscal_id?.label ?? '' })\n : fill(all.fields.errors.postalFormat, { example: region.address?.postal_code?.example ?? '' })\n : p === 'person_type'\n ? all.fields.errors.personType\n : p === 'use_not_allowed'\n ? all.fields.errors.useNotAllowed\n : all.fields.errors.unknown\n return { name: `${namePrefix}.${f}`, id: `sf-reader-${reactId}-${f}`, label: labels[f], message: msg }\n }\n setSummary(keys.map(item))\n setSummaryKey((k) => k + 1)\n return\n }\n setSummary(null)\n const ev = phase.kind === 'review' ? (phase.extraction?.evidence ?? null) : null\n onConfirm({ values, evidence: ev, save: !!canSave && save })\n }\n\n const errorsByName: FieldErrors = { ...fieldErrors }\n for (const s of summary ?? []) errorsByName[s.name] = s.message\n\n // ---- views ------------------------------------------------------------------------------------------------------\n const privacy = serverUpload && !hydrated ? m.privacyServer : m.privacyBrowser\n\n const idle = (\n <div className={cx.root} data-sf-reader data-state=\"idle\">\n <h3 data-sf-reader-title>{fill(m.title, { document: documentName })}</h3>\n {spec.help ? <p data-sf-reader-help>{spec.help}</p> : null}\n <label\n htmlFor={inputId}\n className={dragging ? cx.zoneActive : cx.zone}\n data-sf-reader-zone\n data-dragging={dragging ? '' : undefined}\n onDragOver={(e) => {\n e.preventDefault()\n setDragging(true)\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n >\n <span aria-hidden=\"true\" data-sf-reader-icon>\n ⬆\n </span>\n <span data-sf-reader-drop>{dragging ? m.dropActive : m.dropHint}</span>\n <span data-sf-reader-choose>{m.choose}</span>\n <input\n ref={fileInput}\n id={inputId}\n type=\"file\"\n // With JavaScript the file never travels with the form; the name only exists for the no-JS upload.\n name={serverUpload && !hydrated ? 'document' : undefined}\n accept={accept}\n aria-describedby={helpId}\n data-sf-reader-input\n onChange={(e) => {\n const f = e.target.files?.[0]\n if (f) void read(f)\n }}\n />\n </label>\n {imageMode ? (\n <div className={cx.actions} data-sf-reader-scan>\n <input\n ref={photoInput}\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n hidden\n tabIndex={-1}\n aria-label={m.scan.photo}\n data-sf-reader-photo-input\n onChange={(e) => {\n const f = e.target.files?.[0]\n if (f) void readImage(f)\n }}\n />\n <button type=\"button\" className={cx.secondary} onClick={() => photoInput.current?.click()} data-sf-reader-photo>\n {m.scan.photo}\n </button>\n {hydrated && cameraSupported() ? (\n <button type=\"button\" className={cx.secondary} onClick={() => setPhase({ kind: 'camera' })} data-sf-reader-camera>\n {m.scan.camera}\n </button>\n ) : null}\n </div>\n ) : null}\n <p id={helpId} className={cx.privacy} data-sf-reader-privacy>\n {privacy}\n </p>\n {serverUpload ? (\n <noscript>\n <button type=\"submit\" name=\"intent\" value=\"extract-document\" formEncType=\"multipart/form-data\" formMethod=\"post\" formNoValidate className={cx.secondary} data-sf-reader-upload>\n {m.uploadServer}\n </button>\n </noscript>\n ) : null}\n <p data-sf-reader-links>\n {spec.obtain_url ? (\n <a href={spec.obtain_url} target=\"_blank\" rel=\"noopener noreferrer\" className={cx.link} data-sf-reader-obtain>\n {m.obtain}\n </a>\n ) : null}\n <button type=\"button\" className={cx.link} onClick={openManual} data-sf-reader-manual>\n {m.manual}\n </button>\n </p>\n </div>\n )\n\n const reading = phase.kind === 'reading' && (\n <div className={cx.root} data-sf-reader data-state=\"reading\">\n <p className={cx.status} data-sf-reader-reading>\n <span aria-hidden=\"true\" data-sf-reader-spinner />\n {fill(m.reading, { document: documentName })} <span data-sf-reader-file>{phase.fileName}</span>\n </p>\n <button type=\"button\" className={cx.secondary} onClick={cancel} data-sf-reader-cancel>\n {m.cancel}\n </button>\n </div>\n )\n\n const cameraView = phase.kind === 'camera' && (\n <div className={cx.root} data-sf-reader data-state=\"camera\">\n <h3 data-sf-reader-title>{m.scan.cameraTitle}</h3>\n <div data-sf-reader-viewfinder>\n {/* The stream is shown, never recorded; it stops when this view closes. */}\n <video ref={camera.videoRef} playsInline muted aria-label={m.scan.cameraGuide} data-sf-reader-video />\n <span aria-hidden=\"true\" data-sf-reader-frame />\n </div>\n <p className={cx.status} data-sf-reader-camera-status={camera.status}>\n {camera.status === 'denied'\n ? m.scan.cameraDenied\n : camera.status === 'unsupported'\n ? m.scan.cameraUnavailable\n : camera.status === 'starting'\n ? m.scan.cameraStarting\n : m.scan.cameraGuide}\n </p>\n <p className={cx.privacy} data-sf-reader-privacy>\n {privacy}\n </p>\n <div className={cx.actions} data-sf-reader-actions>\n <button type=\"button\" className={cx.secondary} onClick={() => photoInput.current?.click()} data-sf-reader-photo>\n {m.scan.choosePhoto}\n </button>\n <button\n type=\"button\"\n className={cx.primary}\n onClick={() => {\n camera.stop()\n setPhase({ kind: 'idle' })\n }}\n data-sf-reader-camera-close\n >\n {m.scan.closeCamera}\n </button>\n </div>\n <input\n ref={photoInput}\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n hidden\n tabIndex={-1}\n aria-label={m.scan.choosePhoto}\n data-sf-reader-photo-input\n onChange={(e) => {\n const f = e.target.files?.[0]\n if (f) void readImage(f)\n }}\n />\n </div>\n )\n\n const errored = phase.kind === 'error' && (\n <div className={cx.root} data-sf-reader data-state=\"error\">\n <div ref={errorRef} role=\"alert\" tabIndex={-1} className={cx.error} data-sf-reader-error={phase.code}>\n {fill(m.errors[phase.code], { size: mib(phase.sizeLimit ?? spec.max_bytes) })}\n </div>\n <div className={cx.actions} data-sf-reader-actions>\n <button type=\"button\" className={cx.primary} onClick={openManual} data-sf-reader-manual>\n {m.manual}\n </button>\n <button type=\"button\" className={cx.secondary} onClick={() => setPhase({ kind: 'idle' })} data-sf-reader-retry>\n {m.changeFile}\n </button>\n </div>\n </div>\n )\n\n const review = phase.kind === 'review' && (\n <div className={cx.root} data-sf-reader data-state=\"review\">\n <h3 ref={reviewRef} tabIndex={-1} data-sf-reader-title>\n {m.reviewTitle}\n </h3>\n <p data-sf-reader-help>{m.reviewHint}</p>\n <ErrorSummary\n items={summary}\n focusKey={summaryKey}\n locale={locale}\n title={summary ? (summary.length === 1 ? m.summaryTitleOne : fill(m.summaryTitleMany, { n: summary.length })) : undefined}\n />\n {phase.extraction ? <Warnings x={phase.extraction} m={m} cx={cx} /> : null}\n <FiscalIdentityFields\n region={region}\n values={values}\n onChange={setValues}\n errors={errorsByName}\n idPrefix={`sf-reader-${reactId}`}\n namePrefix={namePrefix}\n fromDocument={phase.extraction?.from_document ?? []}\n documentName={documentName}\n regimeCandidates={phase.extraction && phase.extraction.regime_candidates.length > 1 ? phase.extraction.regime_candidates : undefined}\n suggestedUse={suggestedUse}\n {...(personTypeOf ? { personTypeOf } : {})}\n locale={locale}\n {...(messages ? { messages } : {})}\n classNames={cx}\n hideLegend\n />\n {phase.extraction?.evidence ? <input type=\"hidden\" name={`${namePrefix}.document`} value={JSON.stringify(phase.extraction.evidence)} /> : null}\n {canSave ? (\n <label data-sf-reader-save>\n <input type=\"checkbox\" name={`${namePrefix}.save`} checked={save} onChange={(e) => setSave(e.target.checked)} />\n <span>\n {m.saveToAccount}\n <span data-sf-field-hint> {m.saveConsent}</span>\n </span>\n </label>\n ) : null}\n <div className={cx.actions} data-sf-reader-actions>\n <button type=\"button\" className={cx.primary} onClick={confirm} data-sf-reader-confirm>\n {confirmLabel ?? m.confirm}\n </button>\n <button type=\"button\" className={cx.secondary} onClick={() => setPhase({ kind: 'idle' })} data-sf-reader-retry>\n {m.changeFile}\n </button>\n </div>\n </div>\n )\n\n return (\n <div data-sf-document-reader>\n {/* Always mounted so assistive tech announces every change (reading, done). */}\n <div role=\"status\" aria-live=\"polite\" className={cx.status} data-sf-reader-live style={visuallyHidden}>\n {live}\n </div>\n {phase.kind === 'idle' ? idle : null}\n {reading || null}\n {cameraView || null}\n {errored || null}\n {review || null}\n </div>\n )\n}\n\nconst visuallyHidden = { position: 'absolute', width: 1, height: 1, margin: -1, padding: 0, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap', border: 0 } as const\n\nfunction Warnings({ x, m, cx }: { x: FiscalExtractionSummary; m: FiscalMessages['reader']; cx: IdentityDocumentReaderClassNames }) {\n const items: string[] = []\n if (x.qr_match === false) items.push(m.warnings.qrMismatch)\n if (x.stale === true && x.age_days !== null) items.push(fill(m.warnings.stale, { days: x.age_days }))\n if (x.evidence.source === 'qr') items.push(m.warnings.qrPartial)\n else if (x.regime_candidates.length === 0 && !x.values.tax_regime) items.push(m.warnings.regimeMissing)\n else if (x.missing.some((k) => k !== 'tax_regime' && k !== 'document_id' && k !== 'issued_on')) items.push(m.warnings.fieldsMissing)\n if (!items.length) return null\n return (\n <ul className={cx.warning} data-sf-reader-warnings>\n {items.map((t) => (\n <li key={t} data-sf-reader-warning>\n <span aria-hidden=\"true\">⚠ </span>\n {t}\n </li>\n ))}\n </ul>\n )\n}\n","import { useCallback, useEffect, useRef, type RefObject } from 'react'\n\nexport type DialogCloseReason = 'esc' | 'x' | 'backdrop' | 'action'\n\ntype UseModalDialogOptions = {\n open: boolean\n /** Called for Esc and backdrop clicks. The owner decides whether to close. */\n onClose: (reason: DialogCloseReason) => void\n /** Element focused when the dialog opens. Default: the element marked `data-sf-autofocus`, else the dialog itself. */\n initialFocus?: RefObject<HTMLElement | null>\n}\n\n/**\n * Native `<dialog>` wiring: `showModal()` (focus trap and inert background come from the browser),\n * Esc and backdrop clicks routed to `onClose`, and focus restored to the opener on close.\n * Falls back to the `open` attribute where `showModal` does not exist (old browsers, some test DOMs)\n * with an Esc key handler.\n */\nexport function useModalDialog({ open, onClose, initialFocus }: UseModalDialogOptions) {\n const ref = useRef<HTMLDialogElement | null>(null)\n const opener = useRef<Element | null>(null)\n const onCloseRef = useRef(onClose)\n onCloseRef.current = onClose\n\n useEffect(() => {\n const el = ref.current\n if (!el || !open) return\n opener.current = typeof document !== 'undefined' ? document.activeElement : null\n const hasModal = typeof el.showModal === 'function'\n if (!el.open) {\n if (hasModal) {\n try {\n el.showModal()\n } catch {\n el.setAttribute('open', '')\n }\n } else el.setAttribute('open', '')\n }\n const target = initialFocus?.current ?? el.querySelector<HTMLElement>('[data-sf-autofocus]') ?? el\n if (!target.hasAttribute('tabindex') && target === el) el.setAttribute('tabindex', '-1')\n target.focus({ preventScroll: true })\n\n const onCancel = (e: Event) => {\n e.preventDefault() // we close through state so the owner can navigate/track first\n onCloseRef.current('esc')\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n onCloseRef.current('esc')\n }\n }\n el.addEventListener('cancel', onCancel)\n if (!hasModal) el.addEventListener('keydown', onKey)\n return () => {\n el.removeEventListener('cancel', onCancel)\n el.removeEventListener('keydown', onKey)\n if (el.open) {\n if (typeof el.close === 'function') {\n try {\n el.close()\n } catch {\n el.removeAttribute('open')\n }\n } else el.removeAttribute('open')\n }\n const back = opener.current\n if (back instanceof HTMLElement && back.isConnected) back.focus({ preventScroll: true })\n }\n }, [open])\n\n /** Click on the backdrop (the dialog element itself, outside its content box). */\n const onBackdropClick = useCallback((e: { target: EventTarget; currentTarget: EventTarget }) => {\n if (e.target === e.currentTarget) onCloseRef.current('backdrop')\n }, [])\n\n return { ref, onBackdropClick }\n}\n\n/** `prefers-reduced-motion: reduce`, read after hydration (false on the server). */\nexport function prefersReducedMotion(): boolean {\n try {\n return typeof window !== 'undefined' && !!window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n } catch {\n return false\n }\n}\n","/**\n * \"Scan your tax document\": the entry point of the invoice flows (request an invoice, checkout, add a fiscal profile).\n * A primary button that names the region's document (`IdentityDocumentSpec.label`: another country says its own\n * document) and, under it, \"Enter by hand\". The button opens a bottom sheet with the `IdentityDocumentReader`: choose\n * the PDF, take a photo of the QR or scan it live, review, confirm.\n *\n * Degradation: when the region publishes no document the component renders nothing (the caller shows the plain form).\n * The file, the photo and the camera frames are read on the device and never uploaded (see the reader).\n */\nimport { useId, useRef, useState, type ReactNode } from 'react'\nimport { useModalDialog } from '../dialog.js'\nimport { useResolvedLocale } from '../locale.js'\nimport { IdentityDocumentReader, type FiscalReaderResult, type IdentityDocumentReaderProps } from './document-reader.js'\nimport { fill, fiscalMessages } from './messages.js'\n\nexport type ScanTaxDocumentClassNames = IdentityDocumentReaderProps['classNames'] &\n Partial<Record<'actions' | 'trigger' | 'manual' | 'sheet' | 'sheetPanel' | 'sheetHeader' | 'sheetTitle' | 'sheetClose', string>>\n\nexport type ScanTaxDocumentProps = Omit<IdentityDocumentReaderProps, 'onConfirm' | 'onManual' | 'classNames' | 'confirmLabel'> & {\n /** The buyer confirmed the reviewed data (the sheet is already closed). */\n onConfirm: (result: FiscalReaderResult) => void\n /** The buyer chose to type their data (the sheet is already closed). */\n onManual: () => void\n /** Label of the confirm button inside the sheet. */\n confirmLabel?: ReactNode\n classNames?: ScanTaxDocumentClassNames\n}\n\nexport function ScanTaxDocument(props: ScanTaxDocumentProps) {\n const { onConfirm, onManual, classNames: cx = {}, messages, confirmLabel, ...reader } = props\n const locale = useResolvedLocale(props.locale)\n const m = fiscalMessages(locale, messages).reader\n const spec = props.document ?? props.region.fiscal_id?.documents?.[0]\n const [open, setOpen] = useState(false)\n const titleId = useId()\n const { ref, onBackdropClick } = useModalDialog({ open, onClose: () => setOpen(false) })\n const opener = useRef<HTMLButtonElement>(null)\n if (!spec) return null\n const name = props.documentName ?? spec.label.toLowerCase()\n\n return (\n <div className={cx.actions} data-sf-scan>\n <button ref={opener} type=\"button\" className={cx.trigger ?? cx.primary} onClick={() => setOpen(true)} aria-haspopup=\"dialog\" data-sf-scan-open>\n {fill(m.scan.open, { document: spec.label })}\n </button>\n <button type=\"button\" className={cx.manual ?? cx.secondary} onClick={onManual} data-sf-scan-manual>\n {m.scan.manual}\n </button>\n {open ? (\n <dialog ref={ref} role=\"dialog\" aria-modal=\"true\" aria-labelledby={titleId} onClick={onBackdropClick} onClose={() => setOpen(false)} className={cx.sheet} data-sf-scan-sheet>\n <div className={cx.sheetPanel} data-sf-scan-panel>\n <div className={cx.sheetHeader} data-sf-scan-header>\n <h2 id={titleId} className={cx.sheetTitle} data-sf-scan-title>\n {fill(m.scan.title, { document: name })}\n </h2>\n <button type=\"button\" className={cx.sheetClose} onClick={() => setOpen(false)} aria-label={m.scan.close} data-sf-scan-close data-sf-autofocus>\n <span aria-hidden=\"true\">✕</span>\n </button>\n </div>\n <IdentityDocumentReader\n {...reader}\n locale={locale}\n {...(messages ? { messages } : {})}\n {...(confirmLabel ? { confirmLabel } : {})}\n classNames={cx}\n onConfirm={(result) => {\n setOpen(false)\n onConfirm(result)\n }}\n onManual={() => {\n setOpen(false)\n onManual()\n }}\n />\n </div>\n </dialog>\n ) : null}\n </div>\n )\n}\n","/**\n * \"I need an invoice\" for the checkout (collapsed by default). Expanded it shows, in this order:\n * - the buyer's saved fiscal data as a card (masked tax id) with \"Change\" / \"Use other details\";\n * - otherwise the document reader (upload the tax document, review, confirm) with manual entry as the way out;\n * - or the plain fields when the store reads no document.\n * It reports the state with `onChange` (including the label for the pay button: \"Pay and invoice\") and posts the data as\n * `invoice.*` fields of the surrounding `<form>`, so the checkout action can send it with `createInvoiceAction`.\n */\nimport { useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { FiscalDocumentEvidence, FiscalIdentity, IdentityDocumentSpec, InvoiceRequest, InvoicingCapabilities } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\nimport { IdentityDocumentReader, type IdentityDocumentReaderClassNames } from './document-reader.js'\nimport { entryLabel, maskTaxId, toInvoiceRequest, validateFiscalValues, type FiscalRegion } from './format.js'\nimport { FiscalIdentityFields } from './identity-fields.js'\nimport { fiscalMessages, type DeepPartial, type FiscalMessages } from './messages.js'\nimport type { FiscalActionData, FiscalFieldValues } from './types.js'\n\nexport type InvoiceToggleState = {\n requested: boolean\n /** The data to send as `CheckoutInput.invoice` / `carts.setInvoice`; `null` when none is requested or it is not ready. */\n invoice: InvoiceRequest | null\n /** All the data is there and valid for the region (the server still checks it). */\n ready: boolean\n source: 'profile' | 'document' | 'manual' | null\n /** \"Pay\" or \"Pay and invoice\": the label for the pay button. */\n payLabel: string\n}\n\nexport type InvoiceToggleClassNames = IdentityDocumentReaderClassNames & Partial<Record<'toggle' | 'body' | 'card' | 'cardRow' | 'cardTitle' | 'unavailable', string>>\n\nexport type InvoiceToggleProps = {\n region: FiscalRegion & { country_code?: string }\n /** `loadFiscalContext(...).invoicing`. `available: false` or `checkout: 'off'` renders nothing. */\n capabilities?: InvoicingCapabilities | null\n /** The buyer's saved fiscal data (`customer.fiscal`). */\n profile?: FiscalIdentity | null\n defaultRequested?: boolean\n onChange?: (state: InvoiceToggleState) => void\n /** Result of the shop's action (server errors by field, a document read without JS). */\n data?: FiscalActionData | null\n /** The buyer is signed in: they can save the data to their account. */\n canSave?: boolean\n workerSrc?: string\n /** Enables the no-JS document upload. */\n serverUpload?: boolean\n /** Link (e.g. `?invoice=1`) that opens the section when JavaScript is not available. */\n noJsHref?: string\n document?: IdentityDocumentSpec\n documentName?: string\n personTypeOf?: (taxId: string) => string | null\n /** Label of the pay button when no invoice is asked. Default from the messages. */\n payLabel?: string\n namePrefix?: string\n locale?: string\n messages?: DeepPartial<FiscalMessages>\n classNames?: InvoiceToggleClassNames\n now?: () => Date\n}\n\ntype Mode = 'profile' | 'edit-profile' | 'read' | 'manual'\n\nconst profileValues = (p: FiscalIdentity): FiscalFieldValues => ({\n tax_id: p.tax_id,\n legal_name: p.legal_name,\n postal_code: p.postal_code,\n tax_regime: p.tax_regime,\n use: p.invoice_use ?? '',\n})\n\nexport function InvoiceToggle(props: InvoiceToggleProps) {\n const { region, capabilities, profile, onChange, data, canSave, workerSrc, serverUpload, noJsHref, personTypeOf, namePrefix = 'invoice', messages, classNames: cx = {}, now } = props\n const locale = useResolvedLocale(props.locale)\n const all = fiscalMessages(locale, messages)\n const m = all.toggle\n const fid = region.fiscal_id\n // `identity_documents` lists the kinds the store reads; empty means none. Without capabilities, what the region publishes.\n const spec = props.document ?? fid?.documents?.find((d) => !capabilities || capabilities.identity_documents.includes(d.kind)) ?? undefined\n const canRead = !!spec\n const usable = !!profile && !!profile.invoice_use\n const startMode: Mode = data?.extraction ? 'read' : usable ? 'profile' : profile ? 'edit-profile' : canRead ? 'read' : 'manual'\n\n const bodyId = `sf-invoice-${useId().replace(/:/g, '')}`\n const [requested, setRequested] = useState(!!props.defaultRequested || !!data?.extraction || !!data?.fieldErrors)\n const [mode, setMode] = useState<Mode>(startMode)\n const [values, setValues] = useState<FiscalFieldValues>(profile ? profileValues(profile) : { tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '' })\n const [confirmed, setConfirmed] = useState<{ values: FiscalFieldValues; evidence: FiscalDocumentEvidence | null; save: boolean } | null>(null)\n const [save, setSave] = useState(false)\n const emit = useRef(onChange)\n emit.current = onChange\n\n const payDefault = props.payLabel ?? m.payDefault\n const state = useMemo<InvoiceToggleState>(() => {\n if (!requested) return { requested: false, invoice: null, ready: false, source: null, payLabel: payDefault }\n const country = region.country_code\n const label = m.payAndInvoice\n if (mode === 'profile' && profile) {\n const inv = toInvoiceRequest(profileValues(profile), profile.country_code || country)\n if (profile.document) inv.document = profile.document\n return { requested: true, invoice: inv, ready: true, source: 'profile', payLabel: label }\n }\n if (mode === 'read') {\n if (!confirmed) return { requested: true, invoice: null, ready: false, source: null, payLabel: label }\n const inv = toInvoiceRequest(confirmed.values, country)\n if (confirmed.evidence) inv.document = confirmed.evidence\n if (confirmed.save) inv.save = true\n return { requested: true, invoice: inv, ready: true, source: confirmed.evidence ? 'document' : 'manual', payLabel: label }\n }\n const ready = Object.keys(validateFiscalValues(region, values, personTypeOf)).length === 0\n const inv = toInvoiceRequest(values, country)\n if (save) inv.save = true\n return { requested: true, invoice: ready ? inv : null, ready, source: 'manual', payLabel: label }\n }, [requested, mode, profile, confirmed, values, save, region, personTypeOf, payDefault, m.payAndInvoice])\n\n const key = JSON.stringify(state)\n useEffect(() => {\n emit.current?.(state)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key])\n\n if (capabilities && (!capabilities.available || capabilities.checkout === 'off')) return null\n\n const profileCard = profile && (\n <div className={cx.card} data-sf-invoice-profile>\n <p className={cx.cardTitle} data-sf-invoice-profile-title>\n {m.profileTitle}\n </p>\n <dl>\n <Row cx={cx} label={fid?.label || m.fieldsOf.taxId} value={<span data-sf-masked>{maskTaxId(profile.tax_id)}</span>} />\n <Row cx={cx} label={m.fieldsOf.legalName} value={profile.legal_name} />\n <Row cx={cx} label={m.fieldsOf.postalCode} value={profile.postal_code} />\n <Row cx={cx} label={m.fieldsOf.regime} value={labelOf(fid?.regimes, profile.tax_regime, locale)} />\n <Row cx={cx} label={m.fieldsOf.use} value={labelOf(fid?.invoice_uses, profile.invoice_use ?? '', locale)} />\n </dl>\n {/* The saved data also travels as fields, so the checkout works without JavaScript. */}\n <input type=\"hidden\" name={`${namePrefix}.tax_id`} value={profile.tax_id} />\n <input type=\"hidden\" name={`${namePrefix}.legal_name`} value={profile.legal_name} />\n <input type=\"hidden\" name={`${namePrefix}.postal_code`} value={profile.postal_code} />\n <input type=\"hidden\" name={`${namePrefix}.tax_regime`} value={profile.tax_regime} />\n <input type=\"hidden\" name={`${namePrefix}.use`} value={profile.invoice_use ?? ''} />\n {profile.document ? <input type=\"hidden\" name={`${namePrefix}.document`} value={JSON.stringify(profile.document)} /> : null}\n <div className={cx.actions} data-sf-invoice-actions>\n <button type=\"button\" className={cx.secondary} onClick={() => setMode('edit-profile')} data-sf-invoice-change>\n {m.change}\n </button>\n <button\n type=\"button\"\n className={cx.link}\n onClick={() => {\n setValues({ tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '' })\n setConfirmed(null)\n setMode(canRead ? 'read' : 'manual')\n }}\n data-sf-invoice-other\n >\n {m.useOther}\n </button>\n </div>\n </div>\n )\n\n const saveBox = canSave ? (\n <label data-sf-invoice-save>\n <input type=\"checkbox\" name={`${namePrefix}.save`} checked={save} onChange={(e) => setSave(e.target.checked)} />\n <span>{all.reader.saveToAccount}</span>\n </label>\n ) : null\n const backToProfile =\n profile && usable && mode !== 'profile' ? (\n <button\n type=\"button\"\n className={cx.link}\n onClick={() => {\n setValues(profileValues(profile))\n setMode('profile')\n }}\n data-sf-invoice-back\n >\n {m.useSaved}\n </button>\n ) : null\n\n const body = !requested ? null : (\n <div id={bodyId} className={cx.body} data-sf-invoice-body>\n <input type=\"hidden\" name={`${namePrefix}.requested`} value=\"true\" />\n {mode === 'profile' ? (\n profileCard\n ) : mode === 'read' ? (\n <>\n <IdentityDocumentReader\n region={region}\n {...(spec ? { document: spec } : {})}\n {...(workerSrc ? { workerSrc } : {})}\n {...(data ? { data } : {})}\n {...(canSave !== undefined ? { canSave } : {})}\n {...(serverUpload ? { serverUpload } : {})}\n {...(props.documentName ? { documentName: props.documentName } : {})}\n {...(personTypeOf ? { personTypeOf } : {})}\n {...(now ? { now } : {})}\n onManual={() => {\n setValues({ tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '' })\n setMode('manual')\n }}\n onConfirm={(r) => {\n setConfirmed(r)\n }}\n namePrefix={namePrefix}\n locale={locale}\n {...(messages ? { messages } : {})}\n classNames={cx}\n />\n {confirmed ? (\n <p role=\"status\" data-sf-invoice-confirmed>\n <span aria-hidden=\"true\">✓ </span>\n {m.profileTitle}\n </p>\n ) : null}\n {backToProfile}\n </>\n ) : (\n <>\n <h3 className={cx.cardTitle}>{m.manualTitle}</h3>\n <FiscalIdentityFields\n region={region}\n values={values}\n onChange={setValues}\n errors={Object.fromEntries(Object.entries(data?.fieldErrors ?? {}).map(([k, v]) => [k, all.server.errors[v] ?? v]))}\n namePrefix={namePrefix}\n {...(personTypeOf ? { personTypeOf } : {})}\n locale={locale}\n {...(messages ? { messages } : {})}\n classNames={cx}\n hideLegend\n />\n {saveBox}\n <p className={cx.privacy} data-sf-invoice-privacy>\n {m.privacy}\n </p>\n {backToProfile}\n </>\n )}\n </div>\n )\n\n return (\n <section className={cx.toggle} data-sf-invoice-toggle aria-label={m.label}>\n <label data-sf-invoice-label>\n <input\n type=\"checkbox\"\n name={`${namePrefix}.want`}\n checked={requested}\n aria-controls={requested ? bodyId : undefined}\n onChange={(e) => setRequested(e.target.checked)}\n />\n <span>{m.label}</span>\n </label>\n {noJsHref && !requested ? (\n <noscript>\n <a href={noJsHref} data-sf-invoice-nojs>\n {m.label}\n </a>\n </noscript>\n ) : null}\n {body}\n </section>\n )\n}\n\nfunction Row({ label, value, cx }: { label: string; value: ReactNode; cx: InvoiceToggleClassNames }) {\n return (\n <div className={cx.cardRow} data-sf-invoice-row>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </div>\n )\n}\n\nfunction labelOf(list: { code: string; label: string; label_en?: string; person_types: string[] }[] | undefined, code: string, locale: string): string {\n const e = list?.find((x) => x.code === code)\n return e ? `${e.code} · ${entryLabel(e, locale)}` : code\n}\n","/**\n * The invoice of an order, in one card with the state the buyer needs to understand and the one next step. It reads an\n * `InvoiceSummary` (`stage`, `action`, `can_request`, `blocked_reason`, `reason_code`, links) and never guesses: the\n * server decides what is possible. While an invoice is being generated it asks the caller to refresh (`onRefresh`)\n * every 10 s for at most a minute, then stops and says so.\n */\nimport { useCallback, useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport type { InvoiceSummary } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\nimport { fill, fiscalMessages, type DeepPartial, type FiscalMessages } from './messages.js'\n\nexport type InvoiceCardState =\n | 'not_requested'\n | 'awaiting_payment'\n | 'processing'\n | 'issued'\n | 'needs_data'\n | 'needs_review'\n | 'window_closed'\n | 'unavailable'\n | 'cancelled'\n\n/** Which of the card's states an invoice is in. `available: false` (the store does not invoice) wins over everything. */\nexport function invoiceCardState(invoice: InvoiceSummary | null | undefined, available = true): InvoiceCardState {\n if (!available) return 'unavailable'\n if (!invoice) return 'not_requested'\n const stage = invoice.stage ?? ''\n const blocked = invoice.blocked_reason ?? ''\n if (stage === 'issued' || invoice.status === 'issued' || (invoice.action === 'download' && (invoice.url || invoice.xml_url))) return 'issued'\n if (stage === 'cancelled') return 'cancelled'\n if (stage === 'needs_data' || invoice.action === 'correct_data') return 'needs_data'\n if (stage === 'needs_review' || invoice.action === 'contact_store') return 'needs_review'\n if (stage === 'window_closed' || blocked === 'window_closed') return 'window_closed'\n if (stage === 'awaiting_payment' || blocked === 'awaiting_payment') return 'awaiting_payment'\n if (stage === 'queued' || stage === 'issuing' || stage === 'retrying' || stage === 'requested') return 'processing'\n if (blocked === 'not_invoiceable' || blocked === 'unavailable') return 'unavailable'\n if (invoice.can_request === false && blocked) return 'unavailable'\n return 'not_requested'\n}\n\nexport type InvoiceStatusCardClassNames = Partial<Record<'root' | 'title' | 'body' | 'actions' | 'primary' | 'secondary' | 'link' | 'meta', string>>\n\nexport type InvoiceStatusCardProps = {\n invoice?: InvoiceSummary | null\n /** `capabilities.invoicing.available`. `false`: \"Invoice not available\". */\n available?: boolean\n /** The buyer taps \"Request invoice\". Shown when `invoice.can_request !== false`. Without it, `requestHref` is a link. */\n onRequest?: () => void\n requestHref?: string\n /** \"Fix and retry\". Without it, `correctHref` is a link. */\n onCorrect?: () => void\n correctHref?: string\n /** Called while the invoice is processing (every `refreshMs`, for at most `refreshForMs`). Reload the order there. */\n onRefresh?: () => void\n refreshMs?: number\n refreshForMs?: number\n /** How to reach the store when it must review: an email, a phone or a URL. */\n contact?: { email?: string; phone?: string; url?: string }\n locale?: string\n messages?: DeepPartial<FiscalMessages>\n classNames?: InvoiceStatusCardClassNames\n /** Heading level of the title (default 3). */\n headingLevel?: 2 | 3 | 4\n}\n\nexport function InvoiceStatusCard(props: InvoiceStatusCardProps) {\n const { invoice, available = true, onRequest, requestHref, onCorrect, correctHref, onRefresh, refreshMs = 10_000, refreshForMs = 60_000, contact, messages, classNames: cx = {}, headingLevel = 3 } = props\n const locale = useResolvedLocale(props.locale)\n const m = fiscalMessages(locale, messages).status\n const state = invoiceCardState(invoice, available)\n const titleId = `sf-invoice-card-${useId().replace(/:/g, '')}`\n const [tired, setTired] = useState(false)\n const refresh = useRef(onRefresh)\n refresh.current = onRefresh\n\n // Refresh while it is processing, then give up quietly (the card says it is still going).\n useEffect(() => {\n setTired(false)\n if (state !== 'processing' || !refresh.current) return\n const t0 = Date.now()\n const id = setInterval(() => {\n if (Date.now() - t0 >= refreshForMs) {\n clearInterval(id)\n setTired(true)\n return\n }\n refresh.current?.()\n }, refreshMs)\n return () => clearInterval(id)\n }, [state, refreshMs, refreshForMs])\n\n const manualRefresh = useCallback(() => {\n setTired(false)\n refresh.current?.()\n }, [])\n\n const H = `h${headingLevel}` as 'h2' | 'h3' | 'h4'\n const contactLine = contact?.email ?? contact?.phone ?? contact?.url\n const reason = invoice?.reason_code ? (m.reasons[invoice.reason_code] ?? m.reasons.default) : m.reasons.default\n\n let title: string\n let body: ReactNode = null\n let actions: ReactNode = null\n let live = false\n\n switch (state) {\n case 'not_requested': {\n title = m.title\n body = <p className={cx.body}>{m.requestHelp}</p>\n const can = invoice?.can_request !== false\n if (can && (onRequest || requestHref)) {\n actions = onRequest ? (\n <button type=\"button\" className={cx.primary} onClick={onRequest} data-sf-invoice-request>\n {m.request}\n </button>\n ) : (\n <a href={requestHref} className={cx.primary} data-sf-invoice-request>\n {m.request}\n </a>\n )\n }\n break\n }\n case 'awaiting_payment':\n title = m.awaitingTitle\n body = <p className={cx.body}>{m.awaitingBody}</p>\n break\n case 'processing':\n live = true\n title = m.processingTitle\n body = <p className={cx.body}>{tired ? m.processingSlow : m.processingBody}</p>\n actions = onRefresh ? (\n <button type=\"button\" className={cx.secondary} onClick={manualRefresh} data-sf-invoice-refresh>\n {m.refresh}\n </button>\n ) : null\n break\n case 'issued':\n title = m.issuedTitle\n body = (\n <>\n <p className={cx.body}>{m.issuedBody}</p>\n {invoice?.folio ? (\n <p className={cx.meta} data-sf-invoice-folio>\n <span>{m.folio}: </span>\n <code>{invoice.folio}</code>\n </p>\n ) : null}\n </>\n )\n actions = (\n <>\n {invoice?.url ? (\n <a href={invoice.url} className={cx.primary} rel=\"noopener noreferrer\" download data-sf-invoice-pdf>\n {m.pdf}\n </a>\n ) : null}\n {invoice?.xml_url ? (\n <a href={invoice.xml_url} className={cx.secondary} rel=\"noopener noreferrer\" download data-sf-invoice-xml>\n {m.xml}\n </a>\n ) : null}\n </>\n )\n break\n case 'needs_data':\n title = m.needsDataTitle\n body = (\n <>\n <p className={cx.body}>{m.needsDataBody}</p>\n <p className={cx.meta} data-sf-invoice-reason>\n {reason}\n </p>\n </>\n )\n actions = onCorrect ? (\n <button type=\"button\" className={cx.primary} onClick={onCorrect} data-sf-invoice-correct>\n {m.correct}\n </button>\n ) : correctHref ? (\n <a href={correctHref} className={cx.primary} data-sf-invoice-correct>\n {m.correct}\n </a>\n ) : null\n break\n case 'needs_review':\n title = m.reviewTitle\n body = (\n <>\n <p className={cx.body}>{m.reviewBody}</p>\n {contactLine ? <p className={cx.meta}>{fill(m.contactBy, { contact: contactLine })}</p> : null}\n </>\n )\n actions = contact?.url ? (\n <a href={contact.url} className={cx.secondary} data-sf-invoice-contact>\n {m.contact}\n </a>\n ) : contact?.email ? (\n <a href={`mailto:${contact.email}`} className={cx.secondary} data-sf-invoice-contact>\n {m.contact}\n </a>\n ) : null\n break\n case 'window_closed':\n title = m.windowTitle\n body = <p className={cx.body}>{m.windowBody}</p>\n break\n case 'cancelled':\n title = m.cancelledTitle\n body = <p className={cx.body}>{m.cancelledBody}</p>\n break\n default:\n title = m.unavailableTitle\n body = <p className={cx.body}>{m.unavailableBody}</p>\n }\n\n return (\n <section className={cx.root} data-sf-invoice-card data-state={state} data-stage={invoice?.stage || undefined} aria-labelledby={titleId}>\n <H id={titleId} className={cx.title} data-sf-invoice-title>\n <span aria-hidden=\"true\" data-sf-invoice-icon>\n {ICON[state]}\n </span>{' '}\n {title}\n </H>\n {/* Announces the change when an invoice moves on while the buyer is looking at the page. */}\n <div aria-live={live || state === 'issued' ? 'polite' : undefined} data-sf-invoice-live>\n {body}\n </div>\n {actions ? (\n <div className={cx.actions} data-sf-invoice-actions>\n {actions}\n </div>\n ) : null}\n </section>\n )\n}\n\n/** A shape per state, so the state never depends on color alone. */\nconst ICON: Record<InvoiceCardState, string> = {\n not_requested: '○',\n awaiting_payment: '◔',\n processing: '↻',\n issued: '✓',\n needs_data: '!',\n needs_review: '◐',\n window_closed: '–',\n unavailable: '–',\n cancelled: '×',\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/checkout/fields.tsx","../src/context.tsx","../src/locale.ts","../src/fiscal/format.ts","../src/fiscal/messages.ts","../src/fiscal/identity-fields.tsx","../src/fiscal/extraction.ts","../src/fiscal/use-camera-qr.ts","../src/fiscal/document-reader.tsx","../src/dialog.tsx","../src/fiscal/scan-tax-document.tsx","../src/fiscal/invoice-toggle.tsx","../src/fiscal/invoice-status-card.tsx"],"names":["useRef","useEffect","jsxs","jsx","createContext","useContext","ES","EN","useId","useState","useMemo","first","Fragment","useCallback","inv"],"mappings":"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","file":"fiscal.cjs","sourcesContent":["/**\n * Form fields of a checkout with inline validation: a labelled field that shows its own error under it, a focusable\n * error summary for the submit, and one hook that reads the browser's own constraint validation (`required`, `type`,\n * `pattern`, `minLength`...) so the rules stay in the HTML and the page keeps working without JavaScript (then the\n * browser explains the errors itself).\n *\n * WCAG 2.2: errors are identified in text next to the field (3.3.1), linked with `aria-describedby` and `aria-invalid`,\n * and the summary takes focus and links to every field (3.3.1 / 2.4.3). Validation runs when the buyer leaves a field\n * that has a value, and clears as soon as it is fixed: it never nags while typing.\n */\nimport { useEffect, useRef, useState, type InputHTMLAttributes, type ReactNode, type RefObject, type SelectHTMLAttributes } from 'react'\n\nexport type FieldMessages = {\n valueMissing: string\n /** Required radio group (delivery, payment). */\n choiceMissing: string\n email: string\n tel: string\n pattern: string\n /** `{n}` = minimum length. */\n tooShort: string\n /** A field the server rejected. */\n server: string\n /** Error summary title, `{n}` = number of fields. */\n summaryOne: string\n summaryMany: string\n optional: string\n}\n\nconst ES: FieldMessages = {\n valueMissing: 'Completa este campo.',\n choiceMissing: 'Elige una opción.',\n email: 'Escribe un correo válido, por ejemplo nombre@correo.com.',\n tel: 'Escribe un teléfono válido.',\n pattern: 'Revisa el formato.',\n tooShort: 'Escribe al menos {n} caracteres.',\n server: 'Revisa este campo.',\n summaryOne: 'Revisa 1 campo para continuar',\n summaryMany: 'Revisa {n} campos para continuar',\n optional: '(opcional)',\n}\n\nconst EN: FieldMessages = {\n valueMissing: 'Fill in this field.',\n choiceMissing: 'Choose an option.',\n email: 'Enter a valid email, like name@example.com.',\n tel: 'Enter a valid phone number.',\n pattern: 'Check the format.',\n tooShort: 'Enter at least {n} characters.',\n server: 'Check this field.',\n summaryOne: 'Check 1 field to continue',\n summaryMany: 'Check {n} fields to continue',\n optional: '(optional)',\n}\n\n/** Messages for a locale (`es*` default, `en*`), with optional overrides. */\nexport function fieldMessages(locale?: string | null, overrides?: Partial<FieldMessages> | null): FieldMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\n/** Field name -> error text. */\nexport type FieldErrors = Record<string, string>\n\nexport type ErrorSummaryItem = { name: string; id: string; label: string; message: string }\n\ntype Control = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n\nconst isControl = (el: EventTarget | null): el is Control =>\n !!el && typeof (el as Element).tagName === 'string' && ['INPUT', 'SELECT', 'TEXTAREA'].includes((el as Element).tagName) && !!(el as Control).name\n\n/**\n * The error text for a control, from its validity. A control can bring its own text with `data-sf-error` (any\n * failure) or `title` (pattern mismatch, the HTML convention).\n */\nexport function validationMessage(el: Control, m: FieldMessages = ES): string | null {\n const v = el.validity\n if (!v || v.valid) return null\n const own = el.getAttribute('data-sf-error')\n if (own) return own\n if (v.valueMissing) return el instanceof HTMLInputElement && (el.type === 'radio' || el.type === 'checkbox') ? m.choiceMissing : m.valueMissing\n if (v.typeMismatch && el instanceof HTMLInputElement) return el.type === 'email' ? m.email : el.type === 'tel' ? m.tel : m.pattern\n if (v.patternMismatch) return el.getAttribute('title') || (el instanceof HTMLInputElement && el.type === 'tel' ? m.tel : m.pattern)\n if (v.tooShort && el instanceof HTMLInputElement) return m.tooShort.replace('{n}', String(el.minLength))\n return el.validationMessage || m.pattern\n}\n\n/** Visible name of a control: its `<label>`, `aria-label`, or the legend of its group (radios). */\nfunction labelOf(el: Control): string {\n if (el instanceof HTMLInputElement && el.type === 'radio') {\n const legend = el.closest('fieldset')?.querySelector('legend')\n if (legend?.textContent) return legend.textContent.trim()\n }\n const text = el.labels?.[0]?.getAttribute('data-sf-label') ?? el.labels?.[0]?.textContent ?? el.getAttribute('aria-label') ?? el.name\n return text.trim()\n}\n\nexport type UseFieldErrorsOptions = {\n locale?: string\n messages?: Partial<FieldMessages>\n /** Fields the server rejected (e.g. from the action), shown with `serverMessages[name]` or the generic text. */\n serverFields?: Iterable<string> | null\n serverMessages?: Record<string, string> | null\n}\n\nexport type FieldErrorsState = {\n errors: FieldErrors\n /** Non-null after a submit with problems (or with server errors): render it in `<ErrorSummary>`. */\n summary: ErrorSummaryItem[] | null\n /** Changes every time a new summary appears, so `<ErrorSummary>` focuses it again. */\n summaryKey: number\n clear: () => void\n}\n\n/**\n * Inline validation for the page `<form>`. Listens to the form (no wrapping component): leaving a field with a value\n * checks it; typing in a field with an error clears it when fixed; a submit or `reportValidity()` with problems\n * collects them (the browser's bubbles are replaced by the inline texts) for the summary.\n */\nexport function useFieldErrors(formRef: RefObject<HTMLFormElement | null>, options: UseFieldErrorsOptions = {}): FieldErrorsState {\n const m = fieldMessages(options.locale, options.messages)\n const live = useRef(m)\n live.current = m\n const server = [...(options.serverFields ?? [])]\n const serverKey = server.join('|')\n const [errors, setErrors] = useState<FieldErrors>(() => Object.fromEntries(server.map((n) => [n, options.serverMessages?.[n] ?? m.server])))\n const [summary, setSummary] = useState<ErrorSummaryItem[] | null>(null)\n const [summaryKey, setSummaryKey] = useState(0)\n\n // Server errors (a new action result): inline texts plus a summary.\n useEffect(() => {\n if (!server.length) return\n const form = formRef.current\n const items: ErrorSummaryItem[] = []\n const next: FieldErrors = {}\n for (const name of server) {\n const msg = options.serverMessages?.[name] ?? live.current.server\n next[name] = msg\n const el = form?.elements.namedItem(name)\n const ctl = el && 'length' in el && !(el instanceof HTMLSelectElement) ? ((el as RadioNodeList)[0] as Control | undefined) : (el as Control | null)\n if (ctl) items.push({ name, id: ctl.id || name, label: labelOf(ctl), message: msg })\n }\n setErrors((e) => ({ ...e, ...next }))\n if (items.length) {\n setSummary(items)\n setSummaryKey((k) => k + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [serverKey])\n\n useEffect(() => {\n const form = formRef.current\n if (!form) return\n let batch: Control[] | null = null\n const set = (name: string, msg: string | null) =>\n setErrors((e) => {\n if (msg === null) {\n if (!(name in e)) return e\n const { [name]: _gone, ...rest } = e\n return rest\n }\n return e[name] === msg ? e : { ...e, [name]: msg }\n })\n const onBlur = (ev: FocusEvent) => {\n const el = ev.target\n if (!isControl(el) || (el instanceof HTMLInputElement && (el.type === 'radio' || el.type === 'checkbox' || el.type === 'hidden'))) return\n // Leaving an empty field you only tabbed through is not an error yet; it is at submit.\n if (!el.value) return\n set(el.name, validationMessage(el, live.current))\n }\n const onInput = (ev: Event) => {\n const el = ev.target\n if (!isControl(el)) return\n setErrors((e) => {\n if (!(el.name in e)) return e\n const msg = el.validity.valid ? null : validationMessage(el, live.current)\n if (msg !== null) return e // keep the text until the field is fixed (no flicker while typing)\n const { [el.name]: _gone, ...rest } = e\n return rest\n })\n }\n const onInvalid = (ev: Event) => {\n const el = ev.target\n if (!isControl(el)) return\n ev.preventDefault() // the inline text replaces the browser bubble\n if (!batch) {\n batch = []\n queueMicrotask(() => {\n const list = batch ?? []\n batch = null\n const seen = new Set<string>()\n const items: ErrorSummaryItem[] = []\n const next: FieldErrors = {}\n for (const c of list) {\n if (seen.has(c.name)) continue\n seen.add(c.name)\n const msg = validationMessage(c, live.current) ?? live.current.valueMissing\n next[c.name] = msg\n items.push({ name: c.name, id: c.id || c.name, label: labelOf(c), message: msg })\n }\n setErrors((e) => ({ ...e, ...next }))\n setSummary(items)\n setSummaryKey((k) => k + 1)\n })\n }\n batch.push(el)\n }\n form.addEventListener('focusout', onBlur)\n form.addEventListener('input', onInput)\n form.addEventListener('change', onInput)\n form.addEventListener('invalid', onInvalid, true)\n return () => {\n form.removeEventListener('focusout', onBlur)\n form.removeEventListener('input', onInput)\n form.removeEventListener('change', onInput)\n form.removeEventListener('invalid', onInvalid, true)\n }\n }, [formRef])\n\n // The summary follows the fixes: a field fixed after the submit leaves the list.\n const shown = summary ? summary.filter((s) => s.name in errors).map((s) => ({ ...s, message: errors[s.name]! })) : null\n return {\n errors,\n summary: shown && shown.length ? shown : null,\n summaryKey,\n clear: () => {\n setErrors({})\n setSummary(null)\n },\n }\n}\n\nexport type ErrorSummaryProps = {\n items: readonly ErrorSummaryItem[] | null\n /** Changes when a new summary must take focus (`useFieldErrors().summaryKey`). */\n focusKey?: number\n locale?: string\n messages?: Partial<FieldMessages>\n title?: ReactNode\n className?: string\n classNames?: Partial<Record<'title' | 'list' | 'link', string>>\n}\n\n/**\n * The list of problems after a submit, above the form: `role=\"alert\"`, takes focus, one link per field (moves the\n * focus to it). Renders nothing without items.\n */\nexport function ErrorSummary({ items, focusKey, locale, messages, title, className, classNames: cx = {} }: ErrorSummaryProps) {\n const ref = useRef<HTMLDivElement>(null)\n const m = fieldMessages(locale, messages)\n const has = !!items && items.length > 0\n useEffect(() => {\n if (has) ref.current?.focus()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [focusKey])\n if (!has) return null\n const n = items!.length\n return (\n <div ref={ref} role=\"alert\" tabIndex={-1} className={className} data-sf-error-summary aria-labelledby=\"sf-error-summary-title\">\n <p id=\"sf-error-summary-title\" className={cx.title} data-sf-error-summary-title>\n {title ?? (n === 1 ? m.summaryOne : m.summaryMany.replace('{n}', String(n)))}\n </p>\n <ul className={cx.list}>\n {items!.map((it) => (\n <li key={it.name}>\n <a\n href={`#${it.id}`}\n className={cx.link}\n onClick={(e) => {\n const el = document.getElementById(it.id)\n if (!el) return\n e.preventDefault()\n el.focus()\n el.scrollIntoView?.({ block: 'center' })\n }}\n >\n {it.label}: {it.message}\n </a>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nexport type CheckoutFieldClassNames = Partial<Record<'root' | 'label' | 'optional' | 'input' | 'hint' | 'error', string>>\n\ntype BaseFieldProps = {\n name: string\n label: string\n /** Field id. Default: the name. */\n id?: string\n /** Error text (from `useFieldErrors().errors[name]` or the server). */\n error?: string | null\n /** Help under the label (\"we only use it for the delivery\"). */\n hint?: ReactNode\n /** Marks the label \"(optional)\" and drops `required`. */\n optional?: boolean\n classNames?: CheckoutFieldClassNames\n locale?: string\n messages?: Partial<FieldMessages>\n}\n\nexport type CheckoutFieldProps = BaseFieldProps & Omit<InputHTMLAttributes<HTMLInputElement>, 'name' | 'id'> & { as?: 'input' }\nexport type CheckoutSelectProps = BaseFieldProps & Omit<SelectHTMLAttributes<HTMLSelectElement>, 'name' | 'id'> & { as: 'select'; children: ReactNode }\n\n/**\n * One labelled field: label (with \"(optional)\"), hint, the control and its error text, wired with `aria-describedby`\n * and `aria-invalid`. Required unless `optional`. `as=\"select\"` renders a `<select>` with the given options.\n */\nexport function CheckoutField(props: CheckoutFieldProps | CheckoutSelectProps) {\n const { name, label, id = name, error, hint, optional = false, classNames: cx = {}, locale, messages, ...rest } = props\n const m = fieldMessages(locale, messages)\n const hintId = hint ? `${id}-hint` : undefined\n const errorId = `${id}-error`\n const describedBy = [hintId, error ? errorId : undefined].filter(Boolean).join(' ') || undefined\n const common = {\n id,\n name,\n required: !optional,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': describedBy,\n className: cx.input,\n 'data-sf-field-control': '',\n } as const\n return (\n <div className={cx.root} data-sf-field data-invalid={error ? '' : undefined}>\n <label htmlFor={id} className={cx.label} data-sf-label={label}>\n {label}\n {optional ? (\n <span className={cx.optional} data-sf-field-optional>\n {' '}\n {m.optional}\n </span>\n ) : null}\n </label>\n {hint ? (\n <p id={hintId} className={cx.hint} data-sf-field-hint>\n {hint}\n </p>\n ) : null}\n {rest.as === 'select' ? (\n (() => {\n const { as: _as, children, ...select } = rest\n return (\n <select {...select} {...common}>\n {children}\n </select>\n )\n })()\n ) : (\n (() => {\n const { as: _as, ...input } = rest as CheckoutFieldProps\n return <input {...input} {...common} />\n })()\n )}\n {/* Reserved only when there is an error: the text sits right under its field. */}\n {error ? (\n <p id={errorId} className={cx.error} data-sf-field-error>\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n","import { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { createStorefrontClient, type Shop, type StorefrontClient, type StorefrontClientOptions } from '@asteby/storefront'\n\nexport type StorefrontContextValue = {\n /** Client for browser-side calls (use a public `pk_` token). */\n client: StorefrontClient | null\n shop: Shop | null\n /** BCP 47 locale used for formatting (defaults to `shop.locale`, then `es-MX`). */\n locale: string\n /** ISO 4217 currency (defaults to `shop.currency_code`, then `MXN`). */\n currency: string\n}\n\nconst StorefrontContext = createContext<StorefrontContextValue | null>(null)\n\nexport type StorefrontProviderProps = {\n /** A ready client. Takes precedence over `config`. */\n client?: StorefrontClient\n /** Options to create the browser client (use a `pk_` token). */\n config?: StorefrontClientOptions\n /** Shop info loaded on the server (root loader). */\n shop?: Shop | null\n locale?: string\n currency?: string\n children?: ReactNode\n}\n\n/**\n * Makes the storefront client, shop, locale and currency available to the\n * tree. SSR-safe: creating the client does not touch `window`.\n */\nexport function StorefrontProvider({ client, config, shop = null, locale, currency, children }: StorefrontProviderProps) {\n const configKey = config ? `${config.baseUrl}|${config.token}|${config.locale ?? ''}|${config.customerToken ?? ''}` : ''\n const resolvedClient = useMemo(\n () => client ?? (config ? createStorefrontClient(config) : null),\n [client, configKey],\n )\n const value = useMemo<StorefrontContextValue>(\n () => ({\n client: resolvedClient,\n shop,\n locale: locale ?? config?.locale ?? shop?.locale ?? 'es-MX',\n currency: currency ?? shop?.currency_code ?? 'MXN',\n }),\n [resolvedClient, shop, locale, currency, config?.locale],\n )\n return <StorefrontContext.Provider value={value}>{children}</StorefrontContext.Provider>\n}\n\n/** Storefront context. Throws outside `<StorefrontProvider>`. */\nexport function useStorefront(): StorefrontContextValue {\n const ctx = useContext(StorefrontContext)\n if (!ctx) throw new Error('useStorefront must be used inside <StorefrontProvider>')\n return ctx\n}\n\n/** Storefront context or `null` outside a provider (for components that work standalone). */\nexport function useOptionalStorefront(): StorefrontContextValue | null {\n return useContext(StorefrontContext)\n}\n\n/** The client from context; throws when the provider has none. */\nexport function useStorefrontClient(): StorefrontClient {\n const { client } = useStorefront()\n if (!client) throw new Error('<StorefrontProvider> needs a `client` or `config` for browser-side calls')\n return client\n}\n","import { useOptionalStorefront } from './context.js'\n\n/** Locale of a component: its own prop, else the `StorefrontProvider`'s, else `es-MX`. */\nexport function useResolvedLocale(locale?: string | null): string {\n const sf = useOptionalStorefront()\n return locale ?? sf?.locale ?? 'es-MX'\n}\n","/**\n * Pure helpers over the region's fiscal catalog (`Region.fiscal_id`). They know no country: the tax id format, the\n * regimes, the invoice uses and the postal code format are all data.\n */\nimport type { InvoiceRequest, Region, RegionFiscalEntry, RegionFiscalId } from '@asteby/storefront'\nimport type { FiscalFieldName, FiscalFieldValues } from './types.js'\n\nexport type FiscalRegion = Pick<Region, 'address'> & { fiscal_id?: RegionFiscalId }\n\n/** Uppercase, no spaces, hyphens or dots: how a tax id is compared and sent. */\nexport function normalizeTaxId(raw: string): string {\n return raw.replace(/[\\s\\-.]/g, '').toUpperCase()\n}\n\n/** Masks a tax id for display and logs: first 2 and last 3 characters stay (`PE********ABC`). */\nexport function maskTaxId(taxId: string): string {\n const v = taxId.trim()\n return v.length <= 5 ? '*'.repeat(v.length) : `${v.slice(0, 2)}${'*'.repeat(v.length - 5)}${v.slice(-3)}`\n}\n\nconst compile = (pattern: string | undefined): RegExp | null => {\n if (!pattern) return null\n try {\n return new RegExp(pattern)\n } catch {\n return null\n }\n}\n\n/** `null` when the tax id is valid for the region (its pattern or one of its generic ids); otherwise why not. */\nexport function taxIdProblem(fid: RegionFiscalId | undefined, raw: string): 'required' | 'format' | null {\n const v = normalizeTaxId(raw)\n if (!v) return 'required'\n if (!fid) return null\n if (fid.generic_ids.includes(v)) return null\n const re = compile(fid.pattern)\n return re && !re.test(v) ? 'format' : null\n}\n\nexport function postalCodeProblem(region: FiscalRegion, raw: string): 'required' | 'format' | null {\n const v = raw.trim()\n if (!v) return 'required'\n const re = compile(region.address?.postal_code?.pattern)\n return re && !re.test(v) ? 'format' : null\n}\n\n/**\n * Builds the function that tells a person type from a tax id when the region does not publish one. Pass the length\n * of the tax id per type, e.g. `personTypeByLength({ individual: 13, company: 12 })`. Without a function the regimes\n * are not narrowed by person type (the server still checks the combination).\n */\nexport function personTypeByLength(lengths: Record<string, number>): (taxId: string) => string | null {\n return (taxId) => {\n const n = normalizeTaxId(taxId).length\n return Object.keys(lengths).find((t) => lengths[t] === n) ?? null\n }\n}\n\n/**\n * Tells a person type from a tax id with the region's own patterns (`fiscal_id.person_patterns`, DATA of the region\n * pack). `null` when the region publishes none or none matches. A pattern that does not compile is ignored.\n */\nexport function personTypeFromPatterns(fid: RegionFiscalId | undefined, taxId: string): string | null {\n const patterns = fid?.person_patterns\n if (!patterns) return null\n const v = normalizeTaxId(taxId)\n for (const type of Object.keys(patterns).sort()) {\n const re = compile(patterns[type])\n if (re?.test(v)) return type\n }\n return null\n}\n\n/** The function to use for the person type: the store's override, else the region's patterns. */\nexport function personTypeResolver(fid: RegionFiscalId | undefined, override?: (taxId: string) => string | null): (taxId: string) => string | null {\n return override ?? ((taxId) => personTypeFromPatterns(fid, taxId))\n}\n\n/**\n * The invoice use to suggest for a regime, from region data only: the organization's `default_invoice_use` when the\n * regime admits it, else the first use whose `suggested_for_regimes` lists the regime (and whose `allowed_regimes`\n * admits it). `null` when the region suggests nothing: then nothing is preselected. A suggestion, never a rule.\n */\nexport function suggestInvoiceUse(fid: RegionFiscalId | undefined, regime: string | null | undefined): string | null {\n if (!fid || !regime) return null\n const allowed = usesFor(fid, regime)\n const preferred = fid.default_invoice_use\n if (preferred && allowed.some((u) => u.code === preferred)) return preferred\n return allowed.find((u) => u.suggested_for_regimes?.includes(regime))?.code ?? null\n}\n\n/** Regimes that fit a person type (all when the type is unknown). */\nexport function regimesFor(fid: RegionFiscalId | undefined, personType: string | null): RegionFiscalEntry[] {\n const all = fid?.regimes ?? []\n if (!personType) return all\n return all.filter((r) => r.person_types.length === 0 || r.person_types.includes(personType))\n}\n\n/** Invoice uses a regime admits (all when no regime is chosen yet). */\nexport function usesFor(fid: RegionFiscalId | undefined, regime: string | null | undefined): RegionFiscalEntry[] {\n const all = fid?.invoice_uses ?? []\n if (!regime) return all\n return all.filter((u) => !u.allowed_regimes || u.allowed_regimes.length === 0 || u.allowed_regimes.includes(regime))\n}\n\nexport type FiscalProblem = 'required' | 'format' | 'unknown' | 'person_type' | 'use_not_allowed'\n\n/** Client-side check of the whole form against the region; the server stays the authority. */\nexport function validateFiscalValues(\n region: FiscalRegion,\n v: Partial<FiscalFieldValues>,\n personTypeOverride?: (taxId: string) => string | null,\n): Partial<Record<FiscalFieldName, FiscalProblem>> {\n const fid = region.fiscal_id\n const personTypeOf = personTypeResolver(fid, personTypeOverride)\n const out: Partial<Record<FiscalFieldName, FiscalProblem>> = {}\n const tax = taxIdProblem(fid, v.tax_id ?? '')\n if (tax) out.tax_id = tax\n if (!(v.legal_name ?? '').trim()) out.legal_name = 'required'\n if (postalCodeProblem(region, v.postal_code ?? '')) out.postal_code = postalCodeProblem(region, v.postal_code ?? '')!\n const regime = v.tax_regime ?? ''\n if (!regime) out.tax_regime = 'required'\n else if (fid) {\n const entry = fid.regimes.find((r) => r.code === regime)\n if (!entry) out.tax_regime = 'unknown'\n else if (!tax && !fid.generic_ids.includes(normalizeTaxId(v.tax_id ?? ''))) {\n const person = personTypeOf?.(v.tax_id ?? '') ?? null\n if (person && entry.person_types.length > 0 && !entry.person_types.includes(person)) out.tax_regime = 'person_type'\n }\n }\n const use = v.use ?? ''\n if (!use) out.use = 'required'\n else if (fid) {\n const entry = fid.invoice_uses.find((u) => u.code === use)\n if (!entry) out.use = 'unknown'\n else if (regime && entry.allowed_regimes && entry.allowed_regimes.length > 0 && !entry.allowed_regimes.includes(regime)) out.use = 'use_not_allowed'\n }\n return out\n}\n\n/** Form values -> the API's `InvoiceRequest` (without `document`). */\nexport function toInvoiceRequest(v: Partial<FiscalFieldValues>, countryCode?: string): InvoiceRequest {\n return {\n requested: true,\n tax_id: normalizeTaxId(v.tax_id ?? ''),\n legal_name: (v.legal_name ?? '').trim(),\n tax_regime: v.tax_regime ?? '',\n use: v.use ?? '',\n postal_code: (v.postal_code ?? '').trim(),\n ...(countryCode ? { country_code: countryCode } : {}),\n }\n}\n\n/** `label_en` for English locales when the region has it. */\nexport function entryLabel(e: RegionFiscalEntry, locale?: string | null): string {\n return (locale ?? 'es-MX').toLowerCase().startsWith('en') && e.label_en ? e.label_en : e.label\n}\n","/** Texts of the fiscal components. Spanish (es-MX) by default, English with `en*`, any locale with `messages`. */\nimport type { FiscalReadError } from './types.js'\n\nexport type DeepPartial<T> = { [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K] }\n\nexport type FiscalMessages = {\n fields: {\n legend: string\n taxId: string\n taxIdHint: string\n legalName: string\n /** Used when the region publishes no help for the legal name. */\n legalNameHint: string\n postalCode: string\n postalCodeHint: string\n regime: string\n regimeHint: string\n regimeChoose: string\n regimeFromDocument: string\n use: string\n useHint: string\n useChoose: string\n /** `{document}` = the document's name. */\n fromDocument: string\n /** Mark on an invoice use the region suggested (an editable preselection). */\n suggested: string\n errors: {\n required: string\n taxIdFormat: string\n postalFormat: string\n unknown: string\n personType: string\n useNotAllowed: string\n }\n }\n reader: {\n /** `{document}`. */\n title: string\n dropHint: string\n dropActive: string\n choose: string\n obtain: string\n privacyBrowser: string\n privacyServer: string\n uploadServer: string\n manual: string\n reading: string\n cancel: string\n done: string\n reviewTitle: string\n reviewHint: string\n confirm: string\n changeFile: string\n saveToAccount: string\n saveConsent: string\n warnings: { qrMismatch: string; stale: string; regimeMissing: string; fieldsMissing: string; qrPartial: string }\n /** Reading a photo or the camera (the region's `image_mode`). `{document}` where noted. */\n scan: {\n title: string\n photo: string\n photoHint: string\n camera: string\n cameraTitle: string\n cameraGuide: string\n cameraStarting: string\n cameraRead: string\n cameraDenied: string\n cameraUnavailable: string\n closeCamera: string\n choosePhoto: string\n /** Button that opens the sheet; `{document}` is the document's label. */\n open: string\n manual: string\n close: string\n }\n errors: Record<FiscalReadError, string>\n summaryTitleOne: string\n summaryTitleMany: string\n }\n toggle: {\n label: string\n payDefault: string\n payAndInvoice: string\n profileTitle: string\n change: string\n useOther: string\n useSaved: string\n manualTitle: string\n unavailable: string\n privacy: string\n fieldsOf: { taxId: string; legalName: string; postalCode: string; regime: string; use: string }\n }\n status: {\n title: string\n request: string\n requestHelp: string\n awaitingTitle: string\n awaitingBody: string\n processingTitle: string\n processingBody: string\n processingSlow: string\n refresh: string\n issuedTitle: string\n issuedBody: string\n folio: string\n pdf: string\n xml: string\n needsDataTitle: string\n needsDataBody: string\n correct: string\n reviewTitle: string\n reviewBody: string\n contact: string\n contactBy: string\n windowTitle: string\n windowBody: string\n unavailableTitle: string\n unavailableBody: string\n /** The server says the store has no invoicing active (`capabilities.invoicing.available: false`). */\n notEnabledTitle: string\n notEnabledBody: string\n /** The server does not say (older server) or could not be asked: never claims the store does not invoice. */\n unknownTitle: string\n unknownBody: string\n unreachableBody: string\n /** Invoicing in test mode (sandbox): invoices have no fiscal validity. */\n sandbox: string\n /** `{days}`: how long after the purchase an invoice can be requested. */\n windowNote: string\n cancelledTitle: string\n cancelledBody: string\n /** `reason_code` -> cause for the buyer. `default` when unknown. */\n reasons: Record<string, string>\n }\n server: { errors: Record<string, string> }\n}\n\nconst ES: FiscalMessages = {\n fields: {\n legend: 'Datos fiscales',\n taxId: 'RFC',\n taxIdHint: 'Se escribe en mayúsculas y sin espacios.',\n legalName: 'Nombre o razón social',\n legalNameHint: 'Escríbelo tal como aparece en tu registro fiscal.',\n postalCode: 'Código postal fiscal',\n postalCodeHint: 'El de tu domicilio fiscal, que puede ser distinto al de entrega.',\n regime: 'Régimen fiscal',\n regimeHint: 'Solo mostramos los que aplican a tu tipo de persona.',\n regimeChoose: 'Elige tu régimen',\n regimeFromDocument: 'Tu documento menciona más de un régimen. Elige el que usarás para esta factura.',\n use: 'Uso de la factura',\n useHint: 'Solo mostramos los usos que admite tu régimen.',\n useChoose: 'Elige el uso',\n fromDocument: 'De tu {document}',\n suggested: 'Sugerido',\n errors: {\n required: 'Completa este campo.',\n taxIdFormat: 'Revisa el formato: {kind} no válido.',\n postalFormat: 'Escribe un código postal válido, por ejemplo {example}.',\n unknown: 'Elige una opción de la lista.',\n personType: 'Este régimen no corresponde a tu tipo de persona.',\n useNotAllowed: 'Este uso no está disponible con el régimen elegido.',\n },\n },\n reader: {\n title: 'Sube tu {document}',\n dropHint: 'Arrastra el PDF aquí o toca para elegirlo',\n dropActive: 'Suelta el archivo para leerlo',\n choose: 'Elegir archivo',\n obtain: 'Descárgala aquí',\n privacyBrowser: 'La leemos en tu dispositivo. No guardamos el archivo, solo los datos que confirmes.',\n privacyServer: 'La procesamos y la descartamos al terminar. Solo guardamos los datos que confirmes.',\n uploadServer: 'Leer mi archivo',\n manual: 'Captura tus datos a mano',\n reading: 'Leyendo tu {document}…',\n cancel: 'Cancelar',\n done: 'Listo. Revisa tus datos.',\n reviewTitle: 'Revisa tus datos',\n reviewHint: 'Puedes corregir cualquier campo antes de continuar.',\n confirm: 'Usar estos datos',\n changeFile: 'Subir otro archivo',\n saveToAccount: 'Guardar en mi cuenta para la próxima',\n saveConsent: 'Guardaremos estos datos en tu cuenta para facturar más rápido. Puedes borrarlos cuando quieras.',\n warnings: {\n qrMismatch: 'El código QR de tu documento no coincide con los datos leídos. Revisa con calma tu RFC y tu nombre.',\n stale: 'Tu documento tiene {days} días de emitido. Si algo cambió en tu registro, descarga uno nuevo.',\n regimeMissing: 'No pudimos detectar tu régimen. Elígelo de la lista.',\n fieldsMissing: 'No encontramos algunos datos en el documento. Complétalos para continuar.',\n qrPartial: 'Del código QR solo leímos tu identificador fiscal. Completa los demás datos o sube el PDF.',\n },\n scan: {\n title: 'Escanea tu {document}',\n photo: 'Tomar foto del QR',\n photoHint: 'Enfoca el código QR de tu documento.',\n camera: 'Escanear con la cámara',\n cameraTitle: 'Apunta al código QR',\n cameraGuide: 'Centra el código QR dentro del marco.',\n cameraStarting: 'Abriendo la cámara…',\n cameraRead: 'Código leído',\n cameraDenied: 'No pudimos usar la cámara. Elige una foto o sube el PDF.',\n cameraUnavailable: 'Este dispositivo no permite usar la cámara aquí. Elige una foto o sube el PDF.',\n closeCamera: 'Cerrar la cámara',\n choosePhoto: 'Elegir una foto',\n open: 'Escanear {document}',\n manual: 'Capturar a mano',\n close: 'Cerrar',\n },\n errors: {\n not_pdf: 'Ese archivo no es un PDF. Sube el PDF que descargaste o captura tus datos a mano.',\n too_large: 'El archivo pesa más de {size}. Sube el PDF original o captura tus datos a mano.',\n no_text: 'Este PDF parece una imagen escaneada y no podemos leerlo. Captura tus datos a mano.',\n password: 'Este PDF tiene contraseña y no podemos abrirlo. Descárgalo de nuevo sin contraseña o captura tus datos a mano.',\n unreadable: 'No pudimos leer este archivo. Inténtalo con otro o captura tus datos a mano.',\n no_qr: 'No encontramos el código QR en la foto. Acércate, evita reflejos o sube el PDF.',\n not_image: 'Ese archivo no es una foto que podamos leer. Toma otra foto o sube el PDF.',\n },\n summaryTitleOne: 'Revisa 1 campo para continuar',\n summaryTitleMany: 'Revisa {n} campos para continuar',\n },\n toggle: {\n label: 'Necesito factura (CFDI)',\n payDefault: 'Pagar',\n payAndInvoice: 'Pagar y facturar',\n profileTitle: 'Facturaremos con estos datos',\n change: 'Cambiar',\n useOther: 'Usar otros datos',\n useSaved: 'Usar mis datos guardados',\n manualTitle: 'Datos de facturación',\n unavailable: 'Esta tienda todavía no factura en línea.',\n privacy: 'Usamos estos datos solo para emitir tu factura.',\n fieldsOf: { taxId: 'RFC', legalName: 'Nombre o razón social', postalCode: 'Código postal fiscal', regime: 'Régimen', use: 'Uso' },\n },\n status: {\n title: 'Factura',\n request: 'Solicitar factura',\n requestHelp: '¿Necesitas factura de este pedido?',\n awaitingTitle: 'Esperando tu pago',\n awaitingBody: 'Cuando se acredite tu pago emitimos la factura. Con OXXO o transferencia puede tardar un poco.',\n processingTitle: 'Estamos generando tu factura',\n processingBody: 'Suele tardar menos de un minuto. Esta página se actualiza sola.',\n processingSlow: 'Sigue en proceso. Puedes cerrar esta página: tu factura aparecerá aquí cuando esté lista.',\n refresh: 'Actualizar',\n issuedTitle: 'Tu factura está lista',\n issuedBody: 'Descárgala cuando la necesites. Los enlaces vencen en 15 minutos; vuelve a abrir esta página para generar nuevos.',\n folio: 'Folio fiscal',\n pdf: 'Descargar PDF',\n xml: 'Descargar XML',\n needsDataTitle: 'Faltan datos para tu factura',\n needsDataBody: 'No pudimos emitirla con los datos que nos diste.',\n correct: 'Corregir y reintentar',\n reviewTitle: 'La tienda está revisando tu factura',\n reviewBody: 'Necesita una revisión del negocio. No tienes que hacer nada más; si tarda, escríbenos.',\n contact: 'Contactar a la tienda',\n contactBy: 'Escríbenos a {contact} con tu número de pedido.',\n windowTitle: 'Ya pasó el plazo para facturar',\n windowBody: 'Este pedido está fuera del plazo para pedir factura. Si necesitas ayuda, contacta a la tienda.',\n unavailableTitle: 'Factura no disponible',\n unavailableBody: 'Este pedido no se puede facturar por ahora. Si la necesitas, contacta a la tienda.',\n notEnabledTitle: 'Facturación aún no activa',\n notEnabledBody: 'La tienda todavía no tiene la facturación en línea activa. Si necesitas factura, contáctala.',\n unknownTitle: 'Factura',\n unknownBody: 'Por ahora no podemos mostrar el estado de la facturación de este pedido. Si necesitas factura, contacta a la tienda.',\n unreachableBody: 'No pudimos verificar la facturación en este momento. Inténtalo de nuevo en unos minutos o contacta a la tienda.',\n sandbox: 'Facturación en pruebas (sandbox): las facturas no tienen validez fiscal.',\n windowNote: 'Puedes pedirla hasta {days} días después de la compra.',\n cancelledTitle: 'Factura cancelada',\n cancelledBody: 'Esta factura fue cancelada. Si necesitas una nueva, contacta a la tienda.',\n reasons: {\n 'invoice.tax_id': 'El RFC no es válido.',\n 'invoice.legal_name': 'El nombre o la razón social no coincide con tu registro.',\n 'invoice.tax_regime': 'El régimen fiscal no es válido para tus datos.',\n 'invoice.postal_code': 'El código postal fiscal no es válido.',\n 'invoice.use': 'El uso de la factura no es válido con tu régimen.',\n default: 'Revisa tus datos fiscales y vuelve a intentarlo.',\n },\n },\n server: {\n errors: {\n validation: 'Revisa este campo.',\n required: 'Completa este campo.',\n invalid: 'El valor no es válido.',\n },\n },\n}\n\nconst EN: FiscalMessages = {\n fields: {\n legend: 'Tax details',\n taxId: 'Tax ID',\n taxIdHint: 'Uppercase, without spaces.',\n legalName: 'Legal name',\n legalNameHint: 'Write it as it appears in your tax registration.',\n postalCode: 'Tax postal code',\n postalCodeHint: 'The one of your tax address, which can differ from the delivery address.',\n regime: 'Tax regime',\n regimeHint: 'We only list the ones that apply to your kind of taxpayer.',\n regimeChoose: 'Choose your regime',\n regimeFromDocument: 'Your document lists more than one regime. Choose the one for this invoice.',\n use: 'Invoice use',\n useHint: 'We only list the uses your regime admits.',\n useChoose: 'Choose the use',\n fromDocument: 'From your {document}',\n suggested: 'Suggested',\n errors: {\n required: 'Fill in this field.',\n taxIdFormat: 'Check the format: not a valid {kind}.',\n postalFormat: 'Enter a valid postal code, like {example}.',\n unknown: 'Choose an option from the list.',\n personType: 'This regime does not match your kind of taxpayer.',\n useNotAllowed: 'This use is not available with the chosen regime.',\n },\n },\n reader: {\n title: 'Upload your {document}',\n dropHint: 'Drag the PDF here or tap to choose it',\n dropActive: 'Drop the file to read it',\n choose: 'Choose file',\n obtain: 'Get it here',\n privacyBrowser: 'We read it on your device. We do not keep the file, only the details you confirm.',\n privacyServer: 'We process it and discard it when done. We only keep the details you confirm.',\n uploadServer: 'Read my file',\n manual: 'Enter your details by hand',\n reading: 'Reading your {document}…',\n cancel: 'Cancel',\n done: 'Done. Review your details.',\n reviewTitle: 'Review your details',\n reviewHint: 'You can fix any field before continuing.',\n confirm: 'Use these details',\n changeFile: 'Upload another file',\n saveToAccount: 'Save to my account for next time',\n saveConsent: 'We will save these details to your account to invoice faster. You can delete them any time.',\n warnings: {\n qrMismatch: 'The QR code of your document does not match what we read. Check your tax ID and name carefully.',\n stale: 'Your document was issued {days} days ago. If something changed in your registration, download a new one.',\n regimeMissing: 'We could not detect your regime. Choose it from the list.',\n fieldsMissing: 'We did not find some details in the document. Fill them in to continue.',\n qrPartial: 'The QR code only gave us your tax ID. Fill in the rest or upload the PDF.',\n },\n scan: {\n title: 'Scan your {document}',\n photo: 'Take a photo of the QR',\n photoHint: 'Point at the QR code of your document.',\n camera: 'Scan with the camera',\n cameraTitle: 'Point at the QR code',\n cameraGuide: 'Center the QR code inside the frame.',\n cameraStarting: 'Opening the camera…',\n cameraRead: 'Code read',\n cameraDenied: 'We could not use the camera. Choose a photo or upload the PDF.',\n cameraUnavailable: 'This device does not allow the camera here. Choose a photo or upload the PDF.',\n closeCamera: 'Close the camera',\n choosePhoto: 'Choose a photo',\n open: 'Scan {document}',\n manual: 'Enter by hand',\n close: 'Close',\n },\n errors: {\n not_pdf: 'That file is not a PDF. Upload the PDF you downloaded or enter your details by hand.',\n too_large: 'The file is larger than {size}. Upload the original PDF or enter your details by hand.',\n no_text: 'This PDF looks like a scanned image and we cannot read it. Enter your details by hand.',\n password: 'This PDF is password protected and we cannot open it. Download it again without a password or enter your details by hand.',\n unreadable: 'We could not read this file. Try another one or enter your details by hand.',\n no_qr: 'We could not find the QR code in the photo. Move closer, avoid glare or upload the PDF.',\n not_image: 'That file is not a photo we can read. Take another photo or upload the PDF.',\n },\n summaryTitleOne: 'Check 1 field to continue',\n summaryTitleMany: 'Check {n} fields to continue',\n },\n toggle: {\n label: 'I need an invoice',\n payDefault: 'Pay',\n payAndInvoice: 'Pay and invoice',\n profileTitle: 'We will invoice with these details',\n change: 'Change',\n useOther: 'Use other details',\n useSaved: 'Use my saved details',\n manualTitle: 'Invoice details',\n unavailable: 'This store does not invoice online yet.',\n privacy: 'We only use these details to issue your invoice.',\n fieldsOf: { taxId: 'Tax ID', legalName: 'Legal name', postalCode: 'Tax postal code', regime: 'Regime', use: 'Use' },\n },\n status: {\n title: 'Invoice',\n request: 'Request invoice',\n requestHelp: 'Do you need an invoice for this order?',\n awaitingTitle: 'Waiting for your payment',\n awaitingBody: 'We issue the invoice once your payment clears. Cash and bank transfers can take a while.',\n processingTitle: 'We are generating your invoice',\n processingBody: 'It usually takes under a minute. This page updates by itself.',\n processingSlow: 'Still in progress. You can close this page: your invoice will show up here when it is ready.',\n refresh: 'Refresh',\n issuedTitle: 'Your invoice is ready',\n issuedBody: 'Download it whenever you need. The links expire in 15 minutes; reopen this page for new ones.',\n folio: 'Tax folio',\n pdf: 'Download PDF',\n xml: 'Download XML',\n needsDataTitle: 'Your invoice needs more details',\n needsDataBody: 'We could not issue it with the details you gave us.',\n correct: 'Fix and retry',\n reviewTitle: 'The store is reviewing your invoice',\n reviewBody: 'It needs a review by the business. You do not need to do anything else; if it takes long, write to us.',\n contact: 'Contact the store',\n contactBy: 'Write to {contact} with your order number.',\n windowTitle: 'The invoicing period has ended',\n windowBody: 'This order is outside the period to request an invoice. If you need help, contact the store.',\n unavailableTitle: 'Invoice not available',\n unavailableBody: 'This order cannot be invoiced right now. If you need one, contact the store.',\n notEnabledTitle: 'Invoicing not active yet',\n notEnabledBody: 'The store has not turned on online invoicing yet. If you need an invoice, contact them.',\n unknownTitle: 'Invoice',\n unknownBody: 'We cannot show the invoicing status of this order right now. If you need an invoice, contact the store.',\n unreachableBody: 'We could not check invoicing right now. Try again in a few minutes or contact the store.',\n sandbox: 'Invoicing in test mode (sandbox): invoices have no fiscal validity.',\n windowNote: 'You can request it up to {days} days after the purchase.',\n cancelledTitle: 'Invoice cancelled',\n cancelledBody: 'This invoice was cancelled. If you need a new one, contact the store.',\n reasons: {\n 'invoice.tax_id': 'The tax ID is not valid.',\n 'invoice.legal_name': 'The legal name does not match your registration.',\n 'invoice.tax_regime': 'The tax regime is not valid for your details.',\n 'invoice.postal_code': 'The tax postal code is not valid.',\n 'invoice.use': 'The invoice use is not valid with your regime.',\n default: 'Check your tax details and try again.',\n },\n },\n server: {\n errors: {\n validation: 'Check this field.',\n required: 'Fill in this field.',\n invalid: 'The value is not valid.',\n },\n },\n}\n\nconst merge = <T extends Record<string, unknown>>(base: T, over: DeepPartial<T> | undefined): T => {\n if (!over) return base\n const out: Record<string, unknown> = { ...base }\n for (const [k, v] of Object.entries(over)) {\n if (v === undefined) continue\n const b = base[k]\n out[k] = typeof v === 'object' && v !== null && !Array.isArray(v) && typeof b === 'object' && b !== null ? merge(b as Record<string, unknown>, v as DeepPartial<Record<string, unknown>>) : v\n }\n return out as T\n}\n\n/** Messages for a locale (`es*` default, `en*`), with optional overrides (merged level by level). */\nexport function fiscalMessages(locale?: string | null, overrides?: DeepPartial<FiscalMessages> | null): FiscalMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? merge(base, overrides) : base\n}\n\n/** `{name}` placeholders. */\nexport function fill(template: string, vars: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (m, k: string) => (k in vars ? String(vars[k]) : m))\n}\n","/**\n * The fiscal data of an invoice: tax id, legal name, tax postal code, regime and invoice use. Everything comes from the\n * region (`Region.fiscal_id`): the tax id's name and format, the regimes (narrowed by person type when the shop says how\n * to tell it), the uses (narrowed by the chosen regime) and the postal code format. Nothing here names a country.\n *\n * Plain HTML controls named `<prefix>.<field>` (default `invoice.tax_id`, `invoice.legal_name`...), so the fields work\n * inside any `<form>`, with or without JavaScript; with JavaScript the region's rules also run as the buyer types.\n */\nimport { useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { CheckoutField, type CheckoutFieldClassNames, type FieldErrors } from '../checkout/fields.js'\nimport { useResolvedLocale } from '../locale.js'\nimport { entryLabel, normalizeTaxId, personTypeResolver, regimesFor, suggestInvoiceUse, usesFor, validateFiscalValues, type FiscalProblem, type FiscalRegion } from './format.js'\nimport { fill, fiscalMessages, type DeepPartial, type FiscalMessages } from './messages.js'\nimport type { FiscalFieldName, FiscalFieldValues } from './types.js'\n\nexport type FiscalIdentityFieldsClassNames = CheckoutFieldClassNames & Partial<Record<'fieldset' | 'legend' | 'mark' | 'radios' | 'radio', string>>\n\nexport type FiscalIdentityFieldsProps = {\n region: FiscalRegion\n /** Initial values (and, when they change, the new values: e.g. after a document is read). */\n values?: Partial<FiscalFieldValues>\n onChange?: (values: FiscalFieldValues) => void\n /** Fields that were filled from a document: they get the \"From your {document}\" mark and stay editable. */\n fromDocument?: readonly FiscalFieldName[]\n /** Short noun of the document for the mark (\"constancia\"). Default: nothing specific (\"tu documento\"). */\n documentName?: string\n /** The document listed these regimes: show only them, as radios. */\n regimeCandidates?: readonly string[]\n /** Errors by control name (`invoice.tax_regime`), from the server or `useFieldErrors`. */\n errors?: FieldErrors\n namePrefix?: string\n /** Prefix of the control ids (default: generated). */\n idPrefix?: string\n /**\n * Overrides how a person type is told from a tax id (to narrow the regimes). Default: the region's own patterns\n * (`fiscal_id.person_patterns`); with neither, the regimes are not narrowed (the server still checks).\n */\n personTypeOf?: (taxId: string) => string | null\n /** The invoice use in `values` came from the region's suggestion (a document was read): it gets the \"Suggested\" mark. */\n suggestedUse?: string | null\n disabled?: boolean\n locale?: string\n messages?: DeepPartial<FiscalMessages>\n classNames?: FiscalIdentityFieldsClassNames\n /** Hides the fieldset legend (when the caller already has a heading). */\n hideLegend?: boolean\n}\n\nconst FIELDS: FiscalFieldName[] = ['tax_id', 'legal_name', 'postal_code', 'tax_regime', 'use']\nconst EMPTY: FiscalFieldValues = { tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '' }\n\nfunction problemText(m: FiscalMessages['fields'], region: FiscalRegion, field: FiscalFieldName, p: FiscalProblem): string {\n const e = m.errors\n switch (p) {\n case 'required':\n return e.required\n case 'format':\n return field === 'tax_id'\n ? fill(e.taxIdFormat, { kind: region.fiscal_id?.label ?? '' })\n : fill(e.postalFormat, { example: region.address?.postal_code?.example ?? '' })\n case 'person_type':\n return e.personType\n case 'use_not_allowed':\n return e.useNotAllowed\n default:\n return e.unknown\n }\n}\n\nexport function FiscalIdentityFields({\n region,\n values,\n onChange,\n fromDocument = [],\n documentName,\n regimeCandidates,\n errors = {},\n namePrefix = 'invoice',\n idPrefix,\n personTypeOf: personTypeOverride,\n suggestedUse,\n disabled,\n locale: localeProp,\n messages,\n classNames: cx = {},\n hideLegend,\n}: FiscalIdentityFieldsProps) {\n const locale = useResolvedLocale(localeProp)\n const all = fiscalMessages(locale, messages)\n const m = all.fields\n const fid = region.fiscal_id\n const reactId = useId()\n const base = idPrefix ?? `sf-fiscal-${reactId.replace(/:/g, '')}`\n const [v, setV] = useState<FiscalFieldValues>({ ...EMPTY, ...values })\n const [shown, setShown] = useState<ReadonlySet<FiscalFieldName>>(new Set())\n // The use the region suggested when the regime was chosen here (cleared as soon as the buyer picks one).\n const [autoUse, setAutoUse] = useState<string | null>(null)\n const personTypeOf = useMemo(() => personTypeResolver(region.fiscal_id, personTypeOverride), [region.fiscal_id, personTypeOverride])\n const root = useRef<HTMLFieldSetElement>(null)\n const valuesKey = JSON.stringify(values ?? null)\n const first = useRef(true)\n\n // New values from outside (a document was read): take them.\n useEffect(() => {\n if (first.current) {\n first.current = false\n return\n }\n setV({ ...EMPTY, ...values })\n setShown(new Set())\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valuesKey])\n\n const set = (patch: Partial<FiscalFieldValues>) => {\n const next = { ...v, ...patch }\n // A use the new regime does not admit is dropped, not silently kept.\n if (patch.tax_regime !== undefined && next.use && !usesFor(fid, next.tax_regime).some((u) => u.code === next.use)) next.use = ''\n // A regime was chosen and no use yet: the region's suggestion (if it has one) is preselected, marked and editable.\n if (patch.tax_regime !== undefined && !next.use) {\n const suggestion = suggestInvoiceUse(fid, next.tax_regime)\n if (suggestion) {\n next.use = suggestion\n setAutoUse(suggestion)\n } else setAutoUse(null)\n } else if (patch.use !== undefined) setAutoUse(null)\n setV(next)\n onChange?.(next)\n }\n\n const person = personTypeOf(v.tax_id)\n const taxIdOk = !validateFiscalValues(region, { tax_id: v.tax_id }, personTypeOf).tax_id\n const problems = useMemo(() => validateFiscalValues(region, v, personTypeOf), [region, v, personTypeOf])\n const candidates = regimeCandidates?.length ? regimeCandidates : null\n const regimes = useMemo(() => {\n const list = regimesFor(fid, taxIdOk ? person : null)\n if (candidates) return (fid?.regimes ?? []).filter((r) => candidates.includes(r.code))\n // Never hide the regime already chosen.\n return v.tax_regime && !list.some((r) => r.code === v.tax_regime) ? [...list, ...(fid?.regimes ?? []).filter((r) => r.code === v.tax_regime)] : list\n }, [fid, person, taxIdOk, candidates, v.tax_regime])\n const uses = useMemo(() => usesFor(fid, v.tax_regime), [fid, v.tax_regime])\n\n // Rules that block the submit (format, combination) are exposed to the browser's own validation.\n useEffect(() => {\n const el = root.current\n if (!el) return\n for (const f of FIELDS) {\n const ctl = el.querySelector<HTMLInputElement | HTMLSelectElement>(`[name=\"${namePrefix}.${f}\"]`)\n const p = problems[f]\n ctl?.setCustomValidity?.(p && p !== 'required' ? problemText(m, region, f, p) : '')\n }\n })\n\n const name = (f: FiscalFieldName) => `${namePrefix}.${f}`\n const err = (f: FiscalFieldName): string | null => {\n const external = errors[name(f)]\n if (external) return external\n const p = problems[f]\n return shown.has(f) && p && p !== 'required' ? problemText(m, region, f, p) : null\n }\n const touch = (f: FiscalFieldName) => {\n if (v[f] && !shown.has(f)) setShown((s) => new Set(s).add(f))\n }\n const doc = documentName ?? ''\n const mark = (f: FiscalFieldName): ReactNode =>\n fromDocument.includes(f) && (v[f] || (f === 'tax_regime' && candidates)) ? (\n <span className={cx.mark} data-sf-from-document>\n <span aria-hidden=\"true\">✓ </span>\n {fill(m.fromDocument, { document: doc || (locale.toLowerCase().startsWith('en') ? 'document' : 'documento') })}\n </span>\n ) : null\n const hint = (f: FiscalFieldName, text: string | undefined): ReactNode => {\n const mk = mark(f)\n if (!mk) return text\n return text ? (\n <>\n {mk} · {text}\n </>\n ) : (\n mk\n )\n }\n const postalExample = region.address?.postal_code?.example\n const numericPostal = !!postalExample && /^\\d+$/.test(postalExample)\n\n return (\n <fieldset ref={root} className={cx.fieldset} disabled={disabled} data-sf-fiscal-fields style={{ border: 0, padding: 0, margin: 0, minInlineSize: 0 }}>\n <legend className={cx.legend} hidden={hideLegend ? true : undefined} style={hideLegend ? undefined : { padding: 0 }}>\n {m.legend}\n </legend>\n <CheckoutField\n name={name('tax_id')}\n id={`${base}-tax_id`}\n label={fid?.label || m.taxId}\n hint={hint('tax_id', m.taxIdHint)}\n value={v.tax_id}\n onChange={(e) => set({ tax_id: normalizeTaxId(e.target.value) })}\n onBlur={() => touch('tax_id')}\n error={err('tax_id')}\n classNames={cx}\n autoComplete=\"off\"\n autoCapitalize=\"characters\"\n spellCheck={false}\n inputMode=\"text\"\n enterKeyHint=\"next\"\n maxLength={20}\n locale={locale}\n />\n <CheckoutField\n name={name('legal_name')}\n id={`${base}-legal_name`}\n label={m.legalName}\n hint={hint('legal_name', m.legalNameHint)}\n value={v.legal_name}\n onChange={(e) => set({ legal_name: e.target.value })}\n onBlur={() => touch('legal_name')}\n error={err('legal_name')}\n classNames={cx}\n autoComplete=\"organization\"\n enterKeyHint=\"next\"\n maxLength={254}\n locale={locale}\n />\n <CheckoutField\n name={name('postal_code')}\n id={`${base}-postal_code`}\n label={m.postalCode}\n hint={hint('postal_code', m.postalCodeHint)}\n value={v.postal_code}\n onChange={(e) => set({ postal_code: e.target.value.trim() })}\n onBlur={() => touch('postal_code')}\n error={err('postal_code')}\n classNames={cx}\n autoComplete=\"postal-code\"\n inputMode={numericPostal ? 'numeric' : 'text'}\n placeholder={postalExample}\n enterKeyHint=\"next\"\n maxLength={12}\n locale={locale}\n />\n {candidates ? (\n <fieldset className={cx.radios} data-sf-fiscal-regimes aria-describedby={err('tax_regime') ? `${base}-regime-error` : undefined} style={{ border: 0, padding: 0, margin: 0, minInlineSize: 0 }}>\n <legend className={cx.label} data-sf-label={m.regime}>\n {m.regime}\n </legend>\n <p className={cx.hint} data-sf-field-hint>\n {mark('tax_regime')} · {m.regimeFromDocument}\n </p>\n {regimes.map((r, i) => (\n <label key={r.code} className={cx.radio} data-sf-fiscal-radio>\n <input\n type=\"radio\"\n id={i === 0 ? `${base}-tax_regime` : undefined}\n name={name('tax_regime')}\n value={r.code}\n checked={v.tax_regime === r.code}\n required\n onChange={() => set({ tax_regime: r.code })}\n />\n <span>\n {entryLabel(r, locale)} <span data-sf-fiscal-code>({r.code})</span>\n </span>\n </label>\n ))}\n {err('tax_regime') ? (\n <p id={`${base}-regime-error`} className={cx.error} data-sf-field-error>\n {err('tax_regime')}\n </p>\n ) : null}\n </fieldset>\n ) : (\n <CheckoutField\n as=\"select\"\n name={name('tax_regime')}\n id={`${base}-tax_regime`}\n label={m.regime}\n hint={hint('tax_regime', m.regimeHint)}\n value={v.tax_regime}\n onChange={(e) => set({ tax_regime: e.target.value })}\n onBlur={() => touch('tax_regime')}\n error={err('tax_regime')}\n classNames={cx}\n locale={locale}\n >\n <option value=\"\">{m.regimeChoose}</option>\n {regimes.map((r) => (\n <option key={r.code} value={r.code}>\n {r.code} · {entryLabel(r, locale)}\n </option>\n ))}\n </CheckoutField>\n )}\n <CheckoutField\n as=\"select\"\n name={name('use')}\n id={`${base}-use`}\n label={m.use}\n hint={\n v.use && (v.use === autoUse || v.use === suggestedUse) ? (\n <>\n <span className={cx.mark} data-sf-suggested>\n {m.suggested}\n </span>{' '}\n · {m.useHint}\n </>\n ) : (\n m.useHint\n )\n }\n value={v.use}\n onChange={(e) => set({ use: e.target.value })}\n onBlur={() => touch('use')}\n error={err('use')}\n classNames={cx}\n locale={locale}\n >\n <option value=\"\">{m.useChoose}</option>\n {uses.map((u) => (\n <option key={u.code} value={u.code}>\n {u.code} · {entryLabel(u, locale)}\n </option>\n ))}\n </CheckoutField>\n </fieldset>\n )\n}\n","/** Turns what the engine read into what the UI shows. Shared by the browser reader and the server upload. */\nimport type { FiscalDocumentEvidence } from '@asteby/storefront'\nimport type { IdentityExtraction } from '@asteby/storefront/fiscal-document'\nimport { normalizeTaxId } from './format.js'\nimport type { FiscalExtractionSummary, FiscalFieldName } from './types.js'\n\nconst first = (v: string | string[] | undefined): string => (Array.isArray(v) ? (v[0] ?? '') : (v ?? ''))\n\n/** `evidence` comes from `buildDocumentEvidence`. Only the conventional fields are kept: nothing else can leak. */\nexport function summarizeExtraction(x: IdentityExtraction, evidence: FiscalDocumentEvidence, validRegimes?: Iterable<string>): FiscalExtractionSummary {\n const f = x.fields\n const valid = validRegimes ? new Set(validRegimes) : null\n const raw = f.tax_regime\n const candidates = (Array.isArray(raw) ? raw : raw ? [raw] : []).filter((c) => !valid || valid.has(c))\n const values: FiscalExtractionSummary['values'] = {}\n const from: FiscalFieldName[] = []\n const put = (name: FiscalFieldName, v: string) => {\n if (!v) return\n values[name] = v\n from.push(name)\n }\n put('tax_id', normalizeTaxId(first(f.tax_id)))\n put('legal_name', first(f.legal_name).trim())\n put('postal_code', first(f.postal_code).trim())\n if (candidates.length === 1) put('tax_regime', candidates[0]!)\n else if (candidates.length > 1) from.push('tax_regime')\n return {\n kind: x.kind,\n values,\n regime_candidates: candidates,\n from_document: from,\n qr_match: x.qr.match,\n stale: x.stale,\n age_days: x.age_days,\n missing: [...x.missing],\n evidence,\n }\n}\n","/**\n * Live QR reading with the device camera. Nothing is recorded or stored: the frames are read in memory by\n * `decodeImageQr` (loaded on demand, so a page that never opens the camera pays 0 bytes for it) and the stream is\n * stopped when the scanner closes, when the component unmounts or when the page is hidden.\n */\nimport { useCallback, useEffect, useRef, useState, type RefObject } from 'react'\n\nexport type CameraQrStatus =\n /** Not running. */\n | 'idle'\n /** Waiting for the permission or for the first frame. */\n | 'starting'\n | 'scanning'\n /** The buyer (or the browser) refused the camera. */\n | 'denied'\n /** No `getUserMedia` here (old browser, insecure page). */\n | 'unsupported'\n\nexport type UseCameraQrOptions = {\n /** Start (true) or stop (false) the camera. */\n active: boolean\n /** The QR text read. Called once; the camera stops right after. */\n onCode: (text: string) => void\n /** Milliseconds between two reading attempts (default 250). */\n intervalMs?: number\n}\n\nexport type UseCameraQr = {\n videoRef: RefObject<HTMLVideoElement | null>\n status: CameraQrStatus\n /** Stops the stream now. */\n stop: () => void\n}\n\ntype MediaDevicesLike = { getUserMedia(c: unknown): Promise<MediaStream> }\n\nexport function cameraSupported(): boolean {\n return typeof navigator !== 'undefined' && typeof (navigator as { mediaDevices?: MediaDevicesLike }).mediaDevices?.getUserMedia === 'function'\n}\n\nexport function useCameraQr({ active, onCode, intervalMs = 250 }: UseCameraQrOptions): UseCameraQr {\n const videoRef = useRef<HTMLVideoElement | null>(null)\n const [status, setStatus] = useState<CameraQrStatus>('idle')\n const streamRef = useRef<MediaStream | null>(null)\n const onCodeRef = useRef(onCode)\n onCodeRef.current = onCode\n\n const stop = useCallback(() => {\n for (const track of streamRef.current?.getTracks() ?? []) track.stop()\n streamRef.current = null\n const v = videoRef.current\n if (v) v.srcObject = null\n setStatus((s) => (s === 'denied' || s === 'unsupported' ? s : 'idle'))\n }, [])\n\n useEffect(() => {\n if (!active) return\n if (!cameraSupported()) {\n setStatus('unsupported')\n return\n }\n let cancelled = false\n let timer: ReturnType<typeof setInterval> | undefined\n let busy = false\n setStatus('starting')\n\n const onHidden = () => {\n if (document.visibilityState === 'hidden') stop()\n }\n document.addEventListener('visibilitychange', onHidden)\n\n ;(async () => {\n let stream: MediaStream\n try {\n stream = await (navigator as unknown as { mediaDevices: MediaDevicesLike }).mediaDevices.getUserMedia({ video: { facingMode: { ideal: 'environment' } }, audio: false })\n } catch {\n if (!cancelled) setStatus('denied')\n return\n }\n if (cancelled) {\n for (const t of stream.getTracks()) t.stop()\n return\n }\n streamRef.current = stream\n const video = videoRef.current\n if (!video) {\n for (const t of stream.getTracks()) t.stop()\n streamRef.current = null\n return\n }\n video.srcObject = stream\n video.muted = true\n void video.play?.().catch(() => undefined)\n setStatus('scanning')\n const eng = await import('@asteby/storefront/fiscal-document')\n timer = setInterval(async () => {\n if (busy || cancelled || !videoRef.current || videoRef.current.readyState < 2) return\n busy = true\n try {\n const text = await eng.decodeImageQr(videoRef.current)\n if (text && !cancelled) {\n cancelled = true\n clearInterval(timer)\n stop()\n onCodeRef.current(text)\n }\n } catch {\n /* a frame that cannot be read is not an error: the next one may */\n } finally {\n busy = false\n }\n }, intervalMs)\n })()\n\n return () => {\n cancelled = true\n if (timer) clearInterval(timer)\n document.removeEventListener('visibilitychange', onHidden)\n for (const t of streamRef.current?.getTracks() ?? []) t.stop()\n streamRef.current = null\n if (videoRef.current) videoRef.current.srcObject = null\n }\n }, [active, intervalMs, stop])\n\n return { videoRef, status, stop }\n}\n","/**\n * \"Upload your tax document\" flow: the buyer drops the PDF the tax authority gave them, we read it ON THEIR DEVICE\n * (pdf.js is loaded only when a file is chosen, never in the main bundle), they review the prefilled fields and confirm.\n * The file is never uploaded or kept; only the fields the buyer confirms leave, plus minimal evidence of where they came\n * from (`buildDocumentEvidence`). Fields the region lists in `discard_fields` (ids, street...) are never shown or kept.\n *\n * Without JavaScript the same control posts the file to the shop's action (`createInvoiceAction`, intent\n * `extract-document`), which reads it in memory, discards it and sends back `data` to review.\n *\n * When the region lets a PHOTO of the document be read (`image_mode`: `qr_only` | `full`) the buyer can also take a\n * picture of its QR or scan it live with the camera. A QR carries only the tax id and the id of the document: the\n * rest is asked for (or the PDF is uploaded). The image and the camera frames never leave the device.\n *\n * Everything country-specific is the region's `IdentityDocumentSpec`: label, where to get it, accepted types, size,\n * rules, freshness. The component only knows \"a document with fiscal data\".\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type DragEvent, type ReactNode } from 'react'\nimport type { FiscalDocumentEvidence, IdentityDocumentSpec } from '@asteby/storefront'\nimport { ErrorSummary, type ErrorSummaryItem, type FieldErrors } from '../checkout/fields.js'\nimport { useResolvedLocale } from '../locale.js'\nimport { summarizeExtraction } from './extraction.js'\nimport { personTypeResolver, suggestInvoiceUse, validateFiscalValues, type FiscalRegion } from './format.js'\nimport { FiscalIdentityFields, type FiscalIdentityFieldsClassNames } from './identity-fields.js'\nimport { fill, fiscalMessages, type DeepPartial, type FiscalMessages } from './messages.js'\nimport { cameraSupported, useCameraQr } from './use-camera-qr.js'\nimport type { FiscalActionData, FiscalExtractionSummary, FiscalFieldName, FiscalFieldValues, FiscalReadError } from './types.js'\n\nexport type FiscalReaderResult = {\n values: FiscalFieldValues\n /** Where the data came from; `null` when the buyer typed everything. */\n evidence: FiscalDocumentEvidence | null\n /** The buyer asked to save the data to their account (`canSave`). */\n save: boolean\n}\n\nexport type IdentityDocumentReaderClassNames = FiscalIdentityFieldsClassNames &\n Partial<Record<'root' | 'zone' | 'zoneActive' | 'button' | 'link' | 'privacy' | 'status' | 'error' | 'warning' | 'notice' | 'actions' | 'primary' | 'secondary' | 'summary', string>>\n\nexport type IdentityDocumentReaderProps = {\n region: FiscalRegion\n /** The document to read. Default: the first of `region.fiscal_id.documents`. */\n document?: IdentityDocumentSpec\n /**\n * URL of the pdf.js worker (`pdf.worker.mjs` from `pdfjs-dist/legacy/build`) that YOUR site serves. There is no\n * default and no CDN: without it the browser cannot read the file and the buyer is sent to manual entry.\n */\n workerSrc?: string\n /** The buyer confirmed the reviewed data. */\n onConfirm: (result: FiscalReaderResult) => void\n /** The buyer chose to type their data. Default: the review form opens empty. */\n onManual?: () => void\n /** Values to start the review with (e.g. a saved profile). */\n initialValues?: Partial<FiscalFieldValues>\n /** Result of the server (no-JS upload): when it carries an `extraction` or an error, it is shown. */\n data?: FiscalActionData | null\n /** The shop has a signed-in buyer: offer \"Save to my account\". */\n canSave?: boolean\n /** Enables the no-JS upload (a button that posts the file to the action with `intent=extract-document`). */\n serverUpload?: boolean\n /** Short noun of the document for texts (\"constancia\"). Default: the spec's label in lowercase. */\n documentName?: string\n personTypeOf?: (taxId: string) => string | null\n /** Clock for tests. */\n now?: () => Date\n namePrefix?: string\n locale?: string\n messages?: DeepPartial<FiscalMessages>\n classNames?: IdentityDocumentReaderClassNames\n /** Label of the confirm button. */\n confirmLabel?: ReactNode\n}\n\ntype Phase =\n | { kind: 'idle' }\n | { kind: 'reading'; fileName: string }\n | { kind: 'camera' }\n | { kind: 'review'; extraction: FiscalExtractionSummary | null; revision: number }\n | { kind: 'error'; code: FiscalReadError; sizeLimit?: number }\n\nconst isPdf = (f: File, accept: string[]) => {\n const okType = f.type ? accept.some((a) => a === f.type) || f.type === 'application/pdf' : false\n return okType || /\\.pdf$/i.test(f.name)\n}\n\nconst isImage = (f: File) => f.type.startsWith('image/') || /\\.(jpe?g|png|webp|heic|heif)$/i.test(f.name)\n\nconst mib = (bytes: number) => `${Math.round((bytes / (1024 * 1024)) * 10) / 10} MB`\n\nexport function IdentityDocumentReader(props: IdentityDocumentReaderProps) {\n const { region, workerSrc, onConfirm, onManual, initialValues, data, canSave, serverUpload, personTypeOf, now, namePrefix = 'invoice', messages, classNames: cx = {}, confirmLabel } = props\n const locale = useResolvedLocale(props.locale)\n const all = fiscalMessages(locale, messages)\n const m = all.reader\n const spec = props.document ?? region.fiscal_id?.documents?.[0]\n const reactId = useId().replace(/:/g, '')\n const inputId = `sf-reader-${reactId}-file`\n const helpId = `sf-reader-${reactId}-help`\n const documentName = props.documentName ?? (spec?.label ?? 'document').toLowerCase()\n\n const fromServer = data?.extraction ?? null\n const serverError = data && !data.ok && data.error && ['not_pdf', 'too_large', 'no_text', 'password', 'unreadable'].includes(data.error.code) ? (data.error.code as FiscalReadError) : null\n const [phase, setPhase] = useState<Phase>(() =>\n fromServer ? { kind: 'review', extraction: fromServer, revision: 0 } : serverError ? { kind: 'error', code: serverError, sizeLimit: spec?.max_bytes } : { kind: 'idle' },\n )\n const [dragging, setDragging] = useState(false)\n const [live, setLive] = useState('')\n const [values, setValues] = useState<FiscalFieldValues>({ tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '', ...initialValues, ...(fromServer?.values ?? {}) })\n const [save, setSave] = useState(false)\n const [summary, setSummary] = useState<ErrorSummaryItem[] | null>(null)\n const [summaryKey, setSummaryKey] = useState(0)\n const [hydrated, setHydrated] = useState(false)\n const abort = useRef<AbortController | null>(null)\n const fileInput = useRef<HTMLInputElement>(null)\n const errorRef = useRef<HTMLDivElement>(null)\n const reviewRef = useRef<HTMLHeadingElement>(null)\n\n useEffect(() => setHydrated(true), [])\n useEffect(() => () => abort.current?.abort(), [])\n // A new answer from the server (the buyer posted a file without JS and the page came back).\n useEffect(() => {\n if (!fromServer) return\n setValues((cur) => {\n const next = { ...cur, ...fromServer.values }\n const suggestion = next.tax_regime && !next.use ? suggestInvoiceUse(region.fiscal_id, next.tax_regime) : null\n if (suggestion) {\n next.use = suggestion\n setSuggestedUse(suggestion)\n }\n return next\n })\n setPhase({ kind: 'review', extraction: fromServer, revision: 1 })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromServer])\n useEffect(() => {\n if (phase.kind === 'error') errorRef.current?.focus()\n if (phase.kind === 'review' && phase.revision > 0) reviewRef.current?.focus()\n }, [phase])\n\n // The file picker takes the document's files (PDF); photos have their own control (`image_mode`).\n const accept = useMemo(() => {\n const files = (spec?.accept ?? []).filter((a) => !a.startsWith('image/'))\n return files.length ? files.join(',') : 'application/pdf'\n }, [spec])\n const imageMode = spec?.image_mode && spec.image_mode !== 'none' ? spec.image_mode : null\n const photoInput = useRef<HTMLInputElement>(null)\n const [suggestedUse, setSuggestedUse] = useState<string | null>(null)\n const cameraActive = phase.kind === 'camera' \n const fieldErrors: FieldErrors = useMemo(() => {\n const out: FieldErrors = {}\n for (const [k, v] of Object.entries(data?.fieldErrors ?? {})) out[k] = all.server.errors[v] ?? v\n return out\n }, [data, all.server.errors])\n\n const cancel = useCallback(() => {\n abort.current?.abort()\n abort.current = null\n setPhase({ kind: 'idle' })\n setLive('')\n }, [])\n\n const openManual = useCallback(() => {\n onManual?.()\n setPhase({ kind: 'review', extraction: null, revision: 1 })\n setLive('')\n }, [onManual])\n\n /** Puts what the engine read (a PDF, or only a QR) in the form, with the region's suggested use when it has one. */\n const showExtraction = useCallback(\n (sum: FiscalExtractionSummary) => {\n const base = { tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '', ...sum.values }\n const suggestion = base.tax_regime ? suggestInvoiceUse(region.fiscal_id, base.tax_regime) : null\n if (suggestion && !base.use) base.use = suggestion\n setSuggestedUse(suggestion && base.use === suggestion ? suggestion : null)\n setValues(base)\n setSummary(null)\n setPhase({ kind: 'review', extraction: sum, revision: 1 })\n setLive(m.done)\n },\n [region.fiscal_id, m.done],\n )\n\n /** The text of a QR (a photo, or a live frame) -> the fields it carries. Never blocks: no tax id means \"no QR of this document\". */\n const readQr = useCallback(\n async (text: string | null) => {\n if (!spec) return\n if (!text) return setPhase({ kind: 'error', code: 'no_qr' })\n const eng = await import('@asteby/storefront/fiscal-document')\n const x = eng.extractIdentityDocument('', spec, {\n catalogs: region.fiscal_id ? eng.catalogsFromRegion(region.fiscal_id) : {},\n qr: text,\n ...(now ? { now: now() } : {}),\n })\n if (!x.fields.tax_id) return setPhase({ kind: 'error', code: 'no_qr' })\n const evidence = eng.buildDocumentEvidence(x, { sha256: null, source: 'qr' })\n showExtraction(summarizeExtraction(x, evidence, region.fiscal_id?.regimes.map((r) => r.code)))\n },\n [spec, region, now, showExtraction],\n )\n\n const readImage = useCallback(\n async (file: File) => {\n if (!spec) return\n if (file.size > spec.max_bytes) return setPhase({ kind: 'error', code: 'too_large', sizeLimit: spec.max_bytes })\n const ctl = new AbortController()\n abort.current = ctl\n setPhase({ kind: 'reading', fileName: file.name })\n setLive(fill(m.reading, { document: documentName }))\n try {\n const eng = await import('@asteby/storefront/fiscal-document')\n const text = await eng.decodeImageQr(file, { maxBytes: spec.max_bytes, signal: ctl.signal })\n if (ctl.signal.aborted) return\n await readQr(text)\n } catch (err) {\n if (ctl.signal.aborted) return\n const code = (err as { code?: string } | null)?.code\n setLive('')\n setPhase({ kind: 'error', code: code === 'too_large' ? 'too_large' : code === 'not_image' ? 'not_image' : 'unreadable', sizeLimit: spec.max_bytes })\n } finally {\n if (abort.current === ctl) abort.current = null\n if (photoInput.current) photoInput.current.value = ''\n }\n },\n [spec, documentName, m.reading, readQr],\n )\n\n const camera = useCameraQr({\n active: cameraActive,\n onCode: (text) => {\n // \"Code read. Review your details\": one announcement for the camera path (the review has its own focus).\n void readQr(text)\n .then(() => setLive(`${m.scan.cameraRead}. ${m.done}`))\n .catch(() => setPhase({ kind: 'error', code: 'unreadable' }))\n },\n })\n\n const read = useCallback(\n async (file: File) => {\n if (!spec) return\n if (imageMode && isImage(file)) return readImage(file)\n if (!isPdf(file, spec.accept ?? [])) return setPhase({ kind: 'error', code: 'not_pdf' })\n if (file.size > spec.max_bytes) return setPhase({ kind: 'error', code: 'too_large', sizeLimit: spec.max_bytes })\n const ctl = new AbortController()\n abort.current = ctl\n setPhase({ kind: 'reading', fileName: file.name })\n setLive(fill(m.reading, { document: documentName }))\n try {\n // On demand: pdf.js is not in the main bundle, it loads here.\n const eng = await import('@asteby/storefront/fiscal-document')\n const { text, sha256 } = await eng.readPdfText(file, {\n maxBytes: spec.max_bytes,\n ...(spec.max_pages ? { maxPages: spec.max_pages } : {}),\n ...(workerSrc ? { workerSrc } : {}),\n signal: ctl.signal,\n })\n if (ctl.signal.aborted) return\n // The QR is a best-effort cross-check; it never blocks.\n const qr = await eng.decodePdfQr(file, { ...(workerSrc ? { workerSrc } : {}), signal: ctl.signal }).catch(() => null)\n if (ctl.signal.aborted) return\n const x = eng.extractIdentityDocument(text, spec, {\n catalogs: region.fiscal_id ? eng.catalogsFromRegion(region.fiscal_id) : {},\n qr,\n ...(now ? { now: now() } : {}),\n })\n const evidence = eng.buildDocumentEvidence(x, { sha256, source: 'pdf_client' })\n const sum = summarizeExtraction(x, evidence, region.fiscal_id?.regimes.map((r) => r.code))\n showExtraction(sum)\n } catch (err) {\n if (ctl.signal.aborted) return\n const code = (err as { code?: string } | null)?.code\n setLive('')\n setPhase({\n kind: 'error',\n code: code === 'not_pdf' || code === 'too_large' || code === 'no_text' || code === 'password' ? code : 'unreadable',\n sizeLimit: spec.max_bytes,\n })\n } finally {\n if (abort.current === ctl) abort.current = null\n if (fileInput.current) fileInput.current.value = ''\n }\n },\n [spec, workerSrc, region, now, documentName, m.reading, imageMode, readImage, showExtraction],\n )\n\n if (!spec) return null\n\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n setDragging(false)\n const f = e.dataTransfer?.files?.[0]\n if (f) void read(f)\n }\n\n const confirm = () => {\n const problems = validateFiscalValues(region, values, personTypeResolver(region.fiscal_id, personTypeOf))\n const keys = Object.keys(problems) as FiscalFieldName[]\n if (keys.length) {\n const labels: Record<FiscalFieldName, string> = {\n tax_id: region.fiscal_id?.label || all.fields.taxId,\n legal_name: all.fields.legalName,\n postal_code: all.fields.postalCode,\n tax_regime: all.fields.regime,\n use: all.fields.use,\n }\n const item = (f: FiscalFieldName): ErrorSummaryItem => {\n const p = problems[f]!\n const msg =\n p === 'required'\n ? all.fields.errors.required\n : p === 'format'\n ? f === 'tax_id'\n ? fill(all.fields.errors.taxIdFormat, { kind: region.fiscal_id?.label ?? '' })\n : fill(all.fields.errors.postalFormat, { example: region.address?.postal_code?.example ?? '' })\n : p === 'person_type'\n ? all.fields.errors.personType\n : p === 'use_not_allowed'\n ? all.fields.errors.useNotAllowed\n : all.fields.errors.unknown\n return { name: `${namePrefix}.${f}`, id: `sf-reader-${reactId}-${f}`, label: labels[f], message: msg }\n }\n setSummary(keys.map(item))\n setSummaryKey((k) => k + 1)\n return\n }\n setSummary(null)\n const ev = phase.kind === 'review' ? (phase.extraction?.evidence ?? null) : null\n onConfirm({ values, evidence: ev, save: !!canSave && save })\n }\n\n const errorsByName: FieldErrors = { ...fieldErrors }\n for (const s of summary ?? []) errorsByName[s.name] = s.message\n\n // ---- views ------------------------------------------------------------------------------------------------------\n const privacy = serverUpload && !hydrated ? m.privacyServer : m.privacyBrowser\n\n const idle = (\n <div className={cx.root} data-sf-reader data-state=\"idle\">\n <h3 data-sf-reader-title>{fill(m.title, { document: documentName })}</h3>\n {spec.help ? <p data-sf-reader-help>{spec.help}</p> : null}\n <label\n htmlFor={inputId}\n className={dragging ? cx.zoneActive : cx.zone}\n data-sf-reader-zone\n data-dragging={dragging ? '' : undefined}\n onDragOver={(e) => {\n e.preventDefault()\n setDragging(true)\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n >\n <span aria-hidden=\"true\" data-sf-reader-icon>\n ⬆\n </span>\n <span data-sf-reader-drop>{dragging ? m.dropActive : m.dropHint}</span>\n <span data-sf-reader-choose>{m.choose}</span>\n <input\n ref={fileInput}\n id={inputId}\n type=\"file\"\n // With JavaScript the file never travels with the form; the name only exists for the no-JS upload.\n name={serverUpload && !hydrated ? 'document' : undefined}\n accept={accept}\n aria-describedby={helpId}\n data-sf-reader-input\n onChange={(e) => {\n const f = e.target.files?.[0]\n if (f) void read(f)\n }}\n />\n </label>\n {imageMode ? (\n <div className={cx.actions} data-sf-reader-scan>\n <input\n ref={photoInput}\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n hidden\n tabIndex={-1}\n aria-label={m.scan.photo}\n data-sf-reader-photo-input\n onChange={(e) => {\n const f = e.target.files?.[0]\n if (f) void readImage(f)\n }}\n />\n <button type=\"button\" className={cx.secondary} onClick={() => photoInput.current?.click()} data-sf-reader-photo>\n {m.scan.photo}\n </button>\n {hydrated && cameraSupported() ? (\n <button type=\"button\" className={cx.secondary} onClick={() => setPhase({ kind: 'camera' })} data-sf-reader-camera>\n {m.scan.camera}\n </button>\n ) : null}\n </div>\n ) : null}\n <p id={helpId} className={cx.privacy} data-sf-reader-privacy>\n {privacy}\n </p>\n {serverUpload ? (\n <noscript>\n <button type=\"submit\" name=\"intent\" value=\"extract-document\" formEncType=\"multipart/form-data\" formMethod=\"post\" formNoValidate className={cx.secondary} data-sf-reader-upload>\n {m.uploadServer}\n </button>\n </noscript>\n ) : null}\n <p data-sf-reader-links>\n {spec.obtain_url ? (\n <a href={spec.obtain_url} target=\"_blank\" rel=\"noopener noreferrer\" className={cx.link} data-sf-reader-obtain>\n {m.obtain}\n </a>\n ) : null}\n <button type=\"button\" className={cx.link} onClick={openManual} data-sf-reader-manual>\n {m.manual}\n </button>\n </p>\n </div>\n )\n\n const reading = phase.kind === 'reading' && (\n <div className={cx.root} data-sf-reader data-state=\"reading\">\n <p className={cx.status} data-sf-reader-reading>\n <span aria-hidden=\"true\" data-sf-reader-spinner />\n {fill(m.reading, { document: documentName })} <span data-sf-reader-file>{phase.fileName}</span>\n </p>\n <button type=\"button\" className={cx.secondary} onClick={cancel} data-sf-reader-cancel>\n {m.cancel}\n </button>\n </div>\n )\n\n const cameraView = phase.kind === 'camera' && (\n <div className={cx.root} data-sf-reader data-state=\"camera\">\n <h3 data-sf-reader-title>{m.scan.cameraTitle}</h3>\n <div data-sf-reader-viewfinder>\n {/* The stream is shown, never recorded; it stops when this view closes. */}\n <video ref={camera.videoRef} playsInline muted aria-label={m.scan.cameraGuide} data-sf-reader-video />\n <span aria-hidden=\"true\" data-sf-reader-frame />\n </div>\n <p className={cx.status} data-sf-reader-camera-status={camera.status}>\n {camera.status === 'denied'\n ? m.scan.cameraDenied\n : camera.status === 'unsupported'\n ? m.scan.cameraUnavailable\n : camera.status === 'starting'\n ? m.scan.cameraStarting\n : m.scan.cameraGuide}\n </p>\n <p className={cx.privacy} data-sf-reader-privacy>\n {privacy}\n </p>\n <div className={cx.actions} data-sf-reader-actions>\n <button type=\"button\" className={cx.secondary} onClick={() => photoInput.current?.click()} data-sf-reader-photo>\n {m.scan.choosePhoto}\n </button>\n <button\n type=\"button\"\n className={cx.primary}\n onClick={() => {\n camera.stop()\n setPhase({ kind: 'idle' })\n }}\n data-sf-reader-camera-close\n >\n {m.scan.closeCamera}\n </button>\n </div>\n <input\n ref={photoInput}\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n hidden\n tabIndex={-1}\n aria-label={m.scan.choosePhoto}\n data-sf-reader-photo-input\n onChange={(e) => {\n const f = e.target.files?.[0]\n if (f) void readImage(f)\n }}\n />\n </div>\n )\n\n const errored = phase.kind === 'error' && (\n <div className={cx.root} data-sf-reader data-state=\"error\">\n <div ref={errorRef} role=\"alert\" tabIndex={-1} className={cx.error} data-sf-reader-error={phase.code}>\n {fill(m.errors[phase.code], { size: mib(phase.sizeLimit ?? spec.max_bytes) })}\n </div>\n <div className={cx.actions} data-sf-reader-actions>\n <button type=\"button\" className={cx.primary} onClick={openManual} data-sf-reader-manual>\n {m.manual}\n </button>\n <button type=\"button\" className={cx.secondary} onClick={() => setPhase({ kind: 'idle' })} data-sf-reader-retry>\n {m.changeFile}\n </button>\n </div>\n </div>\n )\n\n const review = phase.kind === 'review' && (\n <div className={cx.root} data-sf-reader data-state=\"review\">\n <h3 ref={reviewRef} tabIndex={-1} data-sf-reader-title>\n {m.reviewTitle}\n </h3>\n <p data-sf-reader-help>{m.reviewHint}</p>\n <ErrorSummary\n items={summary}\n focusKey={summaryKey}\n locale={locale}\n title={summary ? (summary.length === 1 ? m.summaryTitleOne : fill(m.summaryTitleMany, { n: summary.length })) : undefined}\n />\n {phase.extraction ? <Warnings x={phase.extraction} m={m} cx={cx} /> : null}\n <FiscalIdentityFields\n region={region}\n values={values}\n onChange={setValues}\n errors={errorsByName}\n idPrefix={`sf-reader-${reactId}`}\n namePrefix={namePrefix}\n fromDocument={phase.extraction?.from_document ?? []}\n documentName={documentName}\n regimeCandidates={phase.extraction && phase.extraction.regime_candidates.length > 1 ? phase.extraction.regime_candidates : undefined}\n suggestedUse={suggestedUse}\n {...(personTypeOf ? { personTypeOf } : {})}\n locale={locale}\n {...(messages ? { messages } : {})}\n classNames={cx}\n hideLegend\n />\n {phase.extraction?.evidence ? <input type=\"hidden\" name={`${namePrefix}.document`} value={JSON.stringify(phase.extraction.evidence)} /> : null}\n {canSave ? (\n <label data-sf-reader-save>\n <input type=\"checkbox\" name={`${namePrefix}.save`} checked={save} onChange={(e) => setSave(e.target.checked)} />\n <span>\n {m.saveToAccount}\n <span data-sf-field-hint> {m.saveConsent}</span>\n </span>\n </label>\n ) : null}\n <div className={cx.actions} data-sf-reader-actions>\n <button type=\"button\" className={cx.primary} onClick={confirm} data-sf-reader-confirm>\n {confirmLabel ?? m.confirm}\n </button>\n <button type=\"button\" className={cx.secondary} onClick={() => setPhase({ kind: 'idle' })} data-sf-reader-retry>\n {m.changeFile}\n </button>\n </div>\n </div>\n )\n\n return (\n <div data-sf-document-reader>\n {/* Always mounted so assistive tech announces every change (reading, done). */}\n <div role=\"status\" aria-live=\"polite\" className={cx.status} data-sf-reader-live style={visuallyHidden}>\n {live}\n </div>\n {phase.kind === 'idle' ? idle : null}\n {reading || null}\n {cameraView || null}\n {errored || null}\n {review || null}\n </div>\n )\n}\n\nconst visuallyHidden = { position: 'absolute', width: 1, height: 1, margin: -1, padding: 0, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap', border: 0 } as const\n\nfunction Warnings({ x, m, cx }: { x: FiscalExtractionSummary; m: FiscalMessages['reader']; cx: IdentityDocumentReaderClassNames }) {\n const items: string[] = []\n if (x.qr_match === false) items.push(m.warnings.qrMismatch)\n if (x.stale === true && x.age_days !== null) items.push(fill(m.warnings.stale, { days: x.age_days }))\n if (x.evidence.source === 'qr') items.push(m.warnings.qrPartial)\n else if (x.regime_candidates.length === 0 && !x.values.tax_regime) items.push(m.warnings.regimeMissing)\n else if (x.missing.some((k) => k !== 'tax_regime' && k !== 'document_id' && k !== 'issued_on')) items.push(m.warnings.fieldsMissing)\n if (!items.length) return null\n return (\n <ul className={cx.warning} data-sf-reader-warnings>\n {items.map((t) => (\n <li key={t} data-sf-reader-warning>\n <span aria-hidden=\"true\">⚠ </span>\n {t}\n </li>\n ))}\n </ul>\n )\n}\n","import { useCallback, useEffect, useRef, type RefObject } from 'react'\n\nexport type DialogCloseReason = 'esc' | 'x' | 'backdrop' | 'action'\n\ntype UseModalDialogOptions = {\n open: boolean\n /** Called for Esc and backdrop clicks. The owner decides whether to close. */\n onClose: (reason: DialogCloseReason) => void\n /** Element focused when the dialog opens. Default: the element marked `data-sf-autofocus`, else the dialog itself. */\n initialFocus?: RefObject<HTMLElement | null>\n}\n\n/**\n * Native `<dialog>` wiring: `showModal()` (focus trap and inert background come from the browser),\n * Esc and backdrop clicks routed to `onClose`, and focus restored to the opener on close.\n * Falls back to the `open` attribute where `showModal` does not exist (old browsers, some test DOMs)\n * with an Esc key handler.\n */\nexport function useModalDialog({ open, onClose, initialFocus }: UseModalDialogOptions) {\n const ref = useRef<HTMLDialogElement | null>(null)\n const opener = useRef<Element | null>(null)\n const onCloseRef = useRef(onClose)\n onCloseRef.current = onClose\n\n useEffect(() => {\n const el = ref.current\n if (!el || !open) return\n opener.current = typeof document !== 'undefined' ? document.activeElement : null\n const hasModal = typeof el.showModal === 'function'\n if (!el.open) {\n if (hasModal) {\n try {\n el.showModal()\n } catch {\n el.setAttribute('open', '')\n }\n } else el.setAttribute('open', '')\n }\n const target = initialFocus?.current ?? el.querySelector<HTMLElement>('[data-sf-autofocus]') ?? el\n if (!target.hasAttribute('tabindex') && target === el) el.setAttribute('tabindex', '-1')\n target.focus({ preventScroll: true })\n\n const onCancel = (e: Event) => {\n e.preventDefault() // we close through state so the owner can navigate/track first\n onCloseRef.current('esc')\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n onCloseRef.current('esc')\n }\n }\n el.addEventListener('cancel', onCancel)\n if (!hasModal) el.addEventListener('keydown', onKey)\n return () => {\n el.removeEventListener('cancel', onCancel)\n el.removeEventListener('keydown', onKey)\n if (el.open) {\n if (typeof el.close === 'function') {\n try {\n el.close()\n } catch {\n el.removeAttribute('open')\n }\n } else el.removeAttribute('open')\n }\n const back = opener.current\n if (back instanceof HTMLElement && back.isConnected) back.focus({ preventScroll: true })\n }\n }, [open])\n\n /** Click on the backdrop (the dialog element itself, outside its content box). */\n const onBackdropClick = useCallback((e: { target: EventTarget; currentTarget: EventTarget }) => {\n if (e.target === e.currentTarget) onCloseRef.current('backdrop')\n }, [])\n\n return { ref, onBackdropClick }\n}\n\n/** `prefers-reduced-motion: reduce`, read after hydration (false on the server). */\nexport function prefersReducedMotion(): boolean {\n try {\n return typeof window !== 'undefined' && !!window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n } catch {\n return false\n }\n}\n","/**\n * \"Scan your tax document\": the entry point of the invoice flows (request an invoice, checkout, add a fiscal profile).\n * A primary button that names the region's document (`IdentityDocumentSpec.label`: another country says its own\n * document) and, under it, \"Enter by hand\". The button opens a bottom sheet with the `IdentityDocumentReader`: choose\n * the PDF, take a photo of the QR or scan it live, review, confirm.\n *\n * Degradation: when the region publishes no document the component renders nothing (the caller shows the plain form).\n * The file, the photo and the camera frames are read on the device and never uploaded (see the reader).\n */\nimport { useId, useRef, useState, type ReactNode } from 'react'\nimport { useModalDialog } from '../dialog.js'\nimport { useResolvedLocale } from '../locale.js'\nimport { IdentityDocumentReader, type FiscalReaderResult, type IdentityDocumentReaderProps } from './document-reader.js'\nimport { fill, fiscalMessages } from './messages.js'\n\nexport type ScanTaxDocumentClassNames = IdentityDocumentReaderProps['classNames'] &\n Partial<Record<'actions' | 'trigger' | 'manual' | 'sheet' | 'sheetPanel' | 'sheetHeader' | 'sheetTitle' | 'sheetClose', string>>\n\nexport type ScanTaxDocumentProps = Omit<IdentityDocumentReaderProps, 'onConfirm' | 'onManual' | 'classNames' | 'confirmLabel'> & {\n /** The buyer confirmed the reviewed data (the sheet is already closed). */\n onConfirm: (result: FiscalReaderResult) => void\n /** The buyer chose to type their data (the sheet is already closed). */\n onManual: () => void\n /** Label of the confirm button inside the sheet. */\n confirmLabel?: ReactNode\n classNames?: ScanTaxDocumentClassNames\n}\n\nexport function ScanTaxDocument(props: ScanTaxDocumentProps) {\n const { onConfirm, onManual, classNames: cx = {}, messages, confirmLabel, ...reader } = props\n const locale = useResolvedLocale(props.locale)\n const m = fiscalMessages(locale, messages).reader\n const spec = props.document ?? props.region.fiscal_id?.documents?.[0]\n const [open, setOpen] = useState(false)\n const titleId = useId()\n const { ref, onBackdropClick } = useModalDialog({ open, onClose: () => setOpen(false) })\n const opener = useRef<HTMLButtonElement>(null)\n if (!spec) return null\n const name = props.documentName ?? spec.label.toLowerCase()\n\n return (\n <div className={cx.actions} data-sf-scan>\n <button ref={opener} type=\"button\" className={cx.trigger ?? cx.primary} onClick={() => setOpen(true)} aria-haspopup=\"dialog\" data-sf-scan-open>\n {fill(m.scan.open, { document: spec.label })}\n </button>\n <button type=\"button\" className={cx.manual ?? cx.secondary} onClick={onManual} data-sf-scan-manual>\n {m.scan.manual}\n </button>\n {open ? (\n <dialog ref={ref} role=\"dialog\" aria-modal=\"true\" aria-labelledby={titleId} onClick={onBackdropClick} onClose={() => setOpen(false)} className={cx.sheet} data-sf-scan-sheet>\n <div className={cx.sheetPanel} data-sf-scan-panel>\n <div className={cx.sheetHeader} data-sf-scan-header>\n <h2 id={titleId} className={cx.sheetTitle} data-sf-scan-title>\n {fill(m.scan.title, { document: name })}\n </h2>\n <button type=\"button\" className={cx.sheetClose} onClick={() => setOpen(false)} aria-label={m.scan.close} data-sf-scan-close data-sf-autofocus>\n <span aria-hidden=\"true\">✕</span>\n </button>\n </div>\n <IdentityDocumentReader\n {...reader}\n locale={locale}\n {...(messages ? { messages } : {})}\n {...(confirmLabel ? { confirmLabel } : {})}\n classNames={cx}\n onConfirm={(result) => {\n setOpen(false)\n onConfirm(result)\n }}\n onManual={() => {\n setOpen(false)\n onManual()\n }}\n />\n </div>\n </dialog>\n ) : null}\n </div>\n )\n}\n","/**\n * \"I need an invoice\" for the checkout (collapsed by default). Expanded it shows, in this order:\n * - the buyer's saved fiscal data as a card (masked tax id) with \"Change\" / \"Use other details\";\n * - otherwise the document reader (upload the tax document, review, confirm) with manual entry as the way out;\n * - or the plain fields when the store reads no document.\n * It reports the state with `onChange` (including the label for the pay button: \"Pay and invoice\") and posts the data as\n * `invoice.*` fields of the surrounding `<form>`, so the checkout action can send it with `createInvoiceAction`.\n */\nimport { useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { FiscalDocumentEvidence, FiscalIdentity, IdentityDocumentSpec, InvoiceRequest, InvoicingCapabilities } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\nimport { IdentityDocumentReader, type IdentityDocumentReaderClassNames } from './document-reader.js'\nimport { entryLabel, maskTaxId, toInvoiceRequest, validateFiscalValues, type FiscalRegion } from './format.js'\nimport { FiscalIdentityFields } from './identity-fields.js'\nimport { fiscalMessages, type DeepPartial, type FiscalMessages } from './messages.js'\nimport type { FiscalActionData, FiscalFieldValues } from './types.js'\n\nexport type InvoiceToggleState = {\n requested: boolean\n /** The data to send as `CheckoutInput.invoice` / `carts.setInvoice`; `null` when none is requested or it is not ready. */\n invoice: InvoiceRequest | null\n /** All the data is there and valid for the region (the server still checks it). */\n ready: boolean\n source: 'profile' | 'document' | 'manual' | null\n /** \"Pay\" or \"Pay and invoice\": the label for the pay button. */\n payLabel: string\n}\n\nexport type InvoiceToggleClassNames = IdentityDocumentReaderClassNames & Partial<Record<'toggle' | 'body' | 'card' | 'cardRow' | 'cardTitle' | 'unavailable', string>>\n\nexport type InvoiceToggleProps = {\n region: FiscalRegion & { country_code?: string }\n /** `loadFiscalContext(...).invoicing`. `available: false` or `checkout: 'off'` renders nothing. */\n capabilities?: InvoicingCapabilities | null\n /** The buyer's saved fiscal data (`customer.fiscal`). */\n profile?: FiscalIdentity | null\n defaultRequested?: boolean\n onChange?: (state: InvoiceToggleState) => void\n /** Result of the shop's action (server errors by field, a document read without JS). */\n data?: FiscalActionData | null\n /** The buyer is signed in: they can save the data to their account. */\n canSave?: boolean\n workerSrc?: string\n /** Enables the no-JS document upload. */\n serverUpload?: boolean\n /** Link (e.g. `?invoice=1`) that opens the section when JavaScript is not available. */\n noJsHref?: string\n document?: IdentityDocumentSpec\n documentName?: string\n personTypeOf?: (taxId: string) => string | null\n /** Label of the pay button when no invoice is asked. Default from the messages. */\n payLabel?: string\n namePrefix?: string\n locale?: string\n messages?: DeepPartial<FiscalMessages>\n classNames?: InvoiceToggleClassNames\n now?: () => Date\n}\n\ntype Mode = 'profile' | 'edit-profile' | 'read' | 'manual'\n\nconst profileValues = (p: FiscalIdentity): FiscalFieldValues => ({\n tax_id: p.tax_id,\n legal_name: p.legal_name,\n postal_code: p.postal_code,\n tax_regime: p.tax_regime,\n use: p.invoice_use ?? '',\n})\n\nexport function InvoiceToggle(props: InvoiceToggleProps) {\n const { region, capabilities, profile, onChange, data, canSave, workerSrc, serverUpload, noJsHref, personTypeOf, namePrefix = 'invoice', messages, classNames: cx = {}, now } = props\n const locale = useResolvedLocale(props.locale)\n const all = fiscalMessages(locale, messages)\n const m = all.toggle\n const fid = region.fiscal_id\n // `identity_documents` lists the kinds the store reads; empty means none. Without capabilities, what the region publishes.\n const spec = props.document ?? fid?.documents?.find((d) => !capabilities || capabilities.identity_documents.includes(d.kind)) ?? undefined\n const canRead = !!spec\n const usable = !!profile && !!profile.invoice_use\n const startMode: Mode = data?.extraction ? 'read' : usable ? 'profile' : profile ? 'edit-profile' : canRead ? 'read' : 'manual'\n\n const bodyId = `sf-invoice-${useId().replace(/:/g, '')}`\n const [requested, setRequested] = useState(!!props.defaultRequested || !!data?.extraction || !!data?.fieldErrors)\n const [mode, setMode] = useState<Mode>(startMode)\n const [values, setValues] = useState<FiscalFieldValues>(profile ? profileValues(profile) : { tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '' })\n const [confirmed, setConfirmed] = useState<{ values: FiscalFieldValues; evidence: FiscalDocumentEvidence | null; save: boolean } | null>(null)\n const [save, setSave] = useState(false)\n const emit = useRef(onChange)\n emit.current = onChange\n\n const payDefault = props.payLabel ?? m.payDefault\n const state = useMemo<InvoiceToggleState>(() => {\n if (!requested) return { requested: false, invoice: null, ready: false, source: null, payLabel: payDefault }\n const country = region.country_code\n const label = m.payAndInvoice\n if (mode === 'profile' && profile) {\n const inv = toInvoiceRequest(profileValues(profile), profile.country_code || country)\n if (profile.document) inv.document = profile.document\n return { requested: true, invoice: inv, ready: true, source: 'profile', payLabel: label }\n }\n if (mode === 'read') {\n if (!confirmed) return { requested: true, invoice: null, ready: false, source: null, payLabel: label }\n const inv = toInvoiceRequest(confirmed.values, country)\n if (confirmed.evidence) inv.document = confirmed.evidence\n if (confirmed.save) inv.save = true\n return { requested: true, invoice: inv, ready: true, source: confirmed.evidence ? 'document' : 'manual', payLabel: label }\n }\n const ready = Object.keys(validateFiscalValues(region, values, personTypeOf)).length === 0\n const inv = toInvoiceRequest(values, country)\n if (save) inv.save = true\n return { requested: true, invoice: ready ? inv : null, ready, source: 'manual', payLabel: label }\n }, [requested, mode, profile, confirmed, values, save, region, personTypeOf, payDefault, m.payAndInvoice])\n\n const key = JSON.stringify(state)\n useEffect(() => {\n emit.current?.(state)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key])\n\n if (capabilities && (!capabilities.available || capabilities.checkout === 'off')) return null\n\n const profileCard = profile && (\n <div className={cx.card} data-sf-invoice-profile>\n <p className={cx.cardTitle} data-sf-invoice-profile-title>\n {m.profileTitle}\n </p>\n <dl>\n <Row cx={cx} label={fid?.label || m.fieldsOf.taxId} value={<span data-sf-masked>{maskTaxId(profile.tax_id)}</span>} />\n <Row cx={cx} label={m.fieldsOf.legalName} value={profile.legal_name} />\n <Row cx={cx} label={m.fieldsOf.postalCode} value={profile.postal_code} />\n <Row cx={cx} label={m.fieldsOf.regime} value={labelOf(fid?.regimes, profile.tax_regime, locale)} />\n <Row cx={cx} label={m.fieldsOf.use} value={labelOf(fid?.invoice_uses, profile.invoice_use ?? '', locale)} />\n </dl>\n {/* The saved data also travels as fields, so the checkout works without JavaScript. */}\n <input type=\"hidden\" name={`${namePrefix}.tax_id`} value={profile.tax_id} />\n <input type=\"hidden\" name={`${namePrefix}.legal_name`} value={profile.legal_name} />\n <input type=\"hidden\" name={`${namePrefix}.postal_code`} value={profile.postal_code} />\n <input type=\"hidden\" name={`${namePrefix}.tax_regime`} value={profile.tax_regime} />\n <input type=\"hidden\" name={`${namePrefix}.use`} value={profile.invoice_use ?? ''} />\n {profile.document ? <input type=\"hidden\" name={`${namePrefix}.document`} value={JSON.stringify(profile.document)} /> : null}\n <div className={cx.actions} data-sf-invoice-actions>\n <button type=\"button\" className={cx.secondary} onClick={() => setMode('edit-profile')} data-sf-invoice-change>\n {m.change}\n </button>\n <button\n type=\"button\"\n className={cx.link}\n onClick={() => {\n setValues({ tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '' })\n setConfirmed(null)\n setMode(canRead ? 'read' : 'manual')\n }}\n data-sf-invoice-other\n >\n {m.useOther}\n </button>\n </div>\n </div>\n )\n\n const saveBox = canSave ? (\n <label data-sf-invoice-save>\n <input type=\"checkbox\" name={`${namePrefix}.save`} checked={save} onChange={(e) => setSave(e.target.checked)} />\n <span>{all.reader.saveToAccount}</span>\n </label>\n ) : null\n const backToProfile =\n profile && usable && mode !== 'profile' ? (\n <button\n type=\"button\"\n className={cx.link}\n onClick={() => {\n setValues(profileValues(profile))\n setMode('profile')\n }}\n data-sf-invoice-back\n >\n {m.useSaved}\n </button>\n ) : null\n\n const body = !requested ? null : (\n <div id={bodyId} className={cx.body} data-sf-invoice-body>\n <input type=\"hidden\" name={`${namePrefix}.requested`} value=\"true\" />\n {mode === 'profile' ? (\n profileCard\n ) : mode === 'read' ? (\n <>\n <IdentityDocumentReader\n region={region}\n {...(spec ? { document: spec } : {})}\n {...(workerSrc ? { workerSrc } : {})}\n {...(data ? { data } : {})}\n {...(canSave !== undefined ? { canSave } : {})}\n {...(serverUpload ? { serverUpload } : {})}\n {...(props.documentName ? { documentName: props.documentName } : {})}\n {...(personTypeOf ? { personTypeOf } : {})}\n {...(now ? { now } : {})}\n onManual={() => {\n setValues({ tax_id: '', legal_name: '', postal_code: '', tax_regime: '', use: '' })\n setMode('manual')\n }}\n onConfirm={(r) => {\n setConfirmed(r)\n }}\n namePrefix={namePrefix}\n locale={locale}\n {...(messages ? { messages } : {})}\n classNames={cx}\n />\n {confirmed ? (\n <p role=\"status\" data-sf-invoice-confirmed>\n <span aria-hidden=\"true\">✓ </span>\n {m.profileTitle}\n </p>\n ) : null}\n {backToProfile}\n </>\n ) : (\n <>\n <h3 className={cx.cardTitle}>{m.manualTitle}</h3>\n <FiscalIdentityFields\n region={region}\n values={values}\n onChange={setValues}\n errors={Object.fromEntries(Object.entries(data?.fieldErrors ?? {}).map(([k, v]) => [k, all.server.errors[v] ?? v]))}\n namePrefix={namePrefix}\n {...(personTypeOf ? { personTypeOf } : {})}\n locale={locale}\n {...(messages ? { messages } : {})}\n classNames={cx}\n hideLegend\n />\n {saveBox}\n <p className={cx.privacy} data-sf-invoice-privacy>\n {m.privacy}\n </p>\n {backToProfile}\n </>\n )}\n </div>\n )\n\n return (\n <section className={cx.toggle} data-sf-invoice-toggle aria-label={m.label}>\n <label data-sf-invoice-label>\n <input\n type=\"checkbox\"\n name={`${namePrefix}.want`}\n checked={requested}\n aria-controls={requested ? bodyId : undefined}\n onChange={(e) => setRequested(e.target.checked)}\n />\n <span>{m.label}</span>\n </label>\n {noJsHref && !requested ? (\n <noscript>\n <a href={noJsHref} data-sf-invoice-nojs>\n {m.label}\n </a>\n </noscript>\n ) : null}\n {body}\n </section>\n )\n}\n\nfunction Row({ label, value, cx }: { label: string; value: ReactNode; cx: InvoiceToggleClassNames }) {\n return (\n <div className={cx.cardRow} data-sf-invoice-row>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </div>\n )\n}\n\nfunction labelOf(list: { code: string; label: string; label_en?: string; person_types: string[] }[] | undefined, code: string, locale: string): string {\n const e = list?.find((x) => x.code === code)\n return e ? `${e.code} · ${entryLabel(e, locale)}` : code\n}\n","/**\n * The invoice of an order, in one card with the state the buyer needs to understand and the one next step. It reads an\n * `InvoiceSummary` (`stage`, `action`, `can_request`, `blocked_reason`, `reason_code`, links) and never guesses: the\n * server decides what is possible. While an invoice is being generated it asks the caller to refresh (`onRefresh`)\n * every 10 s for at most a minute, then stops and says so.\n */\nimport { useCallback, useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport type { InvoiceSummary } from '@asteby/storefront'\nimport type { FiscalReason } from './types.js'\nimport { useResolvedLocale } from '../locale.js'\nimport { fill, fiscalMessages, type DeepPartial, type FiscalMessages } from './messages.js'\n\nexport type InvoiceCardState =\n | 'not_requested'\n | 'awaiting_payment'\n | 'processing'\n | 'issued'\n | 'needs_data'\n | 'needs_review'\n | 'window_closed'\n | 'unavailable'\n | 'not_enabled'\n | 'unknown'\n | 'unreachable'\n | 'cancelled'\n\n/** The state the order's own `invoice` summary describes (the server decides what is possible for THIS order). */\nfunction orderState(invoice: InvoiceSummary | null | undefined): InvoiceCardState {\n if (!invoice) return 'not_requested'\n const stage = invoice.stage ?? ''\n const blocked = invoice.blocked_reason ?? ''\n if (stage === 'issued' || invoice.status === 'issued' || (invoice.action === 'download' && (invoice.url || invoice.xml_url))) return 'issued'\n if (stage === 'cancelled') return 'cancelled'\n if (stage === 'needs_data' || invoice.action === 'correct_data') return 'needs_data'\n if (stage === 'needs_review' || invoice.action === 'contact_store') return 'needs_review'\n if (stage === 'window_closed' || blocked === 'window_closed') return 'window_closed'\n if (stage === 'awaiting_payment' || blocked === 'awaiting_payment') return 'awaiting_payment'\n if (stage === 'queued' || stage === 'issuing' || stage === 'retrying' || stage === 'requested') return 'processing'\n if (blocked === 'not_invoiceable' || blocked === 'unavailable') return 'unavailable'\n if (invoice.can_request === false && blocked) return 'unavailable'\n return 'not_requested'\n}\n\n/**\n * Which of the card's states an invoice is in.\n *\n * `available` / `reason` come from `loadFiscalContext`. Only a server that SAYS the store does not invoice\n * (`reason` `off` / `no_region`) wins over the order: `not_enabled`. When the server says nothing (`unknown`, an older\n * server), could not be asked (`unreachable`) or the caller gave no `reason`, the order's own summary still decides\n * (an order that `can_request`, is being issued or already has its invoice is shown as such) and, with nothing to show,\n * the card is neutral: it never claims that the store does not issue invoices.\n */\nexport function invoiceCardState(invoice: InvoiceSummary | null | undefined, available = true, reason?: FiscalReason): InvoiceCardState {\n if (available) return orderState(invoice)\n if (reason === 'off' || reason === 'no_region') return 'not_enabled'\n const own = orderState(invoice)\n if (invoice && (own !== 'not_requested' || invoice.can_request === true || invoice.action === 'request')) return own\n return reason === 'unreachable' ? 'unreachable' : 'unknown'\n}\n\nexport type InvoiceStatusCardClassNames = Partial<Record<'root' | 'title' | 'body' | 'actions' | 'primary' | 'secondary' | 'link' | 'meta', string>>\n\nexport type InvoiceStatusCardProps = {\n invoice?: InvoiceSummary | null\n /** `loadFiscalContext(...).available`. `false` alone is read as \"unknown\": see `availability`. */\n available?: boolean\n /** `loadFiscalContext(...).reason`: why it is (not) available. Lets the card say the true thing (not active / unknown / could not check). */\n availability?: FiscalReason\n /** Invoicing is in test mode (sandbox): shows a badge saying invoices have no fiscal validity. */\n testMode?: boolean\n /** `capabilities.invoicing.window_days`: shown next to the request button. */\n windowDays?: number\n /** The buyer taps \"Request invoice\". Shown when `invoice.can_request !== false`. Without it, `requestHref` is a link. */\n onRequest?: () => void\n requestHref?: string\n /** \"Fix and retry\". Without it, `correctHref` is a link. */\n onCorrect?: () => void\n correctHref?: string\n /** Called while the invoice is processing (every `refreshMs`, for at most `refreshForMs`). Reload the order there. */\n onRefresh?: () => void\n refreshMs?: number\n refreshForMs?: number\n /** How to reach the store when it must review: an email, a phone or a URL. */\n contact?: { email?: string; phone?: string; url?: string }\n locale?: string\n messages?: DeepPartial<FiscalMessages>\n classNames?: InvoiceStatusCardClassNames\n /** Heading level of the title (default 3). */\n headingLevel?: 2 | 3 | 4\n}\n\nexport function InvoiceStatusCard(props: InvoiceStatusCardProps) {\n const { invoice, available = true, availability, testMode, windowDays, onRequest, requestHref, onCorrect, correctHref, onRefresh, refreshMs = 10_000, refreshForMs = 60_000, contact, messages, classNames: cx = {}, headingLevel = 3 } = props\n const locale = useResolvedLocale(props.locale)\n const m = fiscalMessages(locale, messages).status\n const state = invoiceCardState(invoice, available, availability)\n const titleId = `sf-invoice-card-${useId().replace(/:/g, '')}`\n const [tired, setTired] = useState(false)\n const refresh = useRef(onRefresh)\n refresh.current = onRefresh\n\n // Refresh while it is processing, then give up quietly (the card says it is still going).\n useEffect(() => {\n setTired(false)\n if (state !== 'processing' || !refresh.current) return\n const t0 = Date.now()\n const id = setInterval(() => {\n if (Date.now() - t0 >= refreshForMs) {\n clearInterval(id)\n setTired(true)\n return\n }\n refresh.current?.()\n }, refreshMs)\n return () => clearInterval(id)\n }, [state, refreshMs, refreshForMs])\n\n const manualRefresh = useCallback(() => {\n setTired(false)\n refresh.current?.()\n }, [])\n\n const H = `h${headingLevel}` as 'h2' | 'h3' | 'h4'\n const contactLine = contact?.email ?? contact?.phone ?? contact?.url\n const reason = invoice?.reason_code ? (m.reasons[invoice.reason_code] ?? m.reasons.default) : m.reasons.default\n\n let title: string\n let body: ReactNode = null\n let actions: ReactNode = null\n let live = false\n\n switch (state) {\n case 'not_requested': {\n title = m.title\n body = (\n <>\n <p className={cx.body}>{m.requestHelp}</p>\n {windowDays && windowDays > 0 ? (\n <p className={cx.meta} data-sf-invoice-window>\n {fill(m.windowNote, { days: windowDays })}\n </p>\n ) : null}\n </>\n )\n const can = invoice?.can_request !== false\n if (can && (onRequest || requestHref)) {\n actions = onRequest ? (\n <button type=\"button\" className={cx.primary} onClick={onRequest} data-sf-invoice-request>\n {m.request}\n </button>\n ) : (\n <a href={requestHref} className={cx.primary} data-sf-invoice-request>\n {m.request}\n </a>\n )\n }\n break\n }\n case 'awaiting_payment':\n title = m.awaitingTitle\n body = <p className={cx.body}>{m.awaitingBody}</p>\n break\n case 'processing':\n live = true\n title = m.processingTitle\n body = <p className={cx.body}>{tired ? m.processingSlow : m.processingBody}</p>\n actions = onRefresh ? (\n <button type=\"button\" className={cx.secondary} onClick={manualRefresh} data-sf-invoice-refresh>\n {m.refresh}\n </button>\n ) : null\n break\n case 'issued':\n title = m.issuedTitle\n body = (\n <>\n <p className={cx.body}>{m.issuedBody}</p>\n {invoice?.folio ? (\n <p className={cx.meta} data-sf-invoice-folio>\n <span>{m.folio}: </span>\n <code>{invoice.folio}</code>\n </p>\n ) : null}\n </>\n )\n actions = (\n <>\n {invoice?.url ? (\n <a href={invoice.url} className={cx.primary} rel=\"noopener noreferrer\" download data-sf-invoice-pdf>\n {m.pdf}\n </a>\n ) : null}\n {invoice?.xml_url ? (\n <a href={invoice.xml_url} className={cx.secondary} rel=\"noopener noreferrer\" download data-sf-invoice-xml>\n {m.xml}\n </a>\n ) : null}\n </>\n )\n break\n case 'needs_data':\n title = m.needsDataTitle\n body = (\n <>\n <p className={cx.body}>{m.needsDataBody}</p>\n <p className={cx.meta} data-sf-invoice-reason>\n {reason}\n </p>\n </>\n )\n actions = onCorrect ? (\n <button type=\"button\" className={cx.primary} onClick={onCorrect} data-sf-invoice-correct>\n {m.correct}\n </button>\n ) : correctHref ? (\n <a href={correctHref} className={cx.primary} data-sf-invoice-correct>\n {m.correct}\n </a>\n ) : null\n break\n case 'needs_review':\n title = m.reviewTitle\n body = (\n <>\n <p className={cx.body}>{m.reviewBody}</p>\n {contactLine ? <p className={cx.meta}>{fill(m.contactBy, { contact: contactLine })}</p> : null}\n </>\n )\n actions = contact?.url ? (\n <a href={contact.url} className={cx.secondary} data-sf-invoice-contact>\n {m.contact}\n </a>\n ) : contact?.email ? (\n <a href={`mailto:${contact.email}`} className={cx.secondary} data-sf-invoice-contact>\n {m.contact}\n </a>\n ) : null\n break\n case 'window_closed':\n title = m.windowTitle\n body = <p className={cx.body}>{m.windowBody}</p>\n break\n case 'cancelled':\n title = m.cancelledTitle\n body = <p className={cx.body}>{m.cancelledBody}</p>\n break\n case 'not_enabled':\n case 'unknown':\n case 'unreachable': {\n title = state === 'not_enabled' ? m.notEnabledTitle : m.unknownTitle\n body = <p className={cx.body}>{state === 'not_enabled' ? m.notEnabledBody : state === 'unreachable' ? m.unreachableBody : m.unknownBody}</p>\n const mail = contact?.url ?? (contact?.email ? `mailto:${contact.email}` : null)\n actions = (\n <>\n {state === 'unreachable' && onRefresh ? (\n <button type=\"button\" className={cx.secondary} onClick={manualRefresh} data-sf-invoice-refresh>\n {m.refresh}\n </button>\n ) : null}\n {mail ? (\n <a href={mail} className={cx.secondary} data-sf-invoice-contact>\n {m.contact}\n </a>\n ) : null}\n </>\n )\n break\n }\n default:\n title = m.unavailableTitle\n body = <p className={cx.body}>{m.unavailableBody}</p>\n }\n\n return (\n <section className={cx.root} data-sf-invoice-card data-state={state} data-stage={invoice?.stage || undefined} aria-labelledby={titleId}>\n <H id={titleId} className={cx.title} data-sf-invoice-title>\n <span aria-hidden=\"true\" data-sf-invoice-icon>\n {ICON[state]}\n </span>{' '}\n {title}\n </H>\n {/* Announces the change when an invoice moves on while the buyer is looking at the page. */}\n <div aria-live={live || state === 'issued' ? 'polite' : undefined} data-sf-invoice-live>\n {body}\n </div>\n {testMode ? (\n <p className={cx.meta} data-sf-invoice-sandbox>\n {m.sandbox}\n </p>\n ) : null}\n {actions ? (\n <div className={cx.actions} data-sf-invoice-actions>\n {actions}\n </div>\n ) : null}\n </section>\n )\n}\n\n/** A shape per state, so the state never depends on color alone. */\nconst ICON: Record<InvoiceCardState, string> = {\n not_requested: '○',\n awaiting_payment: '◔',\n processing: '↻',\n issued: '✓',\n needs_data: '!',\n needs_review: '◐',\n window_closed: '–',\n unavailable: '–',\n not_enabled: '–',\n unknown: '?',\n unreachable: '?',\n cancelled: '×',\n}\n"]}
|