'use client'; import { useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { createClient } from '@/lib/supabase/client'; import Header from '@/components/Header'; import QRCode from 'qrcode'; import { Wasserzaehler } from '@/types'; const BASE_URL = process.env.NEXT_PUBLIC_BASE_URL || 'https://gemeindeportal.vercel.app'; interface QRData { zaehler: Wasserzaehler; dataUrl: string; } export default function AdminQRCodesPage() { const router = useRouter(); const supabase = createClient(); const [loading, setLoading] = useState(true); const [qrItems, setQrItems] = useState([]); const [error, setError] = useState(''); const loadAndGenerate = useCallback(async () => { try { const { data: { user } } = await supabase.auth.getUser(); if (!user) { router.push('/admin/login'); return; } const { data, error: fetchError } = await supabase .from('wasserzaehler') .select('*') .order('kundennummer', { ascending: true }); if (fetchError) { setError('Fehler beim Laden der Wasserzähler.'); setLoading(false); return; } const zaehlerList: Wasserzaehler[] = data || []; const items: QRData[] = await Promise.all( zaehlerList.map(async (z) => { const url = `${BASE_URL}/wasserzaehler?token=${z.access_token}`; const dataUrl = await QRCode.toDataURL(url, { width: 300, margin: 2, errorCorrectionLevel: 'M', }); return { zaehler: z, dataUrl }; }) ); setQrItems(items); } catch { setError('Unerwarteter Fehler.'); } finally { setLoading(false); } }, [supabase, router]); useEffect(() => { loadAndGenerate(); }, [loadAndGenerate]); if (loading) { return (
); } if (error) { return (

{error}

); } return (
{/* Screen-only header */}
{/* Admin Bar */}

QR-Codes — Wasserzähler

{qrItems.length} Zähler — je 1 Seite pro Kunde beim Drucken

Excel Download
{/* Preview on screen / Print pages */}
{qrItems.length === 0 ? (

Keine Wasserzähler gefunden. Bitte zuerst das Import-Script ausführen.

npx tsx scripts/import-zaehler.ts zaehlerablesen_2025.xlsx
) : (
{qrItems.map((item, index) => (
{/* Gemeinde Header */}

Gemeindeamt Weißkirchen an der Traun

Wasserzähler-Ablesung {new Date().getFullYear()}

{/* QR Code */}
{/* eslint-disable-next-line @next/next/no-img-element */} {`QR-Code
{/* Info */}
Kundennummer
{item.zaehler.kundennummer}
Zählernummer
{item.zaehler.zaehlernummer}
{/* Instructions */}

Scannen Sie den QR-Code mit Ihrem Smartphone um Ihren aktuellen Zählerstand zu melden.

{/* Screen-only badge */}
Seite {index + 1} von {qrItems.length}
))}
)}
{/* Print Styles */}
); }