ae8134fd64
Release package / release (push) Failing after 7m21s
Co-authored-by: TakahashiNg <83152264+TakahashiNguyen@users.noreply.github.com> Reviewed-on: #38
92 lines
2.7 KiB
TypeScript
92 lines
2.7 KiB
TypeScript
"use client";
|
|
|
|
import { SearchBar } from "@/components/molecules/search-bar";
|
|
import { CategorySidebar } from "@/components/organisms/navigation";
|
|
import { ProductGrid } from "@/components/organisms/product-grid";
|
|
import { eateryClient } from "@/lib/apollo-clients";
|
|
import { allEateriesQuery } from "@/lib/types";
|
|
import { gql } from "@apollo/client";
|
|
import { useQuery } from "@apollo/client/react";
|
|
import { useRouter } from "next/navigation";
|
|
import { useEffect, useState } from "react";
|
|
|
|
const GET_EATERY_COUNT = gql`
|
|
{
|
|
allEateries {
|
|
id
|
|
}
|
|
}
|
|
`;
|
|
|
|
/**
|
|
* Main page — sidebar + product grid layout.
|
|
*
|
|
* Layout:
|
|
* [Sidebar (sticky, collapsible)] | [Main content (scrollable)]
|
|
*
|
|
* Sidebar state:
|
|
* - Desktop (≥ 1024px): expanded by default
|
|
* - Mobile (< 1024px): collapsed by default
|
|
*/
|
|
export default function Home() {
|
|
const router = useRouter();
|
|
|
|
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
|
|
const [searchQuery, setSearchQuery] = useState("");
|
|
|
|
const { data, loading, error } = useQuery<allEateriesQuery>(
|
|
GET_EATERY_COUNT,
|
|
{
|
|
client: eateryClient,
|
|
fetchPolicy: "no-cache",
|
|
},
|
|
);
|
|
|
|
useEffect(() => {
|
|
if (!loading && data) {
|
|
console.log(data);
|
|
|
|
const count = data.allEateries.length ?? 0;
|
|
if (count === 0) {
|
|
router.push("/manager-signup");
|
|
}
|
|
}
|
|
}, [data, loading, router]);
|
|
|
|
useEffect(() => {
|
|
const mq = window.matchMedia("(min-width: 1024px)");
|
|
// eslint-disable-next-line react-hooks/set-state-in-effect
|
|
setIsSidebarOpen(mq.matches);
|
|
const handler = (e: MediaQueryListEvent) => setIsSidebarOpen(e.matches);
|
|
mq.addEventListener("change", handler);
|
|
return () => mq.removeEventListener("change", handler);
|
|
}, []);
|
|
|
|
if (loading) return <div>Loading...</div>;
|
|
if (error) return <div>Error: {error.message}</div>;
|
|
|
|
return (
|
|
<div className="bg-background flex min-h-[calc(100vh-var(--spacing-header-height))] items-start">
|
|
{/* ── Main content ── */}
|
|
<main className="min-w-0 flex-1 px-4 py-6 md:px-6 lg:px-8">
|
|
{/* ── Section heading + search bar ── */}
|
|
<div className="mb-5 flex flex-col justify-between gap-3 sm:flex-row sm:items-center">
|
|
{/* Search bar */}
|
|
<SearchBar
|
|
value={searchQuery}
|
|
onChange={(q) => {
|
|
setSearchQuery(q);
|
|
}}
|
|
onClear={() => setSearchQuery("")}
|
|
placeholder="Search items..."
|
|
className="sm:max-w-xs"
|
|
/>
|
|
</div>
|
|
|
|
{/* ── Product grid (organism handles mobile category menu + grid) ── */}
|
|
<ProductGrid searchQuery={searchQuery} isSidebarOpen={isSidebarOpen} />
|
|
</main>
|
|
</div>
|
|
);
|
|
}
|