Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions src/components/FieldCatalog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,19 @@ import { useEffect, useState, type ChangeEvent } from "react";
import FieldBadges from "./fields/FieldBadges";
import Markdown from "react-markdown";
import type { CollectionEntry } from "astro:content";
import { setSearchParams } from "~/util/url";

type Fields = CollectionEntry<"fields">["data"]["entries"];

type Filters = {
search: string;
categories: string[];
keywords: string[];
};

const FieldCatalog = ({ fields }: { fields: Fields }) => {
const [filters, setFilters] = useState<Filters>({
search: "",
categories: [],
keywords: [],
});

const mapped = fields.sort((f1, f2) => {
Expand Down Expand Up @@ -58,7 +57,6 @@ const FieldCatalog = ({ fields }: { fields: Fields }) => {
});

useEffect(() => {
// On component load, check for deep-links to categories in the query param
const params = new URLSearchParams(window.location.search);
const categories = params.getAll("field-category");
const searchTerm = params.get("search-term") ?? "";
Expand All @@ -72,6 +70,22 @@ const FieldCatalog = ({ fields }: { fields: Fields }) => {
});
}, []);

useEffect(() => {
const params = new URLSearchParams();

if (filters.search) {
params.set("search-term", filters.search);
}

if (filters.categories.length > 0) {
filters.categories.forEach((category) =>
params.append("field-category", category),
);
}

setSearchParams(params);
}, [filters]);

return (
<div className="md:flex">
<div className="mr-8 w-full md:w-1/4">
Expand Down
31 changes: 30 additions & 1 deletion src/components/LearningPathCatalog.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { useState, type ChangeEvent } from "react";
import { useEffect, useState, type ChangeEvent } from "react";
import Markdown from "react-markdown";
import type { CollectionEntry } from "astro:content";
import type { IconifyIconBuildResult } from "@iconify/utils";
import { setSearchParams } from "~/util/url";

type LearningPaths = CollectionEntry<"learning-paths">["data"][];
type Icons = Record<string, IconifyIconBuildResult>;
Expand All @@ -23,6 +24,34 @@ const LearningPathCatalog = ({
groups: [],
});

useEffect(() => {
const params = new URLSearchParams(window.location.search);
const products = params.getAll("products");
const groups = params.getAll("groups");

if (!products && !groups) return;

setFilters({
...filters,
products,
groups,
});
}, []);

useEffect(() => {
const params = new URLSearchParams();

if (filters.products.length > 0) {
filters.products.forEach((product) => params.append("products", product));
}

if (filters.groups.length > 0) {
filters.groups.forEach((group) => params.append("groups", group));
}

setSearchParams(params);
}, [filters]);

const sorted = paths.sort((lp1, lp2) => {
return lp1.priority < lp2.priority ? -1 : 1;
});
Expand Down
25 changes: 25 additions & 0 deletions src/components/ModelCatalog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import ModelInfo from "./models/ModelInfo";
import ModelBadges from "./models/ModelBadges";
import { authorData } from "./models/data";
import type { WorkersAIModelsSchema } from "~/schemas";
import { setSearchParams } from "~/util/url";

type Filters = {
search: string;
Expand Down Expand Up @@ -67,6 +68,30 @@ const ModelCatalog = ({ models }: { models: WorkersAIModelsSchema[] }) => {
});
}, []);

useEffect(() => {
const params = new URLSearchParams();

if (filters.search) {
params.set("search", filters.search);
}

if (filters.authors.length > 0) {
filters.authors.forEach((author) => params.append("authors", author));
}

if (filters.tasks.length > 0) {
filters.tasks.forEach((task) => params.append("tasks", task));
}

if (filters.capabilities.length > 0) {
filters.capabilities.forEach((capability) =>
params.append("capabilities", capability),
);
}

setSearchParams(params);
}, [filters]);

const mapped = sortedModels.map((model) => ({
model: {
...model,
Expand Down
16 changes: 15 additions & 1 deletion src/components/ProductCatalog.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { useEffect, useState, type ChangeEvent } from "react";
import type { CollectionEntry } from "astro:content";
import type { IconifyIconBuildResult } from "@iconify/utils";
import { setSearchParams } from "~/util/url";

export type ProductData = CollectionEntry<"products"> & {
icon?: IconifyIconBuildResult;
Expand Down Expand Up @@ -42,7 +43,6 @@ const ProductCatalog = ({ products }: { products: ProductData[] }) => {
});

useEffect(() => {
// On component load, check for deep-links to groups in the query param
const params = new URLSearchParams(window.location.search);
const groups = params.get("product-group")?.split(",");

Expand All @@ -54,6 +54,20 @@ const ProductCatalog = ({ products }: { products: ProductData[] }) => {
});
}, []);

useEffect(() => {
const params = new URLSearchParams();

if (filters.search) {
params.set("search", filters.search);
}

if (filters.groups.length > 0) {
filters.groups.forEach((group) => params.append("product-group", group));
}

setSearchParams(params);
}, [filters]);

return (
<div className="md:flex">
<div className="mr-8 w-full md:w-1/4">
Expand Down
13 changes: 3 additions & 10 deletions src/components/search/InstantSearch.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
FloatingPortal,
} from "@floating-ui/react";
import { PiCaretDownBold } from "react-icons/pi";
import { setSearchParams } from "~/util/url";

function SearchBox(props: UseSearchBoxProps) {
const { query, refine } = useSearchBox(props);
Expand All @@ -43,11 +44,7 @@ function SearchBox(props: UseSearchBoxProps) {
params.delete("q");
}

history.pushState(
null,
"",
`${window.location.pathname}?${params.toString()}`,
);
setSearchParams(params);
}, [query]);

return (
Expand Down Expand Up @@ -143,11 +140,7 @@ function FilterDropdown({
params.set(attribute, refined.join(","));
}

history.pushState(
null,
"",
`${window.location.pathname}?${params.toString()}`,
);
setSearchParams(params);
}, [items]);

const { refs, floatingStyles, context } = useFloating({
Expand Down
12 changes: 12 additions & 0 deletions src/util/url.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export function setSearchParams(params: URLSearchParams) {
if (params.size === 0) {
history.pushState(null, "", window.location.pathname);
return;
}

history.pushState(
null,
"",
`${window.location.pathname}?${params.toString()}`,
);
}