'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { nanoid } from 'nanoid'; import { AuthButton } from '@/components/AuthButton'; import { useAuthStore } from '@/stores/auth'; // Emoji options for avatars const EMOJI_OPTIONS = ['🐙', '🦊', '🐻', '🐱', '🦝', '🐸', '🦉', '🐧', '🦋', '🐝']; // Generate a URL-safe room slug function generateSlug(): string { return nanoid(8).toLowerCase(); } export default function HomePage() { const router = useRouter(); const { isAuthenticated, username: authUsername } = useAuthStore(); const [isCreating, setIsCreating] = useState(false); const [joinSlug, setJoinSlug] = useState(''); const [name, setName] = useState(''); const [emoji, setEmoji] = useState(''); const [roomName, setRoomName] = useState(''); const [isLoaded, setIsLoaded] = useState(false); const [lastRoom, setLastRoom] = useState(null); // Load saved user info from localStorage on mount useEffect(() => { let loadedEmoji = ''; try { const stored = localStorage.getItem('rmaps_user'); if (stored) { const user = JSON.parse(stored); if (user.name) setName(user.name); if (user.emoji) { setEmoji(user.emoji); loadedEmoji = user.emoji; } } // Load last visited room const lastVisited = localStorage.getItem('rmaps_last_room'); if (lastVisited) { setLastRoom(lastVisited); } } catch { // Ignore parse errors } // Set random emoji if none loaded if (!loadedEmoji) { setEmoji(EMOJI_OPTIONS[Math.floor(Math.random() * EMOJI_OPTIONS.length)]); } setIsLoaded(true); }, []); // Auto-fill name from EncryptID when authenticated useEffect(() => { if (isAuthenticated && authUsername && !name) { setName(authUsername); } }, [isAuthenticated, authUsername, name]); const handleCreateRoom = async () => { if (!name.trim()) return; const slug = roomName.trim() ? roomName.toLowerCase().replace(/[^a-z0-9]/g, '-').slice(0, 20) : generateSlug(); // Store user info in localStorage for the session localStorage.setItem('rmaps_user', JSON.stringify({ name, emoji })); localStorage.setItem('rmaps_last_room', slug); // Navigate to the room (will create it if it doesn't exist) router.push(`/${slug}`); }; const handleJoinRoom = () => { if (!name.trim() || !joinSlug.trim()) return; localStorage.setItem('rmaps_user', JSON.stringify({ name, emoji })); // Clean the slug const cleanSlug = joinSlug.toLowerCase().replace(/[^a-z0-9-]/g, ''); localStorage.setItem('rmaps_last_room', cleanSlug); router.push(`/${cleanSlug}`); }; const handleRejoinLastRoom = () => { if (!name.trim() || !lastRoom) return; localStorage.setItem('rmaps_user', JSON.stringify({ name, emoji })); router.push(`/${lastRoom}`); }; return (
{/* Logo/Title */}

rMaps

Find your friends at events

{/* Quick Rejoin Card - show when user has saved info and last room */} {isLoaded && name && lastRoom && (

Welcome back, {name}!

Or create/join a different room below

)} {/* Main Card */}
{/* User Setup */}

Your Profile

setName(e.target.value)} placeholder="Enter your name" className="input w-full" maxLength={20} />
{EMOJI_OPTIONS.map((e) => ( ))}

{/* Create Room */} {!isCreating ? (
or
{/* Join Room */}
setJoinSlug(e.target.value)} placeholder="Enter room name or code" className="input w-full" />
) : (
setRoomName(e.target.value)} placeholder="e.g., 39c3-crew" className="input flex-1" maxLength={20} /> .rmaps.online

Leave blank for a random code

)}
{/* Footer */}

Privacy-first location sharing

Built for{' '} CCC events

); }