"use client"; import { useEffect, useMemo, useState } from "react"; import { useTranslation } from "@/i18n/navigation"; import Footer from "@/app/components/Footer"; import { apiFetch } from "@/app/lib/api-client"; interface Topic { id: string; title: string; author: string; avatar: string; views: number; replies: number; likes: number; category: string; lastActive: string; pinned: boolean; excerpt?: string; } interface DiscussionRecord { id: string; title: string; author?: string; city?: string; tags?: string[]; excerpt?: string; replies?: number; views?: number; created?: string; } const FALLBACK_TOPICS: Topic[] = [ { id: "1", title: "大理最佳共享办公空间推荐 Top 10", author: "林晓", avatar: "https://i.pravatar.cc/150?img=5", views: 2340, replies: 56, likes: 128, category: "资源共享", lastActive: "2小时前", pinned: true, }, { id: "2", title: "2026年数字游民友好城市排名", author: "张浩", avatar: "https://i.pravatar.cc/150?img=3", views: 1890, replies: 42, likes: 95, category: "城市测评", lastActive: "5小时前", pinned: true, }, { id: "3", title: "远程工作者的税务规划指南", author: "陈悦", avatar: "https://i.pravatar.cc/150?img=9", views: 1560, replies: 38, likes: 87, category: "税务签证", lastActive: "1天前", pinned: false, }, { id: "4", title: "成都 vs 大理:哪个更适合游民?", author: "周杰", avatar: "https://i.pravatar.cc/150?img=7", views: 1230, replies: 67, likes: 54, category: "城市对比", lastActive: "3小时前", pinned: false, }, { id: "5", title: "新手游民必备工具与装备清单", author: "吴婷", avatar: "https://i.pravatar.cc/150?img=1", views: 980, replies: 29, likes: 76, category: "经验分享", lastActive: "1天前", pinned: false, }, { id: "6", title: "如何在泰国办理长期签证?", author: "杨帅", avatar: "https://i.pravatar.cc/150?img=12", views: 2150, replies: 89, likes: 156, category: "税务签证", lastActive: "30分钟前", pinned: false, }, { id: "7", title: "数字游民保险选择指南", author: "赵琪", avatar: "https://i.pravatar.cc/150?img=16", views: 1780, replies: 45, likes: 112, category: "安全保障", lastActive: "6小时前", pinned: false, }, { id: "8", title: "东南亚最佳数字游民目的地", author: "黄磊", avatar: "https://i.pravatar.cc/150?img=11", views: 3210, replies: 78, likes: 234, category: "目的地", lastActive: "1小时前", pinned: false, }, ]; const CATEGORIES = [ { key: "all", zh: "全部", en: "All" }, { key: "城市测评", zh: "城市测评", en: "City Review" }, { key: "城市对比", zh: "城市对比", en: "City Comparison" }, { key: "税务签证", zh: "税务签证", en: "Tax & Visa" }, { key: "资源共享", zh: "资源共享", en: "Resource Sharing" }, { key: "经验分享", zh: "经验分享", en: "Experience" }, { key: "安全保障", zh: "安全保障", en: "Safety & Insurance" }, { key: "目的地", zh: "目的地", en: "Destinations" }, ]; function mapDiscussion(topic: DiscussionRecord, index: number): Topic { const author = topic.author || "NomadCNA"; const tags = Array.isArray(topic.tags) ? topic.tags : []; return { id: topic.id, title: topic.title, author, avatar: `https://api.dicebear.com/7.x/initials/svg?seed=${encodeURIComponent(author)}`, views: Number(topic.views || 0), replies: Number(topic.replies || 0), likes: Math.max(3, Math.round(Number(topic.views || 0) / 30) + Number(topic.replies || 0)), category: tags[0] || topic.city || "资源分享", lastActive: topic.created ? new Date(topic.created).toLocaleDateString("zh-CN") : "刚刚", pinned: index < 2, excerpt: topic.excerpt, }; } export default function DiscussPage() { const { t } = useTranslation("discuss"); const [activeCategory, setActiveCategory] = useState("all"); const [searchQuery, setSearchQuery] = useState(""); const [topics, setTopics] = useState(FALLBACK_TOPICS); const [showComposer, setShowComposer] = useState(false); const [posting, setPosting] = useState(false); const [draft, setDraft] = useState({ title: "", city: "", excerpt: "" }); useEffect(() => { apiFetch<{ items: DiscussionRecord[] }>("/api/discussions") .then((data) => { if (data.items?.length) { setTopics(data.items.map(mapDiscussion)); } }) .catch(() => setTopics(FALLBACK_TOPICS)); }, []); const filteredTopics = useMemo(() => topics.filter((topic) => { const matchesCategory = activeCategory === "all" || topic.category === activeCategory; const matchesSearch = topic.title.toLowerCase().includes(searchQuery.toLowerCase()); return matchesCategory && matchesSearch; }), [activeCategory, searchQuery, topics]); const createTopic = async (e: React.FormEvent) => { e.preventDefault(); if (!draft.title.trim()) return; setPosting(true); try { const data = await apiFetch<{ record: DiscussionRecord }>("/api/discussions", { method: "POST", body: JSON.stringify({ title: draft.title.trim(), author: "本地用户", city: draft.city.trim(), tags: [draft.city.trim() || "资源分享"], excerpt: draft.excerpt.trim(), }), }); setTopics((current) => [mapDiscussion(data.record, 0), ...current]); setDraft({ title: "", city: "", excerpt: "" }); setShowComposer(false); } finally { setPosting(false); } }; return (

{t("title")}

{t("subtitle")}

{showComposer && (
setDraft((v) => ({ ...v, title: e.target.value }))} placeholder="帖子标题" className="rounded-xl border border-gray-200 bg-white px-4 py-3 text-sm text-gray-900 focus:border-[#ff4d4f] focus:outline-none dark:border-gray-700 dark:bg-gray-800 dark:text-gray-100" /> setDraft((v) => ({ ...v, city: e.target.value }))} placeholder="关联城市" className="rounded-xl border border-gray-200 bg-white px-4 py-3 text-sm text-gray-900 focus:border-[#ff4d4f] focus:outline-none dark:border-gray-700 dark:bg-gray-800 dark:text-gray-100" />