feat(orders): idempotency guard, order numbers, button lock, success page, my-orders, admin polling

This commit is contained in:
DanielS
2026-06-17 01:48:06 +02:00
parent 48920828ea
commit d96be1ace9
10 changed files with 624 additions and 57 deletions

View File

@@ -1,6 +1,7 @@
'use client'
import { useState, useMemo } from 'react'
import { useRouter } from 'next/navigation'
import { motion, AnimatePresence } from 'framer-motion'
import { Product, ProductModule, Profile } from '@/lib/types'
import { Card, CardContent, CardDescription, CardHeader, CardTitle, CardFooter } from '@/components/ui/card'
@@ -10,7 +11,7 @@ import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { Separator } from '@/components/ui/separator'
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'
import { Check, ChevronRight, ChevronLeft, ShoppingCart, User, ShieldCheck, Cloud, Utensils, HardDrive, Package, AlertCircle } from 'lucide-react'
import { Check, ChevronRight, ChevronLeft, ShoppingCart, User, ShieldCheck, Cloud, Utensils, HardDrive, Package, AlertCircle, Loader2 } from 'lucide-react'
import { submitOrder } from '@/lib/actions/orders'
import { Category } from '@/lib/types'
import { Badge } from '@/components/ui/badge'
@@ -76,7 +77,9 @@ export function OrderWizard({
categories: Category[]
initialProfile: Profile | null
}) {
const router = useRouter()
const [step, setStep] = useState(1)
const [isSubmitting, setIsSubmitting] = useState(false)
const [customerData, setCustomerData] = useState<Partial<Profile>>(
initialProfile || {
company_name: '',
@@ -145,18 +148,20 @@ export function OrderWizard({
const prevStep = () => setStep(s => s - 1)
const handleSubmit = async () => {
if (isSubmitting) return // Doppelklick-Guard
setIsSubmitting(true)
try {
await submitOrder({
const order = await submitOrder({
selections,
products,
categories,
customerProfile: customerData,
})
alert('Bestellung erfolgreich aufgegeben!')
window.location.href = '/'
router.push(`/order/success?id=${order.id}`)
} catch (error) {
console.error(error)
alert('Fehler bei der Bestellung.')
alert('Fehler bei der Bestellung. Bitte versuchen Sie es erneut.')
setIsSubmitting(false) // Nur bei Fehler wieder entsperren
}
}
@@ -552,8 +557,13 @@ export function OrderWizard({
<Button
className="w-full h-14 text-xl font-bold bg-primary hover:bg-primary/90"
onClick={handleSubmit}
disabled={isSubmitting}
>
Kostenpflichtig bestellen
{isSubmitting ? (
<><Loader2 className="mr-2 h-5 w-5 animate-spin" /> Bestellung wird verarbeitet...</>
) : (
'Kostenpflichtig bestellen'
)}
</Button>
<Button variant="ghost" onClick={prevStep} className="w-full">
Noch etwas ändern