diff --git a/package-lock.json b/package-lock.json index 4d430e4..707a3bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dayjs": "^1.11.13", "lucide-react": "^0.542.0", "next": "^15.4.0", - "pathcat": "^1.4.0", + "pathcat": "^1.5.1", "react": "^19", "react-dom": "^19", "react-grid-gallery": "^1.0.1" diff --git a/package.json b/package.json index 287be68..b15a13e 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "dayjs": "^1.11.13", "lucide-react": "^0.542.0", "next": "^15.4.0", - "pathcat": "^1.4.0", + "pathcat": "^1.5.1", "react": "^19", "react-dom": "^19", "react-grid-gallery": "^1.0.1" diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index c6e11d7..7cd3c13 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -1,4 +1,3 @@ -import { pathWildcat } from "@/spanner/api"; import { Metadata } from "next"; import Image from "next/image"; import { cloneElement } from "react"; diff --git a/src/app/join/page.tsx b/src/app/join/page.tsx index 10421a8..5de5717 100644 --- a/src/app/join/page.tsx +++ b/src/app/join/page.tsx @@ -1,4 +1,4 @@ -import { pathWildcat } from "@/spanner/api"; +import { spannerPathCat } from "@/spanner/api"; import { wwlrcClubId } from "@/spanner/wwlrc"; import { Download, ExternalLinkIcon } from "lucide-react"; import { Metadata } from "next"; @@ -178,7 +178,7 @@ export default function Join() {

): string { - if (!query) { - return pathcat(spannerBase, template); - } - - return pathcat(spannerBase, template, query); +function wrap( + fn: (path: string) => R, +): ( + base: string, + path: Path, + ...query: [ExtractRouteParams] extends [never] + ? [query?: Query] + : [query: Query] +) => R { + return (base, path, ...query): R => fn(pathcat(base, path, ...query)); } -export function spannerApiFetch( - template: string, - query?: Query, -): Promise { - const url = pathWildcat(template, query); - let p = fetch(url); - // TODO: probably worth putting some more fancy error handling here - return p.then((response) => response.json()); +function wrapWithBase( + base: string, + fn: (path: string) => R, +): ( + path: Path, + ...query: [ExtractRouteParams] extends [never] + ? [query?: Query] + : [query: Query] +) => R { + return (path, ...query): R => wrap(fn)(base, path, ...query); } + +export const spannerApiFetch = wrapWithBase>( + "https://spanner.wwlrc.co.uk", + async (path) => { + let response = await fetch(path); + // TODO: probably worth putting some more fancy error handling here + return response.json(); + }, +); diff --git a/src/spanner/blog.ts b/src/spanner/blog.ts index 0d46735..d017cdb 100644 --- a/src/spanner/blog.ts +++ b/src/spanner/blog.ts @@ -1,4 +1,4 @@ -import { spannerApiFetch } from "./api"; +import { spannerApiFetch, spannerPathCat } from "./api"; import { wwlrcClubId } from "./wwlrc"; export async function getPosts(): Promise {