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

2 lines
6.5 KiB
JavaScript

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