'use client' import React from 'react' import Header from '../../../components/nav/Header' import Footer from '../../../components/Footer' import { UsersIcon, PlusIcon, BanknotesIcon, CalendarDaysIcon, MagnifyingGlassIcon, XMarkIcon } from '@heroicons/react/24/outline' import { useRouter, useSearchParams } from 'next/navigation' import useAuthStore from '../../../store/authStore' import PageTransitionEffect from '../../../components/animation/pageTransitionEffect' type PoolUser = { id: string name: string email: string contributed: number joinedAt: string // NEW: member since } export default function PoolManagePage() { const router = useRouter() const searchParams = useSearchParams() const user = useAuthStore(s => s.user) const isAdmin = !!user && ( (user as any)?.role === 'admin' || (user as any)?.userType === 'admin' || (user as any)?.isAdmin === true || ((user as any)?.roles?.includes?.('admin')) ) // Auth gate const [authChecked, setAuthChecked] = React.useState(false) React.useEffect(() => { if (user === null) { router.replace('/login') return } if (user && !isAdmin) { router.replace('/') return } setAuthChecked(true) }, [user, isAdmin, router]) // Read pool data from query params with fallbacks (hooks must be before any return) const poolId = searchParams.get('id') ?? 'pool-unknown' const poolName = searchParams.get('pool_name') ?? 'Unnamed Pool' const poolDescription = searchParams.get('description') ?? '' const poolPrice = parseFloat(searchParams.get('price') ?? '0') const poolType = searchParams.get('pool_type') as 'coffee' | 'other' || 'other' const poolIsActive = searchParams.get('is_active') === 'true' const poolCreatedAt = searchParams.get('createdAt') ?? new Date().toISOString() // Members (no dummy data) const [users, setUsers] = React.useState([]) // Stats (no dummy data) const [totalAmount, setTotalAmount] = React.useState(0) const [amountThisYear, setAmountThisYear] = React.useState(0) const [amountThisMonth, setAmountThisMonth] = React.useState(0) // Search modal state const [searchOpen, setSearchOpen] = React.useState(false) const [query, setQuery] = React.useState('') const [loading, setLoading] = React.useState(false) const [error, setError] = React.useState('') const [candidates, setCandidates] = React.useState>([]) const [hasSearched, setHasSearched] = React.useState(false) // Early return AFTER all hooks are declared to keep consistent order if (!authChecked) return null // Remove dummy candidate source; keep search scaffolding returning empty async function doSearch() { setError('') const q = query.trim().toLowerCase() if (q.length < 3) { setHasSearched(false) setCandidates([]) return } setHasSearched(true) setLoading(true) setTimeout(() => { setCandidates([]) // no local dummy results setLoading(false) }, 300) } function addUserFromModal(u: { id: string; name: string; email: string }) { // Append user to pool; contribution stays zero; joinedAt is now. setUsers(prev => [{ id: u.id, name: u.name, email: u.email, contributed: 0, joinedAt: new Date().toISOString() }, ...prev]) setSearchOpen(false) setQuery('') setCandidates([]) setHasSearched(false) setError('') setLoading(false) } return (
{/* main wrapper: avoid high z-index stacking */}
{/* Header (remove sticky/z-10) */}

{poolName}

{poolDescription ? poolDescription : 'Manage users and track pool funds'}

{!poolIsActive ? 'Inactive' : 'Active'} Created {new Date(poolCreatedAt).toLocaleDateString('de-DE', { year: 'numeric', month: 'short', day: '2-digit' })} ID: {poolId}
{/* Back to Pool Management */}
{/* Stats (now zero until backend wired) */}

Total in Pool

€ {totalAmount.toLocaleString()}

This Year

€ {amountThisYear.toLocaleString()}

Current Month

€ {amountThisMonth.toLocaleString()}

{/* Unified Members card: add button + list */}

Members

{users.map(u => (

{u.name}

{u.email}

€ {u.contributed.toLocaleString()}
Member since:{' '} {new Date(u.joinedAt).toLocaleDateString('de-DE', { year: 'numeric', month: 'short', day: '2-digit' })}
))} {users.length === 0 && (
No users in this pool yet.
)}