← 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")),
  };
}