'use client' import React, { useState, useEffect, Suspense } from 'react' import { useRouter, useSearchParams } from 'next/navigation' import Link from 'next/link' interface Resident { id: number name: string room: string table?: string station?: string highCaloric?: boolean aversions?: string notes?: string } type MealType = 'breakfast' | 'lunch' | 'dinner' interface BreakfastOptions { accordingToPlan: boolean bread: { breadRoll: boolean wholeGrainRoll: boolean greyBread: boolean wholeGrainBread: boolean whiteBread: boolean crispbread: boolean } porridge: boolean preparation: { sliced: boolean; spread: boolean } spreads: { butter: boolean margarine: boolean jam: boolean diabeticJam: boolean honey: boolean cheese: boolean quark: boolean sausage: boolean } beverages: { coffee: boolean; tea: boolean; hotMilk: boolean; coldMilk: boolean } additions: { sugar: boolean; sweetener: boolean; coffeeCreamer: boolean } } interface LunchOptions { portionSize: 'small' | 'large' | 'vegetarian' soup: boolean dessert: boolean specialPreparations: { pureedFood: boolean pureedMeat: boolean slicedMeat: boolean mashedPotatoes: boolean } restrictions: { noFish: boolean; fingerFood: boolean; onlySweet: boolean } } interface DinnerOptions { accordingToPlan: boolean bread: { greyBread: boolean; wholeGrainBread: boolean; whiteBread: boolean; crispbread: boolean } preparation: { spread: boolean; sliced: boolean } spreads: { butter: boolean; margarine: boolean } soup: boolean porridge: boolean noFish: boolean beverages: { tea: boolean; cocoa: boolean; hotMilk: boolean; coldMilk: boolean } additions: { sugar: boolean; sweetener: boolean } } const defaultBreakfast: BreakfastOptions = { accordingToPlan: false, bread: { breadRoll: false, wholeGrainRoll: false, greyBread: false, wholeGrainBread: false, whiteBread: false, crispbread: false, }, porridge: false, preparation: { sliced: false, spread: false }, spreads: { butter: false, margarine: false, jam: false, diabeticJam: false, honey: false, cheese: false, quark: false, sausage: false, }, beverages: { coffee: false, tea: false, hotMilk: false, coldMilk: false }, additions: { sugar: false, sweetener: false, coffeeCreamer: false }, } const defaultLunch: LunchOptions = { portionSize: 'large', soup: false, dessert: true, specialPreparations: { pureedFood: false, pureedMeat: false, slicedMeat: false, mashedPotatoes: false, }, restrictions: { noFish: false, fingerFood: false, onlySweet: false }, } const defaultDinner: DinnerOptions = { accordingToPlan: false, bread: { greyBread: false, wholeGrainBread: false, whiteBread: false, crispbread: false }, preparation: { spread: false, sliced: false }, spreads: { butter: false, margarine: false }, soup: false, porridge: false, noFish: false, beverages: { tea: false, cocoa: false, hotMilk: false, coldMilk: false }, additions: { sugar: false, sweetener: false }, } function NewOrderContent() { const router = useRouter() const searchParams = useSearchParams() const initialMealType = (searchParams.get('mealType') as MealType) || null const [step, setStep] = useState(initialMealType ? 2 : 1) const [residents, setResidents] = useState([]) const [selectedResident, setSelectedResident] = useState(null) const [mealType, setMealType] = useState(initialMealType) const [date, setDate] = useState(() => new Date().toISOString().split('T')[0]) const [breakfast, setBreakfast] = useState(defaultBreakfast) const [lunch, setLunch] = useState(defaultLunch) const [dinner, setDinner] = useState(defaultDinner) const [loading, setLoading] = useState(true) const [submitting, setSubmitting] = useState(false) const [error, setError] = useState(null) const [searchQuery, setSearchQuery] = useState('') useEffect(() => { const fetchResidents = async () => { try { const res = await fetch('/api/residents?where[active][equals]=true&limit=100&sort=name', { credentials: 'include', }) if (res.ok) { const data = await res.json() setResidents(data.docs || []) } else if (res.status === 401) { router.push('/caregiver/login') } } catch (err) { console.error('Error fetching residents:', err) } finally { setLoading(false) } } fetchResidents() }, [router]) const filteredResidents = residents.filter( (r) => r.name.toLowerCase().includes(searchQuery.toLowerCase()) || r.room.toLowerCase().includes(searchQuery.toLowerCase()), ) const handleSubmit = async () => { if (!selectedResident || !mealType || !date) return setSubmitting(true) setError(null) try { const orderData: Record = { resident: selectedResident.id, date, mealType, status: 'pending', } if (mealType === 'breakfast') { orderData.breakfast = breakfast } else if (mealType === 'lunch') { orderData.lunch = lunch } else if (mealType === 'dinner') { orderData.dinner = dinner } const res = await fetch('/api/meal-orders', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(orderData), credentials: 'include', }) if (!res.ok) { const data = await res.json() throw new Error(data.errors?.[0]?.message || 'Failed to create order') } router.push('/caregiver/dashboard') } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred') } finally { setSubmitting(false) } } const getMealTypeLabel = (type: MealType) => { switch (type) { case 'breakfast': return 'Breakfast (Frühstück)' case 'lunch': return 'Lunch (Mittagessen)' case 'dinner': return 'Dinner (Abendessen)' } } const renderCheckbox = ( label: string, checked: boolean, onChange: (checked: boolean) => void, ) => ( ) if (loading) { return (
) } return ( <>
← Back

New Meal Order

{/* Progress Steps */}
= 1 ? 'steps__step--active' : ''} ${step > 1 ? 'steps__step--completed' : ''}`} />
= 2 ? 'steps__step--active' : ''} ${step > 2 ? 'steps__step--completed' : ''}`} />
= 3 ? 'steps__step--active' : ''} ${step > 3 ? 'steps__step--completed' : ''}`} />
= 4 ? 'steps__step--active' : ''}`} />
{error &&
{error}
} {/* Step 1: Select Meal Type */} {step === 1 && (

Step 1: Select Meal Type

setDate(e.target.value)} />
)} {/* Step 2: Select Resident */} {step === 2 && (

Step 2: Select Resident

setSearchQuery(e.target.value)} />
{filteredResidents.map((resident) => (
setSelectedResident(resident)} >
{resident.name}
Room {resident.room} {resident.table && Table {resident.table}} {resident.station && {resident.station}}
{resident.highCaloric && (
High Caloric
)}
))}
)} {/* Step 3: Meal Options */} {step === 3 && (

Step 3: {mealType && getMealTypeLabel(mealType)} Options

{/* Show resident notes if any */} {(selectedResident?.aversions || selectedResident?.notes) && (
Notes for {selectedResident?.name}: {selectedResident?.aversions &&
Aversions: {selectedResident.aversions}
} {selectedResident?.notes &&
{selectedResident.notes}
}
)} {/* BREAKFAST OPTIONS */} {mealType === 'breakfast' && ( <>

General

{renderCheckbox('According to Plan (lt. Plan)', breakfast.accordingToPlan, (v) => setBreakfast({ ...breakfast, accordingToPlan: v }), )}

Bread (Brot)

{renderCheckbox('Bread Roll (Brötchen)', breakfast.bread.breadRoll, (v) => setBreakfast({ ...breakfast, bread: { ...breakfast.bread, breadRoll: v } }), )} {renderCheckbox('Whole Grain Roll (Vollkornbrötchen)', breakfast.bread.wholeGrainRoll, (v) => setBreakfast({ ...breakfast, bread: { ...breakfast.bread, wholeGrainRoll: v } }), )} {renderCheckbox('Grey Bread (Graubrot)', breakfast.bread.greyBread, (v) => setBreakfast({ ...breakfast, bread: { ...breakfast.bread, greyBread: v } }), )} {renderCheckbox('Whole Grain Bread (Vollkornbrot)', breakfast.bread.wholeGrainBread, (v) => setBreakfast({ ...breakfast, bread: { ...breakfast.bread, wholeGrainBread: v } }), )} {renderCheckbox('White Bread (Weißbrot)', breakfast.bread.whiteBread, (v) => setBreakfast({ ...breakfast, bread: { ...breakfast.bread, whiteBread: v } }), )} {renderCheckbox('Crispbread (Knäckebrot)', breakfast.bread.crispbread, (v) => setBreakfast({ ...breakfast, bread: { ...breakfast.bread, crispbread: v } }), )}

Preparation

{renderCheckbox('Porridge (Brei)', breakfast.porridge, (v) => setBreakfast({ ...breakfast, porridge: v }), )} {renderCheckbox('Sliced (geschnitten)', breakfast.preparation.sliced, (v) => setBreakfast({ ...breakfast, preparation: { ...breakfast.preparation, sliced: v } }), )} {renderCheckbox('Spread (geschmiert)', breakfast.preparation.spread, (v) => setBreakfast({ ...breakfast, preparation: { ...breakfast.preparation, spread: v } }), )}

Spreads (Aufstrich)

{renderCheckbox('Butter', breakfast.spreads.butter, (v) => setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, butter: v } }), )} {renderCheckbox('Margarine', breakfast.spreads.margarine, (v) => setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, margarine: v } }), )} {renderCheckbox('Jam (Konfitüre)', breakfast.spreads.jam, (v) => setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, jam: v } }), )} {renderCheckbox('Diabetic Jam (Diab. Konfitüre)', breakfast.spreads.diabeticJam, (v) => setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, diabeticJam: v } }), )} {renderCheckbox('Honey (Honig)', breakfast.spreads.honey, (v) => setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, honey: v } }), )} {renderCheckbox('Cheese (Käse)', breakfast.spreads.cheese, (v) => setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, cheese: v } }), )} {renderCheckbox('Quark', breakfast.spreads.quark, (v) => setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, quark: v } }), )} {renderCheckbox('Sausage (Wurst)', breakfast.spreads.sausage, (v) => setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, sausage: v } }), )}

