← back to Homesonspec
apps/web/src/lib/parse-search.ts
47 lines
import type { SearchParams } from "@homesonspec/search";
function num(v: string | null): number | undefined {
if (v === null || v === "") return undefined;
const n = Number(v);
return Number.isFinite(n) ? n : undefined;
}
export function parseSearchParams(searchParams: URLSearchParams): SearchParams {
const bboxRaw = searchParams.get("bbox");
let bbox: SearchParams["bbox"];
if (bboxRaw) {
const [minLat, minLon, maxLat, maxLon] = bboxRaw.split(",").map(Number);
if ([minLat, minLon, maxLat, maxLon].every((n) => Number.isFinite(n))) {
bbox = { minLat: minLat!, minLon: minLon!, maxLat: maxLat!, maxLon: maxLon! };
}
}
return {
q: searchParams.get("q") ?? undefined,
bbox,
priceMin: num(searchParams.get("priceMin")),
priceMax: num(searchParams.get("priceMax")),
bedsMin: num(searchParams.get("bedsMin")),
bathsMin: num(searchParams.get("bathsMin")),
sqftMin: num(searchParams.get("sqftMin")),
sqftMax: num(searchParams.get("sqftMax")),
homeTypes: searchParams.getAll("homeType"),
builderSlugs: searchParams.getAll("builder"),
communitySlug: searchParams.get("community") ?? undefined,
statuses: searchParams.getAll("status"),
storiesEq: num(searchParams.get("stories")),
garageMin: num(searchParams.get("garageMin")),
hasIncentives: searchParams.get("incentives") === "1" ? true : undefined,
ageRestricted:
searchParams.get("ageRestricted") === "1" ? true : searchParams.get("ageRestricted") === "0" ? false : undefined,
hoaMax: num(searchParams.get("hoaMax")),
schoolDistrict: searchParams.get("schoolDistrict") ?? undefined,
state: searchParams.get("state") ?? undefined,
states: searchParams.getAll("st"),
city: searchParams.get("city") ?? undefined,
moveInByMonths: num(searchParams.get("moveInByMonths")),
sort: (searchParams.get("sort") as SearchParams["sort"]) ?? "newest",
page: num(searchParams.get("page")),
pageSize: num(searchParams.get("pageSize")),
};
}