增加 @提及、搜索筛选与找回密码,并将右栏热门改为正在聊。

补齐评论提及补全与通知、按作者/板块/仅标题搜索,以及邮箱验证码重置密码;同时修复 Go 提及正则并优化侧栏悬停样式。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-07 07:39:33 +08:00
parent 10185178e2
commit 94f6a9666b
26 changed files with 1315 additions and 153 deletions

View File

@@ -1,17 +1,53 @@
import { useNavigate } from 'react-router-dom';
import { api } from '../api/client';
import { highlightMentions } from '../utils/content';
import { userPath } from '../utils/userPath';
interface Props {
content: string;
onMentionClick?: (name: string) => void;
}
/** 渲染评论正文(支持正文内 @ 高亮) */
export default function CommentContent({ content, onMentionClick }: Props) {
/** 渲染评论正文(支持正文内 @ 高亮与点击跳转 */
export default function CommentContent({ content }: Props) {
const nav = useNavigate();
const openMention = async (name: string) => {
try {
const r = await api.searchUsers(name, 5);
const exact = (r.users || []).find(
(u) => u.username === name || u.nickname === name,
);
const user = exact || r.users?.[0];
if (user) {
nav(userPath(user.id));
}
} catch {
// 未登录或失败时忽略
}
};
return (
<div
className="floor-body"
onClick={(e) => {
const el = (e.target as HTMLElement).closest('.mention') as HTMLElement | null;
if (!el) return;
const name = el.getAttribute('data-name');
if (!name) return;
e.preventDefault();
void openMention(name);
}}
onKeyDown={(e) => {
if (e.key !== 'Enter' && e.key !== ' ') return;
const el = e.target as HTMLElement;
if (!el.classList.contains('mention')) return;
const name = el.getAttribute('data-name');
if (!name) return;
e.preventDefault();
void openMention(name);
}}
dangerouslySetInnerHTML={{
__html: highlightMentions(content, onMentionClick),
__html: highlightMentions(content),
}}
/>
);