From 6b96f1ffb1a9e6a9599b40860cb07d0b9e43ce3f Mon Sep 17 00:00:00 2001 From: Pepe Ziberi Date: Sun, 22 Feb 2026 10:14:53 +0100 Subject: [PATCH] v1.0.8: fix rapport logos, donation tiers 10/20/50+custom, payment methods, app story --- package.json | 2 +- src/app/api/donate/checkout/route.ts | 2 +- src/app/page.tsx | 8 +- src/app/rapport/[token]/page.tsx | 6 +- src/app/spenden/page.tsx | 101 ++++++++++++++++-------- src/components/journal/journal-view.tsx | 28 ++++--- 6 files changed, 94 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index 20abc7c..1244834 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lageplan", - "version": "1.0.7", + "version": "1.0.8", "description": "Feuerwehr Lageplan - Krokier-App für Einsatzdokumentation", "private": true, "scripts": { diff --git a/src/app/api/donate/checkout/route.ts b/src/app/api/donate/checkout/route.ts index 93d4b07..0e6a4ea 100644 --- a/src/app/api/donate/checkout/route.ts +++ b/src/app/api/donate/checkout/route.ts @@ -21,7 +21,7 @@ export async function POST(req: NextRequest) { const origin = req.headers.get('origin') || req.nextUrl.origin const session = await stripe.checkout.sessions.create({ - payment_method_types: ['card', 'twint'], + payment_method_types: ['card', 'twint', 'link'], mode: 'payment', line_items: [ { diff --git a/src/app/page.tsx b/src/app/page.tsx index 8908b7a..3d22dcf 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -526,10 +526,10 @@ function SupportSection() { {/* Tier preview */}
{[ - { emoji: '\u2615', label: 'Kaffee', amount: 'CHF 5' }, - { emoji: '\uD83C\uDF55', label: 'Pizza', amount: 'CHF 10' }, - { emoji: '\uD83D\uDDA5\uFE0F', label: 'Server', amount: 'CHF 25' }, + { emoji: '\u2615', label: 'Kaffee', amount: 'CHF 10' }, + { emoji: '\uD83D\uDDA5\uFE0F', label: 'Server', amount: 'CHF 20' }, { emoji: '\uD83D\uDE80', label: 'Feature', amount: 'CHF 50' }, + { emoji: '\u2764\uFE0F', label: 'Freibetrag', amount: 'Frei' }, ].map(tier => (
{tier.emoji} @@ -540,7 +540,7 @@ function SupportSection() {

- Wähle einen Betrag auf unserer Spendenseite — Zahlung sicher via Stripe (Kreditkarte, Twint). + Wähle einen Betrag auf unserer Spendenseite — Zahlung sicher via Stripe (Kreditkarte, Twint, Apple Pay, Google Pay).

diff --git a/src/app/rapport/[token]/page.tsx b/src/app/rapport/[token]/page.tsx index fe4bb1c..ae5c351 100644 --- a/src/app/rapport/[token]/page.tsx +++ b/src/app/rapport/[token]/page.tsx @@ -72,7 +72,7 @@ export default function RapportViewerPage({ params }: { params: Promise<{ token: {/* Action bar */}
- + Lageplan Lageplan — Einsatzrapport
@@ -145,7 +145,9 @@ export default function RapportViewerPage({ params }: { params: Promise<{ token: {/* Header */}
- Lageplan + {d.logoUrl && ( + Logo + )}

Einsatzrapport

{d.organisation} · {d.abteilung}

diff --git a/src/app/spenden/page.tsx b/src/app/spenden/page.tsx index d1155af..51b400a 100644 --- a/src/app/spenden/page.tsx +++ b/src/app/spenden/page.tsx @@ -10,14 +10,15 @@ import { import { Logo } from '@/components/ui/logo' const tiers = [ - { value: 5, label: 'Kaffee', emoji: '\u2615', desc: 'Ein Kaffee für die nächste Coding-Session' }, - { value: 10, label: 'Pizza', emoji: '\uD83C\uDF55', desc: 'Pizza-Abend nach einem langen Entwicklungstag' }, - { value: 25, label: 'Server', emoji: '\uD83D\uDDA5\uFE0F', desc: 'Hilft die monatlichen Serverkosten zu decken' }, + { value: 10, label: 'Kaffee', emoji: '\u2615', desc: 'Ein Kaffee für die nächste Coding-Session' }, + { value: 20, label: 'Server', emoji: '\uD83D\uDDA5\uFE0F', desc: 'Hilft die monatlichen Serverkosten zu decken' }, { value: 50, label: 'Feature', emoji: '\uD83D\uDE80', desc: 'Finanziert die Entwicklung eines neuen Features' }, ] export default function SpendenPage() { - const [amount, setAmount] = useState(10) + const [amount, setAmount] = useState(20) + const [customAmount, setCustomAmount] = useState('') + const [isCustom, setIsCustom] = useState(false) const [name, setName] = useState('') const [message, setMessage] = useState('') const [isLoading, setIsLoading] = useState(false) @@ -112,9 +113,9 @@ export default function SpendenPage() { {tiers.map(tier => ( ))} +
- {/* Slider */} -
-
- Oder wähle einen eigenen Betrag: - CHF {amount} + {/* Custom amount input */} + {isCustom && ( +
+ +
+ CHF + { + setCustomAmount(e.target.value) + const val = parseInt(e.target.value) + if (val > 0) setAmount(val) + }} + placeholder="Betrag eingeben..." + className="w-full rounded-lg border border-gray-300 pl-14 pr-4 py-3 text-lg font-bold focus:outline-none focus:ring-2 focus:ring-red-500 focus:border-transparent" + autoFocus + /> +
- setAmount(parseInt(e.target.value))} - className="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-red-600" - /> -
- CHF 5 - CHF 200 -
-
+ )} {/* Current tier description */} -
- {activeTier.emoji} -

{activeTier.desc}

-
+ {!isCustom && ( +
+ {activeTier.emoji} +

{activeTier.desc}

+
+ )} {/* Optional name & message */}
@@ -203,14 +222,32 @@ export default function SpendenPage() { )} -
+
Sichere Zahlung via Stripe - Kreditkarte & Twint + Kreditkarte + Twint + Apple Pay + Google Pay
+ {/* Story */} +
+

Die Geschichte hinter Lageplan

+

+ Lageplan wird seit über 2 Jahren von einem aktiven Feuerwehrmann in seiner Freizeit entwickelt. + Die App ist und bleibt kostenlos — weil jede Feuerwehr Zugang zu guten Werkzeugen haben soll, + unabhängig vom Budget. Es gibt zwar kommerzielle Alternativen, aber die Idee war immer: + Ein Werkzeug von der Feuerwehr, für die Feuerwehr. +

+

+ Mit deiner Spende hilfst du, dass das so bleibt. Jeder Franken fliesst direkt in + Serverkosten und Weiterentwicklung. Danke für deine Unterstützung! +

+
+ {/* Trust */} -
+

100% deiner Spende fliesst direkt in Serverkosten und Weiterentwicklung.
Kein Unternehmen, keine Investoren — nur ein Feuerwehrmann mit einer Idee. diff --git a/src/components/journal/journal-view.tsx b/src/components/journal/journal-view.tsx index 4eee8e5..4fbd189 100644 --- a/src/components/journal/journal-view.tsx +++ b/src/components/journal/journal-view.tsx @@ -1053,20 +1053,22 @@ export function JournalView({ projectId, projectTitle, projectLocation, einsatzl } else { mapScreenshot = rawScreenshot } - // Convert Lageplan app logo to base64 for PDF rendering + // Convert logo URL to base64 for PDF rendering let logoDataUri = '' - try { - const logoRes = await fetch('/logo-icon.png') - if (logoRes.ok) { - const blob = await logoRes.blob() - logoDataUri = await new Promise((resolve) => { - const reader = new FileReader() - reader.onloadend = () => resolve(reader.result as string) - reader.readAsDataURL(blob) - }) - } - } catch (e) { console.warn('Logo fetch failed:', e) } - const rapportData = { ...rapportForm, mapScreenshot, logoUrl: logoDataUri || '/logo-icon.png' } + if (rapportForm.logoUrl) { + try { + const logoRes = await fetch(rapportForm.logoUrl) + if (logoRes.ok) { + const blob = await logoRes.blob() + logoDataUri = await new Promise((resolve) => { + const reader = new FileReader() + reader.onloadend = () => resolve(reader.result as string) + reader.readAsDataURL(blob) + }) + } + } catch (e) { console.warn('Logo fetch failed:', e) } + } + const rapportData = { ...rapportForm, mapScreenshot, logoUrl: logoDataUri || rapportForm.logoUrl } console.log('[Rapport] Sending request, body size ~', JSON.stringify({ projectId, data: rapportData }).length, 'bytes') const res = await fetch('/api/rapports', { method: 'POST',