From eeaa9a66bbe6a0a89b082ffad5280472f5bf3ead Mon Sep 17 00:00:00 2001 From: root Date: Sat, 3 Jan 2026 06:06:54 +0000 Subject: [PATCH] final --- app/admin/drops/page.tsx | 229 +++++++++++++++++++ app/api/drops/[id]/route.ts | 51 ++++- app/api/drops/route.ts | 6 +- app/api/payments/create-invoice/route.ts | 34 ++- app/api/referral-points/redeem/route.ts | 7 +- app/api/referral-points/route.ts | 31 ++- app/components/Drop.tsx | 209 ++++++++++++------ app/components/Nav.tsx | 15 +- app/components/RedeemPointsModal.tsx | 122 ++++++----- cbd420.sql | 268 +++++++---------------- lib/translations/de.json | 21 +- lib/translations/en.json | 21 +- migrations/add_drop_description.sql | 14 ++ migrations/add_eur_referral_points.sql | 18 ++ migrations/add_multi_currency_prices.sql | 30 +++ public/icon_ref_points.png | Bin 0 -> 46557 bytes 16 files changed, 728 insertions(+), 348 deletions(-) create mode 100644 migrations/add_drop_description.sql create mode 100644 migrations/add_eur_referral_points.sql create mode 100644 migrations/add_multi_currency_prices.sql create mode 100644 public/icon_ref_points.png diff --git a/app/admin/drops/page.tsx b/app/admin/drops/page.tsx index 7bfdfe1..7fc5add 100644 --- a/app/admin/drops/page.tsx +++ b/app/admin/drops/page.tsx @@ -6,10 +6,15 @@ import { useRouter } from 'next/navigation' interface Drop { id: number item: string + description?: string | null size: number fill: number unit: string ppu: number + price_chf?: number | null + price_eur?: number | null + wholesale_price_chf?: number | null + wholesale_price_eur?: number | null image_url: string | null images?: string[] created_at: string @@ -42,9 +47,14 @@ export default function DropsManagementPage() { const [selectedDropId, setSelectedDropId] = useState(null) const [formData, setFormData] = useState({ item: '', + description: '', size: '', unit: 'g', ppu: '', + priceChf: '', + priceEur: '', + wholesalePriceChf: '', + wholesalePriceEur: '', imageUrl: '', startTime: '', }) @@ -88,9 +98,14 @@ export default function DropsManagementPage() { setEditingDrop(drop) setFormData({ item: drop.item, + description: drop.description || '', size: drop.size.toString(), unit: drop.unit, ppu: drop.ppu.toString(), + priceChf: drop.price_chf?.toString() || '', + priceEur: drop.price_eur?.toString() || '', + wholesalePriceChf: drop.wholesale_price_chf?.toString() || '', + wholesalePriceEur: drop.wholesale_price_eur?.toString() || '', imageUrl: drop.image_url || '', startTime: drop.start_time ? new Date(drop.start_time).toISOString().slice(0, 16) : '', }) @@ -157,9 +172,14 @@ export default function DropsManagementPage() { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ item: formData.item, + description: formData.description || null, size: parseInt(formData.size), unit: formData.unit, ppu: parseInt(formData.ppu), + priceChf: formData.priceChf ? parseFloat(formData.priceChf) : null, + priceEur: formData.priceEur ? parseFloat(formData.priceEur) : null, + wholesalePriceChf: formData.wholesalePriceChf ? parseFloat(formData.wholesalePriceChf) : null, + wholesalePriceEur: formData.wholesalePriceEur ? parseFloat(formData.wholesalePriceEur) : null, imageUrl: finalImageUrls[0] || null, // Keep first image for legacy support startTime: formData.startTime || null, }), @@ -312,9 +332,14 @@ export default function DropsManagementPage() { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ item: formData.item, + description: formData.description || null, size: parseInt(formData.size), unit: formData.unit, ppu: parseInt(formData.ppu), + priceChf: formData.priceChf ? parseFloat(formData.priceChf) : null, + priceEur: formData.priceEur ? parseFloat(formData.priceEur) : null, + wholesalePriceChf: formData.wholesalePriceChf ? parseFloat(formData.wholesalePriceChf) : null, + wholesalePriceEur: formData.wholesalePriceEur ? parseFloat(formData.wholesalePriceEur) : null, imageUrl: finalImageUrls[0] || null, // Keep first image for legacy support startTime: formData.startTime || null, }), @@ -350,9 +375,14 @@ export default function DropsManagementPage() { alert('Drop created successfully') setFormData({ item: '', + description: '', size: '', unit: 'g', ppu: '', + priceChf: '', + priceEur: '', + wholesalePriceChf: '', + wholesalePriceEur: '', imageUrl: '', startTime: '', }) @@ -434,9 +464,14 @@ export default function DropsManagementPage() { // Reset form when canceling setFormData({ item: '', + description: '', size: '', unit: 'g', ppu: '', + priceChf: '', + priceEur: '', + wholesalePriceChf: '', + wholesalePriceEur: '', imageUrl: '', startTime: '', }) @@ -492,6 +527,25 @@ export default function DropsManagementPage() { }} /> +
+ +