Beverages (Getränke)

{renderCheckbox('Coffee (Kaffee)', breakfast.beverages.coffee, (v) => setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, coffee: v } }), )} {renderCheckbox('Tea (Tee)', breakfast.beverages.tea, (v) => setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, tea: v } }), )} {renderCheckbox('Hot Milk (Milch heiß)', breakfast.beverages.hotMilk, (v) => setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, hotMilk: v } }), )} {renderCheckbox('Cold Milk (Milch kalt)', breakfast.beverages.coldMilk, (v) => setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, coldMilk: v } }), )}

Additions (Zusätze)

{renderCheckbox('Sugar (Zucker)', breakfast.additions.sugar, (v) => setBreakfast({ ...breakfast, additions: { ...breakfast.additions, sugar: v } }), )} {renderCheckbox('Sweetener (Süßstoff)', breakfast.additions.sweetener, (v) => setBreakfast({ ...breakfast, additions: { ...breakfast.additions, sweetener: v } }), )} {renderCheckbox('Coffee Creamer (Kaffeesahne)', breakfast.additions.coffeeCreamer, (v) => setBreakfast({ ...breakfast, additions: { ...breakfast.additions, coffeeCreamer: v } }), )}
)} {/* LUNCH OPTIONS */} {mealType === 'lunch' && ( <>

Portion Size

Meal Options

{renderCheckbox('Soup (Suppe)', lunch.soup, (v) => setLunch({ ...lunch, soup: v }))} {renderCheckbox('Dessert', lunch.dessert, (v) => setLunch({ ...lunch, dessert: v }))}

Special Preparations

{renderCheckbox('Pureed Food (passierte Kost)', lunch.specialPreparations.pureedFood, (v) => setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, pureedFood: v } }), )} {renderCheckbox('Pureed Meat (passiertes Fleisch)', lunch.specialPreparations.pureedMeat, (v) => setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, pureedMeat: v } }), )} {renderCheckbox('Sliced Meat (geschnittenes Fleisch)', lunch.specialPreparations.slicedMeat, (v) => setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, slicedMeat: v } }), )} {renderCheckbox('Mashed Potatoes (Kartoffelbrei)', lunch.specialPreparations.mashedPotatoes, (v) => setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, mashedPotatoes: v } }), )}

