Files
jiang13-forum/embed_static/static/spa/assets/HomePage-12KM5s42.js
freefire b451703642 完善论坛配置与发帖体验:TipTap 富文本、图片上传、修订历史、Feed 排序与后台参数管理。
同步更新 README 与 ROADMAP,反映最新功能与开发状态。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 04:11:38 +08:00

2 lines
5.5 KiB
JavaScript

import{j as e,r as c,e as A,i as I,v as M}from"./react-vendor-CFzzFOsg.js";import{S as V,p as O,a as w,n as U,F as Y,b as q}from"./index-5C0q-ZMs.js";import{u as D}from"./virtual-vendor-DQlhmwRh.js";import{B as G}from"./badge-DB-zL5ml.js";import{P as J}from"./PinnedIcon-CTFlF79l.js";import{f as z}from"./content-BrFHUpp8.js";import{g as F,s as K,c as H}from"./feedCache-D2GnU_BI.js";import"./ui-vendor-BtpOfToU.js";function Q({post:t,sort:i="latest",onClick:l}){var n,s,d,u;const a=((s=(n=t.user)==null?void 0:n.nickname)==null?void 0:s[0])||"?",o=i==="reply"?t.last_reply_at?`${z(t.last_reply_at)} 回复`:"暂无回复":z(t.created_at);return e.jsxs("div",{className:"post-row",onClick:l,children:[e.jsx("div",{className:"post-avatar",children:(d=t.user)!=null&&d.avatar?e.jsx("img",{src:t.user.avatar,alt:""}):a}),e.jsxs("div",{className:"post-body",children:[e.jsxs("div",{className:"post-title",children:[t.pinned&&e.jsx(J,{className:"mr-1.5"}),t.title]}),e.jsxs("div",{className:"post-meta",children:[t.board&&e.jsx(G,{variant:"green",children:t.board.name}),e.jsx("span",{children:((u=t.user)==null?void 0:u.nickname)||"匿名"}),e.jsx("span",{children:o})]})]}),e.jsxs("div",{className:"post-stats",children:[e.jsxs("span",{children:["💬 ",t.comment_count??0]}),e.jsxs("span",{children:["👍 ",t.like_count??0]})]})]})}function W({posts:t,sort:i="latest",loading:l,hasMore:a,onLoadMore:o,onSelect:n,restoreScrollTop:s,onScrollTopChange:d,onScrollRestored:u}){const p=c.useRef(null),x=c.useRef(!1),j=D({count:t.length,getScrollElement:()=>p.current,estimateSize:()=>72,overscan:8});return c.useLayoutEffect(()=>{s==null||x.current||t.length===0||(j.scrollToOffset(s),x.current=!0,u==null||u())},[s,t.length,j,u]),c.useEffect(()=>{x.current=!1},[s]),c.useEffect(()=>{const f=p.current;if(!f)return;const m=()=>{d==null||d(f.scrollTop),f.scrollTop+f.clientHeight>=f.scrollHeight-120&&a&&!l&&o()};return f.addEventListener("scroll",m),()=>f.removeEventListener("scroll",m)},[a,l,o,d]),e.jsxs("div",{className:"post-list-scroll",ref:p,children:[e.jsx("div",{className:"content-surface",style:{height:j.getTotalSize(),position:"relative"},children:j.getVirtualItems().map(f=>{const m=t[f.index];return e.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",transform:`translateY(${f.start}px)`},children:e.jsx(Q,{post:m,sort:i,onClick:()=>n(m.id)})},m.id)})}),l&&e.jsx("div",{className:"flex justify-center py-4",children:e.jsx(V,{})}),!l&&!a&&t.length>0&&e.jsx("div",{style:{textAlign:"center",padding:6,fontSize:12,color:"var(--color-text-3)"},children:"— 已加载全部 —"})]})}function X({boardId:t,keyword:i,boards:l,stats:a,postTotal:o}){const n=A(),s=l.find(p=>p.id===t),d=i?`搜索:${i}`:t&&s?s.name:"全部帖子",u=t&&s&&s.description||"";return e.jsxs("div",{className:`feed-head${i?" feed-head--solo":""}`,children:[e.jsxs("div",{className:"feed-head__title",children:[e.jsx("h2",{title:u||void 0,children:d}),!i&&a&&e.jsxs("span",{className:"feed-head__meta",children:["会员 ",e.jsx("strong",{children:a.users}),e.jsx("span",{className:"feed-head__dot","aria-hidden":!0,children:"·"}),"帖子 ",e.jsx("strong",{children:a.posts}),e.jsx("span",{className:"feed-head__dot","aria-hidden":!0,children:"·"}),"板块 ",e.jsx("strong",{children:a.boards})]})]}),i&&e.jsx("button",{type:"button",className:"feed-head__clear",onClick:()=>n("/"),children:"清除搜索"}),i&&e.jsxs("span",{className:"feed-toolbar__count",children:["共 ",o," 条"]})]})}function oe(){const t=A(),[i]=I(),l=M(),a=Number(i.get("board"))||(l==null?void 0:l.boardId)||0,o=i.get("keyword")||"",n=O(i.get("sort")),s=F(a,o,n),[d,u]=c.useState(()=>(s==null?void 0:s.posts)??[]),[p,x]=c.useState(()=>(s==null?void 0:s.postTotal)??0),[j,f]=c.useState(()=>(s==null?void 0:s.page)??1),[m,S]=c.useState(()=>(s==null?void 0:s.hasMore)??!0),[L,T]=c.useState(()=>!s),[k,g]=c.useState(()=>(s==null?void 0:s.scrollTop)??null),v=c.useRef((s==null?void 0:s.scrollTop)??0),b=c.useCallback(async(r,_=!1)=>{T(!0);try{const h=await w.posts({page:r,size:30,board_id:a||"",keyword:o,sort:n==="latest"?"":n}),N=Array.isArray(h.posts)?h.posts:[];u(y=>_?N:[...y,...N]),x(h.total??0),S(!!h.has_more),f(r)}catch(h){U.error(h instanceof Error?h.message:"加载失败"),_&&u([])}finally{T(!1)}},[a,o,n]),P=c.useCallback(async r=>{try{const _=[];let h=0,N=!0;for(let y=1;y<=r;y++){const E=await w.posts({page:y,size:30,board_id:a||"",keyword:o,sort:n==="latest"?"":n}),R=Array.isArray(E.posts)?E.posts:[];if(_.push(...R),h=E.total??0,N=!!E.has_more,!E.has_more)break}u(_),x(h),S(N),f(r)}catch{}},[a,o,n]);c.useEffect(()=>{const r=F(a,o,n);if(r){u(r.posts),x(r.postTotal),f(r.page),S(r.hasMore),g(r.scrollTop),v.current=r.scrollTop,T(!1),P(r.page);return}g(null),v.current=0,b(1,!0)},[a,o,n,b,P]),c.useEffect(()=>()=>{d.length!==0&&K(a,o,n,{posts:d,postTotal:p,page:j,hasMore:m,scrollTop:v.current})},[a,o,n,d,p,j,m]),c.useEffect(()=>{const r=()=>{H(),g(null),v.current=0,b(1,!0)};return window.addEventListener("posts-refresh",r),()=>window.removeEventListener("posts-refresh",r)},[a,o,n,b]);const $=r=>{r!==n&&(H(),g(null),v.current=0,t(q(a,r)))},B=!o;return e.jsxs("div",{className:"page-wrap",children:[e.jsxs("div",{className:"feed-top",children:[e.jsx(X,{boardId:a,keyword:o,boards:(l==null?void 0:l.boards)??[],stats:(l==null?void 0:l.stats)??null,postTotal:p}),B&&e.jsx(Y,{value:n,onChange:$,postTotal:p})]}),e.jsx(W,{posts:d,sort:n,loading:L,hasMore:m,onLoadMore:()=>!L&&m&&b(j+1),onSelect:r=>t(`/post/${r}`),restoreScrollTop:k,onScrollTopChange:r=>{v.current=r},onScrollRestored:()=>g(null)})]})}export{oe as default};