Spaces:
Running
Running
sort by last created
Browse files- app/page.tsx +12 -5
- components/spaces/index.tsx +9 -11
- 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 |
-
|
|
|
|
|
|
|
|
|
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 |
-
<
|
|
|
|
|
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 |
-
|
13 |
-
|
14 |
-
const [sort, setSort] = useState<"likes" | "createdAt">("createdAt");
|
15 |
|
16 |
-
|
17 |
-
|
18 |
-
|
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:
|
7 |
const urls = pageNumbers.map(async (pageNumber) => {
|
8 |
-
const url = `https://huggingface.co/spaces-json?p=${pageNumber}&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
|
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[]) => {
|