"use client"; import { useState, useEffect, useCallback } from "react"; import Link from "next/link"; import Items from "~/components/sellable_items"; import Search from "~/components/search"; import CartButton from "~/components/cart"; import type { Session } from "next-auth"; import AccountButton from "./account"; import SellableItemsButton from "./new_items"; import TransferButton from "./transfer"; type UserResponse = { id: string; name: string | null; carts: { cartItems: { itemId: string; quantity: number; }[]; }[]; balance: number; adresses: string[]; }; type SellableResponse = { id: string; item_name: string; amount: number; price: number; enabled: boolean; shop: { label: string; }; item: { stock: number; }; }; type Props = { session: Session | null; }; export default function HomeClient({ session }: Props) { const [query, setQuery] = useState(""); const [userData, setUserData] = useState(null); const [sellableData, setSellableData] = useState([]); const [loading, setLoading] = useState(true); // Fetch /api/user once and store globally here const loadUser = useCallback(async () => { try { setLoading(true); const res = await fetch("/api/user"); if (!res.ok) throw new Error("Failed to fetch user"); const data = (await res.json()) as UserResponse; setUserData(data); } catch (err) { console.error(err); } finally { setLoading(false); } }, []); const loadSellable = useCallback(async () => { try { setLoading(true); const res = await fetch("/api/sellable"); if (!res.ok) throw new Error("Failed to fetch sellable"); const data = (await res.json()) as SellableResponse[]; setSellableData(data); } catch (err) { console.error(err); } finally { setLoading(false); } }, []); useEffect(() => { if (!session) return; // Load immediately void loadUser(); void loadSellable(); // Set intervals to reload every 30s (30000ms) const userInterval = setInterval(() => { void loadUser(); }, 30000); const sellableInterval = setInterval(() => { void loadSellable(); }, 30000); // Clear intervals on unmount return () => { clearInterval(userInterval); clearInterval(sellableInterval); }; }, [session, loadUser, loadSellable]); return (
{userData && ( )} {session?.user && ( <> )} {session?.user ? ( Sign out ) : ( Sign in )}

Suchodupin MC Shop

{sellableData && ( )}
); }