"use client" import Link from "next/link" import { useRouter } from "next/navigation" import { Plus, Megaphone } from "lucide-react" import { useTranslations } from "next-intl" import { Button } from "@/shared/components/ui/button" import { EmptyState } from "@/shared/components/ui/empty-state" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/shared/components/ui/select" import { AnnouncementCard } from "./announcement-card" import type { Announcement, AnnouncementStatus } from "../types" type Filter = "all" | AnnouncementStatus /** * 公告列表组件。 * * 过滤模式:纯服务端过滤。 * - Select 切换时更新 URL `?status=`,触发 RSC 重新渲染 * - 父页面根据 `?status=` 查询并传入 `announcements` prop * - 组件不再做客户端二次过滤,避免双重过滤逻辑冗余 */ export function AnnouncementList({ announcements, canManage, createHref, detailHrefBuilder, initialStatus, }: { announcements: Announcement[] canManage?: boolean createHref?: string detailHrefBuilder?: (id: string) => string initialStatus?: Filter }) { const t = useTranslations("announcements") const router = useRouter() const filter: Filter = initialStatus ?? "all" const filterOptions: { value: Filter; label: string }[] = [ { value: "all", label: t("filter.all") }, { value: "published", label: t("filter.published") }, { value: "draft", label: t("filter.draft") }, { value: "archived", label: t("filter.archived") }, ] const handleFilterChange = (value: string): void => { const params = new URLSearchParams() if (value !== "all") params.set("status", value) const qs = params.toString() router.replace(qs ? `?${qs}` : "?") } return (