Files
jiang13-forum/embed_static/static/spa/assets/HomePage-Bk9P_MHc.js

2 lines
6.1 KiB
JavaScript

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