import { useLoaderData, useSearchParams, Form, Link } from "react-router"; import type { Route } from "./+types/events._index"; import { queryEvents, getVenues } from "~/lib/db.server"; import EventCard from "~/components/EventCard"; import FilterBar from "~/components/FilterBar"; export async function loader({ request }: Route.LoaderArgs) { const url = new URL(request.url); const date_from = url.searchParams.get("date_from") ?? undefined; const date_to = url.searchParams.get("date_to") ?? undefined; const venue_id = url.searchParams.get("venue_id") ?? undefined; const keyword = url.searchParams.get("keyword") ?? undefined; const page = Math.max(1, parseInt(url.searchParams.get("page") ?? "1", 10)); const limit = 30; const offset = (page - 1) * limit; const events = queryEvents({ date_from, date_to, venue_id, keyword, limit, offset }); const venues = getVenues(); return { events, venues, page, hasMore: events.length === limit }; } export default function EventsIndex() { const { events, venues, page, hasMore } = useLoaderData(); const [searchParams] = useSearchParams(); return (
🎸 東京ライブハウス

イベント一覧

{events.length === 0 ? (

イベントが見つかりません

「情報を更新」ボタンでデータを取得してください。

) : (
{events.map((event) => ( ))}
)}
{page > 1 && ( ← 前のページ )} {hasMore && ( 次のページ → )}
); } function buildPageParams(params: URLSearchParams, page: number): string { const next = new URLSearchParams(params); next.set("page", String(page)); return next.toString(); }