feat: 全站评论开关,并统一后台表单控件

关闭评论后前台隐藏评论能力;外观/设置/公告改用 AdminField 与 Stepper。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-17 01:22:00 +08:00
parent 442af625f6
commit d93635c961
27 changed files with 989 additions and 479 deletions

View File

@@ -4,6 +4,7 @@ import Link from "next/link";
import { useRouter } from "next/navigation";
import { useRef } from "react";
import { MessageSquareText, Clock, Sparkles } from "lucide-react";
import { useAllowComments } from "@/components/CommentsPolicyProvider";
export type FeedSort = "latest" | "new" | "recommended";
@@ -22,18 +23,20 @@ function tabHref(key: FeedSort, boardId: number) {
export default function FeedTabs({ current, boardId = 0 }: { current: FeedSort; boardId?: number }) {
const router = useRouter();
const tabRefs = useRef<(HTMLAnchorElement | null)[]>([]);
const allowComments = useAllowComments();
const keys = allowComments ? TAB_KEYS : TAB_KEYS.filter((k) => k !== "latest");
const handleKeyDown = (e: React.KeyboardEvent, i: number) => {
if (e.key !== "ArrowRight" && e.key !== "ArrowLeft") return;
e.preventDefault();
const next = (i + (e.key === "ArrowRight" ? 1 : TAB_KEYS.length - 1)) % TAB_KEYS.length;
const next = (i + (e.key === "ArrowRight" ? 1 : keys.length - 1)) % keys.length;
tabRefs.current[next]?.focus();
router.push(tabHref(TAB_KEYS[next], boardId));
router.push(tabHref(keys[next], boardId));
};
return (
<div className="flex items-center gap-1.5 sm:gap-2" role="tablist" aria-label="帖子排序">
{TAB_KEYS.map((key, i) => {
{keys.map((key, i) => {
const Icon = key === "latest" ? MessageSquareText : key === "new" ? Clock : Sparkles;
return (
<Link