@open-mercato/checkout 0.6.7-develop.6862.1.c11a64ce0a → 0.6.7-develop.6869.1.d1ce9999ea
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/modules/checkout/components/CustomerFieldsEditor.js +2 -2
- package/dist/modules/checkout/components/CustomerFieldsEditor.js.map +2 -2
- package/dist/modules/checkout/components/GatewaySettingsFields.js +2 -2
- package/dist/modules/checkout/components/GatewaySettingsFields.js.map +2 -2
- package/dist/modules/checkout/components/LinkTemplateForm.js +8 -8
- package/dist/modules/checkout/components/LinkTemplateForm.js.map +2 -2
- package/dist/modules/checkout/components/LogoUploadField.js +1 -1
- package/dist/modules/checkout/components/LogoUploadField.js.map +2 -2
- package/package.json +5 -5
- package/src/modules/checkout/components/CustomerFieldsEditor.tsx +2 -2
- package/src/modules/checkout/components/GatewaySettingsFields.tsx +2 -2
- package/src/modules/checkout/components/LinkTemplateForm.tsx +8 -8
- package/src/modules/checkout/components/LogoUploadField.tsx +1 -1
|
@@ -110,7 +110,7 @@ function CustomerFieldsEditor({ value, onChange, errors }) {
|
|
|
110
110
|
[]
|
|
111
111
|
);
|
|
112
112
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
113
|
-
/* @__PURE__ */ jsx(Alert, {
|
|
113
|
+
/* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.customerFieldsEditor.notices.defaultFields") }) }),
|
|
114
114
|
/* @__PURE__ */ jsxs("div", { className: "overflow-hidden rounded-xl border border-border/70 bg-background", children: [
|
|
115
115
|
/* @__PURE__ */ jsxs("div", { className: "hidden grid-cols-[1fr_1fr_1fr_180px_90px_110px] gap-3 border-b bg-muted/30 px-4 py-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground md:grid", children: [
|
|
116
116
|
/* @__PURE__ */ jsx("div", { children: t("checkout.customerFieldsEditor.columns.fieldKey") }),
|
|
@@ -280,7 +280,7 @@ function CustomerFieldsEditor({ value, onChange, errors }) {
|
|
|
280
280
|
] })
|
|
281
281
|
] }) : null
|
|
282
282
|
] }, index);
|
|
283
|
-
}) }) : /* @__PURE__ */ jsx("div", { className: "px-4 py-8", children: /* @__PURE__ */ jsx(Alert, {
|
|
283
|
+
}) }) : /* @__PURE__ */ jsx("div", { className: "px-4 py-8", children: /* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.customerFieldsEditor.notices.empty") }) }) })
|
|
284
284
|
] }),
|
|
285
285
|
/* @__PURE__ */ jsxs(
|
|
286
286
|
Button,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/checkout/components/CustomerFieldsEditor.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Plus, Settings2, Trash2 } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport type { CustomerFieldDefinitionInput } from '../data/validators'\nimport { getLocalizedDefaultCheckoutCustomerFields } from '../lib/defaults'\n\ntype Props = {\n value: CustomerFieldDefinitionInput[]\n onChange: (next: CustomerFieldDefinitionInput[]) => void\n errors?: Record<string, string>\n}\n\nfunction withSortOrder(next: CustomerFieldDefinitionInput[]): CustomerFieldDefinitionInput[] {\n return next.map((field, index) => ({\n ...field,\n sortOrder: index,\n }))\n}\n\nfunction createField(index: number, t: ReturnType<typeof useT>): CustomerFieldDefinitionInput {\n return {\n key: `customField${index + 1}`,\n label: t('checkout.customerFieldsEditor.newFieldLabel'),\n kind: 'text',\n required: false,\n fixed: false,\n placeholder: t('checkout.customerFieldsEditor.newFieldPlaceholder'),\n sortOrder: index,\n options: [],\n }\n}\n\nexport function CustomerFieldsEditor({ value, onChange, errors }: Props) {\n const t = useT()\n const fields = React.useMemo<CustomerFieldDefinitionInput[]>(\n () => (\n Array.isArray(value)\n ? value\n : getLocalizedDefaultCheckoutCustomerFields(t).map((field) => ({ ...field, options: [] }))\n ),\n [t, value],\n )\n\n const updateField = React.useCallback(\n (index: number, patch: Partial<CustomerFieldDefinitionInput>) => {\n onChange(\n withSortOrder(\n fields.map((field, currentIndex) => (currentIndex === index ? { ...field, ...patch } : field)),\n ),\n )\n },\n [fields, onChange],\n )\n\n const removeField = React.useCallback(\n (index: number) => {\n onChange(withSortOrder(fields.filter((_, currentIndex) => currentIndex !== index)))\n },\n [fields, onChange],\n )\n\n const updateOption = React.useCallback(\n (fieldIndex: number, optionIndex: number, patch: { value?: string; label?: string }) => {\n const field = fields[fieldIndex]\n if (!field) return\n const options = Array.isArray(field.options) ? field.options : []\n updateField(fieldIndex, {\n options: options.map((option: { value: string; label: string }, currentIndex: number) => (\n currentIndex === optionIndex ? { ...option, ...patch } : option\n )),\n })\n },\n [fields, updateField],\n )\n\n const addOption = React.useCallback(\n (fieldIndex: number) => {\n const field = fields[fieldIndex]\n if (!field) return\n const options = Array.isArray(field.options) ? field.options : []\n updateField(fieldIndex, {\n options: [\n ...options,\n {\n value: `option_${options.length + 1}`,\n label: t('checkout.customerFieldsEditor.options.defaultLabel', 'Option {index}', { index: options.length + 1 }),\n },\n ],\n })\n },\n [fields, t, updateField],\n )\n\n const removeOption = React.useCallback(\n (fieldIndex: number, optionIndex: number) => {\n const field = fields[fieldIndex]\n if (!field) return\n const options = Array.isArray(field.options) ? field.options : []\n updateField(fieldIndex, {\n options: options.filter((_: { value: string; label: string }, currentIndex: number) => currentIndex !== optionIndex),\n })\n },\n [fields, updateField],\n )\n\n const readFieldError = React.useCallback(\n (fieldIndex: number, key: string) => errors?.[`customerFieldsSchema.${fieldIndex}.${key}`],\n [errors],\n )\n\n const readOptionError = React.useCallback(\n (fieldIndex: number, optionIndex: number, key: string) => (\n errors?.[`customerFieldsSchema.${fieldIndex}.options.${optionIndex}.${key}`]\n ),\n [errors],\n )\n\n const readNestedError = React.useCallback(\n (path: string) => {\n if (!errors) return undefined\n if (errors[path]) return errors[path]\n const prefix = `${path}.`\n const nestedEntry = Object.entries(errors).find(([key]) => key.startsWith(prefix))\n return nestedEntry?.[1]\n },\n [errors],\n )\n\n const inputClassName = React.useCallback(\n (error?: string) => (error ? 'border-destructive aria-invalid:ring-destructive' : undefined),\n [],\n )\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.customerFieldsEditor.notices.defaultFields')}\n </AlertDescription>\n </Alert>\n\n <div className=\"overflow-hidden rounded-xl border border-border/70 bg-background\">\n <div className=\"hidden grid-cols-[1fr_1fr_1fr_180px_90px_110px] gap-3 border-b bg-muted/30 px-4 py-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground md:grid\">\n <div>{t('checkout.customerFieldsEditor.columns.fieldKey')}</div>\n <div>{t('checkout.customerFieldsEditor.columns.label')}</div>\n <div>{t('checkout.customerFieldsEditor.columns.placeholder')}</div>\n <div>{t('checkout.customerFieldsEditor.columns.type')}</div>\n <div>{t('checkout.customerFieldsEditor.columns.required')}</div>\n <div className=\"text-right\">{t('checkout.customerFieldsEditor.columns.actions')}</div>\n </div>\n\n {fields.length > 0 ? (\n <div className=\"divide-y divide-border/70\">\n {fields.map((field, index) => {\n const keyError = readFieldError(index, 'key')\n const labelError = readFieldError(index, 'label')\n const placeholderError = readFieldError(index, 'placeholder')\n const kindError = readFieldError(index, 'kind')\n const optionsError = readNestedError(`customerFieldsSchema.${index}.options`)\n\n return (\n <div key={index} className=\"space-y-3 px-4 py-4\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <Label>{t('checkout.customerFieldsEditor.columns.fieldKey')}</Label>\n <Input\n value={field.key}\n onChange={(event) => updateField(index, { key: event.target.value })}\n disabled={field.fixed}\n placeholder={t('checkout.customerFieldsEditor.placeholders.fieldKey')}\n className={inputClassName(keyError)}\n aria-invalid={Boolean(keyError)}\n />\n {keyError ? <p className=\"text-xs text-destructive\">{keyError}</p> : null}\n </div>\n\n <div className=\"space-y-1\">\n <Label>{t('checkout.customerFieldsEditor.columns.label')}</Label>\n <Input\n value={field.label}\n onChange={(event) => updateField(index, { label: event.target.value })}\n placeholder={t('checkout.customerFieldsEditor.placeholders.label')}\n className={inputClassName(labelError)}\n aria-invalid={Boolean(labelError)}\n />\n {labelError ? <p className=\"text-xs text-destructive\">{labelError}</p> : null}\n </div>\n </div>\n\n <div className=\"grid gap-3 md:grid-cols-[1.2fr_180px_100px_110px] md:items-end\">\n <div className=\"space-y-1\">\n <Label>{t('checkout.customerFieldsEditor.columns.placeholder')}</Label>\n <Input\n value={field.placeholder ?? ''}\n onChange={(event) => updateField(index, { placeholder: event.target.value })}\n placeholder={t('checkout.customerFieldsEditor.placeholders.placeholder')}\n className={inputClassName(placeholderError)}\n aria-invalid={Boolean(placeholderError)}\n />\n {placeholderError ? <p className=\"text-xs text-destructive\">{placeholderError}</p> : null}\n </div>\n\n <div className=\"space-y-1\">\n <Label>{t('checkout.customerFieldsEditor.columns.type')}</Label>\n <select\n className={kindError\n ? 'w-full rounded-md border border-destructive bg-background px-3 py-2 text-sm aria-invalid:ring-destructive'\n : 'w-full rounded-md border bg-background px-3 py-2 text-sm'}\n value={field.kind}\n onChange={(event) => updateField(index, { kind: event.target.value as CustomerFieldDefinitionInput['kind'] })}\n disabled={field.fixed}\n aria-invalid={Boolean(kindError)}\n >\n <option value=\"text\">{t('checkout.customerFieldsEditor.types.text')}</option>\n <option value=\"multiline\">{t('checkout.customerFieldsEditor.types.multiline')}</option>\n <option value=\"boolean\">{t('checkout.customerFieldsEditor.types.boolean')}</option>\n <option value=\"select\">{t('checkout.customerFieldsEditor.types.select')}</option>\n <option value=\"radio\">{t('checkout.customerFieldsEditor.types.radio')}</option>\n </select>\n {kindError ? <p className=\"text-xs text-destructive\">{kindError}</p> : null}\n </div>\n\n <label className=\"flex h-9 items-center gap-2 rounded-md border border-border/70 bg-muted/30 px-3 text-sm\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={(event) => updateField(index, { required: event.target.checked })}\n />\n {t('checkout.customerFieldsEditor.columns.required')}\n </label>\n\n <div className=\"flex justify-end gap-2\">\n {!field.fixed ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => removeField(index)}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.remove')}\n </Button>\n ) : (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled>\n {t('checkout.customerFieldsEditor.locked')}\n </Button>\n )}\n </div>\n </div>\n\n {(field.kind === 'select' || field.kind === 'radio') ? (\n <div className=\"space-y-2 rounded-lg border border-dashed border-border/70 bg-muted/30 p-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <Settings2 className=\"h-4 w-4 text-muted-foreground\" />\n {t('checkout.customerFieldsEditor.options.title')}\n </div>\n {optionsError ? <p className=\"text-xs text-destructive\">{optionsError}</p> : null}\n <div className=\"overflow-hidden rounded-lg border border-border/70 bg-background\">\n <table className=\"w-full table-fixed\">\n <thead className=\"border-b bg-muted/30\">\n <tr className=\"text-left text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-3 py-2 w-[40%]\">{t('checkout.customerFieldsEditor.options.value')}</th>\n <th className=\"px-3 py-2\">{t('checkout.customerFieldsEditor.options.label')}</th>\n <th className=\"px-3 py-2 w-[96px] text-right\">{t('checkout.customerFieldsEditor.columns.actions')}</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border/70\">\n {(field.options ?? []).map((option, optionIndex) => {\n const optionValueError = readOptionError(index, optionIndex, 'value')\n const optionLabelError = readOptionError(index, optionIndex, 'label')\n\n return (\n <tr key={optionIndex}>\n <td className=\"px-3 py-2\">\n <Input\n value={option.value}\n onChange={(event) => updateOption(index, optionIndex, { value: event.target.value })}\n placeholder={t('checkout.customerFieldsEditor.options.placeholders.value')}\n className={`h-8 ${inputClassName(optionValueError) ?? ''}`.trim()}\n aria-invalid={Boolean(optionValueError)}\n />\n {optionValueError ? (\n <p className=\"mt-1 text-xs text-destructive\">{optionValueError}</p>\n ) : null}\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={option.label}\n onChange={(event) => updateOption(index, optionIndex, { label: event.target.value })}\n placeholder={t('checkout.customerFieldsEditor.options.placeholders.label')}\n className={`h-8 ${inputClassName(optionLabelError) ?? ''}`.trim()}\n aria-invalid={Boolean(optionLabelError)}\n />\n {optionLabelError ? (\n <p className=\"mt-1 text-xs text-destructive\">{optionLabelError}</p>\n ) : null}\n </td>\n <td className=\"px-3 py-2 text-right\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => removeOption(index, optionIndex)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => addOption(index)}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('checkout.customerFieldsEditor.options.add')}\n </Button>\n </div>\n ) : null}\n </div>\n )})}\n </div>\n ) : (\n <div className=\"px-4 py-8\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.customerFieldsEditor.notices.empty')}\n </AlertDescription>\n </Alert>\n </div>\n )}\n </div>\n\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onChange(withSortOrder([...fields, createField(fields.length, t)]))}\n >\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('checkout.customerFieldsEditor.addField')}\n </Button>\n </div>\n )\n}\n\nexport default CustomerFieldsEditor\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Plus, Settings2, Trash2 } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport type { CustomerFieldDefinitionInput } from '../data/validators'\nimport { getLocalizedDefaultCheckoutCustomerFields } from '../lib/defaults'\n\ntype Props = {\n value: CustomerFieldDefinitionInput[]\n onChange: (next: CustomerFieldDefinitionInput[]) => void\n errors?: Record<string, string>\n}\n\nfunction withSortOrder(next: CustomerFieldDefinitionInput[]): CustomerFieldDefinitionInput[] {\n return next.map((field, index) => ({\n ...field,\n sortOrder: index,\n }))\n}\n\nfunction createField(index: number, t: ReturnType<typeof useT>): CustomerFieldDefinitionInput {\n return {\n key: `customField${index + 1}`,\n label: t('checkout.customerFieldsEditor.newFieldLabel'),\n kind: 'text',\n required: false,\n fixed: false,\n placeholder: t('checkout.customerFieldsEditor.newFieldPlaceholder'),\n sortOrder: index,\n options: [],\n }\n}\n\nexport function CustomerFieldsEditor({ value, onChange, errors }: Props) {\n const t = useT()\n const fields = React.useMemo<CustomerFieldDefinitionInput[]>(\n () => (\n Array.isArray(value)\n ? value\n : getLocalizedDefaultCheckoutCustomerFields(t).map((field) => ({ ...field, options: [] }))\n ),\n [t, value],\n )\n\n const updateField = React.useCallback(\n (index: number, patch: Partial<CustomerFieldDefinitionInput>) => {\n onChange(\n withSortOrder(\n fields.map((field, currentIndex) => (currentIndex === index ? { ...field, ...patch } : field)),\n ),\n )\n },\n [fields, onChange],\n )\n\n const removeField = React.useCallback(\n (index: number) => {\n onChange(withSortOrder(fields.filter((_, currentIndex) => currentIndex !== index)))\n },\n [fields, onChange],\n )\n\n const updateOption = React.useCallback(\n (fieldIndex: number, optionIndex: number, patch: { value?: string; label?: string }) => {\n const field = fields[fieldIndex]\n if (!field) return\n const options = Array.isArray(field.options) ? field.options : []\n updateField(fieldIndex, {\n options: options.map((option: { value: string; label: string }, currentIndex: number) => (\n currentIndex === optionIndex ? { ...option, ...patch } : option\n )),\n })\n },\n [fields, updateField],\n )\n\n const addOption = React.useCallback(\n (fieldIndex: number) => {\n const field = fields[fieldIndex]\n if (!field) return\n const options = Array.isArray(field.options) ? field.options : []\n updateField(fieldIndex, {\n options: [\n ...options,\n {\n value: `option_${options.length + 1}`,\n label: t('checkout.customerFieldsEditor.options.defaultLabel', 'Option {index}', { index: options.length + 1 }),\n },\n ],\n })\n },\n [fields, t, updateField],\n )\n\n const removeOption = React.useCallback(\n (fieldIndex: number, optionIndex: number) => {\n const field = fields[fieldIndex]\n if (!field) return\n const options = Array.isArray(field.options) ? field.options : []\n updateField(fieldIndex, {\n options: options.filter((_: { value: string; label: string }, currentIndex: number) => currentIndex !== optionIndex),\n })\n },\n [fields, updateField],\n )\n\n const readFieldError = React.useCallback(\n (fieldIndex: number, key: string) => errors?.[`customerFieldsSchema.${fieldIndex}.${key}`],\n [errors],\n )\n\n const readOptionError = React.useCallback(\n (fieldIndex: number, optionIndex: number, key: string) => (\n errors?.[`customerFieldsSchema.${fieldIndex}.options.${optionIndex}.${key}`]\n ),\n [errors],\n )\n\n const readNestedError = React.useCallback(\n (path: string) => {\n if (!errors) return undefined\n if (errors[path]) return errors[path]\n const prefix = `${path}.`\n const nestedEntry = Object.entries(errors).find(([key]) => key.startsWith(prefix))\n return nestedEntry?.[1]\n },\n [errors],\n )\n\n const inputClassName = React.useCallback(\n (error?: string) => (error ? 'border-destructive aria-invalid:ring-destructive' : undefined),\n [],\n )\n\n return (\n <div className=\"space-y-4\">\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.customerFieldsEditor.notices.defaultFields')}\n </AlertDescription>\n </Alert>\n\n <div className=\"overflow-hidden rounded-xl border border-border/70 bg-background\">\n <div className=\"hidden grid-cols-[1fr_1fr_1fr_180px_90px_110px] gap-3 border-b bg-muted/30 px-4 py-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground md:grid\">\n <div>{t('checkout.customerFieldsEditor.columns.fieldKey')}</div>\n <div>{t('checkout.customerFieldsEditor.columns.label')}</div>\n <div>{t('checkout.customerFieldsEditor.columns.placeholder')}</div>\n <div>{t('checkout.customerFieldsEditor.columns.type')}</div>\n <div>{t('checkout.customerFieldsEditor.columns.required')}</div>\n <div className=\"text-right\">{t('checkout.customerFieldsEditor.columns.actions')}</div>\n </div>\n\n {fields.length > 0 ? (\n <div className=\"divide-y divide-border/70\">\n {fields.map((field, index) => {\n const keyError = readFieldError(index, 'key')\n const labelError = readFieldError(index, 'label')\n const placeholderError = readFieldError(index, 'placeholder')\n const kindError = readFieldError(index, 'kind')\n const optionsError = readNestedError(`customerFieldsSchema.${index}.options`)\n\n return (\n <div key={index} className=\"space-y-3 px-4 py-4\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"space-y-1\">\n <Label>{t('checkout.customerFieldsEditor.columns.fieldKey')}</Label>\n <Input\n value={field.key}\n onChange={(event) => updateField(index, { key: event.target.value })}\n disabled={field.fixed}\n placeholder={t('checkout.customerFieldsEditor.placeholders.fieldKey')}\n className={inputClassName(keyError)}\n aria-invalid={Boolean(keyError)}\n />\n {keyError ? <p className=\"text-xs text-destructive\">{keyError}</p> : null}\n </div>\n\n <div className=\"space-y-1\">\n <Label>{t('checkout.customerFieldsEditor.columns.label')}</Label>\n <Input\n value={field.label}\n onChange={(event) => updateField(index, { label: event.target.value })}\n placeholder={t('checkout.customerFieldsEditor.placeholders.label')}\n className={inputClassName(labelError)}\n aria-invalid={Boolean(labelError)}\n />\n {labelError ? <p className=\"text-xs text-destructive\">{labelError}</p> : null}\n </div>\n </div>\n\n <div className=\"grid gap-3 md:grid-cols-[1.2fr_180px_100px_110px] md:items-end\">\n <div className=\"space-y-1\">\n <Label>{t('checkout.customerFieldsEditor.columns.placeholder')}</Label>\n <Input\n value={field.placeholder ?? ''}\n onChange={(event) => updateField(index, { placeholder: event.target.value })}\n placeholder={t('checkout.customerFieldsEditor.placeholders.placeholder')}\n className={inputClassName(placeholderError)}\n aria-invalid={Boolean(placeholderError)}\n />\n {placeholderError ? <p className=\"text-xs text-destructive\">{placeholderError}</p> : null}\n </div>\n\n <div className=\"space-y-1\">\n <Label>{t('checkout.customerFieldsEditor.columns.type')}</Label>\n <select\n className={kindError\n ? 'w-full rounded-md border border-destructive bg-background px-3 py-2 text-sm aria-invalid:ring-destructive'\n : 'w-full rounded-md border bg-background px-3 py-2 text-sm'}\n value={field.kind}\n onChange={(event) => updateField(index, { kind: event.target.value as CustomerFieldDefinitionInput['kind'] })}\n disabled={field.fixed}\n aria-invalid={Boolean(kindError)}\n >\n <option value=\"text\">{t('checkout.customerFieldsEditor.types.text')}</option>\n <option value=\"multiline\">{t('checkout.customerFieldsEditor.types.multiline')}</option>\n <option value=\"boolean\">{t('checkout.customerFieldsEditor.types.boolean')}</option>\n <option value=\"select\">{t('checkout.customerFieldsEditor.types.select')}</option>\n <option value=\"radio\">{t('checkout.customerFieldsEditor.types.radio')}</option>\n </select>\n {kindError ? <p className=\"text-xs text-destructive\">{kindError}</p> : null}\n </div>\n\n <label className=\"flex h-9 items-center gap-2 rounded-md border border-border/70 bg-muted/30 px-3 text-sm\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={(event) => updateField(index, { required: event.target.checked })}\n />\n {t('checkout.customerFieldsEditor.columns.required')}\n </label>\n\n <div className=\"flex justify-end gap-2\">\n {!field.fixed ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => removeField(index)}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.remove')}\n </Button>\n ) : (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled>\n {t('checkout.customerFieldsEditor.locked')}\n </Button>\n )}\n </div>\n </div>\n\n {(field.kind === 'select' || field.kind === 'radio') ? (\n <div className=\"space-y-2 rounded-lg border border-dashed border-border/70 bg-muted/30 p-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <Settings2 className=\"h-4 w-4 text-muted-foreground\" />\n {t('checkout.customerFieldsEditor.options.title')}\n </div>\n {optionsError ? <p className=\"text-xs text-destructive\">{optionsError}</p> : null}\n <div className=\"overflow-hidden rounded-lg border border-border/70 bg-background\">\n <table className=\"w-full table-fixed\">\n <thead className=\"border-b bg-muted/30\">\n <tr className=\"text-left text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-3 py-2 w-[40%]\">{t('checkout.customerFieldsEditor.options.value')}</th>\n <th className=\"px-3 py-2\">{t('checkout.customerFieldsEditor.options.label')}</th>\n <th className=\"px-3 py-2 w-[96px] text-right\">{t('checkout.customerFieldsEditor.columns.actions')}</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border/70\">\n {(field.options ?? []).map((option, optionIndex) => {\n const optionValueError = readOptionError(index, optionIndex, 'value')\n const optionLabelError = readOptionError(index, optionIndex, 'label')\n\n return (\n <tr key={optionIndex}>\n <td className=\"px-3 py-2\">\n <Input\n value={option.value}\n onChange={(event) => updateOption(index, optionIndex, { value: event.target.value })}\n placeholder={t('checkout.customerFieldsEditor.options.placeholders.value')}\n className={`h-8 ${inputClassName(optionValueError) ?? ''}`.trim()}\n aria-invalid={Boolean(optionValueError)}\n />\n {optionValueError ? (\n <p className=\"mt-1 text-xs text-destructive\">{optionValueError}</p>\n ) : null}\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={option.label}\n onChange={(event) => updateOption(index, optionIndex, { label: event.target.value })}\n placeholder={t('checkout.customerFieldsEditor.options.placeholders.label')}\n className={`h-8 ${inputClassName(optionLabelError) ?? ''}`.trim()}\n aria-invalid={Boolean(optionLabelError)}\n />\n {optionLabelError ? (\n <p className=\"mt-1 text-xs text-destructive\">{optionLabelError}</p>\n ) : null}\n </td>\n <td className=\"px-3 py-2 text-right\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => removeOption(index, optionIndex)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => addOption(index)}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('checkout.customerFieldsEditor.options.add')}\n </Button>\n </div>\n ) : null}\n </div>\n )})}\n </div>\n ) : (\n <div className=\"px-4 py-8\">\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.customerFieldsEditor.notices.empty')}\n </AlertDescription>\n </Alert>\n </div>\n )}\n </div>\n\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onChange(withSortOrder([...fields, createField(fields.length, t)]))}\n >\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('checkout.customerFieldsEditor.addField')}\n </Button>\n </div>\n )\n}\n\nexport default CustomerFieldsEditor\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -57,10 +57,10 @@ function GatewaySettingsFields({ providerKey, value, onChange }) {
|
|
|
57
57
|
}, [providerKey]);
|
|
58
58
|
const fields = descriptor?.sessionConfig?.fields ?? [];
|
|
59
59
|
if (!providerKey) {
|
|
60
|
-
return /* @__PURE__ */ jsx(Alert, {
|
|
60
|
+
return /* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.gatewaySettings.notices.chooseProvider") }) });
|
|
61
61
|
}
|
|
62
62
|
if (!fields.length) {
|
|
63
|
-
return /* @__PURE__ */ jsx(Alert, {
|
|
63
|
+
return /* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.gatewaySettings.notices.noSettings") }) });
|
|
64
64
|
}
|
|
65
65
|
return /* @__PURE__ */ jsx("div", { className: "space-y-4", children: fields.map((field) => {
|
|
66
66
|
const currentValue = value?.[field.key];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/checkout/components/GatewaySettingsFields.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Checkbox } from '@open-mercato/ui/primitives/checkbox'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\n\ntype Descriptor = {\n providerKey: string\n label: string\n sessionConfig?: {\n fields?: Array<{\n key: string\n label: string\n type: 'text' | 'number' | 'select' | 'multiselect' | 'boolean' | 'textarea' | 'secret' | 'url'\n description?: string\n options?: Array<{ value: string; label: string }>\n }>\n }\n}\n\ntype Props = {\n providerKey: string | null | undefined\n value: Record<string, unknown> | null | undefined\n onChange: (next: Record<string, unknown>) => void\n}\n\nexport function GatewaySettingsFields({ providerKey, value, onChange }: Props) {\n const t = useT()\n const [descriptor, setDescriptor] = React.useState<Descriptor | null>(null)\n\n const patchSetting = React.useCallback(\n (fieldKey: string, nextValue: unknown) => {\n const next = { ...(value ?? {}) }\n if (nextValue === undefined || nextValue === null || nextValue === '') {\n delete next[fieldKey]\n } else {\n next[fieldKey] = nextValue\n }\n onChange(next)\n },\n [onChange, value],\n )\n\n const toggleMultiselectValue = React.useCallback(\n (fieldKey: string, optionValue: string) => {\n const current = Array.isArray(value?.[fieldKey])\n ? value?.[fieldKey].filter((entry): entry is string => typeof entry === 'string')\n : []\n const next = current.includes(optionValue)\n ? current.filter((entry) => entry !== optionValue)\n : [...current, optionValue]\n patchSetting(fieldKey, next.length ? next : undefined)\n },\n [patchSetting, value],\n )\n\n React.useEffect(() => {\n let active = true\n if (!providerKey) {\n setDescriptor(null)\n return () => { active = false }\n }\n void readApiResultOrThrow<Descriptor>(`/api/payment_gateways/providers/${encodeURIComponent(providerKey)}`)\n .then((result) => {\n if (active) setDescriptor(result)\n })\n .catch(() => {\n if (active) setDescriptor(null)\n })\n return () => { active = false }\n }, [providerKey])\n\n const fields = descriptor?.sessionConfig?.fields ?? []\n if (!providerKey) {\n return (\n <Alert
|
|
5
|
-
"mappings": ";AAuFQ,cAwBM,YAxBN;AAtFR,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,SAAS,4BAA4B;AACrC,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,OAAO,wBAAwB;AACxC,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAsBA,SAAS,sBAAsB,EAAE,aAAa,OAAO,SAAS,GAAU;AAC7E,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAA4B,IAAI;AAE1E,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,UAAkB,cAAuB;AACxC,YAAM,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAChC,UAAI,cAAc,UAAa,cAAc,QAAQ,cAAc,IAAI;AACrE,eAAO,KAAK,QAAQ;AAAA,MACtB,OAAO;AACL,aAAK,QAAQ,IAAI;AAAA,MACnB;AACA,eAAS,IAAI;AAAA,IACf;AAAA,IACA,CAAC,UAAU,KAAK;AAAA,EAClB;AAEA,QAAM,yBAAyB,MAAM;AAAA,IACnC,CAAC,UAAkB,gBAAwB;AACzC,YAAM,UAAU,MAAM,QAAQ,QAAQ,QAAQ,CAAC,IAC3C,QAAQ,QAAQ,EAAE,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAC9E,CAAC;AACL,YAAM,OAAO,QAAQ,SAAS,WAAW,IACrC,QAAQ,OAAO,CAAC,UAAU,UAAU,WAAW,IAC/C,CAAC,GAAG,SAAS,WAAW;AAC5B,mBAAa,UAAU,KAAK,SAAS,OAAO,MAAS;AAAA,IACvD;AAAA,IACA,CAAC,cAAc,KAAK;AAAA,EACtB;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS;AACb,QAAI,CAAC,aAAa;AAChB,oBAAc,IAAI;AAClB,aAAO,MAAM;AAAE,iBAAS;AAAA,MAAM;AAAA,IAChC;AACA,SAAK,qBAAiC,mCAAmC,mBAAmB,WAAW,CAAC,EAAE,EACvG,KAAK,CAAC,WAAW;AAChB,UAAI,OAAQ,eAAc,MAAM;AAAA,IAClC,CAAC,EACA,MAAM,MAAM;AACX,UAAI,OAAQ,eAAc,IAAI;AAAA,IAChC,CAAC;AACH,WAAO,MAAM;AAAE,eAAS;AAAA,IAAM;AAAA,EAChC,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,SAAS,YAAY,eAAe,UAAU,CAAC;AACrD,MAAI,CAAC,aAAa;AAChB,WACE,oBAAC,SAAM,
|
|
4
|
+
"sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Checkbox } from '@open-mercato/ui/primitives/checkbox'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\n\ntype Descriptor = {\n providerKey: string\n label: string\n sessionConfig?: {\n fields?: Array<{\n key: string\n label: string\n type: 'text' | 'number' | 'select' | 'multiselect' | 'boolean' | 'textarea' | 'secret' | 'url'\n description?: string\n options?: Array<{ value: string; label: string }>\n }>\n }\n}\n\ntype Props = {\n providerKey: string | null | undefined\n value: Record<string, unknown> | null | undefined\n onChange: (next: Record<string, unknown>) => void\n}\n\nexport function GatewaySettingsFields({ providerKey, value, onChange }: Props) {\n const t = useT()\n const [descriptor, setDescriptor] = React.useState<Descriptor | null>(null)\n\n const patchSetting = React.useCallback(\n (fieldKey: string, nextValue: unknown) => {\n const next = { ...(value ?? {}) }\n if (nextValue === undefined || nextValue === null || nextValue === '') {\n delete next[fieldKey]\n } else {\n next[fieldKey] = nextValue\n }\n onChange(next)\n },\n [onChange, value],\n )\n\n const toggleMultiselectValue = React.useCallback(\n (fieldKey: string, optionValue: string) => {\n const current = Array.isArray(value?.[fieldKey])\n ? value?.[fieldKey].filter((entry): entry is string => typeof entry === 'string')\n : []\n const next = current.includes(optionValue)\n ? current.filter((entry) => entry !== optionValue)\n : [...current, optionValue]\n patchSetting(fieldKey, next.length ? next : undefined)\n },\n [patchSetting, value],\n )\n\n React.useEffect(() => {\n let active = true\n if (!providerKey) {\n setDescriptor(null)\n return () => { active = false }\n }\n void readApiResultOrThrow<Descriptor>(`/api/payment_gateways/providers/${encodeURIComponent(providerKey)}`)\n .then((result) => {\n if (active) setDescriptor(result)\n })\n .catch(() => {\n if (active) setDescriptor(null)\n })\n return () => { active = false }\n }, [providerKey])\n\n const fields = descriptor?.sessionConfig?.fields ?? []\n if (!providerKey) {\n return (\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.gatewaySettings.notices.chooseProvider')}\n </AlertDescription>\n </Alert>\n )\n }\n if (!fields.length) {\n return (\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.gatewaySettings.notices.noSettings')}\n </AlertDescription>\n </Alert>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {fields.map((field) => {\n const currentValue = value?.[field.key]\n return (\n <div key={field.key} className=\"space-y-2 rounded-lg border border-border/70 bg-muted/30 p-3\">\n <Label>{field.label}</Label>\n {field.type === 'select' ? (\n <Select\n value={typeof currentValue === 'string' ? currentValue : ''}\n onValueChange={(next) => patchSetting(field.key, next)}\n >\n <SelectTrigger>\n <SelectValue placeholder={t('checkout.gatewaySettings.selectPlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {(field.options ?? []).map((option) => (\n <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : field.type === 'multiselect' ? (\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {(field.options ?? []).map((option) => {\n const selectedValues = Array.isArray(currentValue)\n ? currentValue.filter((entry): entry is string => typeof entry === 'string')\n : []\n const checked = selectedValues.includes(option.value)\n return (\n <label\n key={option.value}\n className=\"flex items-center gap-2 rounded-md border bg-background px-3 py-2 text-sm\"\n >\n <Checkbox\n checked={checked}\n onCheckedChange={() => toggleMultiselectValue(field.key, option.value)}\n />\n <span>{option.label}</span>\n </label>\n )\n })}\n </div>\n ) : field.type === 'boolean' ? (\n <label className=\"flex items-center gap-2 text-sm\">\n <Checkbox\n checked={currentValue === true}\n onCheckedChange={(next) => patchSetting(field.key, next === true)}\n />\n {t('checkout.common.enabled')}\n </label>\n ) : field.type === 'textarea' ? (\n <Textarea\n value={typeof currentValue === 'string' ? currentValue : ''}\n onChange={(event) => patchSetting(field.key, event.target.value)}\n />\n ) : (\n <Input\n type={field.type === 'number' ? 'number' : field.type === 'secret' ? 'password' : 'text'}\n value={typeof currentValue === 'string' || typeof currentValue === 'number' ? `${currentValue}` : ''}\n onChange={(event) => patchSetting(field.key, event.target.value)}\n />\n )}\n {field.description ? <p className=\"text-xs text-muted-foreground\">{field.description}</p> : null}\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default GatewaySettingsFields\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -324,7 +324,7 @@ function PriceListEditor({
|
|
|
324
324
|
]);
|
|
325
325
|
}, [items, onChange]);
|
|
326
326
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
327
|
-
/* @__PURE__ */ jsx(Alert, {
|
|
327
|
+
/* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.linkTemplateForm.priceList.notices.singleCurrency") }) }),
|
|
328
328
|
error ? /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: error }) : null,
|
|
329
329
|
/* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-xl border border-border/70 bg-background", children: items.length > 0 ? /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "w-full min-w-[760px] table-fixed", children: [
|
|
330
330
|
/* @__PURE__ */ jsx("thead", { className: "border-b bg-muted/30", children: /* @__PURE__ */ jsxs("tr", { className: "text-left text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: [
|
|
@@ -390,7 +390,7 @@ function PriceListEditor({
|
|
|
390
390
|
}
|
|
391
391
|
) })
|
|
392
392
|
] }, `${item.id}:${index}`)) })
|
|
393
|
-
] }) }) : /* @__PURE__ */ jsx("div", { className: "px-4 py-8", children: /* @__PURE__ */ jsx(Alert, {
|
|
393
|
+
] }) }) : /* @__PURE__ */ jsx("div", { className: "px-4 py-8", children: /* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.linkTemplateForm.priceList.notices.empty") }) }) }) }),
|
|
394
394
|
/* @__PURE__ */ jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: addItem, children: [
|
|
395
395
|
/* @__PURE__ */ jsx(Plus, { className: "mr-2 h-4 w-4" }),
|
|
396
396
|
t("checkout.linkTemplateForm.priceList.actions.addItem")
|
|
@@ -823,7 +823,7 @@ function CustomerDetailsSection({ values, setValue, errors }) {
|
|
|
823
823
|
] }),
|
|
824
824
|
collectCustomerDetailsError ? /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: collectCustomerDetailsError }) : null,
|
|
825
825
|
collectCustomerDetails ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
826
|
-
/* @__PURE__ */ jsx(Alert, {
|
|
826
|
+
/* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.linkTemplateForm.customerDetails.notices.simpleLink") }) }),
|
|
827
827
|
customerFieldsError ? /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: customerFieldsError }) : null,
|
|
828
828
|
/* @__PURE__ */ jsx(
|
|
829
829
|
CustomerFieldsEditor,
|
|
@@ -833,7 +833,7 @@ function CustomerDetailsSection({ values, setValue, errors }) {
|
|
|
833
833
|
errors
|
|
834
834
|
}
|
|
835
835
|
)
|
|
836
|
-
] }) : /* @__PURE__ */ jsx(Alert, {
|
|
836
|
+
] }) : /* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.linkTemplateForm.customerDetails.notices.disabled") }) })
|
|
837
837
|
] });
|
|
838
838
|
}
|
|
839
839
|
function LegalSection({ values, setValue, errors }) {
|
|
@@ -857,7 +857,7 @@ function LegalSection({ values, setValue, errors }) {
|
|
|
857
857
|
[legalDocuments, setValue]
|
|
858
858
|
);
|
|
859
859
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
860
|
-
/* @__PURE__ */ jsx(Alert, {
|
|
860
|
+
/* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.linkTemplateForm.legal.notice") }) }),
|
|
861
861
|
/* @__PURE__ */ jsxs(Tabs, { value: tab, onValueChange: (next) => setTab(next), children: [
|
|
862
862
|
/* @__PURE__ */ jsxs(TabsList, { className: SETTINGS_TABS_LIST_CLASS, children: [
|
|
863
863
|
/* @__PURE__ */ jsxs(TabsTrigger, { value: "terms", className: SETTINGS_TABS_TRIGGER_CLASS, children: [
|
|
@@ -965,7 +965,7 @@ function MessagesSection({ values, setValue, errors }) {
|
|
|
965
965
|
}
|
|
966
966
|
};
|
|
967
967
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
968
|
-
/* @__PURE__ */ jsx(Alert, {
|
|
968
|
+
/* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.linkTemplateForm.messages.notice") }) }),
|
|
969
969
|
/* @__PURE__ */ jsxs(Tabs, { value: tab, onValueChange: (next) => setTab(next), children: [
|
|
970
970
|
/* @__PURE__ */ jsx(TabsList, { className: SETTINGS_TABS_LIST_CLASS, children: ["success", "cancel", "error"].map((item) => /* @__PURE__ */ jsxs(TabsTrigger, { value: item, className: SETTINGS_TABS_TRIGGER_CLASS, children: [
|
|
971
971
|
/* @__PURE__ */ jsx(MessageSquare, { className: "mr-2 h-4 w-4" }),
|
|
@@ -1044,7 +1044,7 @@ function EmailsSection({ values, setValue, errors }) {
|
|
|
1044
1044
|
}
|
|
1045
1045
|
};
|
|
1046
1046
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
1047
|
-
/* @__PURE__ */ jsx(Alert, {
|
|
1047
|
+
/* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.linkTemplateForm.emails.notice") }) }),
|
|
1048
1048
|
/* @__PURE__ */ jsx(VariableHint, {}),
|
|
1049
1049
|
/* @__PURE__ */ jsxs(Tabs, { value: tab, onValueChange: (next) => setTab(next), children: [
|
|
1050
1050
|
/* @__PURE__ */ jsx(TabsList, { className: SETTINGS_TABS_LIST_CLASS, children: ["start", "success", "error"].map((item) => {
|
|
@@ -1357,7 +1357,7 @@ function LinkTemplateForm({ mode, recordId }) {
|
|
|
1357
1357
|
() => `checkout-${mode}-editor-${recordId ?? "new"}`,
|
|
1358
1358
|
[mode, recordId]
|
|
1359
1359
|
);
|
|
1360
|
-
const lockedNotice = isLocked ? /* @__PURE__ */ jsxs(Alert, {
|
|
1360
|
+
const lockedNotice = isLocked ? /* @__PURE__ */ jsxs(Alert, { status: "warning", children: [
|
|
1361
1361
|
/* @__PURE__ */ jsx(AlertTitle, { children: t("checkout.linkTemplateForm.locked.title") }),
|
|
1362
1362
|
/* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.linkTemplateForm.locked.description") })
|
|
1363
1363
|
] }) : void 0;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/checkout/components/LinkTemplateForm.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useSearchParams } from 'next/navigation'\nimport { useT, type TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport {\n AlertTriangle,\n BadgeCheck,\n CircleDollarSign,\n Eye,\n FileCheck2,\n FileText,\n IdCard,\n MessageSquare,\n Plus,\n Send,\n Shield,\n Sparkles,\n Trash2,\n WalletCards,\n} from 'lucide-react'\nimport { slugify } from '@open-mercato/shared/lib/slugify'\nimport { CrudForm, type CrudField, type CrudFormGroup, type CrudFormGroupComponentProps } from '@open-mercato/ui/backend/CrudForm'\nimport { ComboboxInput, type ComboboxOption } from '@open-mercato/ui/backend/inputs'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { RecordNotFoundState } from '@open-mercato/ui/backend/detail'\nimport { SwitchableMarkdownInput } from '@open-mercato/ui/backend/inputs'\nimport { apiCall, apiCallOrThrow, readApiResultOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ColorPicker } from '@open-mercato/ui/primitives/color-picker'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { PasswordInput } from '@open-mercato/ui/primitives/password-input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'\nimport { CHECKOUT_ENTITY_IDS } from '../lib/constants'\nimport { getLocalizedDefaultCheckoutCustomerFields } from '../lib/defaults'\nimport type { CustomerFieldDefinitionInput, PriceListItemInput } from '../data/validators'\nimport { getGatewayProviderConfigurationMessageKey } from '../lib/gatewayProviderAvailability'\nimport { readCustomerFieldsSectionError } from '../lib/customerFieldErrors'\nimport { isRecordNotFoundError } from '../lib/recordNotFound'\nimport { CheckoutCurrencySelect } from './CheckoutCurrencySelect'\nimport { CustomerFieldsEditor } from './CustomerFieldsEditor'\nimport { GatewaySettingsFields } from './GatewaySettingsFields'\nimport { LogoUploadField } from './LogoUploadField'\n\ntype Props = {\n mode: 'link' | 'template'\n recordId?: string\n}\n\ntype FormValues = Record<string, unknown>\n\ntype ProviderDescriptor = {\n providerKey: string\n label: string\n isConfigured?: boolean\n requiresConfiguration?: boolean\n configurationStatus?: 'configured' | 'missing_credentials' | 'disabled' | 'unmanaged' | null\n}\n\ntype TemplateSummary = {\n id: string\n name: string\n title?: string | null\n pricingMode?: string | null\n gatewayProviderKey?: string | null\n}\n\ntype LegalDocumentValue = {\n title: string\n markdown: string\n required: boolean\n}\n\ntype LegalDocumentsValue = {\n terms: LegalDocumentValue\n privacyPolicy: LegalDocumentValue\n}\n\ntype PriceListItem = PriceListItemInput\n\nconst DEFAULT_COLORS = {\n primaryColor: '#1E3A8A',\n secondaryColor: '#F59E0B',\n backgroundColor: '#F8F4EE',\n} as const\n\nconst SETTINGS_TABS_LIST_CLASS = 'h-auto w-full justify-start overflow-x-auto rounded-none border-b border-border bg-transparent p-0'\nconst SETTINGS_TABS_TRIGGER_CLASS = 'mr-8 h-auto rounded-none border-b-2 border-transparent bg-transparent px-0 py-2.5 text-sm font-medium text-muted-foreground shadow-none transition-colors hover:bg-transparent hover:text-foreground aria-selected:border-accent-indigo aria-selected:bg-transparent aria-selected:text-foreground aria-selected:shadow-none last:mr-0'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction readString(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction readNumberInputValue(value: unknown): string {\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n if (typeof value === 'string') return value\n return ''\n}\n\nfunction readBoolean(value: unknown, fallback = false): boolean {\n return typeof value === 'boolean' ? value : fallback\n}\n\nfunction cloneDefaultCustomerFields(t?: TranslateFn): CustomerFieldDefinitionInput[] {\n return getLocalizedDefaultCheckoutCustomerFields(t).map((field) => ({\n ...field,\n placeholder: typeof field.placeholder === 'string' ? field.placeholder : undefined,\n }))\n}\n\nfunction createDefaultLegalDocuments(): LegalDocumentsValue {\n return {\n terms: { title: '', markdown: '', required: false },\n privacyPolicy: { title: '', markdown: '', required: false },\n }\n}\n\nfunction createDefaultValues(t?: TranslateFn): FormValues {\n return {\n name: '',\n title: '',\n subtitle: '',\n description: '',\n slug: '',\n logoAttachmentId: null,\n logoUrl: null,\n ...DEFAULT_COLORS,\n themeMode: 'auto',\n displayCustomFieldsOnPage: false,\n pricingMode: 'fixed',\n fixedPriceAmount: null,\n fixedPriceCurrencyCode: 'USD',\n fixedPriceIncludesTax: true,\n fixedPriceOriginalAmount: null,\n customAmountMin: null,\n customAmountMax: null,\n customAmountCurrencyCode: 'USD',\n priceListItems: [],\n gatewayProviderKey: '',\n gatewaySettings: {},\n templateId: null,\n customFieldsetCode: null,\n collectCustomerDetails: true,\n customerFieldsSchema: cloneDefaultCustomerFields(t),\n legalDocuments: createDefaultLegalDocuments(),\n status: 'draft',\n maxCompletions: null,\n password: '',\n successTitle: '',\n successMessage: '',\n cancelTitle: '',\n cancelMessage: '',\n errorTitle: '',\n errorMessage: '',\n startEmailSubject: '',\n startEmailBody: '',\n sendStartEmail: true,\n successEmailSubject: '',\n successEmailBody: '',\n sendSuccessEmail: true,\n errorEmailSubject: '',\n errorEmailBody: '',\n sendErrorEmail: true,\n }\n}\n\nfunction normalizePriceListItems(value: unknown): PriceListItem[] {\n if (!Array.isArray(value)) return []\n return value\n .map((item) => {\n if (!isRecord(item)) return null\n const id = readString(item.id).trim()\n const description = readString(item.description)\n const amount = Number(item.amount ?? 0)\n const currencyCode = readString(item.currencyCode).trim().toUpperCase()\n return {\n id: id || `item_${Date.now()}`,\n description,\n amount: Number.isFinite(amount) ? amount : 0,\n currencyCode: currencyCode || 'USD',\n }\n })\n .filter((item): item is PriceListItem => item !== null)\n}\n\nfunction normalizeCustomerFields(value: unknown, t?: TranslateFn): CustomerFieldDefinitionInput[] {\n if (!Array.isArray(value)) return cloneDefaultCustomerFields(t)\n return value.reduce<CustomerFieldDefinitionInput[]>((result, field, index) => {\n if (!isRecord(field)) return result\n const key = readString(field.key).trim()\n const label = readString(field.label).trim()\n const kind = readString(field.kind)\n if (!key || !label) return result\n if (!['text', 'multiline', 'boolean', 'select', 'radio'].includes(kind)) return result\n const options = Array.isArray(field.options)\n ? field.options.reduce<Array<{ value: string; label: string }>>((optionResult, option) => {\n if (!isRecord(option)) return optionResult\n const valuePart = readString(option.value).trim()\n const labelPart = readString(option.label).trim()\n if (!valuePart || !labelPart) return optionResult\n optionResult.push({ value: valuePart, label: labelPart })\n return optionResult\n }, [])\n : []\n result.push({\n key,\n label,\n kind: kind as CustomerFieldDefinitionInput['kind'],\n required: readBoolean(field.required),\n fixed: readBoolean(field.fixed),\n placeholder: readString(field.placeholder).trim() || undefined,\n options,\n sortOrder: typeof field.sortOrder === 'number' ? field.sortOrder : index,\n })\n return result\n }, [])\n}\n\nfunction readCustomerFields(value: unknown, t?: TranslateFn): CustomerFieldDefinitionInput[] {\n return Array.isArray(value) ? value as CustomerFieldDefinitionInput[] : cloneDefaultCustomerFields(t)\n}\n\nfunction normalizeLegalDocuments(value: unknown): LegalDocumentsValue {\n const defaults = createDefaultLegalDocuments()\n if (!isRecord(value)) return defaults\n const normalizeDocument = (raw: unknown, fallback: LegalDocumentValue): LegalDocumentValue => {\n if (!isRecord(raw)) return fallback\n return {\n title: readString(raw.title),\n markdown: readString(raw.markdown),\n required: readBoolean(raw.required),\n }\n }\n return {\n terms: normalizeDocument(value.terms, defaults.terms),\n privacyPolicy: normalizeDocument(value.privacyPolicy, defaults.privacyPolicy),\n }\n}\n\nfunction normalizeFormValues(value: FormValues | null | undefined, t?: TranslateFn): FormValues {\n const defaults = createDefaultValues(t)\n const source = isRecord(value) ? value : {}\n const customFields = isRecord(source.customFields) ? source.customFields : {}\n\n const prefixedCustomFieldValues = Object.fromEntries(\n Object.entries(customFields).map(([key, fieldValue]) => [`cf_${key}`, fieldValue]),\n )\n\n return {\n ...defaults,\n ...source,\n ...prefixedCustomFieldValues,\n logoAttachmentId: readString(source.logoAttachmentId).trim() || null,\n logoUrl: readString(source.logoUrl).trim() || null,\n primaryColor: readString(source.primaryColor).trim() || defaults.primaryColor,\n secondaryColor: readString(source.secondaryColor).trim() || defaults.secondaryColor,\n backgroundColor: readString(source.backgroundColor).trim() || defaults.backgroundColor,\n gatewayProviderKey: readString(source.gatewayProviderKey).trim(),\n gatewaySettings: isRecord(source.gatewaySettings) ? source.gatewaySettings : {},\n customFieldsetCode: readString(source.customFieldsetCode).trim() || null,\n collectCustomerDetails: readBoolean(source.collectCustomerDetails, true),\n customerFieldsSchema: normalizeCustomerFields(source.customerFieldsSchema, t),\n legalDocuments: normalizeLegalDocuments(source.legalDocuments),\n priceListItems: normalizePriceListItems(source.priceListItems),\n fixedPriceCurrencyCode: readString(source.fixedPriceCurrencyCode).trim().toUpperCase() || 'USD',\n customAmountCurrencyCode: readString(source.customAmountCurrencyCode).trim().toUpperCase() || 'USD',\n sendStartEmail: readBoolean(source.sendStartEmail, true),\n sendSuccessEmail: readBoolean(source.sendSuccessEmail, true),\n sendErrorEmail: readBoolean(source.sendErrorEmail, true),\n }\n}\n\nfunction readError(errors: Record<string, string>, path: string): string | undefined {\n if (!path) return undefined\n if (errors[path]) return errors[path]\n const prefix = `${path}.`\n const nestedEntry = Object.entries(errors).find(([key]) => key.startsWith(prefix))\n return nestedEntry?.[1]\n}\n\nfunction readDirectError(errors: Record<string, string>, path: string): string | undefined {\n if (!path) return undefined\n return errors[path]\n}\n\nfunction readAnyError(errors: Record<string, string>, ...paths: string[]): string | undefined {\n for (const path of paths) {\n const error = readError(errors, path)\n if (error) return error\n }\n return undefined\n}\n\nfunction toTemplateOption(template: TemplateSummary): ComboboxOption {\n const title = typeof template.title === 'string' ? template.title.trim() : ''\n const provider = typeof template.gatewayProviderKey === 'string' ? template.gatewayProviderKey.trim() : ''\n const parts = [title, provider].filter((part) => part.length > 0)\n return {\n value: template.id,\n label: template.name,\n description: parts.length > 0 ? parts.join(' \u2022 ') : null,\n }\n}\n\nfunction errorInputClassName(error?: string): string | undefined {\n return error ? 'border-destructive aria-invalid:ring-destructive' : undefined\n}\n\nfunction SectionLabel({\n label,\n hint,\n error,\n required,\n children,\n}: {\n label: string\n hint?: string\n error?: string\n required?: boolean\n children: React.ReactNode\n}) {\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <Label className=\"gap-0\">\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </Label>\n {hint ? <p className=\"text-xs text-muted-foreground\">{hint}</p> : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n {children}\n </div>\n )\n}\n\nfunction ColorField({\n label,\n value,\n onChange,\n error,\n}: {\n label: string\n value: string\n onChange: (next: string) => void\n error?: string\n}) {\n const pickerValue = /^#([0-9a-fA-F]{6})$/.test(value) ? value : '#000000'\n return (\n <SectionLabel label={label} error={error}>\n <div className=\"flex items-center gap-3\">\n <ColorPicker\n value={pickerValue}\n onChange={(next) => onChange(next.toUpperCase())}\n aria-label={label}\n />\n <Input\n value={value}\n onChange={(event) => onChange(event.target.value.toUpperCase())}\n placeholder=\"#1E3A8A\"\n className={error ? `min-w-0 ${errorInputClassName(error)}` : 'min-w-0'}\n aria-invalid={Boolean(error)}\n />\n </div>\n </SectionLabel>\n )\n}\n\nfunction PriceListEditor({\n value,\n onChange,\n error,\n}: {\n value: PriceListItem[]\n onChange: (next: PriceListItem[]) => void\n error?: string\n}) {\n const t = useT()\n const items = Array.isArray(value) ? value : []\n\n const updateItem = React.useCallback(\n (index: number, patch: Partial<PriceListItem>) => {\n onChange(items.map((item, currentIndex) => (currentIndex === index ? { ...item, ...patch } : item)))\n },\n [items, onChange],\n )\n\n const addItem = React.useCallback(() => {\n onChange([\n ...items,\n {\n id: `item_${items.length + 1}`,\n description: '',\n amount: 0,\n currencyCode: items[0]?.currencyCode ?? 'USD',\n },\n ])\n }, [items, onChange])\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.priceList.notices.singleCurrency')}\n </AlertDescription>\n </Alert>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n\n <div className=\"overflow-hidden rounded-xl border border-border/70 bg-background\">\n {items.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[760px] table-fixed\">\n <thead className=\"border-b bg-muted/30\">\n <tr className=\"text-left text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-3 py-2 w-[22%]\">{t('checkout.linkTemplateForm.priceList.columns.itemCode')}</th>\n <th className=\"px-3 py-2\">{t('checkout.linkTemplateForm.priceList.columns.description')}</th>\n <th className=\"px-3 py-2 w-[16%]\">{t('checkout.linkTemplateForm.priceList.columns.amount')}</th>\n <th className=\"px-3 py-2 w-[24%]\">{t('checkout.linkTemplateForm.priceList.columns.currency')}</th>\n <th className=\"px-3 py-2 w-[110px] text-right\">{t('checkout.linkTemplateForm.priceList.columns.actions')}</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border/70\">\n {items.map((item, index) => (\n <tr key={`${item.id}:${index}`} className=\"align-top\">\n <td className=\"px-3 py-2\">\n <Input\n value={item.id}\n onChange={(event) => updateItem(index, { id: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.priceList.placeholders.itemCode')}\n aria-label={t('checkout.linkTemplateForm.priceList.aria.itemCode', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={item.description}\n onChange={(event) => updateItem(index, { description: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.priceList.placeholders.description')}\n aria-label={t('checkout.linkTemplateForm.priceList.aria.description', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={item.amount}\n onChange={(event) => updateItem(index, { amount: Number(event.target.value) })}\n placeholder=\"0.00\"\n aria-label={t('checkout.linkTemplateForm.priceList.aria.amount', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <CheckoutCurrencySelect\n value={item.currencyCode}\n onChange={(next) => updateItem(index, { currencyCode: next })}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </td>\n <td className=\"px-3 py-2 text-right\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onChange(items.filter((_, currentIndex) => currentIndex !== index))}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.remove')}\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <div className=\"px-4 py-8\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.priceList.notices.empty')}\n </AlertDescription>\n </Alert>\n </div>\n )}\n </div>\n\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={addItem}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.priceList.actions.addItem')}\n </Button>\n </div>\n )\n}\n\nfunction PricingSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const pricingMode = readString(values.pricingMode) || 'fixed'\n const pricingModeError = readError(errors, 'pricingMode')\n const fixedPriceAmountError = readError(errors, 'fixedPriceAmount')\n const fixedPriceCurrencyError = readError(errors, 'fixedPriceCurrencyCode')\n const fixedPriceOriginalAmountError = readError(errors, 'fixedPriceOriginalAmount')\n const customAmountMinError = readError(errors, 'customAmountMin')\n const customAmountMaxError = readError(errors, 'customAmountMax')\n const customAmountCurrencyError = readError(errors, 'customAmountCurrencyCode')\n const priceListItemsError = readError(errors, 'priceListItems')\n\n return (\n <div className=\"space-y-4\">\n {pricingModeError ? <p className=\"text-xs text-destructive\">{pricingModeError}</p> : null}\n <div className=\"flex flex-wrap gap-2\">\n {[\n { id: 'fixed', label: t('checkout.linkTemplateForm.pricing.modes.fixed'), icon: CircleDollarSign },\n { id: 'custom_amount', label: t('checkout.linkTemplateForm.pricing.modes.customAmount'), icon: WalletCards },\n { id: 'price_list', label: t('checkout.linkTemplateForm.pricing.modes.priceList'), icon: FileText },\n ].map((mode) => {\n const Icon = mode.icon\n const active = pricingMode === mode.id\n return (\n <Button\n key={mode.id}\n type=\"button\"\n variant={active ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setValue('pricingMode', mode.id)}\n >\n <Icon className=\"mr-2 h-4 w-4\" />\n {mode.label}\n </Button>\n )\n })}\n </div>\n\n {pricingMode === 'fixed' ? (\n <div className=\"grid gap-4 md:grid-cols-2\">\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.amount')} error={fixedPriceAmountError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.fixedPriceAmount)}\n onChange={(event) => setValue('fixedPriceAmount', Number(event.target.value))}\n placeholder=\"150\"\n className={errorInputClassName(fixedPriceAmountError)}\n aria-invalid={Boolean(fixedPriceAmountError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.currency')} error={fixedPriceCurrencyError} required>\n <CheckoutCurrencySelect\n value={readString(values.fixedPriceCurrencyCode) || 'USD'}\n onChange={(next) => setValue('fixedPriceCurrencyCode', next)}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </SectionLabel>\n\n <SectionLabel\n label={t('checkout.linkTemplateForm.pricing.fields.compareAtPrice')}\n hint={t('checkout.linkTemplateForm.pricing.hints.compareAtPrice')}\n error={fixedPriceOriginalAmountError}\n >\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.fixedPriceOriginalAmount)}\n onChange={(event) => setValue('fixedPriceOriginalAmount', Number(event.target.value))}\n placeholder=\"200\"\n className={errorInputClassName(fixedPriceOriginalAmountError)}\n aria-invalid={Boolean(fixedPriceOriginalAmountError)}\n />\n </SectionLabel>\n\n <div className=\"flex items-end\">\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values.fixedPriceIncludesTax, true)}\n onChange={(event) => setValue('fixedPriceIncludesTax', event.target.checked)}\n />\n {t('checkout.linkTemplateForm.pricing.fields.includesTax')}\n </label>\n </div>\n </div>\n ) : null}\n\n {pricingMode === 'custom_amount' ? (\n <div className=\"grid gap-4 md:grid-cols-3\">\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.minimumAmount')} error={customAmountMinError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.customAmountMin)}\n onChange={(event) => setValue('customAmountMin', Number(event.target.value))}\n placeholder=\"10\"\n className={errorInputClassName(customAmountMinError)}\n aria-invalid={Boolean(customAmountMinError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.maximumAmount')} error={customAmountMaxError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.customAmountMax)}\n onChange={(event) => setValue('customAmountMax', Number(event.target.value))}\n placeholder=\"500\"\n className={errorInputClassName(customAmountMaxError)}\n aria-invalid={Boolean(customAmountMaxError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.currency')} error={customAmountCurrencyError} required>\n <CheckoutCurrencySelect\n value={readString(values.customAmountCurrencyCode) || 'USD'}\n onChange={(next) => setValue('customAmountCurrencyCode', next)}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </SectionLabel>\n </div>\n ) : null}\n\n {pricingMode === 'price_list' ? (\n <PriceListEditor\n value={normalizePriceListItems(values.priceListItems)}\n onChange={(next) => setValue('priceListItems', next)}\n error={priceListItemsError}\n />\n ) : null}\n </div>\n )\n}\n\nfunction GeneralSection({\n values,\n setValue,\n errors,\n mode,\n templateOptions,\n loadTemplateSuggestions,\n applyTemplate,\n isApplyingTemplate,\n}: CrudFormGroupComponentProps & {\n mode: 'link' | 'template'\n templateOptions: ComboboxOption[]\n loadTemplateSuggestions: (query?: string) => Promise<ComboboxOption[]>\n applyTemplate: (templateId: string | null) => Promise<void>\n isApplyingTemplate: boolean\n}) {\n const t = useT()\n const fallbackSlug = slugify(\n readString(values.title).trim().length > 0\n ? readString(values.title)\n : readString(values.name),\n ) || 'pay-link'\n const currentSlug = readString(values.slug)\n const resolvedSlug = currentSlug.trim() || fallbackSlug\n const currentTemplateId = readString(values.templateId).trim()\n const nameError = readError(errors, 'name')\n const titleError = readError(errors, 'title')\n const subtitleError = readError(errors, 'subtitle')\n const descriptionError = readError(errors, 'description')\n const slugError = readError(errors, 'slug')\n const templateError = readError(errors, 'templateId')\n\n return (\n <div className=\"space-y-4\">\n {mode === 'link' ? (\n <SectionLabel\n label={t('checkout.linkTemplateForm.general.fields.template')}\n hint={t('checkout.linkTemplateForm.general.hints.template')}\n error={templateError}\n >\n <div className=\"space-y-3\">\n <ComboboxInput\n value={currentTemplateId}\n suggestions={templateOptions}\n loadSuggestions={loadTemplateSuggestions}\n resolveLabel={(value) => templateOptions.find((option) => option.value === value)?.label ?? value}\n resolveDescription={(value) => templateOptions.find((option) => option.value === value)?.description}\n onChange={(nextValue) => {\n const normalized = nextValue.trim()\n setValue('templateId', normalized || null)\n void applyTemplate(normalized || null)\n }}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.template')}\n disabled={isApplyingTemplate}\n allowCustomValues={false}\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={isApplyingTemplate || currentTemplateId.length === 0}\n onClick={() => {\n setValue('templateId', null)\n void applyTemplate(null)\n }}\n >\n {t('checkout.linkTemplateForm.general.actions.clearTemplate')}\n </Button>\n {isApplyingTemplate ? (\n <p className=\"text-xs text-muted-foreground\">\n {t('checkout.linkTemplateForm.general.status.applyingTemplate')}\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t('checkout.linkTemplateForm.general.notices.templateReplacement')}\n </p>\n )}\n </div>\n </div>\n </SectionLabel>\n ) : null}\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.name')} error={nameError} required>\n <Input\n value={readString(values.name)}\n onChange={(event) => setValue('name', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.name')}\n className={errorInputClassName(nameError)}\n aria-invalid={Boolean(nameError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.title')} error={titleError}>\n <Input\n value={readString(values.title)}\n onChange={(event) => setValue('title', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.title')}\n className={errorInputClassName(titleError)}\n aria-invalid={Boolean(titleError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.subtitle')} error={subtitleError}>\n <Input\n value={readString(values.subtitle)}\n onChange={(event) => setValue('subtitle', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.subtitle')}\n className={errorInputClassName(subtitleError)}\n aria-invalid={Boolean(subtitleError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.description')} hint={t('checkout.linkTemplateForm.general.hints.description')} error={descriptionError}>\n <SwitchableMarkdownInput\n value={readString(values.description)}\n onChange={(next) => setValue('description', next)}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.description')}\n />\n </SectionLabel>\n\n {mode === 'link' ? (\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.slug')} hint={t('checkout.linkTemplateForm.general.hints.slug')} error={slugError}>\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <Input\n value={currentSlug}\n onChange={(event) => setValue('slug', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.slug')}\n className={errorInputClassName(slugError)}\n aria-invalid={Boolean(slugError)}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setValue('slug', fallbackSlug)}\n >\n <Sparkles className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.general.actions.generateSlug')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">{t('checkout.linkTemplateForm.general.slugPreview', { slug: resolvedSlug })}</p>\n </div>\n </SectionLabel>\n ) : null}\n </div>\n )\n}\n\nfunction AppearanceSection({\n values,\n setValue,\n errors,\n entityId,\n attachmentRecordId,\n}: CrudFormGroupComponentProps & { entityId: string; attachmentRecordId: string }) {\n const t = useT()\n const logoError = readAnyError(errors, 'logoAttachmentId', 'logoUrl')\n const primaryColorError = readError(errors, 'primaryColor')\n const secondaryColorError = readError(errors, 'secondaryColor')\n const backgroundColorError = readError(errors, 'backgroundColor')\n const themeModeError = readError(errors, 'themeMode')\n const displayCustomFieldsError = readError(errors, 'displayCustomFieldsOnPage')\n\n return (\n <div className=\"space-y-4\">\n <LogoUploadField\n entityId={entityId}\n recordId={attachmentRecordId}\n attachmentId={readString(values.logoAttachmentId) || null}\n logoUrl={readString(values.logoUrl) || null}\n error={logoError}\n onChange={(next) => {\n setValue('logoAttachmentId', next.logoAttachmentId)\n setValue('logoUrl', next.logoUrl)\n }}\n />\n\n <div className=\"space-y-4\">\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.primaryColor')}\n value={readString(values.primaryColor) || DEFAULT_COLORS.primaryColor}\n onChange={(next) => setValue('primaryColor', next)}\n error={primaryColorError}\n />\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.secondaryColor')}\n value={readString(values.secondaryColor) || DEFAULT_COLORS.secondaryColor}\n onChange={(next) => setValue('secondaryColor', next)}\n error={secondaryColorError}\n />\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.backgroundColor')}\n value={readString(values.backgroundColor) || DEFAULT_COLORS.backgroundColor}\n onChange={(next) => setValue('backgroundColor', next)}\n error={backgroundColorError}\n />\n </div>\n\n <SectionLabel label={t('checkout.linkTemplateForm.appearance.fields.themeMode')} error={themeModeError}>\n <select\n className={themeModeError\n ? `w-full rounded-md border bg-background px-3 py-2 text-sm ${errorInputClassName(themeModeError)}`\n : 'w-full rounded-md border bg-background px-3 py-2 text-sm'}\n value={readString(values.themeMode) || 'auto'}\n onChange={(event) => setValue('themeMode', event.target.value)}\n aria-invalid={Boolean(themeModeError)}\n >\n <option value=\"auto\">{t('checkout.linkTemplateForm.appearance.themeModes.auto')}</option>\n <option value=\"light\">{t('checkout.linkTemplateForm.appearance.themeModes.light')}</option>\n <option value=\"dark\">{t('checkout.linkTemplateForm.appearance.themeModes.dark')}</option>\n </select>\n </SectionLabel>\n\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values.displayCustomFieldsOnPage)}\n onChange={(event) => setValue('displayCustomFieldsOnPage', event.target.checked)}\n />\n {t('checkout.linkTemplateForm.appearance.fields.displayCustomFields')}\n </label>\n {displayCustomFieldsError ? <p className=\"text-xs text-destructive\">{displayCustomFieldsError}</p> : null}\n </div>\n )\n}\n\nfunction PaymentSection({ values, setValue, errors, providers }: CrudFormGroupComponentProps & { providers: ProviderDescriptor[] }) {\n const t = useT()\n const selectedProviderKey = readString(values.gatewayProviderKey)\n const selectedProvider = providers.find((provider) => provider.providerKey === selectedProviderKey)\n const gatewayProviderError = readError(errors, 'gatewayProviderKey')\n ?? (() => {\n const messageKey = getGatewayProviderConfigurationMessageKey(selectedProvider)\n return messageKey ? t(messageKey) : undefined\n })()\n const gatewaySettingsError = readError(errors, 'gatewaySettings')\n\n return (\n <div className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.payment.fields.gatewayProvider')} error={gatewayProviderError} required>\n <select\n className={gatewayProviderError\n ? `w-full rounded-md border bg-background px-3 py-2 text-sm ${errorInputClassName(gatewayProviderError)}`\n : 'w-full rounded-md border bg-background px-3 py-2 text-sm'}\n value={readString(values.gatewayProviderKey)}\n onChange={(event) => setValue('gatewayProviderKey', event.target.value)}\n aria-invalid={Boolean(gatewayProviderError)}\n >\n <option value=\"\">{t('checkout.linkTemplateForm.payment.placeholders.provider')}</option>\n {providers.map((provider) => (\n <option\n key={provider.providerKey}\n value={provider.providerKey}\n disabled={provider.isConfigured === false}\n >\n {provider.isConfigured === false\n ? `${provider.label} ${t('checkout.linkTemplateForm.payment.providerUnavailableSuffix')}`\n : provider.label}\n </option>\n ))}\n </select>\n </SectionLabel>\n\n <GatewaySettingsFields\n providerKey={readString(values.gatewayProviderKey) || null}\n value={isRecord(values.gatewaySettings) ? values.gatewaySettings : {}}\n onChange={(next) => setValue('gatewaySettings', next)}\n />\n {gatewaySettingsError ? <p className=\"text-xs text-destructive\">{gatewaySettingsError}</p> : null}\n </div>\n )\n}\n\nfunction CustomerDetailsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const collectCustomerDetails = readBoolean(values.collectCustomerDetails, true)\n const collectCustomerDetailsError = readError(errors, 'collectCustomerDetails')\n const customerFieldsError = readCustomerFieldsSectionError(errors)\n\n return (\n <div className=\"space-y-4\">\n <label className=\"flex items-start gap-3 rounded-xl border border-border/70 bg-muted/30 px-4 py-3 text-sm\">\n <input\n type=\"checkbox\"\n checked={collectCustomerDetails}\n onChange={(event) => setValue('collectCustomerDetails', event.target.checked)}\n />\n <span className=\"space-y-1\">\n <span className=\"flex items-center gap-2 font-medium\">\n <IdCard className=\"h-4 w-4\" />\n {t('checkout.linkTemplateForm.customerDetails.title')}\n </span>\n <span className=\"block text-muted-foreground\">\n {t('checkout.linkTemplateForm.customerDetails.description')}\n </span>\n </span>\n </label>\n {collectCustomerDetailsError ? <p className=\"text-xs text-destructive\">{collectCustomerDetailsError}</p> : null}\n\n {collectCustomerDetails ? (\n <>\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.customerDetails.notices.simpleLink')}\n </AlertDescription>\n </Alert>\n {customerFieldsError ? <p className=\"text-xs text-destructive\">{customerFieldsError}</p> : null}\n <CustomerFieldsEditor\n value={readCustomerFields(values.customerFieldsSchema, t)}\n onChange={(next) => setValue('customerFieldsSchema', next)}\n errors={errors}\n />\n </>\n ) : (\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.customerDetails.notices.disabled')}\n </AlertDescription>\n </Alert>\n )}\n </div>\n )\n}\n\nfunction LegalSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'terms' | 'privacyPolicy'>('terms')\n const legalDocuments = normalizeLegalDocuments(values.legalDocuments)\n const termsTitleError = readAnyError(errors, 'legalDocuments.terms.title', 'legalDocuments.terms')\n const termsMarkdownError = readAnyError(errors, 'legalDocuments.terms.markdown', 'legalDocuments.terms')\n const privacyTitleError = readAnyError(errors, 'legalDocuments.privacyPolicy.title', 'legalDocuments.privacyPolicy')\n const privacyMarkdownError = readAnyError(errors, 'legalDocuments.privacyPolicy.markdown', 'legalDocuments.privacyPolicy')\n\n const patchDocument = React.useCallback(\n (key: 'terms' | 'privacyPolicy', patch: Partial<LegalDocumentValue>) => {\n setValue('legalDocuments', {\n ...legalDocuments,\n [key]: {\n ...legalDocuments[key],\n ...patch,\n },\n })\n },\n [legalDocuments, setValue],\n )\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.legal.notice')}\n </AlertDescription>\n </Alert>\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'terms' | 'privacyPolicy')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n <TabsTrigger value=\"terms\" className={SETTINGS_TABS_TRIGGER_CLASS}>\n <Shield className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.legal.tabs.terms')}\n </TabsTrigger>\n <TabsTrigger value=\"privacyPolicy\" className={SETTINGS_TABS_TRIGGER_CLASS}>\n <FileCheck2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.legal.tabs.privacy')}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"terms\" className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.termsTitle')} error={termsTitleError}>\n <Input\n value={legalDocuments.terms.title}\n onChange={(event) => patchDocument('terms', { title: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.termsTitle')}\n className={errorInputClassName(termsTitleError)}\n aria-invalid={Boolean(termsTitleError)}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.termsBody')} error={termsMarkdownError}>\n <SwitchableMarkdownInput\n value={legalDocuments.terms.markdown}\n onChange={(next) => patchDocument('terms', { markdown: next })}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.termsBody')}\n />\n </SectionLabel>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={legalDocuments.terms.required}\n onChange={(event) => patchDocument('terms', { required: event.target.checked })}\n />\n {t('checkout.linkTemplateForm.legal.fields.acceptanceRequired')}\n </label>\n </TabsContent>\n\n <TabsContent value=\"privacyPolicy\" className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.privacyTitle')} error={privacyTitleError}>\n <Input\n value={legalDocuments.privacyPolicy.title}\n onChange={(event) => patchDocument('privacyPolicy', { title: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.privacyTitle')}\n className={errorInputClassName(privacyTitleError)}\n aria-invalid={Boolean(privacyTitleError)}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.privacyBody')} error={privacyMarkdownError}>\n <SwitchableMarkdownInput\n value={legalDocuments.privacyPolicy.markdown}\n onChange={(next) => patchDocument('privacyPolicy', { markdown: next })}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.privacyBody')}\n />\n </SectionLabel>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={legalDocuments.privacyPolicy.required}\n onChange={(event) => patchDocument('privacyPolicy', { required: event.target.checked })}\n />\n {t('checkout.linkTemplateForm.legal.fields.acceptanceRequired')}\n </label>\n </TabsContent>\n </Tabs>\n </div>\n )\n}\n\nfunction MessagesSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'success' | 'cancel' | 'error'>('success')\n\n const config = {\n success: {\n titleKey: 'successTitle',\n bodyKey: 'successMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.successTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.successBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.success'),\n },\n cancel: {\n titleKey: 'cancelTitle',\n bodyKey: 'cancelMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.cancelTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.cancelBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.cancel'),\n },\n error: {\n titleKey: 'errorTitle',\n bodyKey: 'errorMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.errorTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.errorBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.error'),\n },\n } as const\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.messages.notice')}\n </AlertDescription>\n </Alert>\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'success' | 'cancel' | 'error')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n {(['success', 'cancel', 'error'] as const).map((item) => (\n <TabsTrigger key={item} value={item} className={SETTINGS_TABS_TRIGGER_CLASS}>\n <MessageSquare className=\"mr-2 h-4 w-4\" />\n {config[item].label}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {(['success', 'cancel', 'error'] as const).map((item) => (\n <TabsContent key={item} value={item} className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.messages.labels.title', { state: config[item].label })} error={readError(errors, config[item].titleKey)}>\n <Input\n value={readString(values[config[item].titleKey])}\n onChange={(event) => setValue(config[item].titleKey, event.target.value)}\n placeholder={config[item].titlePlaceholder}\n className={errorInputClassName(readError(errors, config[item].titleKey))}\n aria-invalid={Boolean(readError(errors, config[item].titleKey))}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.messages.labels.body', { state: config[item].label })} error={readError(errors, config[item].bodyKey)}>\n <SwitchableMarkdownInput\n value={readString(values[config[item].bodyKey])}\n onChange={(next) => setValue(config[item].bodyKey, next)}\n isMarkdownEnabled\n height={220}\n placeholder={config[item].bodyPlaceholder}\n />\n </SectionLabel>\n </TabsContent>\n ))}\n </Tabs>\n </div>\n )\n}\n\nfunction VariableHint() {\n const t = useT()\n const variables = ['{{firstName}}', '{{amount}}', '{{currencyCode}}', '{{linkTitle}}', '{{transactionId}}', '{{errorMessage}}']\n return (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-muted-foreground\">{t('checkout.linkTemplateForm.emails.variableHint')}</p>\n <div className=\"flex flex-wrap gap-2\">\n {variables.map((variable) => (\n <span\n key={variable}\n className=\"rounded-full border border-border/70 bg-background px-2 py-1 text-xs text-muted-foreground\"\n >\n {variable}\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction EmailsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'start' | 'success' | 'error'>('start')\n\n const config = {\n start: {\n enabledKey: 'sendStartEmail',\n subjectKey: 'startEmailSubject',\n bodyKey: 'startEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.start'),\n Icon: Send,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.startSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.startBody'),\n },\n success: {\n enabledKey: 'sendSuccessEmail',\n subjectKey: 'successEmailSubject',\n bodyKey: 'successEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.success'),\n Icon: BadgeCheck,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.successSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.successBody'),\n },\n error: {\n enabledKey: 'sendErrorEmail',\n subjectKey: 'errorEmailSubject',\n bodyKey: 'errorEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.error'),\n Icon: AlertTriangle,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.errorSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.errorBody'),\n },\n } as const\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.emails.notice')}\n </AlertDescription>\n </Alert>\n <VariableHint />\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'start' | 'success' | 'error')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n {(['start', 'success', 'error'] as const).map((item) => {\n const Icon = config[item].Icon\n return (\n <TabsTrigger key={item} value={item} className={SETTINGS_TABS_TRIGGER_CLASS}>\n <Icon className=\"mr-2 h-4 w-4\" />\n {config[item].title}\n </TabsTrigger>\n )\n })}\n </TabsList>\n\n {(['start', 'success', 'error'] as const).map((item) => (\n <TabsContent key={item} value={item} className=\"space-y-4\">\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values[config[item].enabledKey], true)}\n onChange={(event) => setValue(config[item].enabledKey, event.target.checked)}\n />\n {t('checkout.linkTemplateForm.emails.sendToCustomer')}\n </label>\n\n <SectionLabel label={t('checkout.linkTemplateForm.emails.labels.subject', { state: config[item].title })} error={readError(errors, config[item].subjectKey)}>\n <Input\n value={readString(values[config[item].subjectKey])}\n onChange={(event) => setValue(config[item].subjectKey, event.target.value)}\n placeholder={config[item].subjectPlaceholder}\n className={errorInputClassName(readError(errors, config[item].subjectKey))}\n aria-invalid={Boolean(readError(errors, config[item].subjectKey))}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.emails.labels.body', { state: config[item].title })} error={readError(errors, config[item].bodyKey)}>\n <SwitchableMarkdownInput\n value={readString(values[config[item].bodyKey])}\n onChange={(next) => setValue(config[item].bodyKey, next)}\n isMarkdownEnabled\n height={220}\n placeholder={config[item].bodyPlaceholder}\n />\n </SectionLabel>\n </TabsContent>\n ))}\n </Tabs>\n </div>\n )\n}\n\nfunction SettingsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const status = readString(values.status) || 'draft'\n const statusError = readError(errors, 'status')\n const maxCompletionsError = readError(errors, 'maxCompletions')\n const passwordError = readError(errors, 'password')\n\n return (\n <div className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.status')} error={statusError}>\n <div className=\"flex flex-wrap gap-2\">\n {[\n { id: 'draft', label: t('checkout.common.status.draft') },\n { id: 'active', label: t('checkout.common.status.active') },\n { id: 'inactive', label: t('checkout.common.status.inactive') },\n ].map((option) => (\n <Button\n key={option.id}\n type=\"button\"\n variant={status === option.id ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setValue('status', option.id)}\n >\n {option.label}\n </Button>\n ))}\n </div>\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.maxCompletions')} hint={t('checkout.linkTemplateForm.settings.hints.maxCompletions')} error={maxCompletionsError}>\n <Input\n type=\"number\"\n min=\"1\"\n step=\"1\"\n value={readNumberInputValue(values.maxCompletions)}\n onChange={(event) => setValue('maxCompletions', event.target.value ? Number(event.target.value) : null)}\n placeholder={t('checkout.linkTemplateForm.settings.placeholders.unlimited')}\n className={errorInputClassName(maxCompletionsError)}\n aria-invalid={Boolean(maxCompletionsError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.password')} hint={t('checkout.linkTemplateForm.settings.hints.password')} error={passwordError}>\n <PasswordInput\n value={readString(values.password)}\n onChange={(event) => setValue('password', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.settings.placeholders.password')}\n className={errorInputClassName(passwordError)}\n aria-invalid={Boolean(passwordError)}\n />\n </SectionLabel>\n </div>\n )\n}\n\nexport function LinkTemplateForm({ mode, recordId }: Props) {\n const t = useT()\n const searchParams = useSearchParams()\n const entityId = mode === 'link' ? CHECKOUT_ENTITY_IDS.link : CHECKOUT_ENTITY_IDS.template\n const templateId = React.useMemo(() => {\n const raw = searchParams.get('templateId')\n return raw && raw.trim().length > 0 ? raw : null\n }, [searchParams])\n const attachmentDraftRecordId = React.useMemo(\n () => recordId ?? (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function' ? crypto.randomUUID() : `draft-${Date.now()}`),\n [recordId],\n )\n const initialLogoAttachmentIdRef = React.useRef<string | null>(null)\n const [providers, setProviders] = React.useState<ProviderDescriptor[]>([])\n const [templateOptions, setTemplateOptions] = React.useState<ComboboxOption[]>([])\n const [isApplyingTemplate, setIsApplyingTemplate] = React.useState(false)\n const [formInstanceKey, setFormInstanceKey] = React.useState(0)\n const [initialValues, setInitialValues] = React.useState<FormValues | null>(\n recordId ? null : normalizeFormValues(createDefaultValues(t), t),\n )\n const [notFound, setNotFound] = React.useState(false)\n\n const replaceInitialValues = React.useCallback((nextValues: FormValues) => {\n setInitialValues(nextValues)\n setFormInstanceKey((current) => current + 1)\n }, [])\n\n React.useEffect(() => {\n initialLogoAttachmentIdRef.current = initialValues && typeof initialValues.logoAttachmentId === 'string'\n ? initialValues.logoAttachmentId\n : null\n }, [initialValues])\n\n React.useEffect(() => {\n let active = true\n void readApiResultOrThrow<{ items: ProviderDescriptor[] }>('/api/payment_gateways/providers')\n .then((result) => {\n if (!active) return\n setProviders(Array.isArray(result.items) ? result.items : [])\n })\n .catch(() => {\n if (active) setProviders([])\n })\n return () => {\n active = false\n }\n }, [])\n\n const rememberTemplateOptions = React.useCallback((items: TemplateSummary[] | ComboboxOption[]) => {\n setTemplateOptions((current) => {\n const next = new Map(current.map((option) => [option.value, option]))\n items.forEach((item) => {\n if ('value' in item) {\n next.set(item.value, item)\n return\n }\n const option = toTemplateOption(item)\n next.set(option.value, option)\n })\n return Array.from(next.values())\n })\n }, [])\n\n const loadTemplateSuggestions = React.useCallback(async (query?: string): Promise<ComboboxOption[]> => {\n const params = new URLSearchParams({\n page: '1',\n pageSize: '25',\n })\n if (query && query.trim().length > 0) {\n params.set('search', query.trim())\n }\n const result = await readApiResultOrThrow<{ items: TemplateSummary[] }>(`/api/checkout/templates?${params.toString()}`)\n const options = Array.isArray(result.items) ? result.items.map(toTemplateOption) : []\n rememberTemplateOptions(options)\n return options\n }, [rememberTemplateOptions])\n\n const applyTemplate = React.useCallback(async (nextTemplateId: string | null) => {\n if (recordId || mode !== 'link') return\n if (!nextTemplateId) {\n replaceInitialValues(normalizeFormValues(createDefaultValues(t), t))\n return\n }\n setIsApplyingTemplate(true)\n try {\n const result = await readApiResultOrThrow<FormValues>(`/api/checkout/templates/${encodeURIComponent(nextTemplateId)}`)\n rememberTemplateOptions([{\n id: nextTemplateId,\n name: readString(result.name),\n title: readString(result.title) || null,\n gatewayProviderKey: readString(result.gatewayProviderKey) || null,\n pricingMode: readString(result.pricingMode) || null,\n }])\n replaceInitialValues(\n normalizeFormValues({\n ...result,\n slug: '',\n templateId: nextTemplateId,\n }, t),\n )\n } finally {\n setIsApplyingTemplate(false)\n }\n }, [mode, recordId, rememberTemplateOptions, replaceInitialValues, t])\n\n React.useEffect(() => {\n if (mode !== 'link' || recordId) return\n void loadTemplateSuggestions()\n .catch(() => null)\n }, [loadTemplateSuggestions, mode, recordId])\n\n React.useEffect(() => {\n if (!recordId) return\n let active = true\n setNotFound(false)\n void readApiResultOrThrow<FormValues>(`/api/checkout/${mode === 'link' ? 'links' : 'templates'}/${encodeURIComponent(recordId)}`)\n .then((result) => {\n if (!active) return\n replaceInitialValues(normalizeFormValues(result, t))\n })\n .catch((error) => {\n if (!active) return\n if (isRecordNotFoundError(error)) {\n setNotFound(true)\n return\n }\n replaceInitialValues(normalizeFormValues({}, t))\n })\n return () => {\n active = false\n }\n }, [mode, recordId, replaceInitialValues, t])\n\n React.useEffect(() => {\n if (recordId || mode !== 'link' || !templateId) return\n void applyTemplate(templateId).catch(() => null)\n }, [applyTemplate, mode, recordId, templateId])\n\n React.useEffect(() => {\n const currentTemplateId = readString(initialValues?.templateId).trim()\n if (mode !== 'link' || !currentTemplateId) return\n if (templateOptions.some((option) => option.value === currentTemplateId)) return\n\n let active = true\n void readApiResultOrThrow<FormValues>(`/api/checkout/templates/${encodeURIComponent(currentTemplateId)}`)\n .then((result) => {\n if (!active) return\n rememberTemplateOptions([{\n id: currentTemplateId,\n name: readString(result.name),\n title: readString(result.title) || null,\n gatewayProviderKey: readString(result.gatewayProviderKey) || null,\n pricingMode: readString(result.pricingMode) || null,\n }])\n })\n .catch(() => null)\n\n return () => {\n active = false\n }\n }, [initialValues?.templateId, mode, rememberTemplateOptions, templateOptions])\n\n const fields = React.useMemo<CrudField[]>(() => [], [])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n {\n id: 'general',\n title: t('checkout.linkTemplateForm.groups.general'),\n column: 1,\n component: (ctx) => (\n <GeneralSection\n {...ctx}\n mode={mode}\n templateOptions={templateOptions}\n loadTemplateSuggestions={loadTemplateSuggestions}\n applyTemplate={applyTemplate}\n isApplyingTemplate={isApplyingTemplate}\n />\n ),\n },\n {\n id: 'payment',\n title: t('checkout.linkTemplateForm.groups.payment'),\n column: 2,\n component: (ctx) => <PaymentSection {...ctx} providers={providers} />,\n },\n {\n id: 'pricing',\n title: t('checkout.linkTemplateForm.groups.pricing'),\n column: 1,\n component: (ctx) => <PricingSection {...ctx} />,\n },\n {\n id: 'appearance',\n title: t('checkout.linkTemplateForm.groups.appearance'),\n column: 2,\n component: (ctx) => (\n <AppearanceSection\n {...ctx}\n entityId={entityId}\n attachmentRecordId={attachmentDraftRecordId}\n />\n ),\n },\n {\n id: 'customerFields',\n title: t('checkout.linkTemplateForm.groups.customerFields'),\n column: 1,\n component: (ctx) => <CustomerDetailsSection {...ctx} />,\n },\n {\n id: 'settings',\n title: t('checkout.linkTemplateForm.groups.settings'),\n column: 2,\n component: (ctx) => <SettingsSection {...ctx} />,\n },\n {\n id: 'legal',\n title: t('checkout.linkTemplateForm.groups.legal'),\n column: 1,\n component: (ctx) => <LegalSection {...ctx} />,\n },\n {\n id: 'messages',\n title: t('checkout.linkTemplateForm.groups.messages'),\n column: 1,\n component: (ctx) => <MessagesSection {...ctx} />,\n },\n {\n id: 'emails',\n title: t('checkout.linkTemplateForm.groups.emails'),\n column: 1,\n component: (ctx) => <EmailsSection {...ctx} />,\n },\n { id: 'customFields', title: t('checkout.linkTemplateForm.groups.customFields'), column: 2, kind: 'customFields' },\n ], [applyTemplate, attachmentDraftRecordId, entityId, isApplyingTemplate, loadTemplateSuggestions, mode, providers, t, templateOptions])\n\n const isLocked = mode === 'link' && Boolean(recordId) && readBoolean(initialValues?.isLocked)\n const formId = React.useMemo(\n () => `checkout-${mode}-editor-${recordId ?? 'new'}`,\n [mode, recordId],\n )\n const lockedNotice = isLocked ? (\n <Alert variant=\"warning\">\n <AlertTitle>{t('checkout.linkTemplateForm.locked.title')}</AlertTitle>\n <AlertDescription>{t('checkout.linkTemplateForm.locked.description')}</AlertDescription>\n </Alert>\n ) : undefined\n const lockedOverlay = isLocked ? (\n <div className=\"mx-auto mt-6 max-w-md rounded-xl border border-status-warning-border bg-background/95 px-5 py-4 text-center shadow-sm\">\n <div className=\"mx-auto mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-status-warning-bg text-status-warning-icon\">\n <Shield className=\"h-5 w-5\" />\n </div>\n <p className=\"text-sm font-semibold text-foreground\">\n {t('checkout.linkTemplateForm.locked.overlayTitle')}\n </p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {t('checkout.linkTemplateForm.locked.overlayDescription')}\n </p>\n </div>\n ) : undefined\n\n const listHref = mode === 'link' ? '/backend/checkout/pay-links' : '/backend/checkout/templates'\n\n if (notFound) {\n return (\n <Page>\n <PageBody>\n <RecordNotFoundState\n label={t(mode === 'link'\n ? 'checkout.linkTemplateForm.notFound.link.title'\n : 'checkout.linkTemplateForm.notFound.template.title')}\n description={t(mode === 'link'\n ? 'checkout.linkTemplateForm.notFound.link.description'\n : 'checkout.linkTemplateForm.notFound.template.description')}\n backHref={listHref}\n />\n </PageBody>\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n {initialValues ? (\n <CrudForm<FormValues>\n key={formInstanceKey}\n formId={formId}\n title={recordId\n ? t(mode === 'link' ? 'checkout.linkTemplateForm.titles.editLink' : 'checkout.linkTemplateForm.titles.editTemplate')\n : t(mode === 'link' ? 'checkout.linkTemplateForm.titles.createLink' : 'checkout.linkTemplateForm.titles.createTemplate')}\n backHref={mode === 'link' ? '/backend/checkout/pay-links' : '/backend/checkout/templates'}\n cancelHref={mode === 'link' ? '/backend/checkout/pay-links' : '/backend/checkout/templates'}\n fields={fields}\n groups={groups}\n extraActions={recordId ? (\n <>\n {isLocked ? (\n <Button asChild type=\"button\" variant=\"outline\">\n <a\n href={mode === 'link'\n ? `/pay/${encodeURIComponent(readString(initialValues.slug))}?preview=true`\n : `/backend/checkout/templates/${encodeURIComponent(recordId)}/preview`}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <Eye className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.preview')}\n </a>\n </Button>\n ) : (\n <Button\n type=\"submit\"\n form={formId}\n variant=\"outline\"\n name=\"submitIntent\"\n value=\"preview\"\n >\n <Eye className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.preview')}\n </Button>\n )}\n {mode === 'link' && recordId && !isLocked ? (\n <Button\n type=\"submit\"\n form={formId}\n name=\"submitIntent\"\n value=\"publish\"\n >\n <BadgeCheck className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.saveAndPublish')}\n </Button>\n ) : null}\n </>\n ) : null}\n entityId={entityId}\n customFieldsetBindings={{ [entityId]: { valueKey: 'customFieldsetCode' } }}\n initialValues={initialValues}\n contentHeader={lockedNotice}\n readOnly={isLocked}\n readOnlyOverlay={lockedOverlay}\n deleteVisible={Boolean(recordId)}\n onSubmit={async (values, context) => {\n const submitIntent = context?.submitter?.value === 'preview'\n ? 'preview'\n : context?.submitter?.value === 'publish'\n ? 'publish'\n : 'save'\n const shouldOpenPreview = submitIntent === 'preview'\n const payload = {\n ...values,\n status: submitIntent === 'publish' ? 'active' : values.status,\n customFields: collectCustomFieldValues(values),\n }\n const endpoint = `/api/checkout/${mode === 'link' ? 'links' : 'templates'}${recordId ? `/${encodeURIComponent(recordId)}` : ''}`\n let response: { id?: string; slug?: string; ok?: boolean }\n try {\n response = await withScopedApiRequestHeaders(\n recordId ? buildOptimisticLockHeader(readString(initialValues?.updatedAt) || null) : {},\n () => readApiResultOrThrow<{ id?: string; slug?: string; ok?: boolean }>(endpoint, {\n method: recordId ? 'PUT' : 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n )\n } catch (error) {\n if (surfaceRecordConflict(error, t)) return\n if (recordId && isRecordNotFoundError(error)) {\n setNotFound(true)\n return\n }\n throw error\n }\n const targetId = recordId ?? (typeof response?.id === 'string' ? response.id : null)\n const logoAttachmentId = readString(values.logoAttachmentId)\n if (\n !recordId &&\n targetId &&\n logoAttachmentId &&\n logoAttachmentId !== initialLogoAttachmentIdRef.current\n ) {\n await apiCall('/api/attachments/transfer', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n entityId,\n attachmentIds: [logoAttachmentId],\n fromRecordId: attachmentDraftRecordId,\n toRecordId: targetId,\n }),\n })\n }\n if (shouldOpenPreview) {\n if (mode === 'link') {\n const savedSlug = typeof response?.slug === 'string' && response.slug.trim().length > 0\n ? response.slug.trim()\n : readString(values.slug).trim() || readString(initialValues.slug).trim()\n if (savedSlug) {\n window.open(`/pay/${encodeURIComponent(savedSlug)}?preview=true`, '_blank', 'noopener,noreferrer')\n return\n }\n } else if (targetId) {\n window.open(\n `/backend/checkout/templates/${encodeURIComponent(targetId)}/preview`,\n '_blank',\n 'noopener,noreferrer',\n )\n return\n }\n }\n window.location.href = mode === 'link'\n ? `/backend/checkout/pay-links?flash=${encodeURIComponent(\n t(submitIntent === 'publish' ? 'checkout.admin.payLinks.flash.published' : 'checkout.common.flash.saved'),\n )}&type=success`\n : `/backend/checkout/templates?flash=${encodeURIComponent(t('checkout.common.flash.saved'))}&type=success`\n }}\n onDelete={recordId ? async () => {\n try {\n await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(readString(initialValues?.updatedAt) || null),\n () => apiCallOrThrow(`/api/checkout/${mode === 'link' ? 'links' : 'templates'}/${encodeURIComponent(recordId)}`, { method: 'DELETE' }),\n )\n } catch (error) {\n if (surfaceRecordConflict(error, t)) return\n if (isRecordNotFoundError(error)) {\n setNotFound(true)\n return\n }\n throw error\n }\n window.location.href = mode === 'link'\n ? `/backend/checkout/pay-links?flash=${encodeURIComponent(t('checkout.common.flash.deleted'))}&type=success`\n : `/backend/checkout/templates?flash=${encodeURIComponent(t('checkout.common.flash.deleted'))}&type=success`\n } : undefined}\n />\n ) : null}\n </PageBody>\n </Page>\n )\n}\n\nexport default LinkTemplateForm\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useSearchParams } from 'next/navigation'\nimport { useT, type TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport {\n AlertTriangle,\n BadgeCheck,\n CircleDollarSign,\n Eye,\n FileCheck2,\n FileText,\n IdCard,\n MessageSquare,\n Plus,\n Send,\n Shield,\n Sparkles,\n Trash2,\n WalletCards,\n} from 'lucide-react'\nimport { slugify } from '@open-mercato/shared/lib/slugify'\nimport { CrudForm, type CrudField, type CrudFormGroup, type CrudFormGroupComponentProps } from '@open-mercato/ui/backend/CrudForm'\nimport { ComboboxInput, type ComboboxOption } from '@open-mercato/ui/backend/inputs'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { RecordNotFoundState } from '@open-mercato/ui/backend/detail'\nimport { SwitchableMarkdownInput } from '@open-mercato/ui/backend/inputs'\nimport { apiCall, apiCallOrThrow, readApiResultOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ColorPicker } from '@open-mercato/ui/primitives/color-picker'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { PasswordInput } from '@open-mercato/ui/primitives/password-input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'\nimport { CHECKOUT_ENTITY_IDS } from '../lib/constants'\nimport { getLocalizedDefaultCheckoutCustomerFields } from '../lib/defaults'\nimport type { CustomerFieldDefinitionInput, PriceListItemInput } from '../data/validators'\nimport { getGatewayProviderConfigurationMessageKey } from '../lib/gatewayProviderAvailability'\nimport { readCustomerFieldsSectionError } from '../lib/customerFieldErrors'\nimport { isRecordNotFoundError } from '../lib/recordNotFound'\nimport { CheckoutCurrencySelect } from './CheckoutCurrencySelect'\nimport { CustomerFieldsEditor } from './CustomerFieldsEditor'\nimport { GatewaySettingsFields } from './GatewaySettingsFields'\nimport { LogoUploadField } from './LogoUploadField'\n\ntype Props = {\n mode: 'link' | 'template'\n recordId?: string\n}\n\ntype FormValues = Record<string, unknown>\n\ntype ProviderDescriptor = {\n providerKey: string\n label: string\n isConfigured?: boolean\n requiresConfiguration?: boolean\n configurationStatus?: 'configured' | 'missing_credentials' | 'disabled' | 'unmanaged' | null\n}\n\ntype TemplateSummary = {\n id: string\n name: string\n title?: string | null\n pricingMode?: string | null\n gatewayProviderKey?: string | null\n}\n\ntype LegalDocumentValue = {\n title: string\n markdown: string\n required: boolean\n}\n\ntype LegalDocumentsValue = {\n terms: LegalDocumentValue\n privacyPolicy: LegalDocumentValue\n}\n\ntype PriceListItem = PriceListItemInput\n\nconst DEFAULT_COLORS = {\n primaryColor: '#1E3A8A',\n secondaryColor: '#F59E0B',\n backgroundColor: '#F8F4EE',\n} as const\n\nconst SETTINGS_TABS_LIST_CLASS = 'h-auto w-full justify-start overflow-x-auto rounded-none border-b border-border bg-transparent p-0'\nconst SETTINGS_TABS_TRIGGER_CLASS = 'mr-8 h-auto rounded-none border-b-2 border-transparent bg-transparent px-0 py-2.5 text-sm font-medium text-muted-foreground shadow-none transition-colors hover:bg-transparent hover:text-foreground aria-selected:border-accent-indigo aria-selected:bg-transparent aria-selected:text-foreground aria-selected:shadow-none last:mr-0'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction readString(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction readNumberInputValue(value: unknown): string {\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n if (typeof value === 'string') return value\n return ''\n}\n\nfunction readBoolean(value: unknown, fallback = false): boolean {\n return typeof value === 'boolean' ? value : fallback\n}\n\nfunction cloneDefaultCustomerFields(t?: TranslateFn): CustomerFieldDefinitionInput[] {\n return getLocalizedDefaultCheckoutCustomerFields(t).map((field) => ({\n ...field,\n placeholder: typeof field.placeholder === 'string' ? field.placeholder : undefined,\n }))\n}\n\nfunction createDefaultLegalDocuments(): LegalDocumentsValue {\n return {\n terms: { title: '', markdown: '', required: false },\n privacyPolicy: { title: '', markdown: '', required: false },\n }\n}\n\nfunction createDefaultValues(t?: TranslateFn): FormValues {\n return {\n name: '',\n title: '',\n subtitle: '',\n description: '',\n slug: '',\n logoAttachmentId: null,\n logoUrl: null,\n ...DEFAULT_COLORS,\n themeMode: 'auto',\n displayCustomFieldsOnPage: false,\n pricingMode: 'fixed',\n fixedPriceAmount: null,\n fixedPriceCurrencyCode: 'USD',\n fixedPriceIncludesTax: true,\n fixedPriceOriginalAmount: null,\n customAmountMin: null,\n customAmountMax: null,\n customAmountCurrencyCode: 'USD',\n priceListItems: [],\n gatewayProviderKey: '',\n gatewaySettings: {},\n templateId: null,\n customFieldsetCode: null,\n collectCustomerDetails: true,\n customerFieldsSchema: cloneDefaultCustomerFields(t),\n legalDocuments: createDefaultLegalDocuments(),\n status: 'draft',\n maxCompletions: null,\n password: '',\n successTitle: '',\n successMessage: '',\n cancelTitle: '',\n cancelMessage: '',\n errorTitle: '',\n errorMessage: '',\n startEmailSubject: '',\n startEmailBody: '',\n sendStartEmail: true,\n successEmailSubject: '',\n successEmailBody: '',\n sendSuccessEmail: true,\n errorEmailSubject: '',\n errorEmailBody: '',\n sendErrorEmail: true,\n }\n}\n\nfunction normalizePriceListItems(value: unknown): PriceListItem[] {\n if (!Array.isArray(value)) return []\n return value\n .map((item) => {\n if (!isRecord(item)) return null\n const id = readString(item.id).trim()\n const description = readString(item.description)\n const amount = Number(item.amount ?? 0)\n const currencyCode = readString(item.currencyCode).trim().toUpperCase()\n return {\n id: id || `item_${Date.now()}`,\n description,\n amount: Number.isFinite(amount) ? amount : 0,\n currencyCode: currencyCode || 'USD',\n }\n })\n .filter((item): item is PriceListItem => item !== null)\n}\n\nfunction normalizeCustomerFields(value: unknown, t?: TranslateFn): CustomerFieldDefinitionInput[] {\n if (!Array.isArray(value)) return cloneDefaultCustomerFields(t)\n return value.reduce<CustomerFieldDefinitionInput[]>((result, field, index) => {\n if (!isRecord(field)) return result\n const key = readString(field.key).trim()\n const label = readString(field.label).trim()\n const kind = readString(field.kind)\n if (!key || !label) return result\n if (!['text', 'multiline', 'boolean', 'select', 'radio'].includes(kind)) return result\n const options = Array.isArray(field.options)\n ? field.options.reduce<Array<{ value: string; label: string }>>((optionResult, option) => {\n if (!isRecord(option)) return optionResult\n const valuePart = readString(option.value).trim()\n const labelPart = readString(option.label).trim()\n if (!valuePart || !labelPart) return optionResult\n optionResult.push({ value: valuePart, label: labelPart })\n return optionResult\n }, [])\n : []\n result.push({\n key,\n label,\n kind: kind as CustomerFieldDefinitionInput['kind'],\n required: readBoolean(field.required),\n fixed: readBoolean(field.fixed),\n placeholder: readString(field.placeholder).trim() || undefined,\n options,\n sortOrder: typeof field.sortOrder === 'number' ? field.sortOrder : index,\n })\n return result\n }, [])\n}\n\nfunction readCustomerFields(value: unknown, t?: TranslateFn): CustomerFieldDefinitionInput[] {\n return Array.isArray(value) ? value as CustomerFieldDefinitionInput[] : cloneDefaultCustomerFields(t)\n}\n\nfunction normalizeLegalDocuments(value: unknown): LegalDocumentsValue {\n const defaults = createDefaultLegalDocuments()\n if (!isRecord(value)) return defaults\n const normalizeDocument = (raw: unknown, fallback: LegalDocumentValue): LegalDocumentValue => {\n if (!isRecord(raw)) return fallback\n return {\n title: readString(raw.title),\n markdown: readString(raw.markdown),\n required: readBoolean(raw.required),\n }\n }\n return {\n terms: normalizeDocument(value.terms, defaults.terms),\n privacyPolicy: normalizeDocument(value.privacyPolicy, defaults.privacyPolicy),\n }\n}\n\nfunction normalizeFormValues(value: FormValues | null | undefined, t?: TranslateFn): FormValues {\n const defaults = createDefaultValues(t)\n const source = isRecord(value) ? value : {}\n const customFields = isRecord(source.customFields) ? source.customFields : {}\n\n const prefixedCustomFieldValues = Object.fromEntries(\n Object.entries(customFields).map(([key, fieldValue]) => [`cf_${key}`, fieldValue]),\n )\n\n return {\n ...defaults,\n ...source,\n ...prefixedCustomFieldValues,\n logoAttachmentId: readString(source.logoAttachmentId).trim() || null,\n logoUrl: readString(source.logoUrl).trim() || null,\n primaryColor: readString(source.primaryColor).trim() || defaults.primaryColor,\n secondaryColor: readString(source.secondaryColor).trim() || defaults.secondaryColor,\n backgroundColor: readString(source.backgroundColor).trim() || defaults.backgroundColor,\n gatewayProviderKey: readString(source.gatewayProviderKey).trim(),\n gatewaySettings: isRecord(source.gatewaySettings) ? source.gatewaySettings : {},\n customFieldsetCode: readString(source.customFieldsetCode).trim() || null,\n collectCustomerDetails: readBoolean(source.collectCustomerDetails, true),\n customerFieldsSchema: normalizeCustomerFields(source.customerFieldsSchema, t),\n legalDocuments: normalizeLegalDocuments(source.legalDocuments),\n priceListItems: normalizePriceListItems(source.priceListItems),\n fixedPriceCurrencyCode: readString(source.fixedPriceCurrencyCode).trim().toUpperCase() || 'USD',\n customAmountCurrencyCode: readString(source.customAmountCurrencyCode).trim().toUpperCase() || 'USD',\n sendStartEmail: readBoolean(source.sendStartEmail, true),\n sendSuccessEmail: readBoolean(source.sendSuccessEmail, true),\n sendErrorEmail: readBoolean(source.sendErrorEmail, true),\n }\n}\n\nfunction readError(errors: Record<string, string>, path: string): string | undefined {\n if (!path) return undefined\n if (errors[path]) return errors[path]\n const prefix = `${path}.`\n const nestedEntry = Object.entries(errors).find(([key]) => key.startsWith(prefix))\n return nestedEntry?.[1]\n}\n\nfunction readDirectError(errors: Record<string, string>, path: string): string | undefined {\n if (!path) return undefined\n return errors[path]\n}\n\nfunction readAnyError(errors: Record<string, string>, ...paths: string[]): string | undefined {\n for (const path of paths) {\n const error = readError(errors, path)\n if (error) return error\n }\n return undefined\n}\n\nfunction toTemplateOption(template: TemplateSummary): ComboboxOption {\n const title = typeof template.title === 'string' ? template.title.trim() : ''\n const provider = typeof template.gatewayProviderKey === 'string' ? template.gatewayProviderKey.trim() : ''\n const parts = [title, provider].filter((part) => part.length > 0)\n return {\n value: template.id,\n label: template.name,\n description: parts.length > 0 ? parts.join(' \u2022 ') : null,\n }\n}\n\nfunction errorInputClassName(error?: string): string | undefined {\n return error ? 'border-destructive aria-invalid:ring-destructive' : undefined\n}\n\nfunction SectionLabel({\n label,\n hint,\n error,\n required,\n children,\n}: {\n label: string\n hint?: string\n error?: string\n required?: boolean\n children: React.ReactNode\n}) {\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <Label className=\"gap-0\">\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </Label>\n {hint ? <p className=\"text-xs text-muted-foreground\">{hint}</p> : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n {children}\n </div>\n )\n}\n\nfunction ColorField({\n label,\n value,\n onChange,\n error,\n}: {\n label: string\n value: string\n onChange: (next: string) => void\n error?: string\n}) {\n const pickerValue = /^#([0-9a-fA-F]{6})$/.test(value) ? value : '#000000'\n return (\n <SectionLabel label={label} error={error}>\n <div className=\"flex items-center gap-3\">\n <ColorPicker\n value={pickerValue}\n onChange={(next) => onChange(next.toUpperCase())}\n aria-label={label}\n />\n <Input\n value={value}\n onChange={(event) => onChange(event.target.value.toUpperCase())}\n placeholder=\"#1E3A8A\"\n className={error ? `min-w-0 ${errorInputClassName(error)}` : 'min-w-0'}\n aria-invalid={Boolean(error)}\n />\n </div>\n </SectionLabel>\n )\n}\n\nfunction PriceListEditor({\n value,\n onChange,\n error,\n}: {\n value: PriceListItem[]\n onChange: (next: PriceListItem[]) => void\n error?: string\n}) {\n const t = useT()\n const items = Array.isArray(value) ? value : []\n\n const updateItem = React.useCallback(\n (index: number, patch: Partial<PriceListItem>) => {\n onChange(items.map((item, currentIndex) => (currentIndex === index ? { ...item, ...patch } : item)))\n },\n [items, onChange],\n )\n\n const addItem = React.useCallback(() => {\n onChange([\n ...items,\n {\n id: `item_${items.length + 1}`,\n description: '',\n amount: 0,\n currencyCode: items[0]?.currencyCode ?? 'USD',\n },\n ])\n }, [items, onChange])\n\n return (\n <div className=\"space-y-4\">\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.priceList.notices.singleCurrency')}\n </AlertDescription>\n </Alert>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n\n <div className=\"overflow-hidden rounded-xl border border-border/70 bg-background\">\n {items.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[760px] table-fixed\">\n <thead className=\"border-b bg-muted/30\">\n <tr className=\"text-left text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-3 py-2 w-[22%]\">{t('checkout.linkTemplateForm.priceList.columns.itemCode')}</th>\n <th className=\"px-3 py-2\">{t('checkout.linkTemplateForm.priceList.columns.description')}</th>\n <th className=\"px-3 py-2 w-[16%]\">{t('checkout.linkTemplateForm.priceList.columns.amount')}</th>\n <th className=\"px-3 py-2 w-[24%]\">{t('checkout.linkTemplateForm.priceList.columns.currency')}</th>\n <th className=\"px-3 py-2 w-[110px] text-right\">{t('checkout.linkTemplateForm.priceList.columns.actions')}</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border/70\">\n {items.map((item, index) => (\n <tr key={`${item.id}:${index}`} className=\"align-top\">\n <td className=\"px-3 py-2\">\n <Input\n value={item.id}\n onChange={(event) => updateItem(index, { id: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.priceList.placeholders.itemCode')}\n aria-label={t('checkout.linkTemplateForm.priceList.aria.itemCode', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={item.description}\n onChange={(event) => updateItem(index, { description: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.priceList.placeholders.description')}\n aria-label={t('checkout.linkTemplateForm.priceList.aria.description', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={item.amount}\n onChange={(event) => updateItem(index, { amount: Number(event.target.value) })}\n placeholder=\"0.00\"\n aria-label={t('checkout.linkTemplateForm.priceList.aria.amount', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <CheckoutCurrencySelect\n value={item.currencyCode}\n onChange={(next) => updateItem(index, { currencyCode: next })}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </td>\n <td className=\"px-3 py-2 text-right\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onChange(items.filter((_, currentIndex) => currentIndex !== index))}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.remove')}\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <div className=\"px-4 py-8\">\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.priceList.notices.empty')}\n </AlertDescription>\n </Alert>\n </div>\n )}\n </div>\n\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={addItem}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.priceList.actions.addItem')}\n </Button>\n </div>\n )\n}\n\nfunction PricingSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const pricingMode = readString(values.pricingMode) || 'fixed'\n const pricingModeError = readError(errors, 'pricingMode')\n const fixedPriceAmountError = readError(errors, 'fixedPriceAmount')\n const fixedPriceCurrencyError = readError(errors, 'fixedPriceCurrencyCode')\n const fixedPriceOriginalAmountError = readError(errors, 'fixedPriceOriginalAmount')\n const customAmountMinError = readError(errors, 'customAmountMin')\n const customAmountMaxError = readError(errors, 'customAmountMax')\n const customAmountCurrencyError = readError(errors, 'customAmountCurrencyCode')\n const priceListItemsError = readError(errors, 'priceListItems')\n\n return (\n <div className=\"space-y-4\">\n {pricingModeError ? <p className=\"text-xs text-destructive\">{pricingModeError}</p> : null}\n <div className=\"flex flex-wrap gap-2\">\n {[\n { id: 'fixed', label: t('checkout.linkTemplateForm.pricing.modes.fixed'), icon: CircleDollarSign },\n { id: 'custom_amount', label: t('checkout.linkTemplateForm.pricing.modes.customAmount'), icon: WalletCards },\n { id: 'price_list', label: t('checkout.linkTemplateForm.pricing.modes.priceList'), icon: FileText },\n ].map((mode) => {\n const Icon = mode.icon\n const active = pricingMode === mode.id\n return (\n <Button\n key={mode.id}\n type=\"button\"\n variant={active ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setValue('pricingMode', mode.id)}\n >\n <Icon className=\"mr-2 h-4 w-4\" />\n {mode.label}\n </Button>\n )\n })}\n </div>\n\n {pricingMode === 'fixed' ? (\n <div className=\"grid gap-4 md:grid-cols-2\">\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.amount')} error={fixedPriceAmountError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.fixedPriceAmount)}\n onChange={(event) => setValue('fixedPriceAmount', Number(event.target.value))}\n placeholder=\"150\"\n className={errorInputClassName(fixedPriceAmountError)}\n aria-invalid={Boolean(fixedPriceAmountError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.currency')} error={fixedPriceCurrencyError} required>\n <CheckoutCurrencySelect\n value={readString(values.fixedPriceCurrencyCode) || 'USD'}\n onChange={(next) => setValue('fixedPriceCurrencyCode', next)}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </SectionLabel>\n\n <SectionLabel\n label={t('checkout.linkTemplateForm.pricing.fields.compareAtPrice')}\n hint={t('checkout.linkTemplateForm.pricing.hints.compareAtPrice')}\n error={fixedPriceOriginalAmountError}\n >\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.fixedPriceOriginalAmount)}\n onChange={(event) => setValue('fixedPriceOriginalAmount', Number(event.target.value))}\n placeholder=\"200\"\n className={errorInputClassName(fixedPriceOriginalAmountError)}\n aria-invalid={Boolean(fixedPriceOriginalAmountError)}\n />\n </SectionLabel>\n\n <div className=\"flex items-end\">\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values.fixedPriceIncludesTax, true)}\n onChange={(event) => setValue('fixedPriceIncludesTax', event.target.checked)}\n />\n {t('checkout.linkTemplateForm.pricing.fields.includesTax')}\n </label>\n </div>\n </div>\n ) : null}\n\n {pricingMode === 'custom_amount' ? (\n <div className=\"grid gap-4 md:grid-cols-3\">\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.minimumAmount')} error={customAmountMinError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.customAmountMin)}\n onChange={(event) => setValue('customAmountMin', Number(event.target.value))}\n placeholder=\"10\"\n className={errorInputClassName(customAmountMinError)}\n aria-invalid={Boolean(customAmountMinError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.maximumAmount')} error={customAmountMaxError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.customAmountMax)}\n onChange={(event) => setValue('customAmountMax', Number(event.target.value))}\n placeholder=\"500\"\n className={errorInputClassName(customAmountMaxError)}\n aria-invalid={Boolean(customAmountMaxError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.currency')} error={customAmountCurrencyError} required>\n <CheckoutCurrencySelect\n value={readString(values.customAmountCurrencyCode) || 'USD'}\n onChange={(next) => setValue('customAmountCurrencyCode', next)}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </SectionLabel>\n </div>\n ) : null}\n\n {pricingMode === 'price_list' ? (\n <PriceListEditor\n value={normalizePriceListItems(values.priceListItems)}\n onChange={(next) => setValue('priceListItems', next)}\n error={priceListItemsError}\n />\n ) : null}\n </div>\n )\n}\n\nfunction GeneralSection({\n values,\n setValue,\n errors,\n mode,\n templateOptions,\n loadTemplateSuggestions,\n applyTemplate,\n isApplyingTemplate,\n}: CrudFormGroupComponentProps & {\n mode: 'link' | 'template'\n templateOptions: ComboboxOption[]\n loadTemplateSuggestions: (query?: string) => Promise<ComboboxOption[]>\n applyTemplate: (templateId: string | null) => Promise<void>\n isApplyingTemplate: boolean\n}) {\n const t = useT()\n const fallbackSlug = slugify(\n readString(values.title).trim().length > 0\n ? readString(values.title)\n : readString(values.name),\n ) || 'pay-link'\n const currentSlug = readString(values.slug)\n const resolvedSlug = currentSlug.trim() || fallbackSlug\n const currentTemplateId = readString(values.templateId).trim()\n const nameError = readError(errors, 'name')\n const titleError = readError(errors, 'title')\n const subtitleError = readError(errors, 'subtitle')\n const descriptionError = readError(errors, 'description')\n const slugError = readError(errors, 'slug')\n const templateError = readError(errors, 'templateId')\n\n return (\n <div className=\"space-y-4\">\n {mode === 'link' ? (\n <SectionLabel\n label={t('checkout.linkTemplateForm.general.fields.template')}\n hint={t('checkout.linkTemplateForm.general.hints.template')}\n error={templateError}\n >\n <div className=\"space-y-3\">\n <ComboboxInput\n value={currentTemplateId}\n suggestions={templateOptions}\n loadSuggestions={loadTemplateSuggestions}\n resolveLabel={(value) => templateOptions.find((option) => option.value === value)?.label ?? value}\n resolveDescription={(value) => templateOptions.find((option) => option.value === value)?.description}\n onChange={(nextValue) => {\n const normalized = nextValue.trim()\n setValue('templateId', normalized || null)\n void applyTemplate(normalized || null)\n }}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.template')}\n disabled={isApplyingTemplate}\n allowCustomValues={false}\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={isApplyingTemplate || currentTemplateId.length === 0}\n onClick={() => {\n setValue('templateId', null)\n void applyTemplate(null)\n }}\n >\n {t('checkout.linkTemplateForm.general.actions.clearTemplate')}\n </Button>\n {isApplyingTemplate ? (\n <p className=\"text-xs text-muted-foreground\">\n {t('checkout.linkTemplateForm.general.status.applyingTemplate')}\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t('checkout.linkTemplateForm.general.notices.templateReplacement')}\n </p>\n )}\n </div>\n </div>\n </SectionLabel>\n ) : null}\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.name')} error={nameError} required>\n <Input\n value={readString(values.name)}\n onChange={(event) => setValue('name', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.name')}\n className={errorInputClassName(nameError)}\n aria-invalid={Boolean(nameError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.title')} error={titleError}>\n <Input\n value={readString(values.title)}\n onChange={(event) => setValue('title', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.title')}\n className={errorInputClassName(titleError)}\n aria-invalid={Boolean(titleError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.subtitle')} error={subtitleError}>\n <Input\n value={readString(values.subtitle)}\n onChange={(event) => setValue('subtitle', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.subtitle')}\n className={errorInputClassName(subtitleError)}\n aria-invalid={Boolean(subtitleError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.description')} hint={t('checkout.linkTemplateForm.general.hints.description')} error={descriptionError}>\n <SwitchableMarkdownInput\n value={readString(values.description)}\n onChange={(next) => setValue('description', next)}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.description')}\n />\n </SectionLabel>\n\n {mode === 'link' ? (\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.slug')} hint={t('checkout.linkTemplateForm.general.hints.slug')} error={slugError}>\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <Input\n value={currentSlug}\n onChange={(event) => setValue('slug', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.slug')}\n className={errorInputClassName(slugError)}\n aria-invalid={Boolean(slugError)}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setValue('slug', fallbackSlug)}\n >\n <Sparkles className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.general.actions.generateSlug')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">{t('checkout.linkTemplateForm.general.slugPreview', { slug: resolvedSlug })}</p>\n </div>\n </SectionLabel>\n ) : null}\n </div>\n )\n}\n\nfunction AppearanceSection({\n values,\n setValue,\n errors,\n entityId,\n attachmentRecordId,\n}: CrudFormGroupComponentProps & { entityId: string; attachmentRecordId: string }) {\n const t = useT()\n const logoError = readAnyError(errors, 'logoAttachmentId', 'logoUrl')\n const primaryColorError = readError(errors, 'primaryColor')\n const secondaryColorError = readError(errors, 'secondaryColor')\n const backgroundColorError = readError(errors, 'backgroundColor')\n const themeModeError = readError(errors, 'themeMode')\n const displayCustomFieldsError = readError(errors, 'displayCustomFieldsOnPage')\n\n return (\n <div className=\"space-y-4\">\n <LogoUploadField\n entityId={entityId}\n recordId={attachmentRecordId}\n attachmentId={readString(values.logoAttachmentId) || null}\n logoUrl={readString(values.logoUrl) || null}\n error={logoError}\n onChange={(next) => {\n setValue('logoAttachmentId', next.logoAttachmentId)\n setValue('logoUrl', next.logoUrl)\n }}\n />\n\n <div className=\"space-y-4\">\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.primaryColor')}\n value={readString(values.primaryColor) || DEFAULT_COLORS.primaryColor}\n onChange={(next) => setValue('primaryColor', next)}\n error={primaryColorError}\n />\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.secondaryColor')}\n value={readString(values.secondaryColor) || DEFAULT_COLORS.secondaryColor}\n onChange={(next) => setValue('secondaryColor', next)}\n error={secondaryColorError}\n />\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.backgroundColor')}\n value={readString(values.backgroundColor) || DEFAULT_COLORS.backgroundColor}\n onChange={(next) => setValue('backgroundColor', next)}\n error={backgroundColorError}\n />\n </div>\n\n <SectionLabel label={t('checkout.linkTemplateForm.appearance.fields.themeMode')} error={themeModeError}>\n <select\n className={themeModeError\n ? `w-full rounded-md border bg-background px-3 py-2 text-sm ${errorInputClassName(themeModeError)}`\n : 'w-full rounded-md border bg-background px-3 py-2 text-sm'}\n value={readString(values.themeMode) || 'auto'}\n onChange={(event) => setValue('themeMode', event.target.value)}\n aria-invalid={Boolean(themeModeError)}\n >\n <option value=\"auto\">{t('checkout.linkTemplateForm.appearance.themeModes.auto')}</option>\n <option value=\"light\">{t('checkout.linkTemplateForm.appearance.themeModes.light')}</option>\n <option value=\"dark\">{t('checkout.linkTemplateForm.appearance.themeModes.dark')}</option>\n </select>\n </SectionLabel>\n\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values.displayCustomFieldsOnPage)}\n onChange={(event) => setValue('displayCustomFieldsOnPage', event.target.checked)}\n />\n {t('checkout.linkTemplateForm.appearance.fields.displayCustomFields')}\n </label>\n {displayCustomFieldsError ? <p className=\"text-xs text-destructive\">{displayCustomFieldsError}</p> : null}\n </div>\n )\n}\n\nfunction PaymentSection({ values, setValue, errors, providers }: CrudFormGroupComponentProps & { providers: ProviderDescriptor[] }) {\n const t = useT()\n const selectedProviderKey = readString(values.gatewayProviderKey)\n const selectedProvider = providers.find((provider) => provider.providerKey === selectedProviderKey)\n const gatewayProviderError = readError(errors, 'gatewayProviderKey')\n ?? (() => {\n const messageKey = getGatewayProviderConfigurationMessageKey(selectedProvider)\n return messageKey ? t(messageKey) : undefined\n })()\n const gatewaySettingsError = readError(errors, 'gatewaySettings')\n\n return (\n <div className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.payment.fields.gatewayProvider')} error={gatewayProviderError} required>\n <select\n className={gatewayProviderError\n ? `w-full rounded-md border bg-background px-3 py-2 text-sm ${errorInputClassName(gatewayProviderError)}`\n : 'w-full rounded-md border bg-background px-3 py-2 text-sm'}\n value={readString(values.gatewayProviderKey)}\n onChange={(event) => setValue('gatewayProviderKey', event.target.value)}\n aria-invalid={Boolean(gatewayProviderError)}\n >\n <option value=\"\">{t('checkout.linkTemplateForm.payment.placeholders.provider')}</option>\n {providers.map((provider) => (\n <option\n key={provider.providerKey}\n value={provider.providerKey}\n disabled={provider.isConfigured === false}\n >\n {provider.isConfigured === false\n ? `${provider.label} ${t('checkout.linkTemplateForm.payment.providerUnavailableSuffix')}`\n : provider.label}\n </option>\n ))}\n </select>\n </SectionLabel>\n\n <GatewaySettingsFields\n providerKey={readString(values.gatewayProviderKey) || null}\n value={isRecord(values.gatewaySettings) ? values.gatewaySettings : {}}\n onChange={(next) => setValue('gatewaySettings', next)}\n />\n {gatewaySettingsError ? <p className=\"text-xs text-destructive\">{gatewaySettingsError}</p> : null}\n </div>\n )\n}\n\nfunction CustomerDetailsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const collectCustomerDetails = readBoolean(values.collectCustomerDetails, true)\n const collectCustomerDetailsError = readError(errors, 'collectCustomerDetails')\n const customerFieldsError = readCustomerFieldsSectionError(errors)\n\n return (\n <div className=\"space-y-4\">\n <label className=\"flex items-start gap-3 rounded-xl border border-border/70 bg-muted/30 px-4 py-3 text-sm\">\n <input\n type=\"checkbox\"\n checked={collectCustomerDetails}\n onChange={(event) => setValue('collectCustomerDetails', event.target.checked)}\n />\n <span className=\"space-y-1\">\n <span className=\"flex items-center gap-2 font-medium\">\n <IdCard className=\"h-4 w-4\" />\n {t('checkout.linkTemplateForm.customerDetails.title')}\n </span>\n <span className=\"block text-muted-foreground\">\n {t('checkout.linkTemplateForm.customerDetails.description')}\n </span>\n </span>\n </label>\n {collectCustomerDetailsError ? <p className=\"text-xs text-destructive\">{collectCustomerDetailsError}</p> : null}\n\n {collectCustomerDetails ? (\n <>\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.customerDetails.notices.simpleLink')}\n </AlertDescription>\n </Alert>\n {customerFieldsError ? <p className=\"text-xs text-destructive\">{customerFieldsError}</p> : null}\n <CustomerFieldsEditor\n value={readCustomerFields(values.customerFieldsSchema, t)}\n onChange={(next) => setValue('customerFieldsSchema', next)}\n errors={errors}\n />\n </>\n ) : (\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.customerDetails.notices.disabled')}\n </AlertDescription>\n </Alert>\n )}\n </div>\n )\n}\n\nfunction LegalSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'terms' | 'privacyPolicy'>('terms')\n const legalDocuments = normalizeLegalDocuments(values.legalDocuments)\n const termsTitleError = readAnyError(errors, 'legalDocuments.terms.title', 'legalDocuments.terms')\n const termsMarkdownError = readAnyError(errors, 'legalDocuments.terms.markdown', 'legalDocuments.terms')\n const privacyTitleError = readAnyError(errors, 'legalDocuments.privacyPolicy.title', 'legalDocuments.privacyPolicy')\n const privacyMarkdownError = readAnyError(errors, 'legalDocuments.privacyPolicy.markdown', 'legalDocuments.privacyPolicy')\n\n const patchDocument = React.useCallback(\n (key: 'terms' | 'privacyPolicy', patch: Partial<LegalDocumentValue>) => {\n setValue('legalDocuments', {\n ...legalDocuments,\n [key]: {\n ...legalDocuments[key],\n ...patch,\n },\n })\n },\n [legalDocuments, setValue],\n )\n\n return (\n <div className=\"space-y-4\">\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.legal.notice')}\n </AlertDescription>\n </Alert>\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'terms' | 'privacyPolicy')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n <TabsTrigger value=\"terms\" className={SETTINGS_TABS_TRIGGER_CLASS}>\n <Shield className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.legal.tabs.terms')}\n </TabsTrigger>\n <TabsTrigger value=\"privacyPolicy\" className={SETTINGS_TABS_TRIGGER_CLASS}>\n <FileCheck2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.legal.tabs.privacy')}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"terms\" className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.termsTitle')} error={termsTitleError}>\n <Input\n value={legalDocuments.terms.title}\n onChange={(event) => patchDocument('terms', { title: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.termsTitle')}\n className={errorInputClassName(termsTitleError)}\n aria-invalid={Boolean(termsTitleError)}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.termsBody')} error={termsMarkdownError}>\n <SwitchableMarkdownInput\n value={legalDocuments.terms.markdown}\n onChange={(next) => patchDocument('terms', { markdown: next })}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.termsBody')}\n />\n </SectionLabel>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={legalDocuments.terms.required}\n onChange={(event) => patchDocument('terms', { required: event.target.checked })}\n />\n {t('checkout.linkTemplateForm.legal.fields.acceptanceRequired')}\n </label>\n </TabsContent>\n\n <TabsContent value=\"privacyPolicy\" className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.privacyTitle')} error={privacyTitleError}>\n <Input\n value={legalDocuments.privacyPolicy.title}\n onChange={(event) => patchDocument('privacyPolicy', { title: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.privacyTitle')}\n className={errorInputClassName(privacyTitleError)}\n aria-invalid={Boolean(privacyTitleError)}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.privacyBody')} error={privacyMarkdownError}>\n <SwitchableMarkdownInput\n value={legalDocuments.privacyPolicy.markdown}\n onChange={(next) => patchDocument('privacyPolicy', { markdown: next })}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.privacyBody')}\n />\n </SectionLabel>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={legalDocuments.privacyPolicy.required}\n onChange={(event) => patchDocument('privacyPolicy', { required: event.target.checked })}\n />\n {t('checkout.linkTemplateForm.legal.fields.acceptanceRequired')}\n </label>\n </TabsContent>\n </Tabs>\n </div>\n )\n}\n\nfunction MessagesSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'success' | 'cancel' | 'error'>('success')\n\n const config = {\n success: {\n titleKey: 'successTitle',\n bodyKey: 'successMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.successTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.successBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.success'),\n },\n cancel: {\n titleKey: 'cancelTitle',\n bodyKey: 'cancelMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.cancelTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.cancelBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.cancel'),\n },\n error: {\n titleKey: 'errorTitle',\n bodyKey: 'errorMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.errorTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.errorBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.error'),\n },\n } as const\n\n return (\n <div className=\"space-y-4\">\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.messages.notice')}\n </AlertDescription>\n </Alert>\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'success' | 'cancel' | 'error')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n {(['success', 'cancel', 'error'] as const).map((item) => (\n <TabsTrigger key={item} value={item} className={SETTINGS_TABS_TRIGGER_CLASS}>\n <MessageSquare className=\"mr-2 h-4 w-4\" />\n {config[item].label}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {(['success', 'cancel', 'error'] as const).map((item) => (\n <TabsContent key={item} value={item} className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.messages.labels.title', { state: config[item].label })} error={readError(errors, config[item].titleKey)}>\n <Input\n value={readString(values[config[item].titleKey])}\n onChange={(event) => setValue(config[item].titleKey, event.target.value)}\n placeholder={config[item].titlePlaceholder}\n className={errorInputClassName(readError(errors, config[item].titleKey))}\n aria-invalid={Boolean(readError(errors, config[item].titleKey))}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.messages.labels.body', { state: config[item].label })} error={readError(errors, config[item].bodyKey)}>\n <SwitchableMarkdownInput\n value={readString(values[config[item].bodyKey])}\n onChange={(next) => setValue(config[item].bodyKey, next)}\n isMarkdownEnabled\n height={220}\n placeholder={config[item].bodyPlaceholder}\n />\n </SectionLabel>\n </TabsContent>\n ))}\n </Tabs>\n </div>\n )\n}\n\nfunction VariableHint() {\n const t = useT()\n const variables = ['{{firstName}}', '{{amount}}', '{{currencyCode}}', '{{linkTitle}}', '{{transactionId}}', '{{errorMessage}}']\n return (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-muted-foreground\">{t('checkout.linkTemplateForm.emails.variableHint')}</p>\n <div className=\"flex flex-wrap gap-2\">\n {variables.map((variable) => (\n <span\n key={variable}\n className=\"rounded-full border border-border/70 bg-background px-2 py-1 text-xs text-muted-foreground\"\n >\n {variable}\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction EmailsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'start' | 'success' | 'error'>('start')\n\n const config = {\n start: {\n enabledKey: 'sendStartEmail',\n subjectKey: 'startEmailSubject',\n bodyKey: 'startEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.start'),\n Icon: Send,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.startSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.startBody'),\n },\n success: {\n enabledKey: 'sendSuccessEmail',\n subjectKey: 'successEmailSubject',\n bodyKey: 'successEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.success'),\n Icon: BadgeCheck,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.successSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.successBody'),\n },\n error: {\n enabledKey: 'sendErrorEmail',\n subjectKey: 'errorEmailSubject',\n bodyKey: 'errorEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.error'),\n Icon: AlertTriangle,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.errorSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.errorBody'),\n },\n } as const\n\n return (\n <div className=\"space-y-4\">\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.emails.notice')}\n </AlertDescription>\n </Alert>\n <VariableHint />\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'start' | 'success' | 'error')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n {(['start', 'success', 'error'] as const).map((item) => {\n const Icon = config[item].Icon\n return (\n <TabsTrigger key={item} value={item} className={SETTINGS_TABS_TRIGGER_CLASS}>\n <Icon className=\"mr-2 h-4 w-4\" />\n {config[item].title}\n </TabsTrigger>\n )\n })}\n </TabsList>\n\n {(['start', 'success', 'error'] as const).map((item) => (\n <TabsContent key={item} value={item} className=\"space-y-4\">\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values[config[item].enabledKey], true)}\n onChange={(event) => setValue(config[item].enabledKey, event.target.checked)}\n />\n {t('checkout.linkTemplateForm.emails.sendToCustomer')}\n </label>\n\n <SectionLabel label={t('checkout.linkTemplateForm.emails.labels.subject', { state: config[item].title })} error={readError(errors, config[item].subjectKey)}>\n <Input\n value={readString(values[config[item].subjectKey])}\n onChange={(event) => setValue(config[item].subjectKey, event.target.value)}\n placeholder={config[item].subjectPlaceholder}\n className={errorInputClassName(readError(errors, config[item].subjectKey))}\n aria-invalid={Boolean(readError(errors, config[item].subjectKey))}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.emails.labels.body', { state: config[item].title })} error={readError(errors, config[item].bodyKey)}>\n <SwitchableMarkdownInput\n value={readString(values[config[item].bodyKey])}\n onChange={(next) => setValue(config[item].bodyKey, next)}\n isMarkdownEnabled\n height={220}\n placeholder={config[item].bodyPlaceholder}\n />\n </SectionLabel>\n </TabsContent>\n ))}\n </Tabs>\n </div>\n )\n}\n\nfunction SettingsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const status = readString(values.status) || 'draft'\n const statusError = readError(errors, 'status')\n const maxCompletionsError = readError(errors, 'maxCompletions')\n const passwordError = readError(errors, 'password')\n\n return (\n <div className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.status')} error={statusError}>\n <div className=\"flex flex-wrap gap-2\">\n {[\n { id: 'draft', label: t('checkout.common.status.draft') },\n { id: 'active', label: t('checkout.common.status.active') },\n { id: 'inactive', label: t('checkout.common.status.inactive') },\n ].map((option) => (\n <Button\n key={option.id}\n type=\"button\"\n variant={status === option.id ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setValue('status', option.id)}\n >\n {option.label}\n </Button>\n ))}\n </div>\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.maxCompletions')} hint={t('checkout.linkTemplateForm.settings.hints.maxCompletions')} error={maxCompletionsError}>\n <Input\n type=\"number\"\n min=\"1\"\n step=\"1\"\n value={readNumberInputValue(values.maxCompletions)}\n onChange={(event) => setValue('maxCompletions', event.target.value ? Number(event.target.value) : null)}\n placeholder={t('checkout.linkTemplateForm.settings.placeholders.unlimited')}\n className={errorInputClassName(maxCompletionsError)}\n aria-invalid={Boolean(maxCompletionsError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.password')} hint={t('checkout.linkTemplateForm.settings.hints.password')} error={passwordError}>\n <PasswordInput\n value={readString(values.password)}\n onChange={(event) => setValue('password', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.settings.placeholders.password')}\n className={errorInputClassName(passwordError)}\n aria-invalid={Boolean(passwordError)}\n />\n </SectionLabel>\n </div>\n )\n}\n\nexport function LinkTemplateForm({ mode, recordId }: Props) {\n const t = useT()\n const searchParams = useSearchParams()\n const entityId = mode === 'link' ? CHECKOUT_ENTITY_IDS.link : CHECKOUT_ENTITY_IDS.template\n const templateId = React.useMemo(() => {\n const raw = searchParams.get('templateId')\n return raw && raw.trim().length > 0 ? raw : null\n }, [searchParams])\n const attachmentDraftRecordId = React.useMemo(\n () => recordId ?? (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function' ? crypto.randomUUID() : `draft-${Date.now()}`),\n [recordId],\n )\n const initialLogoAttachmentIdRef = React.useRef<string | null>(null)\n const [providers, setProviders] = React.useState<ProviderDescriptor[]>([])\n const [templateOptions, setTemplateOptions] = React.useState<ComboboxOption[]>([])\n const [isApplyingTemplate, setIsApplyingTemplate] = React.useState(false)\n const [formInstanceKey, setFormInstanceKey] = React.useState(0)\n const [initialValues, setInitialValues] = React.useState<FormValues | null>(\n recordId ? null : normalizeFormValues(createDefaultValues(t), t),\n )\n const [notFound, setNotFound] = React.useState(false)\n\n const replaceInitialValues = React.useCallback((nextValues: FormValues) => {\n setInitialValues(nextValues)\n setFormInstanceKey((current) => current + 1)\n }, [])\n\n React.useEffect(() => {\n initialLogoAttachmentIdRef.current = initialValues && typeof initialValues.logoAttachmentId === 'string'\n ? initialValues.logoAttachmentId\n : null\n }, [initialValues])\n\n React.useEffect(() => {\n let active = true\n void readApiResultOrThrow<{ items: ProviderDescriptor[] }>('/api/payment_gateways/providers')\n .then((result) => {\n if (!active) return\n setProviders(Array.isArray(result.items) ? result.items : [])\n })\n .catch(() => {\n if (active) setProviders([])\n })\n return () => {\n active = false\n }\n }, [])\n\n const rememberTemplateOptions = React.useCallback((items: TemplateSummary[] | ComboboxOption[]) => {\n setTemplateOptions((current) => {\n const next = new Map(current.map((option) => [option.value, option]))\n items.forEach((item) => {\n if ('value' in item) {\n next.set(item.value, item)\n return\n }\n const option = toTemplateOption(item)\n next.set(option.value, option)\n })\n return Array.from(next.values())\n })\n }, [])\n\n const loadTemplateSuggestions = React.useCallback(async (query?: string): Promise<ComboboxOption[]> => {\n const params = new URLSearchParams({\n page: '1',\n pageSize: '25',\n })\n if (query && query.trim().length > 0) {\n params.set('search', query.trim())\n }\n const result = await readApiResultOrThrow<{ items: TemplateSummary[] }>(`/api/checkout/templates?${params.toString()}`)\n const options = Array.isArray(result.items) ? result.items.map(toTemplateOption) : []\n rememberTemplateOptions(options)\n return options\n }, [rememberTemplateOptions])\n\n const applyTemplate = React.useCallback(async (nextTemplateId: string | null) => {\n if (recordId || mode !== 'link') return\n if (!nextTemplateId) {\n replaceInitialValues(normalizeFormValues(createDefaultValues(t), t))\n return\n }\n setIsApplyingTemplate(true)\n try {\n const result = await readApiResultOrThrow<FormValues>(`/api/checkout/templates/${encodeURIComponent(nextTemplateId)}`)\n rememberTemplateOptions([{\n id: nextTemplateId,\n name: readString(result.name),\n title: readString(result.title) || null,\n gatewayProviderKey: readString(result.gatewayProviderKey) || null,\n pricingMode: readString(result.pricingMode) || null,\n }])\n replaceInitialValues(\n normalizeFormValues({\n ...result,\n slug: '',\n templateId: nextTemplateId,\n }, t),\n )\n } finally {\n setIsApplyingTemplate(false)\n }\n }, [mode, recordId, rememberTemplateOptions, replaceInitialValues, t])\n\n React.useEffect(() => {\n if (mode !== 'link' || recordId) return\n void loadTemplateSuggestions()\n .catch(() => null)\n }, [loadTemplateSuggestions, mode, recordId])\n\n React.useEffect(() => {\n if (!recordId) return\n let active = true\n setNotFound(false)\n void readApiResultOrThrow<FormValues>(`/api/checkout/${mode === 'link' ? 'links' : 'templates'}/${encodeURIComponent(recordId)}`)\n .then((result) => {\n if (!active) return\n replaceInitialValues(normalizeFormValues(result, t))\n })\n .catch((error) => {\n if (!active) return\n if (isRecordNotFoundError(error)) {\n setNotFound(true)\n return\n }\n replaceInitialValues(normalizeFormValues({}, t))\n })\n return () => {\n active = false\n }\n }, [mode, recordId, replaceInitialValues, t])\n\n React.useEffect(() => {\n if (recordId || mode !== 'link' || !templateId) return\n void applyTemplate(templateId).catch(() => null)\n }, [applyTemplate, mode, recordId, templateId])\n\n React.useEffect(() => {\n const currentTemplateId = readString(initialValues?.templateId).trim()\n if (mode !== 'link' || !currentTemplateId) return\n if (templateOptions.some((option) => option.value === currentTemplateId)) return\n\n let active = true\n void readApiResultOrThrow<FormValues>(`/api/checkout/templates/${encodeURIComponent(currentTemplateId)}`)\n .then((result) => {\n if (!active) return\n rememberTemplateOptions([{\n id: currentTemplateId,\n name: readString(result.name),\n title: readString(result.title) || null,\n gatewayProviderKey: readString(result.gatewayProviderKey) || null,\n pricingMode: readString(result.pricingMode) || null,\n }])\n })\n .catch(() => null)\n\n return () => {\n active = false\n }\n }, [initialValues?.templateId, mode, rememberTemplateOptions, templateOptions])\n\n const fields = React.useMemo<CrudField[]>(() => [], [])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n {\n id: 'general',\n title: t('checkout.linkTemplateForm.groups.general'),\n column: 1,\n component: (ctx) => (\n <GeneralSection\n {...ctx}\n mode={mode}\n templateOptions={templateOptions}\n loadTemplateSuggestions={loadTemplateSuggestions}\n applyTemplate={applyTemplate}\n isApplyingTemplate={isApplyingTemplate}\n />\n ),\n },\n {\n id: 'payment',\n title: t('checkout.linkTemplateForm.groups.payment'),\n column: 2,\n component: (ctx) => <PaymentSection {...ctx} providers={providers} />,\n },\n {\n id: 'pricing',\n title: t('checkout.linkTemplateForm.groups.pricing'),\n column: 1,\n component: (ctx) => <PricingSection {...ctx} />,\n },\n {\n id: 'appearance',\n title: t('checkout.linkTemplateForm.groups.appearance'),\n column: 2,\n component: (ctx) => (\n <AppearanceSection\n {...ctx}\n entityId={entityId}\n attachmentRecordId={attachmentDraftRecordId}\n />\n ),\n },\n {\n id: 'customerFields',\n title: t('checkout.linkTemplateForm.groups.customerFields'),\n column: 1,\n component: (ctx) => <CustomerDetailsSection {...ctx} />,\n },\n {\n id: 'settings',\n title: t('checkout.linkTemplateForm.groups.settings'),\n column: 2,\n component: (ctx) => <SettingsSection {...ctx} />,\n },\n {\n id: 'legal',\n title: t('checkout.linkTemplateForm.groups.legal'),\n column: 1,\n component: (ctx) => <LegalSection {...ctx} />,\n },\n {\n id: 'messages',\n title: t('checkout.linkTemplateForm.groups.messages'),\n column: 1,\n component: (ctx) => <MessagesSection {...ctx} />,\n },\n {\n id: 'emails',\n title: t('checkout.linkTemplateForm.groups.emails'),\n column: 1,\n component: (ctx) => <EmailsSection {...ctx} />,\n },\n { id: 'customFields', title: t('checkout.linkTemplateForm.groups.customFields'), column: 2, kind: 'customFields' },\n ], [applyTemplate, attachmentDraftRecordId, entityId, isApplyingTemplate, loadTemplateSuggestions, mode, providers, t, templateOptions])\n\n const isLocked = mode === 'link' && Boolean(recordId) && readBoolean(initialValues?.isLocked)\n const formId = React.useMemo(\n () => `checkout-${mode}-editor-${recordId ?? 'new'}`,\n [mode, recordId],\n )\n const lockedNotice = isLocked ? (\n <Alert status=\"warning\">\n <AlertTitle>{t('checkout.linkTemplateForm.locked.title')}</AlertTitle>\n <AlertDescription>{t('checkout.linkTemplateForm.locked.description')}</AlertDescription>\n </Alert>\n ) : undefined\n const lockedOverlay = isLocked ? (\n <div className=\"mx-auto mt-6 max-w-md rounded-xl border border-status-warning-border bg-background/95 px-5 py-4 text-center shadow-sm\">\n <div className=\"mx-auto mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-status-warning-bg text-status-warning-icon\">\n <Shield className=\"h-5 w-5\" />\n </div>\n <p className=\"text-sm font-semibold text-foreground\">\n {t('checkout.linkTemplateForm.locked.overlayTitle')}\n </p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {t('checkout.linkTemplateForm.locked.overlayDescription')}\n </p>\n </div>\n ) : undefined\n\n const listHref = mode === 'link' ? '/backend/checkout/pay-links' : '/backend/checkout/templates'\n\n if (notFound) {\n return (\n <Page>\n <PageBody>\n <RecordNotFoundState\n label={t(mode === 'link'\n ? 'checkout.linkTemplateForm.notFound.link.title'\n : 'checkout.linkTemplateForm.notFound.template.title')}\n description={t(mode === 'link'\n ? 'checkout.linkTemplateForm.notFound.link.description'\n : 'checkout.linkTemplateForm.notFound.template.description')}\n backHref={listHref}\n />\n </PageBody>\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n {initialValues ? (\n <CrudForm<FormValues>\n key={formInstanceKey}\n formId={formId}\n title={recordId\n ? t(mode === 'link' ? 'checkout.linkTemplateForm.titles.editLink' : 'checkout.linkTemplateForm.titles.editTemplate')\n : t(mode === 'link' ? 'checkout.linkTemplateForm.titles.createLink' : 'checkout.linkTemplateForm.titles.createTemplate')}\n backHref={mode === 'link' ? '/backend/checkout/pay-links' : '/backend/checkout/templates'}\n cancelHref={mode === 'link' ? '/backend/checkout/pay-links' : '/backend/checkout/templates'}\n fields={fields}\n groups={groups}\n extraActions={recordId ? (\n <>\n {isLocked ? (\n <Button asChild type=\"button\" variant=\"outline\">\n <a\n href={mode === 'link'\n ? `/pay/${encodeURIComponent(readString(initialValues.slug))}?preview=true`\n : `/backend/checkout/templates/${encodeURIComponent(recordId)}/preview`}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <Eye className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.preview')}\n </a>\n </Button>\n ) : (\n <Button\n type=\"submit\"\n form={formId}\n variant=\"outline\"\n name=\"submitIntent\"\n value=\"preview\"\n >\n <Eye className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.preview')}\n </Button>\n )}\n {mode === 'link' && recordId && !isLocked ? (\n <Button\n type=\"submit\"\n form={formId}\n name=\"submitIntent\"\n value=\"publish\"\n >\n <BadgeCheck className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.saveAndPublish')}\n </Button>\n ) : null}\n </>\n ) : null}\n entityId={entityId}\n customFieldsetBindings={{ [entityId]: { valueKey: 'customFieldsetCode' } }}\n initialValues={initialValues}\n contentHeader={lockedNotice}\n readOnly={isLocked}\n readOnlyOverlay={lockedOverlay}\n deleteVisible={Boolean(recordId)}\n onSubmit={async (values, context) => {\n const submitIntent = context?.submitter?.value === 'preview'\n ? 'preview'\n : context?.submitter?.value === 'publish'\n ? 'publish'\n : 'save'\n const shouldOpenPreview = submitIntent === 'preview'\n const payload = {\n ...values,\n status: submitIntent === 'publish' ? 'active' : values.status,\n customFields: collectCustomFieldValues(values),\n }\n const endpoint = `/api/checkout/${mode === 'link' ? 'links' : 'templates'}${recordId ? `/${encodeURIComponent(recordId)}` : ''}`\n let response: { id?: string; slug?: string; ok?: boolean }\n try {\n response = await withScopedApiRequestHeaders(\n recordId ? buildOptimisticLockHeader(readString(initialValues?.updatedAt) || null) : {},\n () => readApiResultOrThrow<{ id?: string; slug?: string; ok?: boolean }>(endpoint, {\n method: recordId ? 'PUT' : 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n )\n } catch (error) {\n if (surfaceRecordConflict(error, t)) return\n if (recordId && isRecordNotFoundError(error)) {\n setNotFound(true)\n return\n }\n throw error\n }\n const targetId = recordId ?? (typeof response?.id === 'string' ? response.id : null)\n const logoAttachmentId = readString(values.logoAttachmentId)\n if (\n !recordId &&\n targetId &&\n logoAttachmentId &&\n logoAttachmentId !== initialLogoAttachmentIdRef.current\n ) {\n await apiCall('/api/attachments/transfer', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n entityId,\n attachmentIds: [logoAttachmentId],\n fromRecordId: attachmentDraftRecordId,\n toRecordId: targetId,\n }),\n })\n }\n if (shouldOpenPreview) {\n if (mode === 'link') {\n const savedSlug = typeof response?.slug === 'string' && response.slug.trim().length > 0\n ? response.slug.trim()\n : readString(values.slug).trim() || readString(initialValues.slug).trim()\n if (savedSlug) {\n window.open(`/pay/${encodeURIComponent(savedSlug)}?preview=true`, '_blank', 'noopener,noreferrer')\n return\n }\n } else if (targetId) {\n window.open(\n `/backend/checkout/templates/${encodeURIComponent(targetId)}/preview`,\n '_blank',\n 'noopener,noreferrer',\n )\n return\n }\n }\n window.location.href = mode === 'link'\n ? `/backend/checkout/pay-links?flash=${encodeURIComponent(\n t(submitIntent === 'publish' ? 'checkout.admin.payLinks.flash.published' : 'checkout.common.flash.saved'),\n )}&type=success`\n : `/backend/checkout/templates?flash=${encodeURIComponent(t('checkout.common.flash.saved'))}&type=success`\n }}\n onDelete={recordId ? async () => {\n try {\n await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(readString(initialValues?.updatedAt) || null),\n () => apiCallOrThrow(`/api/checkout/${mode === 'link' ? 'links' : 'templates'}/${encodeURIComponent(recordId)}`, { method: 'DELETE' }),\n )\n } catch (error) {\n if (surfaceRecordConflict(error, t)) return\n if (isRecordNotFoundError(error)) {\n setNotFound(true)\n return\n }\n throw error\n }\n window.location.href = mode === 'link'\n ? `/backend/checkout/pay-links?flash=${encodeURIComponent(t('checkout.common.flash.deleted'))}&type=success`\n : `/backend/checkout/templates?flash=${encodeURIComponent(t('checkout.common.flash.deleted'))}&type=success`\n } : undefined}\n />\n ) : null}\n </PageBody>\n </Page>\n )\n}\n\nexport default LinkTemplateForm\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -148,7 +148,7 @@ function LogoUploadField({ entityId, recordId, attachmentId, logoUrl, error: ext
|
|
|
148
148
|
}
|
|
149
149
|
)
|
|
150
150
|
] }),
|
|
151
|
-
attachmentId ? /* @__PURE__ */ jsx(Alert, {
|
|
151
|
+
attachmentId ? /* @__PURE__ */ jsx(Alert, { status: "information", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("checkout.logoUpload.notices.attachmentWins") }) }) : null,
|
|
152
152
|
externalError ? /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: externalError }) : null,
|
|
153
153
|
error ? /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: error }) : null
|
|
154
154
|
] });
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/checkout/components/LogoUploadField.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { ImagePlus, Link2, Loader2, Paperclip, Trash2 } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { buildCheckoutAttachmentPreviewUrl } from '../lib/client-utils'\n\ntype UploadResponse = {\n item?: {\n id?: string\n url?: string\n thumbnailUrl?: string\n }\n error?: string\n}\n\ntype Props = {\n entityId: string\n recordId: string\n attachmentId: string | null | undefined\n logoUrl: string | null | undefined\n error?: string\n onChange: (next: { logoAttachmentId: string | null; logoUrl: string | null }) => void\n}\n\nfunction resolvePreviewUrl(attachmentId: string | null | undefined, logoUrl: string | null | undefined): string | null {\n return buildCheckoutAttachmentPreviewUrl(attachmentId) ?? (typeof logoUrl === 'string' && logoUrl.trim().length > 0 ? logoUrl.trim() : null)\n}\n\nexport function LogoUploadField({ entityId, recordId, attachmentId, logoUrl, error: externalError, onChange }: Props) {\n const t = useT()\n const inputRef = React.useRef<HTMLInputElement | null>(null)\n const [uploading, setUploading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [previewUrl, setPreviewUrl] = React.useState<string | null>(() => resolvePreviewUrl(attachmentId, logoUrl))\n\n React.useEffect(() => {\n setPreviewUrl(resolvePreviewUrl(attachmentId, logoUrl))\n }, [attachmentId, logoUrl])\n\n const deleteAttachment = React.useCallback(async (targetId: string | null | undefined) => {\n if (!targetId) return\n await apiCall(`/api/attachments?id=${encodeURIComponent(targetId)}`, { method: 'DELETE' })\n }, [])\n\n const handleUpload = React.useCallback(\n async (files: FileList | null) => {\n const file = files?.[0]\n if (!file) return\n setUploading(true)\n setError(null)\n try {\n const previousAttachmentId = attachmentId\n const formData = new FormData()\n formData.set('entityId', entityId)\n formData.set('recordId', recordId)\n formData.set('file', file)\n const call = await apiCall<UploadResponse>('/api/attachments', {\n method: 'POST',\n body: formData,\n })\n if (!call.ok || !call.result?.item?.id) {\n const message = call.result?.error || t('checkout.logoUpload.errors.upload')\n throw new Error(message)\n }\n const nextAttachmentId = call.result.item.id\n setPreviewUrl(call.result.item.thumbnailUrl ?? buildCheckoutAttachmentPreviewUrl(nextAttachmentId) ?? call.result.item.url ?? null)\n onChange({\n logoAttachmentId: nextAttachmentId,\n logoUrl: logoUrl ?? null,\n })\n if (previousAttachmentId && previousAttachmentId !== nextAttachmentId) {\n await deleteAttachment(previousAttachmentId)\n }\n } catch (uploadError) {\n setError(uploadError instanceof Error ? uploadError.message : t('checkout.logoUpload.errors.upload'))\n } finally {\n setUploading(false)\n if (inputRef.current) inputRef.current.value = ''\n }\n },\n [attachmentId, deleteAttachment, entityId, logoUrl, onChange, recordId],\n )\n\n const handleRemoveUpload = React.useCallback(async () => {\n setError(null)\n try {\n if (attachmentId) {\n await deleteAttachment(attachmentId)\n }\n } catch (removeError) {\n setError(removeError instanceof Error ? removeError.message : t('checkout.logoUpload.errors.remove'))\n }\n setPreviewUrl(resolvePreviewUrl(null, logoUrl))\n onChange({ logoAttachmentId: null, logoUrl: logoUrl ?? null })\n }, [attachmentId, deleteAttachment, logoUrl, onChange])\n\n return (\n <div className=\"space-y-3 rounded-xl border border-border/70 bg-muted/30 p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <ImagePlus className=\"h-4 w-4 text-muted-foreground\" />\n {t('checkout.logoUpload.title')}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t('checkout.logoUpload.description')}\n </p>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => inputRef.current?.click()}\n disabled={uploading}\n >\n {uploading ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : <Paperclip className=\"mr-2 h-4 w-4\" />}\n {uploading ? t('checkout.logoUpload.actions.uploading') : t('checkout.logoUpload.actions.attach')}\n </Button>\n {attachmentId ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void handleRemoveUpload()}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.logoUpload.actions.removeUpload')}\n </Button>\n ) : null}\n </div>\n </div>\n\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(event) => void handleUpload(event.target.files)}\n />\n\n <div className=\"rounded-lg border border-dashed border-border/70 bg-background px-4 py-6\">\n {previewUrl ? (\n <img src={previewUrl} alt={t('checkout.logoUpload.previewAlt')} className=\"max-h-24 w-auto object-contain\" />\n ) : (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <ImagePlus className=\"h-4 w-4\" />\n {t('checkout.logoUpload.empty')}\n </div>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label className=\"flex items-center gap-2\">\n <Link2 className=\"h-4 w-4 text-muted-foreground\" />\n {t('checkout.logoUpload.externalUrl')}\n </Label>\n <Input\n value={logoUrl ?? ''}\n onChange={(event) => {\n setError(null)\n onChange({\n logoAttachmentId: attachmentId ?? null,\n logoUrl: event.target.value || null,\n })\n }}\n placeholder={t('checkout.logoUpload.externalUrlPlaceholder')}\n />\n </div>\n\n {attachmentId ? (\n <Alert
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { ImagePlus, Link2, Loader2, Paperclip, Trash2 } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { buildCheckoutAttachmentPreviewUrl } from '../lib/client-utils'\n\ntype UploadResponse = {\n item?: {\n id?: string\n url?: string\n thumbnailUrl?: string\n }\n error?: string\n}\n\ntype Props = {\n entityId: string\n recordId: string\n attachmentId: string | null | undefined\n logoUrl: string | null | undefined\n error?: string\n onChange: (next: { logoAttachmentId: string | null; logoUrl: string | null }) => void\n}\n\nfunction resolvePreviewUrl(attachmentId: string | null | undefined, logoUrl: string | null | undefined): string | null {\n return buildCheckoutAttachmentPreviewUrl(attachmentId) ?? (typeof logoUrl === 'string' && logoUrl.trim().length > 0 ? logoUrl.trim() : null)\n}\n\nexport function LogoUploadField({ entityId, recordId, attachmentId, logoUrl, error: externalError, onChange }: Props) {\n const t = useT()\n const inputRef = React.useRef<HTMLInputElement | null>(null)\n const [uploading, setUploading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [previewUrl, setPreviewUrl] = React.useState<string | null>(() => resolvePreviewUrl(attachmentId, logoUrl))\n\n React.useEffect(() => {\n setPreviewUrl(resolvePreviewUrl(attachmentId, logoUrl))\n }, [attachmentId, logoUrl])\n\n const deleteAttachment = React.useCallback(async (targetId: string | null | undefined) => {\n if (!targetId) return\n await apiCall(`/api/attachments?id=${encodeURIComponent(targetId)}`, { method: 'DELETE' })\n }, [])\n\n const handleUpload = React.useCallback(\n async (files: FileList | null) => {\n const file = files?.[0]\n if (!file) return\n setUploading(true)\n setError(null)\n try {\n const previousAttachmentId = attachmentId\n const formData = new FormData()\n formData.set('entityId', entityId)\n formData.set('recordId', recordId)\n formData.set('file', file)\n const call = await apiCall<UploadResponse>('/api/attachments', {\n method: 'POST',\n body: formData,\n })\n if (!call.ok || !call.result?.item?.id) {\n const message = call.result?.error || t('checkout.logoUpload.errors.upload')\n throw new Error(message)\n }\n const nextAttachmentId = call.result.item.id\n setPreviewUrl(call.result.item.thumbnailUrl ?? buildCheckoutAttachmentPreviewUrl(nextAttachmentId) ?? call.result.item.url ?? null)\n onChange({\n logoAttachmentId: nextAttachmentId,\n logoUrl: logoUrl ?? null,\n })\n if (previousAttachmentId && previousAttachmentId !== nextAttachmentId) {\n await deleteAttachment(previousAttachmentId)\n }\n } catch (uploadError) {\n setError(uploadError instanceof Error ? uploadError.message : t('checkout.logoUpload.errors.upload'))\n } finally {\n setUploading(false)\n if (inputRef.current) inputRef.current.value = ''\n }\n },\n [attachmentId, deleteAttachment, entityId, logoUrl, onChange, recordId],\n )\n\n const handleRemoveUpload = React.useCallback(async () => {\n setError(null)\n try {\n if (attachmentId) {\n await deleteAttachment(attachmentId)\n }\n } catch (removeError) {\n setError(removeError instanceof Error ? removeError.message : t('checkout.logoUpload.errors.remove'))\n }\n setPreviewUrl(resolvePreviewUrl(null, logoUrl))\n onChange({ logoAttachmentId: null, logoUrl: logoUrl ?? null })\n }, [attachmentId, deleteAttachment, logoUrl, onChange])\n\n return (\n <div className=\"space-y-3 rounded-xl border border-border/70 bg-muted/30 p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <ImagePlus className=\"h-4 w-4 text-muted-foreground\" />\n {t('checkout.logoUpload.title')}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t('checkout.logoUpload.description')}\n </p>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => inputRef.current?.click()}\n disabled={uploading}\n >\n {uploading ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : <Paperclip className=\"mr-2 h-4 w-4\" />}\n {uploading ? t('checkout.logoUpload.actions.uploading') : t('checkout.logoUpload.actions.attach')}\n </Button>\n {attachmentId ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void handleRemoveUpload()}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.logoUpload.actions.removeUpload')}\n </Button>\n ) : null}\n </div>\n </div>\n\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(event) => void handleUpload(event.target.files)}\n />\n\n <div className=\"rounded-lg border border-dashed border-border/70 bg-background px-4 py-6\">\n {previewUrl ? (\n <img src={previewUrl} alt={t('checkout.logoUpload.previewAlt')} className=\"max-h-24 w-auto object-contain\" />\n ) : (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <ImagePlus className=\"h-4 w-4\" />\n {t('checkout.logoUpload.empty')}\n </div>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label className=\"flex items-center gap-2\">\n <Link2 className=\"h-4 w-4 text-muted-foreground\" />\n {t('checkout.logoUpload.externalUrl')}\n </Label>\n <Input\n value={logoUrl ?? ''}\n onChange={(event) => {\n setError(null)\n onChange({\n logoAttachmentId: attachmentId ?? null,\n logoUrl: event.target.value || null,\n })\n }}\n placeholder={t('checkout.logoUpload.externalUrlPlaceholder')}\n />\n </div>\n\n {attachmentId ? (\n <Alert status=\"information\">\n <AlertDescription>\n {t('checkout.logoUpload.notices.attachmentWins')}\n </AlertDescription>\n </Alert>\n ) : null}\n {externalError ? <p className=\"text-xs text-destructive\">{externalError}</p> : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n )\n}\n\nexport default LogoUploadField\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/checkout",
|
|
3
|
-
"version": "0.6.7-develop.
|
|
3
|
+
"version": "0.6.7-develop.6869.1.d1ce9999ea",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -62,18 +62,18 @@
|
|
|
62
62
|
}
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@open-mercato/core": "0.6.7-develop.
|
|
66
|
-
"@open-mercato/ui": "0.6.7-develop.
|
|
65
|
+
"@open-mercato/core": "0.6.7-develop.6869.1.d1ce9999ea",
|
|
66
|
+
"@open-mercato/ui": "0.6.7-develop.6869.1.d1ce9999ea",
|
|
67
67
|
"bcryptjs": "^3.0.3"
|
|
68
68
|
},
|
|
69
69
|
"peerDependencies": {
|
|
70
70
|
"@mikro-orm/postgresql": "^7.0.14",
|
|
71
|
-
"@open-mercato/shared": "0.6.7-develop.
|
|
71
|
+
"@open-mercato/shared": "0.6.7-develop.6869.1.d1ce9999ea",
|
|
72
72
|
"react": "^19.0.0",
|
|
73
73
|
"react-dom": "^19.0.0"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@open-mercato/shared": "0.6.7-develop.
|
|
76
|
+
"@open-mercato/shared": "0.6.7-develop.6869.1.d1ce9999ea",
|
|
77
77
|
"@types/jest": "^30.0.0",
|
|
78
78
|
"@types/react": "^19.2.17",
|
|
79
79
|
"@types/react-dom": "^19.2.3",
|
|
@@ -139,7 +139,7 @@ export function CustomerFieldsEditor({ value, onChange, errors }: Props) {
|
|
|
139
139
|
|
|
140
140
|
return (
|
|
141
141
|
<div className="space-y-4">
|
|
142
|
-
<Alert
|
|
142
|
+
<Alert status="information">
|
|
143
143
|
<AlertDescription>
|
|
144
144
|
{t('checkout.customerFieldsEditor.notices.defaultFields')}
|
|
145
145
|
</AlertDescription>
|
|
@@ -328,7 +328,7 @@ export function CustomerFieldsEditor({ value, onChange, errors }: Props) {
|
|
|
328
328
|
</div>
|
|
329
329
|
) : (
|
|
330
330
|
<div className="px-4 py-8">
|
|
331
|
-
<Alert
|
|
331
|
+
<Alert status="information">
|
|
332
332
|
<AlertDescription>
|
|
333
333
|
{t('checkout.customerFieldsEditor.notices.empty')}
|
|
334
334
|
</AlertDescription>
|
|
@@ -84,7 +84,7 @@ export function GatewaySettingsFields({ providerKey, value, onChange }: Props) {
|
|
|
84
84
|
const fields = descriptor?.sessionConfig?.fields ?? []
|
|
85
85
|
if (!providerKey) {
|
|
86
86
|
return (
|
|
87
|
-
<Alert
|
|
87
|
+
<Alert status="information">
|
|
88
88
|
<AlertDescription>
|
|
89
89
|
{t('checkout.gatewaySettings.notices.chooseProvider')}
|
|
90
90
|
</AlertDescription>
|
|
@@ -93,7 +93,7 @@ export function GatewaySettingsFields({ providerKey, value, onChange }: Props) {
|
|
|
93
93
|
}
|
|
94
94
|
if (!fields.length) {
|
|
95
95
|
return (
|
|
96
|
-
<Alert
|
|
96
|
+
<Alert status="information">
|
|
97
97
|
<AlertDescription>
|
|
98
98
|
{t('checkout.gatewaySettings.notices.noSettings')}
|
|
99
99
|
</AlertDescription>
|
|
@@ -408,7 +408,7 @@ function PriceListEditor({
|
|
|
408
408
|
|
|
409
409
|
return (
|
|
410
410
|
<div className="space-y-4">
|
|
411
|
-
<Alert
|
|
411
|
+
<Alert status="information">
|
|
412
412
|
<AlertDescription>
|
|
413
413
|
{t('checkout.linkTemplateForm.priceList.notices.singleCurrency')}
|
|
414
414
|
</AlertDescription>
|
|
@@ -486,7 +486,7 @@ function PriceListEditor({
|
|
|
486
486
|
</div>
|
|
487
487
|
) : (
|
|
488
488
|
<div className="px-4 py-8">
|
|
489
|
-
<Alert
|
|
489
|
+
<Alert status="information">
|
|
490
490
|
<AlertDescription>
|
|
491
491
|
{t('checkout.linkTemplateForm.priceList.notices.empty')}
|
|
492
492
|
</AlertDescription>
|
|
@@ -946,7 +946,7 @@ function CustomerDetailsSection({ values, setValue, errors }: CrudFormGroupCompo
|
|
|
946
946
|
|
|
947
947
|
{collectCustomerDetails ? (
|
|
948
948
|
<>
|
|
949
|
-
<Alert
|
|
949
|
+
<Alert status="information">
|
|
950
950
|
<AlertDescription>
|
|
951
951
|
{t('checkout.linkTemplateForm.customerDetails.notices.simpleLink')}
|
|
952
952
|
</AlertDescription>
|
|
@@ -959,7 +959,7 @@ function CustomerDetailsSection({ values, setValue, errors }: CrudFormGroupCompo
|
|
|
959
959
|
/>
|
|
960
960
|
</>
|
|
961
961
|
) : (
|
|
962
|
-
<Alert
|
|
962
|
+
<Alert status="information">
|
|
963
963
|
<AlertDescription>
|
|
964
964
|
{t('checkout.linkTemplateForm.customerDetails.notices.disabled')}
|
|
965
965
|
</AlertDescription>
|
|
@@ -993,7 +993,7 @@ function LegalSection({ values, setValue, errors }: CrudFormGroupComponentProps)
|
|
|
993
993
|
|
|
994
994
|
return (
|
|
995
995
|
<div className="space-y-4">
|
|
996
|
-
<Alert
|
|
996
|
+
<Alert status="information">
|
|
997
997
|
<AlertDescription>
|
|
998
998
|
{t('checkout.linkTemplateForm.legal.notice')}
|
|
999
999
|
</AlertDescription>
|
|
@@ -1103,7 +1103,7 @@ function MessagesSection({ values, setValue, errors }: CrudFormGroupComponentPro
|
|
|
1103
1103
|
|
|
1104
1104
|
return (
|
|
1105
1105
|
<div className="space-y-4">
|
|
1106
|
-
<Alert
|
|
1106
|
+
<Alert status="information">
|
|
1107
1107
|
<AlertDescription>
|
|
1108
1108
|
{t('checkout.linkTemplateForm.messages.notice')}
|
|
1109
1109
|
</AlertDescription>
|
|
@@ -1202,7 +1202,7 @@ function EmailsSection({ values, setValue, errors }: CrudFormGroupComponentProps
|
|
|
1202
1202
|
|
|
1203
1203
|
return (
|
|
1204
1204
|
<div className="space-y-4">
|
|
1205
|
-
<Alert
|
|
1205
|
+
<Alert status="information">
|
|
1206
1206
|
<AlertDescription>
|
|
1207
1207
|
{t('checkout.linkTemplateForm.emails.notice')}
|
|
1208
1208
|
</AlertDescription>
|
|
@@ -1557,7 +1557,7 @@ export function LinkTemplateForm({ mode, recordId }: Props) {
|
|
|
1557
1557
|
[mode, recordId],
|
|
1558
1558
|
)
|
|
1559
1559
|
const lockedNotice = isLocked ? (
|
|
1560
|
-
<Alert
|
|
1560
|
+
<Alert status="warning">
|
|
1561
1561
|
<AlertTitle>{t('checkout.linkTemplateForm.locked.title')}</AlertTitle>
|
|
1562
1562
|
<AlertDescription>{t('checkout.linkTemplateForm.locked.description')}</AlertDescription>
|
|
1563
1563
|
</Alert>
|
|
@@ -175,7 +175,7 @@ export function LogoUploadField({ entityId, recordId, attachmentId, logoUrl, err
|
|
|
175
175
|
</div>
|
|
176
176
|
|
|
177
177
|
{attachmentId ? (
|
|
178
|
-
<Alert
|
|
178
|
+
<Alert status="information">
|
|
179
179
|
<AlertDescription>
|
|
180
180
|
{t('checkout.logoUpload.notices.attachmentWins')}
|
|
181
181
|
</AlertDescription>
|