diff --git a/src/app/api/pages/route.ts b/src/app/api/pages/route.ts index 3722ee18..c61480c8 100644 --- a/src/app/api/pages/route.ts +++ b/src/app/api/pages/route.ts @@ -1,5 +1,5 @@ import { NextServerResponse, getQuery } from "~/lib/server-helper" -import { PageVisibilityEnum } from "~/lib/types" +import { PageVisibilityEnum, PagesSortTypes } from "~/lib/types" import { getPagesBySite } from "~/models/page.model" export async function GET(req: Request) { @@ -13,6 +13,7 @@ export async function GET(req: Request) { cursor: query.cursor as string, useStat: true, skipExpansion: query.skipExpansion === "true", + sortType: query.sortType as PagesSortTypes, ...(query.tags && { tags: Array.isArray(query.tags) ? (query.tags as string[]) diff --git a/src/app/site/[site]/page.tsx b/src/app/site/[site]/page.tsx index e8a97d08..f6652f28 100644 --- a/src/app/site/[site]/page.tsx +++ b/src/app/site/[site]/page.tsx @@ -27,6 +27,7 @@ async function SiteIndexPage({ visibility: PageVisibilityEnum.Published, useStat: true, limit: 18, + sortType: "latest", }, queryClient, ) diff --git a/src/components/site/SiteHome.tsx b/src/components/site/SiteHome.tsx index 4b16ee89..f50dbccb 100644 --- a/src/components/site/SiteHome.tsx +++ b/src/components/site/SiteHome.tsx @@ -1,7 +1,10 @@ "use client" +import { useState } from "react" + import PostList from "~/components/site/PostList" -import { NoteType, PageVisibilityEnum } from "~/lib/types" +import { type TabItem, Tabs } from "~/components/ui/Tabs" +import { NoteType, PageVisibilityEnum, PagesSortTypes } from "~/lib/types" import { useGetPagesBySiteLite, usePinnedPage } from "~/queries/page" import { useGetSite } from "~/queries/site" @@ -13,19 +16,61 @@ export default function SiteHome({ type?: NoteType }) { const site = useGetSite(handle) + const [sortType, setSortType] = useState("latest") const posts = useGetPagesBySiteLite({ characterId: site.data?.characterId, type: type || ["post", "portfolio"], visibility: PageVisibilityEnum.Published, useStat: true, limit: type === "short" ? 20 : 18, + sortType: sortType, }) const pinnedPage = usePinnedPage({ characterId: site.data?.characterId }) - if (!posts.data?.pages?.length) return null + let tabs: TabItem[] + switch (type) { + case "portfolio": + tabs = [] + break + case "short": + tabs = [ + { + text: "Latest", + onClick: () => setSortType("latest"), + active: sortType === "latest", + }, + { + text: "Most Commented", + onClick: () => setSortType("commented"), + active: sortType === "commented", + }, + ] + break + default: + tabs = [ + { + text: "Latest", + onClick: () => setSortType("latest"), + active: sortType === "latest", + }, + { + text: "Hottest", + onClick: () => setSortType("hottest"), + active: sortType === "hottest", + }, + { + text: "Most Commented", + onClick: () => setSortType("commented"), + active: sortType === "commented", + }, + ] + break + } return ( <> + + {!posts.data?.pages?.length && posts.isLoading && <>Loading...} { - if ( - !a.metadata?.content?.date_published || - a.noteId === expandedNotes.pinnedNoteId - ) { - return -1 - } else if ( - !b.metadata?.content?.date_published || - b.noteId === expandedNotes.pinnedNoteId - ) { - return 1 - } else { - return ( - +new Date(b.metadata?.content?.date_published) - - +new Date(a.metadata?.content?.date_published) - ) - } - }) - return expandedNotes }