From ba28c54ae88bbb291aa35c26960c622b40f1de43 Mon Sep 17 00:00:00 2001 From: seaznCode Date: Fri, 20 Mar 2026 16:27:49 +0100 Subject: [PATCH] feat: add required fields for signing city and signature to subscription process --- .../summary/components/SignaturePad.tsx | 14 ++++++---- .../summary/hooks/subscribeAbo.ts | 8 ++++++ src/app/coffee-abonnements/summary/page.tsx | 27 +++++++++++++++---- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/app/coffee-abonnements/summary/components/SignaturePad.tsx b/src/app/coffee-abonnements/summary/components/SignaturePad.tsx index c81c7d3..7d743f8 100644 --- a/src/app/coffee-abonnements/summary/components/SignaturePad.tsx +++ b/src/app/coffee-abonnements/summary/components/SignaturePad.tsx @@ -6,9 +6,11 @@ type Props = { value: string onChange: (dataUrl: string) => void className?: string + required?: boolean + error?: string | null } -export default function SignaturePad({ value, onChange, className }: Props) { +export default function SignaturePad({ value, onChange, className, required = false, error = null }: Props) { const canvasRef = useRef(null) const isDrawing = useRef(false) @@ -137,7 +139,9 @@ export default function SignaturePad({ value, onChange, className }: Props) { return (
-

Signature

+

+ Signature{required ? ' *' : ''} +

-
+
-

- {value ? 'Signature captured.' : 'Draw your signature in the box.'} +

+ {error || (value ? 'Signature captured.' : 'Draw your signature in the box.')}

) diff --git a/src/app/coffee-abonnements/summary/hooks/subscribeAbo.ts b/src/app/coffee-abonnements/summary/hooks/subscribeAbo.ts index 1b6637b..4f6537c 100644 --- a/src/app/coffee-abonnements/summary/hooks/subscribeAbo.ts +++ b/src/app/coffee-abonnements/summary/hooks/subscribeAbo.ts @@ -70,6 +70,14 @@ export async function subscribeAbo(input: SubscribeAboInput) { throw new Error(`Missing required fields: ${missing.join(', ')}`) } + if (typeof input.signingCity !== 'string' || input.signingCity.trim() === '') { + throw new Error('signingCity is required') + } + + if (typeof input.signatureDataUrl !== 'string' || input.signatureDataUrl.trim() === '') { + throw new Error('signatureDataUrl is required') + } + const body: any = { billing_interval: input.billing_interval ?? 'month', interval_count: input.interval_count ?? 1, diff --git a/src/app/coffee-abonnements/summary/page.tsx b/src/app/coffee-abonnements/summary/page.tsx index 5ed3dad..f87ad1c 100644 --- a/src/app/coffee-abonnements/summary/page.tsx +++ b/src/app/coffee-abonnements/summary/page.tsx @@ -510,12 +510,16 @@ export default function SummaryPage() { const hasRequiredSelfFields = requiredSelfFields.every(k => String(form[k]).trim() !== '') const hasRequiredInvoiceFields = form.invoiceSameAsShipping || form.invoiceEmail.trim() !== '' + const hasSigningCity = form.signingCity.trim() !== '' + const hasSignature = signatureDataUrl.trim() !== '' const canSubmit = selectedEntries.length > 0 && totalPacks === requiredPacks && hasRequiredSelfFields && - hasRequiredInvoiceFields; + hasRequiredInvoiceFields && + hasSigningCity && + hasSignature; const backToSelection = () => router.push('/coffee-abonnements'); @@ -527,6 +531,16 @@ export default function SummaryPage() { return } + if (!hasSigningCity) { + setSubmitError('Signing city is required.') + return + } + + if (!hasSignature) { + setSubmitError('Signature is required.') + return + } + setSubmitError(null) setSubmitLoading(true) try { @@ -781,10 +795,13 @@ export default function SummaryPage() {
- - + + + {!hasSigningCity && submitError && ( +

Ort ist erforderlich.

+ )}
- +
@@ -838,7 +855,7 @@ export default function SummaryPage() { {!canSubmit && (

- Please select coffees and fill all required buyer fields. + Please select coffees and fill all required buyer fields, signing city, and signature.

)}