Restrictions

{renderCheckbox('No Fish (ohne Fisch)', lunch.restrictions.noFish, (v) => setLunch({ ...lunch, restrictions: { ...lunch.restrictions, noFish: v } }), )} {renderCheckbox('Finger Food', lunch.restrictions.fingerFood, (v) => setLunch({ ...lunch, restrictions: { ...lunch.restrictions, fingerFood: v } }), )} {renderCheckbox('Only Sweet (nur süß)', lunch.restrictions.onlySweet, (v) => setLunch({ ...lunch, restrictions: { ...lunch.restrictions, onlySweet: v } }), )}
)} {/* DINNER OPTIONS */} {mealType === 'dinner' && ( <>

General

{renderCheckbox('According to Plan (lt. Plan)', dinner.accordingToPlan, (v) => setDinner({ ...dinner, accordingToPlan: v }), )}

Bread (Brot)

{renderCheckbox('Grey Bread (Graubrot)', dinner.bread.greyBread, (v) => setDinner({ ...dinner, bread: { ...dinner.bread, greyBread: v } }), )} {renderCheckbox('Whole Grain Bread (Vollkornbrot)', dinner.bread.wholeGrainBread, (v) => setDinner({ ...dinner, bread: { ...dinner.bread, wholeGrainBread: v } }), )} {renderCheckbox('White Bread (Weißbrot)', dinner.bread.whiteBread, (v) => setDinner({ ...dinner, bread: { ...dinner.bread, whiteBread: v } }), )} {renderCheckbox('Crispbread (Knäckebrot)', dinner.bread.crispbread, (v) => setDinner({ ...dinner, bread: { ...dinner.bread, crispbread: v } }), )}

Preparation

{renderCheckbox('Spread (geschmiert)', dinner.preparation.spread, (v) => setDinner({ ...dinner, preparation: { ...dinner.preparation, spread: v } }), )} {renderCheckbox('Sliced (geschnitten)', dinner.preparation.sliced, (v) => setDinner({ ...dinner, preparation: { ...dinner.preparation, sliced: v } }), )}

Spreads (Aufstrich)

{renderCheckbox('Butter', dinner.spreads.butter, (v) => setDinner({ ...dinner, spreads: { ...dinner.spreads, butter: v } }), )} {renderCheckbox('Margarine', dinner.spreads.margarine, (v) => setDinner({ ...dinner, spreads: { ...dinner.spreads, margarine: v } }), )}

Additional Items

{renderCheckbox('Soup (Suppe)', dinner.soup, (v) => setDinner({ ...dinner, soup: v }))} {renderCheckbox('Porridge (Brei)', dinner.porridge, (v) => setDinner({ ...dinner, porridge: v }), )} {renderCheckbox('No Fish (ohne Fisch)', dinner.noFish, (v) => setDinner({ ...dinner, noFish: v }), )}

Beverages (Getränke)

{renderCheckbox('Tea (Tee)', dinner.beverages.tea, (v) => setDinner({ ...dinner, beverages: { ...dinner.beverages, tea: v } }), )} {renderCheckbox('Cocoa (Kakao)', dinner.beverages.cocoa, (v) => setDinner({ ...dinner, beverages: { ...dinner.beverages, cocoa: v } }), )} {renderCheckbox('Hot Milk (Milch heiß)', dinner.beverages.hotMilk, (v) => setDinner({ ...dinner, beverages: { ...dinner.beverages, hotMilk: v } }), )} {renderCheckbox('Cold Milk (Milch kalt)', dinner.beverages.coldMilk, (v) => setDinner({ ...dinner, beverages: { ...dinner.beverages, coldMilk: v } }), )}

Additions (Zusätze)

{renderCheckbox('Sugar (Zucker)', dinner.additions.sugar, (v) => setDinner({ ...dinner, additions: { ...dinner.additions, sugar: v } }), )} {renderCheckbox('Sweetener (Süßstoff)', dinner.additions.sweetener, (v) => setDinner({ ...dinner, additions: { ...dinner.additions, sweetener: v } }), )}
)}
)} {/* Step 4: Review and Submit */} {step === 4 && (

Step 4: Review & Submit

Resident {selectedResident?.name}
Room {selectedResident?.room}
Date {date}
Meal Type {mealType && getMealTypeLabel(mealType)}
{selectedResident?.highCaloric && (
Note: This resident requires high caloric meals.
)}
)}
) } export default function NewOrderPage() { return (
} >
) }