From b9e06d9a139e6d9a6d509f500beee97d0d071602 Mon Sep 17 00:00:00 2001 From: yyamashita Date: Sat, 15 Aug 2026 20:12:25 +0900 Subject: Add site-wide search for bands and artists Adds a nav search box and /search route backed by a LIKE-based searchAll() query over band name/area/description and artist name. --- app/routes/search.tsx | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 app/routes/search.tsx (limited to 'app/routes/search.tsx') diff --git a/app/routes/search.tsx b/app/routes/search.tsx new file mode 100644 index 0000000..a4c03b7 --- /dev/null +++ b/app/routes/search.tsx @@ -0,0 +1,73 @@ +import { Form, Link, useLoaderData } from "react-router"; +import type { Route } from "./+types/search"; +import { searchAll } from "~/lib/db.server"; + +export function loader({ request }: Route.LoaderArgs) { + const q = new URL(request.url).searchParams.get("q")?.trim() ?? ""; + if (!q) return { q, bands: [], artists: [] }; + const { bands, artists } = searchAll(q); + return { q, bands, artists }; +} + +export default function Search() { + const { q, bands, artists } = useLoaderData(); + const hasResults = bands.length > 0 || artists.length > 0; + + return ( +
+
+

検索

+
+ +
+ +
+ + {!q ? ( +

検索キーワードを入力してください。

+ ) : !hasResults ? ( +

「{q}」に一致する結果が見つかりませんでした。

+ ) : ( + <> + {bands.length > 0 && ( +
+

Bands

+
    + {bands.map((band) => ( +
  • + {band.name} + {band.area && ( + {band.area} + )} + {band.status === "hiatus" && ( + 活動休止 + )} +
  • + ))} +
+
+ )} + + {artists.length > 0 && ( +
+

Artists

+
    + {artists.map((artist) => ( +
  • + {artist.name} +
  • + ))} +
+
+ )} + + )} +
+ ); +} -- cgit v1.2.3