enzostvs HF staff commited on
Commit
a2157f5
·
1 Parent(s): 5269a0e

sort by last created

Browse files
Files changed (3) hide show
  1. app/page.tsx +12 -5
  2. components/spaces/index.tsx +9 -11
  3. utils/index.ts +4 -4
app/page.tsx CHANGED
@@ -1,22 +1,29 @@
1
  import { fetchAllPages } from "@/utils";
2
  import { SpaceProps } from "@/utils/type";
3
  import { Spaces } from "@/components/spaces";
 
4
 
5
- async function getSpaces() {
6
  try {
7
- const response = await fetchAllPages();
8
  return response as SpaceProps[];
9
  } catch {
10
  return [];
11
  }
12
  }
13
 
14
- export default async function Home() {
15
- const spaces = await getSpaces();
 
 
 
 
16
  return (
17
  <section className="flex h-screen overflow-auto">
18
  <div className="w-full container px-6 py-10 lg:py-20 mx-auto space-y-10 lg:space-y-14">
19
- <Spaces spaces={spaces} />
 
 
20
  </div>
21
  </section>
22
  );
 
1
  import { fetchAllPages } from "@/utils";
2
  import { SpaceProps } from "@/utils/type";
3
  import { Spaces } from "@/components/spaces";
4
+ import { Suspense } from "react";
5
 
6
+ async function getSpaces(sort: string) {
7
  try {
8
+ const response = await fetchAllPages(sort);
9
  return response as SpaceProps[];
10
  } catch {
11
  return [];
12
  }
13
  }
14
 
15
+ export default async function Home({
16
+ searchParams: { sort },
17
+ }: {
18
+ searchParams: { sort: string };
19
+ }) {
20
+ const spaces = await getSpaces(sort);
21
  return (
22
  <section className="flex h-screen overflow-auto">
23
  <div className="w-full container px-6 py-10 lg:py-20 mx-auto space-y-10 lg:space-y-14">
24
+ <Suspense fallback={<div>Loading...</div>}>
25
+ <Spaces spaces={spaces} />
26
+ </Suspense>
27
  </div>
28
  </section>
29
  );
components/spaces/index.tsx CHANGED
@@ -3,22 +3,20 @@ import { useMemo, useState } from "react";
3
 
4
  import { SpaceProps } from "@/utils/type";
5
  import { SpaceIcon } from "@/components/space_icon";
6
- import { sortByCreatedAt, sortByLikes } from "@/utils";
7
 
8
  import { Space } from "@/components/spaces/space";
9
  import { Sort } from "@/components/sort";
 
 
10
 
11
- export const Spaces: React.FC<{ spaces: SpaceProps[] }> = ({
12
- spaces: initialSpaces,
13
- }) => {
14
- const [sort, setSort] = useState<"likes" | "createdAt">("createdAt");
15
 
16
- const spaces = useMemo(() => {
17
- if (sort === "likes") {
18
- return sortByLikes(initialSpaces);
19
- }
20
- return sortByCreatedAt(initialSpaces);
21
- }, [initialSpaces, sort]);
22
 
23
  return (
24
  <>
 
3
 
4
  import { SpaceProps } from "@/utils/type";
5
  import { SpaceIcon } from "@/components/space_icon";
6
+ import { fetchAllPages, sortByCreatedAt, sortByLikes } from "@/utils";
7
 
8
  import { Space } from "@/components/spaces/space";
9
  import { Sort } from "@/components/sort";
10
+ import { useUpdateEffect } from "react-use";
11
+ import { useRouter } from "next/navigation";
12
 
13
+ export const Spaces: React.FC<{ spaces: SpaceProps[] }> = ({ spaces }) => {
14
+ const router = useRouter();
15
+ const [sort, setSort] = useState<"likes" | "createdAt">("likes");
 
16
 
17
+ useUpdateEffect(() => {
18
+ router.push("/?sort=" + sort);
19
+ }, [sort]);
 
 
 
20
 
21
  return (
22
  <>
utils/index.ts CHANGED
@@ -1,18 +1,18 @@
1
  import { SpaceProps } from "./type";
2
 
3
- export const fetchAllPages = async () => {
4
  const filter_key = "zero-a10g";
5
 
6
- const pageNumbers = Array.from({ length: 200 }, (_, i) => i);
7
  const urls = pageNumbers.map(async (pageNumber) => {
8
- const url = `https://huggingface.co/spaces-json?p=${pageNumber}&sort=trending`;
9
  const response = await fetch(url);
10
  const json = await response.json();
11
  return json?.spaces ?? [];
12
  });
13
  const jsonResponses = await Promise.all(urls);
14
  const spaces = jsonResponses.flat()?.filter((space) => space?.runtime?.hardware?.current === filter_key && !space?.private);
15
- return sortByCreatedAt(spaces);
16
  };
17
 
18
  export const sortByCreatedAt = (spaces: SpaceProps[]) => {
 
1
  import { SpaceProps } from "./type";
2
 
3
+ export const fetchAllPages = async (sort = "trending") => {
4
  const filter_key = "zero-a10g";
5
 
6
+ const pageNumbers = Array.from({ length: 250 }, (_, i) => i);
7
  const urls = pageNumbers.map(async (pageNumber) => {
8
+ const url = `https://huggingface.co/spaces-json?p=${pageNumber}&sort=${sort}`;
9
  const response = await fetch(url);
10
  const json = await response.json();
11
  return json?.spaces ?? [];
12
  });
13
  const jsonResponses = await Promise.all(urls);
14
  const spaces = jsonResponses.flat()?.filter((space) => space?.runtime?.hardware?.current === filter_key && !space?.private);
15
+ return spaces;
16
  };
17
 
18
  export const sortByCreatedAt = (spaces: SpaceProps[]) => {