"use client"; import { useCallback, useEffect, useState } from "react"; import { GoogleLogin } from "@react-oauth/google"; import { api } from "@/lib/api"; import type { Restaurant } from "@/lib/api"; import { useAuth } from "@/lib/auth-context"; import MapView from "@/components/MapView"; import SearchBar from "@/components/SearchBar"; import RestaurantList from "@/components/RestaurantList"; import RestaurantDetail from "@/components/RestaurantDetail"; export default function Home() { const { user, login, logout, isLoading: authLoading } = useAuth(); const [restaurants, setRestaurants] = useState([]); const [selected, setSelected] = useState(null); const [loading, setLoading] = useState(false); const [showDetail, setShowDetail] = useState(false); // Load all restaurants on mount useEffect(() => { api .getRestaurants({ limit: 200 }) .then(setRestaurants) .catch(console.error); }, []); const handleSearch = useCallback( async (query: string, mode: "keyword" | "semantic" | "hybrid") => { setLoading(true); try { const results = await api.search(query, mode); setRestaurants(results); setSelected(null); setShowDetail(false); } catch (e) { console.error("Search failed:", e); } finally { setLoading(false); } }, [] ); const handleSelectRestaurant = useCallback((r: Restaurant) => { setSelected(r); setShowDetail(true); }, []); const handleCloseDetail = useCallback(() => { setShowDetail(false); }, []); const handleReset = useCallback(() => { setLoading(true); api .getRestaurants({ limit: 200 }) .then((data) => { setRestaurants(data); setSelected(null); setShowDetail(false); }) .catch(console.error) .finally(() => setLoading(false)); }, []); return (
{/* Header */}
{restaurants.length}개 식당
{authLoading ? null : user ? (
{user.avatar_url && ( )} {user.nickname || user.email}
) : ( { if (credentialResponse.credential) { login(credentialResponse.credential).catch(console.error); } }} onError={() => console.error("Google login failed")} size="small" /> )}
{/* Body */}
{/* Sidebar */} {/* Map */}
); }