From 02ccbdac71edca59bab356dbf7a2646d63fde378 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 4 Jan 2025 00:37:26 +0800 Subject: [PATCH] :sparkles: Basic post preview --- bun.lockb | Bin 207693 -> 236209 bytes package.json | 6 ++ src/components/CapAppBar.tsx | 2 +- src/pages/posts/[...id].tsx | 106 +++++++++++++++++++++++++++++++++++ src/services/attachment.ts | 48 ++++++++++++++++ src/services/post.ts | 85 ++++++++++++++++++++++++++++ tailwind.config.ts | 16 +++--- 7 files changed, 254 insertions(+), 9 deletions(-) create mode 100644 src/pages/posts/[...id].tsx create mode 100644 src/services/attachment.ts create mode 100644 src/services/post.ts diff --git a/bun.lockb b/bun.lockb index 26da72f47e094c85aeba9850c1620df51dd4debd..0c00167f21b920a4230402ca23fc79c0db4060a9 100755 GIT binary patch delta 59964 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 K{vGyu^#1{q?nlc2 delta 42192 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 diff --git a/package.json b/package.json index fd86c75..12fb9d3 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@mui/material": "^6.3.0", "@mui/material-nextjs": "^6.3.1", "@mui/x-charts": "^7.23.2", + "@tailwindcss/typography": "^0.5.15", "axios": "^1.7.9", "axios-case-converter": "^1.1.1", "cookies-next": "^5.0.2", @@ -24,6 +25,11 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-hook-form": "^7.54.2", + "rehype-sanitize": "^6.0.0", + "rehype-stringify": "^10.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.1", + "unified": "^11.0.5", "zustand": "^5.0.2" }, "devDependencies": { diff --git a/src/components/CapAppBar.tsx b/src/components/CapAppBar.tsx index 6665098..c600af6 100644 --- a/src/components/CapAppBar.tsx +++ b/src/components/CapAppBar.tsx @@ -41,7 +41,7 @@ function ElevationScroll(props: ElevationAppBarProps) { ? React.cloneElement(props.children, { elevation: trigger ? props.elevation : 0, sx: trigger - ? { backgroundColor: props.color, ...commonStyle } + ? { backgroundColor: props.color, color: 'black', ...commonStyle } : { backgroundColor: 'transparent', ...commonStyle }, }) : null diff --git a/src/pages/posts/[...id].tsx b/src/pages/posts/[...id].tsx new file mode 100644 index 0000000..dfa4300 --- /dev/null +++ b/src/pages/posts/[...id].tsx @@ -0,0 +1,106 @@ +import { getAttachmentUrl, sni } from '@/services/network' +import { SnPost } from '@/services/post' +import { Alert, AlertTitle, Avatar, Box, Collapse, Container, IconButton, Link, Typography } from '@mui/material' +import { GetServerSideProps, InferGetServerSidePropsType } from 'next' +import { useEffect, useMemo, useState } from 'react' +import { unified } from 'unified' +import Image from 'next/image' +import rehypeSanitize from 'rehype-sanitize' +import rehypeStringify from 'rehype-stringify' +import remarkParse from 'remark-parse' +import remarkRehype from 'remark-rehype' + +import CloseIcon from '@mui/icons-material/Close' + +export const getServerSideProps = (async (context) => { + const id = context.params!.id as string[] + try { + const { data: post } = await sni.get('/cgi/co/posts/' + id.join(':')) + if (post.body.content) { + const out = await unified() + .use(remarkParse) + .use(remarkRehype) + .use(rehypeSanitize) + .use(rehypeStringify) + .process(post.body.content) + post.body.content = String(out) + } + return { props: { post } } + } catch (err) { + return { + notFound: true, + } + } +}) satisfies GetServerSideProps<{ post: SnPost }> + +export default function Post({ post }: InferGetServerSidePropsType) { + const link = useMemo(() => `https://sn.solsynth.dev/posts/${post.id}`, [post]) + + const [openAppHint, setOpenAppHint] = useState() + + useEffect(() => { + if (!localStorage.getItem('sol_hide_app_hint')) { + setOpenAppHint(true) + } + }, []) + + useEffect(() => { + if (openAppHint === false) { + localStorage.setItem('sol_hide_app_hint', 'yes') + } + }, [openAppHint]) + + return ( + <> + + { + setOpenAppHint(false) + }} + > + + + } + > + Open in Solian + All feature supported, cross-platform, the official app of Solar Network.{' '} + + Launch + + + + + {post.body.thumbnail && ( + + post thumbnail + + )} + + + + + + + {post.publisher.nick} + + @{post.publisher.name} + + + + + + + {post.body.content &&
} + + + + ) +} diff --git a/src/services/attachment.ts b/src/services/attachment.ts new file mode 100644 index 0000000..31f14ac --- /dev/null +++ b/src/services/attachment.ts @@ -0,0 +1,48 @@ +import { sni } from './network' + +export interface SnAttachment { + id: number + createdAt: Date + updatedAt: Date + deletedAt?: Date | null + rid: string + uuid: string + size: number + name: string + alt: string + mimetype: string + hash: string + destination: number + refCount: number + contentRating: number + qualityRating: number + cleanedAt?: Date | null + isAnalyzed: boolean + isSelfRef: boolean + isIndexable: boolean + ref?: SnAttachment | null + refId?: number | null + poolId?: number | null + accountId: number + thumbnailId?: number | null + thumbnail?: SnAttachment | null + compressedId?: number | null + compressed?: SnAttachment | null + usermeta: Record + metadata: Record +} + +async function getAttachment(id: string | number): Promise { + const resp = await sni.get('/cgi/uc/attachments/' + id + '/meta') + return resp.data +} + +async function listAttachment(id: string[]): Promise { + const resp = await sni.get<{ data: SnAttachment[] }>('/cgi/uc/attachments', { + params: { + id: id.join(','), + take: id.length, + }, + }) + return resp.data.data +} diff --git a/src/services/post.ts b/src/services/post.ts new file mode 100644 index 0000000..85e0e48 --- /dev/null +++ b/src/services/post.ts @@ -0,0 +1,85 @@ +export interface SnPost { + id: number + createdAt: Date + updatedAt: Date + deletedAt?: Date | null + type: string + body: SnPostBody & Record + language: string + alias?: string | null + aliasPrefix?: string | null + tags: SnPostTag[] + categories: SnPostCategory[] + replies?: SnPost[] | null + replyId?: number | null + repostId?: number | null + replyTo?: SnPost | null + repostTo?: SnPost | null + visibleUsersList?: number[] | null + invisibleUsersList?: number[] | null + visibility: number + editedAt?: Date | null + pinnedAt?: Date | null + lockedAt?: Date | null + isDraft: boolean + publishedAt?: Date | null + publishedUntil?: Date | null + totalUpvote: number + totalDownvote: number + publisherId: number + publisher: SnPublisher + metric: SnMetric +} + +export interface SnPostTag { + id: number + createdAt: Date + updatedAt: Date + deletedAt?: Date + alias: string + name: string + description: string + posts?: SnPost[] +} + +export interface SnPostCategory { + id: number + createdAt: Date + updatedAt: Date + deletedAt?: Date + alias: string + name: string + description: string + posts?: SnPost[] +} + +export interface SnPostBody { + attachments: string[] + content: string + location?: string + thumbnail?: string + title?: string +} + +export interface SnMetric { + replyCount: number + reactionCount: number + reactionList: Record +} + +export interface SnPublisher { + id: number + createdAt: Date + updatedAt: Date + deletedAt?: Date | null + type: number + name: string + nick: string + description: string + avatar: string + banner: string + totalUpvote: number + totalDownvote: number + realmId?: number | null + accountId: number +} diff --git a/tailwind.config.ts b/tailwind.config.ts index 109807b..4834e9c 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,18 +1,18 @@ -import type { Config } from "tailwindcss"; +import type { Config } from 'tailwindcss' export default { content: [ - "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", - "./src/components/**/*.{js,ts,jsx,tsx,mdx}", - "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + './src/components/**/*.{js,ts,jsx,tsx,mdx}', + './src/app/**/*.{js,ts,jsx,tsx,mdx}', ], theme: { extend: { colors: { - background: "var(--background)", - foreground: "var(--foreground)", + background: 'var(--background)', + foreground: 'var(--foreground)', }, }, }, - plugins: [], -} satisfies Config; + plugins: [require('@tailwindcss/typography')], +} satisfies Config