'use client'; import React, { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { X, QrCode, Keyboard, Loader2, CheckCircle2, Copy, RefreshCw, Link2 } from 'lucide-react'; import QRCode from 'react-qr-code'; import { generateBuddyCode, redeemBuddyCode, revokeBuddyCode } from '@/services/buddy-link'; import { useI18n } from '@/i18n/I18nContext'; interface BuddyHandshakeProps { isOpen: boolean; onClose: () => void; onSuccess?: () => void; } type Tab = 'show' | 'enter'; export default function BuddyHandshake({ isOpen, onClose, onSuccess }: BuddyHandshakeProps) { const { t } = useI18n(); const [activeTab, setActiveTab] = useState('show'); // Show Code Tab State const [code, setCode] = useState(null); const [isGenerating, setIsGenerating] = useState(false); const [copied, setCopied] = useState(false); // Enter Code Tab State const [inputCode, setInputCode] = useState(''); const [isRedeeming, setIsRedeeming] = useState(false); const [redeemError, setRedeemError] = useState(null); const [redeemSuccess, setRedeemSuccess] = useState(null); // Generate code when showing "Show Code" tab useEffect(() => { if (isOpen && activeTab === 'show' && !code) { handleGenerateCode(); } }, [isOpen, activeTab]); // Reset state when closing useEffect(() => { if (!isOpen) { setCode(null); setInputCode(''); setRedeemError(null); setRedeemSuccess(null); setCopied(false); } }, [isOpen]); const handleGenerateCode = async () => { setIsGenerating(true); const result = await generateBuddyCode(); if (result.success && result.code) { setCode(result.code); } setIsGenerating(false); }; const handleRefreshCode = async () => { await revokeBuddyCode(); setCode(null); handleGenerateCode(); }; const handleCopyCode = () => { if (code) { navigator.clipboard.writeText(code); setCopied(true); setTimeout(() => setCopied(false), 2000); } }; const handleRedeemCode = async () => { if (!inputCode.trim()) return; setIsRedeeming(true); setRedeemError(null); setRedeemSuccess(null); const result = await redeemBuddyCode(inputCode); if (result.success) { setRedeemSuccess(`Verbunden mit ${result.buddyName}!`); setTimeout(() => { onSuccess?.(); onClose(); }, 1500); } else { setRedeemError(result.error || 'Unbekannter Fehler'); } setIsRedeeming(false); }; const formatCodeForDisplay = (code: string) => { // Format as XXX-XXX for better readability return `${code.slice(0, 3)}-${code.slice(3)}`; }; if (!isOpen) return null; return ( e.stopPropagation()} > {/* Header */}

Account verbinden

Buddy-Handshake

{/* Tabs */}
{/* Content */}
{activeTab === 'show' ? (
{isGenerating ? (

Generiere Code...

) : code ? ( <> {/* QR Code */}
{/* Text Code */}

Oder Code teilen:

{formatCodeForDisplay(code)}
{/* Timer/Refresh */}
Gültig für 15 Minuten
) : (

Fehler beim Generieren

)}
) : (

Gib den 6-stelligen Code deines Buddies ein:

{/* Code Input */} { const val = e.target.value.toUpperCase().replace(/[^A-Z0-9]/g, ''); if (val.length <= 6) { setInputCode(val); setRedeemError(null); } }} placeholder="XXXXXX" className="w-full text-center text-3xl font-black tracking-[0.4em] bg-zinc-950 border-2 border-zinc-800 rounded-2xl py-4 text-white placeholder:text-zinc-700 focus:outline-hidden focus:border-orange-500 transition-colors font-mono" maxLength={6} autoFocus /> {/* Error Message */} {redeemError && ( {redeemError} )} {/* Success Message */} {redeemSuccess && ( {redeemSuccess} )} {/* Submit Button */}
)}
); }