From 0faf98ee80933c76f02d71837ae28c2b27d656e4 Mon Sep 17 00:00:00 2001
From: Yuri Tatishchev Songs Search
@@ -101,14 +64,21 @@
{/if}
No songs found matching your criteria.
diff --git a/src/routes/songs/+page.ts b/src/routes/songs/+page.ts index e619eeb..ffcfb7e 100644 --- a/src/routes/songs/+page.ts +++ b/src/routes/songs/+page.ts @@ -1,27 +1,24 @@ import type { SongFilters } from "$lib/db/client-db"; import { db, ensureSeeded, getSongsWithFilters } from "$lib/db/client-db"; import type { PageLoad } from "./$types"; -import { LoadSearchParamsSchema } from "./schema"; +import { SearchParamsSchema } from "./schema"; export const load: PageLoad = async ({ url, fetch, depends }) => { depends("clientdb:songs"); - const parsed = LoadSearchParamsSchema.safeParse( + const parsed = SearchParamsSchema.safeParse( Object.fromEntries(url.searchParams.entries()), ); const filters: SongFilters = {}; if (parsed.success) { - if (parsed.data.q) filters.songName = parsed.data.q; + if (parsed.data.song) filters.songName = parsed.data.song; if (parsed.data.artist) filters.artistName = parsed.data.artist; if (parsed.data.anime) filters.animeName = parsed.data.anime; - if (parsed.data.type && parsed.data.type.length > 0) - filters.songTypes = parsed.data.type; if (parsed.data.gpm !== undefined) filters.globalPercentMin = parsed.data.gpm; if (parsed.data.gpx !== undefined) filters.globalPercentMax = parsed.data.gpx; - if (parsed.data.cat !== undefined) filters.category = parsed.data.cat; } // Client-only DB: on the server `db` is null, so return [] and let hydration re-run load in browser. diff --git a/src/routes/songs/schema.ts b/src/routes/songs/schema.ts index 1c014a7..637d0f6 100644 --- a/src/routes/songs/schema.ts +++ b/src/routes/songs/schema.ts @@ -1,38 +1,9 @@ import { z } from "zod"; -import { SongTypeMap } from "$lib/utils/amq"; -// Base schema for raw URL search parameters as strings -const BaseSearchParamsSchema = z.object({ - q: z.string().optional(), - artist: z.string().optional(), - anime: z.string().optional(), - gpm: z.string().optional(), - gpx: z.string().optional(), - cat: z.string().optional(), +export const SearchParamsSchema = z.object({ + song: z.string().optional().default(""), + artist: z.string().optional().default(""), + anime: z.string().optional().default(""), + gpm: z.int().optional().default(0), + gpx: z.int().optional().default(100), }); - -// Schema for +page.ts load function (parses comma-separated types into number array) -export const LoadSearchParamsSchema = BaseSearchParamsSchema.extend({ - type: z - .string() - .optional() - .transform((s) => { - if (!s) return undefined; - return s - .split(",") - .map((t) => SongTypeMap[t.trim().toUpperCase()]) - .filter((n) => n !== undefined); - }), -}).strict(); - -// Schema for +page.svelte useSearchParams (handles 'type' as an array of strings from URL) -export const SvelteSearchParamsSchema = BaseSearchParamsSchema.extend({ - type: z.array(z.string()).default([]), -}).strict(); - -// Define the type for the Svelte form, which will have default values -export type SvelteSearchForm = z.infer