From 46969f85cb9b253fcc629e664f5992365a9c0ab4 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Tue, 16 May 2023 23:47:23 +0100 Subject: [PATCH] feat: home tag page --- src/app/(home)/tag/[tag]/page.tsx | 39 +++++++++++++++++++++++ src/app/(home)/topic/[topic]/page.tsx | 8 ++--- src/components/home/HomeFeed.tsx | 33 ++++++++++++-------- src/models/home.model.ts | 45 ++++++++++++++++++++++++++- src/queries/home.ts | 1 + 5 files changed, 107 insertions(+), 19 deletions(-) create mode 100644 src/app/(home)/tag/[tag]/page.tsx diff --git a/src/app/(home)/tag/[tag]/page.tsx b/src/app/(home)/tag/[tag]/page.tsx new file mode 100644 index 00000000..43226128 --- /dev/null +++ b/src/app/(home)/tag/[tag]/page.tsx @@ -0,0 +1,39 @@ +import { Metadata } from "next" + +import { HomeFeed } from "~/components/home/HomeFeed" +import { HomeSidebar } from "~/components/home/HomeSidebar" +import { APP_NAME } from "~/lib/env" + +export function generateMetadata({ + params, +}: { + params: { + tag: string + } +}): Metadata { + return { + title: `Tag: ${params.tag} - ${APP_NAME}`, + } +} + +export default function Tag({ + params, +}: { + params: { + tag: string + } +}) { + params.tag = decodeURIComponent(params.tag) + + return ( +
+
+
+

Tag: {params.tag}

+ +
+ +
+
+ ) +} diff --git a/src/app/(home)/topic/[topic]/page.tsx b/src/app/(home)/topic/[topic]/page.tsx index 6870d8bb..02ce9fbc 100644 --- a/src/app/(home)/topic/[topic]/page.tsx +++ b/src/app/(home)/topic/[topic]/page.tsx @@ -31,11 +31,9 @@ function Topic({
-

Topic: {params.topic}

-

{info?.description}

-
- -
+

Topic: {params.topic}

+

{info?.description}

+
diff --git a/src/components/home/HomeFeed.tsx b/src/components/home/HomeFeed.tsx index 00fc952c..c103d982 100644 --- a/src/components/home/HomeFeed.tsx +++ b/src/components/home/HomeFeed.tsx @@ -1,7 +1,7 @@ "use client" import Link from "next/link" -import { useRouter, useSearchParams } from "next/navigation" +import { useParams, useRouter, useSearchParams } from "next/navigation" import { memo, useEffect, useState } from "react" import reactStringReplace from "react-string-replace" import { Virtuoso } from "react-virtuoso" @@ -46,7 +46,7 @@ const Post = ({ } return ( -
+
("latest") + const params = useParams() + const feed = useGetFeed({ type: feedType, characterId: currentCharacterId, @@ -179,6 +181,7 @@ export const HomeFeed: React.FC<{ daysInterval: hotInterval, searchKeyword: searchParams?.get("q") || undefined, searchType, + tag: decodeURIComponent(params?.tag), }) const hasFiltering = feedType === "latest" @@ -301,7 +304,7 @@ export const HomeFeed: React.FC<{ ) : !feed.data?.pages[0]?.count ? ( ) : ( -
+
feed.hasNextPage && feed.fetchNextPage()} @@ -309,16 +312,20 @@ export const HomeFeed: React.FC<{ data={feed.data?.pages} itemContent={(_, posts) => { if (!posts?.list.length) return
- return posts?.list.map((post) => { - return ( - - ) - }) + return ( +
+ {posts?.list.map((post) => { + return ( + + ) + })} +
+ ) }} >
diff --git a/src/models/home.model.ts b/src/models/home.model.ts index 43e1d9a3..e62c96a4 100644 --- a/src/models/home.model.ts +++ b/src/models/home.model.ts @@ -8,7 +8,13 @@ import { ExpandedNote } from "~/lib/types" import filter from "../../data/filter.json" -export type FeedType = "latest" | "following" | "topic" | "hot" | "search" +export type FeedType = + | "latest" + | "following" + | "topic" + | "hot" + | "search" + | "tag" export type SearchType = "latest" | "hot" export async function getFeed({ @@ -20,6 +26,7 @@ export async function getFeed({ daysInterval, searchKeyword, searchType, + tag, }: { type?: FeedType cursor?: string @@ -29,6 +36,7 @@ export async function getFeed({ daysInterval?: number searchKeyword?: string searchType?: SearchType + tag?: string }) { if (type === "search" && !searchKeyword) { type = "latest" @@ -258,6 +266,41 @@ export async function getFeed({ }), ) + return { + list, + cursor: result.cursor, + count: result.count, + } + } + case "tag": { + if (!tag) { + return { + list: [], + cursor: "", + count: 0, + } + } + + let result = await indexer.getNotes({ + sources: "xlog", + tags: ["post", tag], + limit, + cursor, + includeCharacter: true, + }) + + result.list = result.list.filter( + (note) => !filter.latest.includes(note.characterId), + ) + + const list = await Promise.all( + result.list.map(async (page: any) => { + const expand = await expandCrossbellNote(page, false, true) + delete expand.metadata?.content.content + return expand + }), + ) + return { list, cursor: result.cursor, diff --git a/src/queries/home.ts b/src/queries/home.ts index 480ff5fb..59033273 100644 --- a/src/queries/home.ts +++ b/src/queries/home.ts @@ -12,6 +12,7 @@ export const useGetFeed = (data?: { daysInterval?: number searchKeyword?: string searchType?: homeModel.SearchType + tag?: string }) => { return useInfiniteQuery({ queryKey: ["getFeed", data],