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[]) => {
|