'use client'; import { useState } from 'react'; export default function TokenGenerator() { const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [generatedLink, setGeneratedLink] = useState(null); const [bulkTokenCount, setBulkTokenCount] = useState(10); const [isGeneratingBulk, setIsGeneratingBulk] = useState(false); const handleGenerateToken = async () => { setIsLoading(true); setError(null); try { const response = await fetch('/api/generate-token', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({}), // No need to send password, using JWT cookie }); const data = await response.json(); if (!response.ok) { throw new Error(data.error || 'Token konnte nicht generiert werden'); } setGeneratedLink(data.voteUrl); } catch (err) { setError(err instanceof Error ? err.message : 'Ein Fehler ist aufgetreten'); } finally { setIsLoading(false); } }; const copyToClipboard = () => { if (generatedLink) { navigator.clipboard.writeText(generatedLink); alert('Link in die Zwischenablage kopiert!'); } }; const handleGenerateBulkTokens = async () => { setIsGeneratingBulk(true); setError(null); try { // Generate the specified number of tokens const response = await fetch('/api/generate-bulk-tokens', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ count: bulkTokenCount }), }); if (!response.ok) { // Try to parse error as JSON try { const errorData = await response.json(); throw new Error(errorData.error || 'Fehler beim Generieren der Tokens'); } catch { // If not JSON, use status text throw new Error(`Fehler beim Generieren der Tokens: ${response.statusText}`); } } // For successful responses, get the CSV data and create a download const csvData = await response.text(); const blob = new Blob([csvData], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); // Create a temporary link and trigger download const link = document.createElement('a'); link.href = url; link.setAttribute('download', `abstimmungslinks_${new Date().toISOString().slice(0, 10)}.csv`); document.body.appendChild(link); link.click(); // Clean up setTimeout(() => { document.body.removeChild(link); URL.revokeObjectURL(url); }, 100); } catch (err) { setError(err instanceof Error ? err.message : 'Ein Fehler ist aufgetreten'); } finally { setIsGeneratingBulk(false); } }; return (

Abstimmungslinks

{generatedLink && (

Generierter Abstimmungslink:

)}
{error && (
{error}
)}

Mehrere Abstimmungslinks generieren:

setBulkTokenCount(Math.max(1, parseInt(e.target.value) || 1))} className="w-24 px-2 py-1 border border-gray-300 focus:outline-none focus:border-[#0057a6]" />

Die generierten Links werden als CSV-Datei heruntergeladen, die Sie mit Ihrer Mitgliederliste zusammenführen können.

); }