most-box 0.2.9 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/out/admin/index.html +0 -0
  2. package/out/app/index.html +0 -0
  3. package/out/assets/{FilePreviewOverlay-BYZIAMJ-.js → FilePreviewOverlay-CM5IqnZD.js} +1 -1
  4. package/out/assets/{MarketingHeader-ceWdRCpe.js → MarketingHeader-B45AaM29.js} +1 -1
  5. package/out/assets/{MarketingLayout-Bun1d2wL.js → MarketingLayout-A00pEOa2.js} +1 -1
  6. package/out/assets/{MilkdownEditor-CT6SHYKG.js → MilkdownEditor-BTq9bDAf.js} +1 -1
  7. package/out/assets/{OpenSidebarButton-CLSCB7CG.js → OpenSidebarButton-D8qfUGzU.js} +1 -1
  8. package/out/assets/{SidebarAccount-CNh0kvtB.js → SidebarAccount-_RBE5K_o.js} +1 -1
  9. package/out/assets/{SidebarHomeLink-DXv0c9Ob.js → SidebarHomeLink-qMFEGjZt.js} +1 -1
  10. package/out/assets/{downloadValidation-Bzl7cci9.js → downloadValidation-CSXwoQKW.js} +1 -1
  11. package/out/assets/index-BRhsWNj1.css +1 -0
  12. package/out/assets/{index-BI8oNSVC.js → index-C-_ZwxuN.js} +2 -2
  13. package/out/assets/index-CYVRmppz.css +1 -0
  14. package/out/assets/index.lazy-0YYV0CR3.js +1 -0
  15. package/out/assets/index.lazy-BTYGr9Vb.js +1 -0
  16. package/out/assets/{index.lazy-BOMHingE.js → index.lazy-BVAtQtTa.js} +1 -1
  17. package/out/assets/{index.lazy-ur0joIFl.js → index.lazy-BbdLA2L-.js} +1 -1
  18. package/out/assets/{index.lazy-bAp_Hgck.js → index.lazy-CbiLtziY.js} +1 -1
  19. package/out/assets/{index.lazy-D4zNn3D6.js → index.lazy-CcEdBg3i.js} +2 -2
  20. package/out/assets/index.lazy-CePHsLXG.js +1 -0
  21. package/out/assets/{index.lazy-Ch4Y17pJ.js → index.lazy-DG_3_VdF.js} +1 -1
  22. package/out/assets/{index.lazy-7omTRykl.js → index.lazy-DR0rWEWZ.js} +1 -1
  23. package/out/assets/{index.lazy-BSY5_gby.js → index.lazy-DSyTSCJD.js} +1 -1
  24. package/out/assets/{index.lazy-C4ipXKZ7.js → index.lazy-DUhsuPLv.js} +1 -1
  25. package/out/assets/{index.lazy-_mEd0Q_u.js → index.lazy-DVnhWbzH.js} +1 -1
  26. package/out/assets/{index.lazy-CPZbEnJZ.js → index.lazy-DZpkg1DJ.js} +1 -1
  27. package/out/assets/useChannelMessages-DOaWHdAP.js +4 -0
  28. package/out/assets/{useGameRoom-cs9YpYt7.js → useGameRoom-hHkV65ii.js} +1 -1
  29. package/out/assets/{userProfile-qcc60tHK.js → userProfile-DwZip0Dt.js} +1 -1
  30. package/out/chat/index.html +0 -0
  31. package/out/chat/join/index.html +0 -0
  32. package/out/download/index.html +2 -2
  33. package/out/game/gandengyan/index.html +0 -0
  34. package/out/game/index.html +0 -0
  35. package/out/game/zhajinhua/index.html +0 -0
  36. package/out/index.html +2 -2
  37. package/out/note/index.html +0 -0
  38. package/out/ping/index.html +2 -2
  39. package/out/profile/index.html +0 -0
  40. package/out/web3/index.html +0 -0
  41. package/package.json +1 -1
  42. package/server/index.js +59 -2
  43. package/server/src/http/app.js +7 -1
  44. package/server/src/http/nodeStatus.js +6 -0
  45. package/server/src/http/routes/channelRoutes.js +12 -0
  46. package/server/src/index.js +476 -3
  47. package/out/assets/index-3OD3Chi9.css +0 -1
  48. package/out/assets/index-BSOvFG3o.css +0 -1
  49. package/out/assets/index.lazy-CvBIIYbm.js +0 -1
  50. package/out/assets/index.lazy-Cz-OZwYL.js +0 -1
  51. package/out/assets/index.lazy-DRY3xoQp.js +0 -1
  52. package/out/assets/useChannelMessages-BeKF0gwo.js +0 -3
@@ -1 +0,0 @@
1
- import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{C as r,T as i,s as a}from"./ui-BpDGD3IR.js";import{a as o}from"./i18n-NjvOSuV6.js";import{n as s,r as c}from"./LanguageToggle-CSQtRZ3A.js";import{t as ee}from"./copy-DEzFUzeX.js";import{n as te}from"./SidebarHomeLink-DXv0c9Ob.js";import{t as ne}from"./play-B-BjsTZz.js";import{t as re}from"./send-BL4d5iOt.js";import{i as ie,n as ae,r as oe,t as se}from"./useGameRoom-cs9YpYt7.js";import{S as l,c as u,i as d,x as f}from"./index-BI8oNSVC.js";var ce=r(`rotate-ccw`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]),p=t(e(),1),m=[`S`,`H`,`C`,`D`],h=[`3`,`4`,`5`,`6`,`7`,`8`,`9`,`10`,`J`,`Q`,`K`,`A`,`2`],g=h.filter(e=>e!==`2`),_=new Map(h.map((e,t)=>[e,t+3])),v=5,y=20,b=1e3;function le({roomCode:e,ownerAddress:t,ownerName:n,players:r=[],random:i=Math.random}){let a=k(r);return a.some(e=>e.address===f(t))||a.unshift({address:f(t),name:Y(n),avatar:``}),x({id:String(e||``).toUpperCase(),ownerAddress:f(t),status:`lobby`,seq:1,players:a.slice(0,6).map((e,t)=>({address:e.address,name:Y(e.name),avatar:l(e.avatar),seat:t,hand:[],handCount:0,score:b,playedCards:0})),deck:[],discard:[],table:null,currentSeat:0,lastWinnerSeat:null,previousWinnerSeat:null,passSeats:[],baseScore:1,bombCount:0,diceRolls:[],roundResult:null,log:[`房间已创建`],winnerSeat:null,random:i})}function ue(e,t=[]){let n=S(e);if(!n||n.status!==`lobby`)return n;let r=new Map(n.players.map(e=>[e.address,e.score]));return n.players=k(t).slice(0,6).map((e,t)=>({address:e.address,name:Y(e.name),avatar:l(e.avatar),seat:t,hand:[],handCount:0,score:r.get(e.address)??b,playedCards:0})),n.seq+=1,x(n)}function de(e,t=Math.random){let n=S(e);if(!n||n.players.length<2)throw Error(`至少需要 2 名玩家`);n.deck=I(F(),t),n.discard=[],n.table=null,n.passSeats=[],n.winnerSeat=null,n.roundResult=null,n.baseScore=1,n.bombCount=0,n.status=`playing`;for(let e of V(n))e.hand=L(n,v),e.handCount=e.hand.length,e.playedCards=0,R(e.hand);let r=M(n,t);return n.currentSeat=r.seat,n.lastWinnerSeat=null,n.log=[`新一局开始,${r.name} 先出牌`],n.diceRolls.length>0&&n.log.unshift(`骰子结果:${n.diceRolls.map(e=>`${e.name} ${e.value}`).join(`,`)}`),n.seq+=1,x(n)}function fe(e,t,n){let r=S(e),i=z(r),a=f(t);if(!i||i.address!==a)return{ok:!1,error:`还没轮到你`,state:x(r)};let o=n.map(e=>i.hand.find(t=>t.id===e));if(o.length===0||o.some(e=>!e))return{ok:!1,error:`手牌不存在`,state:x(r)};let s=C(o);return s?O(s,r.table?.combo)?(o.sort(W),i.hand=i.hand.filter(e=>!n.includes(e.id)),i.handCount=i.hand.length,i.playedCards+=o.length,r.discard.push(...o),r.table={seat:i.seat,playerName:i.name,cards:o,combo:s},r.passSeats=[],r.lastWinnerSeat=i.seat,s.type===`bomb`&&(r.bombCount+=1,r.baseScore*=2),r.log.unshift(`${i.name} 出 ${s.label} ${o.map(J).join(` `)}${s.type===`bomb`?`,底分 ${r.baseScore}`:``}`),i.hand.length===0?N(r,i):H(r),r.seq+=1,{ok:!0,state:x(r)}):{ok:!1,error:`出的牌压不过上一手`,state:x(r)}:{ok:!1,error:`这个牌型不合法`,state:x(r)}}function pe(e,t){let n=S(e),r=z(n),i=f(t);return!r||r.address!==i?{ok:!1,error:`还没轮到你`,state:x(n)}:n.table?(n.passSeats.includes(r.seat)||n.passSeats.push(r.seat),n.log.unshift(`${r.name} 不要`),B(n).map(e=>e.seat).filter(e=>e!==n.lastWinnerSeat).every(e=>n.passSeats.includes(e))?(P(n),n.currentSeat=n.lastWinnerSeat,n.table=null,n.passSeats=[],n.log.unshift(`本轮结束,所有玩家各补 1 张,重新领出`)):H(n),n.seq+=1,{ok:!0,state:x(n)}):{ok:!1,error:`领出时不能不要`,state:x(n)}}function me(e,t){let n=S(e);if(!n)return null;let r=f(t),i=n.players.findIndex(e=>e.address===r);if(i===-1)return x(n);let a=n.players[i],o=n.currentSeat===a.seat,s=n.lastWinnerSeat===a.seat;n.players.splice(i,1),n.passSeats=n.passSeats.filter(e=>e!==a.seat),n.log.unshift(`${a.name} 已退出房间`);let c=V(n);if(n.status===`playing`)if(c.length<=1)c.length===1?N(n,c[0]):(n.status=`finished`,n.log.unshift(`玩家不足,本局结束`));else{if(o){let e=B(n);if(e.length>0){let t=e.findIndex(e=>e.seat>a.seat);n.currentSeat=e[t>=0?t:0].seat}}s&&n.table&&(n.table=null,n.passSeats=[])}return n.seq+=1,x(n)}function x(e){return e?{id:e.id,ownerAddress:e.ownerAddress,status:e.status,seq:Number(e.seq||1),deck:Array.isArray(e.deck)?e.deck.map(q):[],deckCount:e.deck?.length||Number(e.deckCount||0),discard:Array.isArray(e.discard)?e.discard.map(q):[],discardCount:e.discard?.length||Number(e.discardCount||0),currentSeat:Number(e.currentSeat||0),lastWinnerSeat:e.lastWinnerSeat===null||e.lastWinnerSeat===void 0?null:Number(e.lastWinnerSeat),previousWinnerSeat:e.previousWinnerSeat===null||e.previousWinnerSeat===void 0?null:Number(e.previousWinnerSeat),baseScore:Number(e.baseScore||1),bombCount:Number(e.bombCount||0),diceRolls:Array.isArray(e.diceRolls)?e.diceRolls:[],roundResult:e.roundResult||null,table:e.table?{...e.table,cards:e.table.cards.map(q)}:null,passSeats:Array.isArray(e.passSeats)?e.passSeats:[],winnerSeat:e.winnerSeat===null||e.winnerSeat===void 0?null:Number(e.winnerSeat),log:Array.isArray(e.log)?e.log.slice(0,18):[],players:V(e).map(e=>({address:e.address,name:e.name,avatar:l(e.avatar),seat:e.seat,handCount:e.hand?.length??e.handCount??0,score:Number(e.score??b),playedCards:Number(e.playedCards||0),hand:Array.isArray(e.hand)?e.hand.map(q):[]}))}:null}function S(e){return!e||typeof e!=`object`?null:{id:String(e.id||``).toUpperCase(),ownerAddress:f(e.ownerAddress),status:e.status===`playing`||e.status===`finished`?e.status:`lobby`,seq:Number(e.seq||1),players:Array.isArray(e.players)?e.players.map(A).filter(Boolean):[],deck:Array.isArray(e.deck)?e.deck.map(_e).filter(Boolean):[],discard:Array.isArray(e.discard)?e.discard.map(j).filter(Boolean):[],table:e.table&&typeof e.table==`object`?{...e.table,cards:Array.isArray(e.table.cards)?e.table.cards.map(j).filter(Boolean):[]}:null,currentSeat:Number(e.currentSeat||0),lastWinnerSeat:e.lastWinnerSeat===null||e.lastWinnerSeat===void 0?null:Number(e.lastWinnerSeat),previousWinnerSeat:e.previousWinnerSeat===null||e.previousWinnerSeat===void 0?null:Number(e.previousWinnerSeat),passSeats:Array.isArray(e.passSeats)?e.passSeats.map(Number):[],baseScore:Number(e.baseScore||1),bombCount:Number(e.bombCount||0),diceRolls:Array.isArray(e.diceRolls)?e.diceRolls:[],roundResult:e.roundResult||null,log:Array.isArray(e.log)?e.log.map(String):[],winnerSeat:e.winnerSeat===null||e.winnerSeat===void 0?null:Number(e.winnerSeat)}}function C(e){if(!e?.length)return null;e=[...e].sort(W);let t=e.filter(K).length,n=e.filter(e=>!K(e));if(n.length===0)return null;let r=w(e,n,t);if(r)return r;if(e.length===1&&t===0)return D(`single`,G(e[0]),1,[G(e[0])]);if(e.length===2&&U(n,t)){let e=he(n);return D(`pair`,e,2,[e,e])}return T(e)||E(e)}function w(e,t,n){if(e.length<3||!U(t,n))return null;let r=he(t);return D(`bomb`,r,e.length,Array(e.length).fill(r),n===0)}function T(e){if(e.length<3)return null;let t=e.filter(K).length,n=e.filter(e=>!K(e));for(let r=0;r<=g.length-e.length;r+=1){let i=g.slice(r,r+e.length).map(e=>_.get(e)),a=[...i],o=0;for(let e of n){let t=a.indexOf(G(e));t!==-1&&(a.splice(t,1),o+=1)}if(o+t===e.length&&a.length===t)return D(`straight`,i.at(-1),e.length,i)}return null}function E(e){if(e.length<4||e.length%2!=0)return null;let t=e.length/2,n=e.filter(K).length,r=e.filter(e=>!K(e));for(let i=0;i<=g.length-t;i+=1){let a=g.slice(i,i+t).map(e=>_.get(e)),o=a.flatMap(e=>[e,e]),s=0;for(let e of r){let t=o.indexOf(G(e));t!==-1&&(o.splice(t,1),s+=1)}if(s+n===e.length&&o.length===n){let t=a.flatMap(e=>[e,e]);return D(`pairStraight`,a.at(-1),e.length,t)}}return null}function D(e,t,n,r,i=!0){return{type:e,value:t,length:n,resolvedValues:r,pure:i,label:be({type:e,value:t,length:n,resolvedValues:r,pure:i})}}function O(e,t){return e?!t||e.type===`bomb`&&t.type!==`bomb`?!0:e.type===t.type?e.type===`bomb`?e.length===t.length?e.value===t.value?e.pure&&!t.pure:e.value>t.value:e.length>t.length:e.length===t.length?e.type===`single`||e.type===`pair`?e.value===Se(t.value)||e.value===_.get(`2`)&&t.value!==_.get(`2`):e.value===Se(t.value):!1:!1:!1}function k(e){let t=new Set;return e.map(e=>({address:f(e.address),name:Y(e.name),avatar:l(e.avatar),publicKey:String(e.publicKey||``)})).filter(e=>!e.address||t.has(e.address)?!1:(t.add(e.address),!0))}function A(e){let t=f(e.address);return t?{address:t,name:Y(e.name),avatar:l(e.avatar),seat:Number(e.seat||0),hand:Array.isArray(e.hand)?e.hand.map(j).filter(Boolean):[],handCount:Number(e.handCount||0),score:Number(e.score??b),playedCards:Number(e.playedCards||0)}:null}function j(e){if(!e||typeof e!=`object`)return null;let t=String(e.rank||``),n=String(e.suit||``);return!_.has(t)&&t!==`SJ`&&t!==`BJ`||!m.includes(n)&&n!==`Joker`?null:{id:String(e.id||`${n}-${t}`),suit:n,rank:t,label:e.label||J({suit:n,rank:t}),color:e.color||ye({suit:n,rank:t})}}function M(e,t){if(e.previousWinnerSeat!==null)return e.diceRolls=[],V(e).find(t=>t.seat===e.previousWinnerSeat)||V(e)[0];let n=V(e),r=[];for(;n.length>1;){r=n.map(e=>({seat:e.seat,name:e.name,value:Ce(t)}));let i=Math.max(...r.map(e=>e.value)),a=r.filter(e=>e.value===i);if(a.length===1)return e.diceRolls=r,n.find(e=>e.seat===a[0].seat);n=n.filter(e=>a.some(t=>t.seat===e.seat))}return e.diceRolls=r,n[0]}function N(e,t){e.status=`finished`,e.winnerSeat=t.seat,e.previousWinnerSeat=t.seat;let n=[],r=0;for(let i of V(e)){if(i.seat===t.seat)continue;let a=i.playedCards===0,o=a?y:i.hand.length*e.baseScore*.5;i.score-=o,r+=o,n.push({seat:i.seat,name:i.name,loss:o,sealed:a,cardsLeft:i.hand.length})}t.score+=r,e.roundResult={winnerSeat:t.seat,winnerName:t.name,winnerGain:r,baseScore:e.baseScore,bombCount:e.bombCount,losers:n},e.log.unshift(`${t.name} 获胜,赢 ${r} 分`)}function P(e){for(let t of B(e)){if(e.deck.length===0)break;t.hand.push(...L(e,1)),t.handCount=t.hand.length,R(t.hand)}}function F(){let e=[];for(let t of m)for(let n of h)e.push({id:`${t}-${n}`,suit:t,rank:n});return e.push({id:`SJ`,suit:`Joker`,rank:`SJ`}),e.push({id:`BJ`,suit:`Joker`,rank:`BJ`}),e.map(q)}function I(e,t){let n=[...e];for(let e=n.length-1;e>0;--e){let r=Math.floor(t()*(e+1));[n[e],n[r]]=[n[r],n[e]]}return n}function L(e,t){return e.deck.splice(0,t)}function R(e){e.sort(W)}function z(e){return e.players.find(t=>t.seat===e.currentSeat)}function B(e){return V(e).filter(e=>e.hand.length>0)}function V(e){return[...e?.players||[]].sort((e,t)=>e.seat-t.seat)}function H(e){let t=B(e).map(e=>e.seat);e.currentSeat=t[(t.indexOf(e.currentSeat)+1)%t.length]}function U(e,t=0){if(e.length===0)return!1;let n=e[0].rank;return e.every(e=>e.rank===n)&&e.length+t>=2}function he(e){return G(e[0])}function W(e,t){return G(e)-G(t)||ge(e.suit)-ge(t.suit)}function G(e){return _.get(e.rank)||99}function K(e){return e.rank===`SJ`||e.rank===`BJ`}function ge(e){return{D:0,C:1,H:2,S:3,Joker:4}[e]||0}function _e(e){if(typeof e==`string`){let[t,n]=e.split(`-`);return j({id:e,suit:t,rank:n})}return j(e)}function q(e){return{id:e.id,suit:e.suit,rank:e.rank,label:J(e),color:ye(e)}}function J(e){return e.rank===`SJ`?`小王`:e.rank===`BJ`?`大王`:`${ve(e.suit)}${e.rank}`}function ve(e){return{S:`♠`,H:`♥`,C:`♣`,D:`♦`}[e]||``}function ye(e){return e.suit===`H`||e.suit===`D`||e.rank===`BJ`?`red`:`black`}function be(e){let t=e.resolvedValues?.length?`(${e.resolvedValues.map(xe).join(` `)})`:``;return`${{single:`单张`,pair:`对子`,straight:`顺子`,pairStraight:`连对`,bomb:e.pure?`纯炸弹`:`带王炸弹`}[e.type]}${t}`}function xe(e){return h.find(t=>_.get(t)===e)||String(e)}function Se(e){let t=h.findIndex(t=>_.get(t)===e);return t===-1||t>=h.length-1?null:_.get(h[t+1])}function Ce(e){return Math.floor(e()*6)+1}function Y(e){return String(e||`玩家`).trim().slice(0,16)||`玩家`}var X={page:`_page_p7qf6_1`,headerActions:`_headerActions_p7qf6_7`,entry:`_entry_p7qf6_13`,entryBrand:`_entryBrand_p7qf6_23`,cardMark:`_cardMark_p7qf6_29`,entryPanel:`_entryPanel_p7qf6_59`,panel:`_panel_p7qf6_60`,handPanel:`_handPanel_p7qf6_61`,accountLine:`_accountLine_p7qf6_74`,scoreMeta:`_scoreMeta_p7qf6_75`,roomBar:`_roomBar_p7qf6_76`,badges:`_badges_p7qf6_77`,actions:`_actions_p7qf6_78`,joinForm:`_joinForm_p7qf6_98`,status:`_status_p7qf6_119`,gameGrid:`_gameGrid_p7qf6_125`,tablePanel:`_tablePanel_p7qf6_136`,seats:`_seats_p7qf6_170`,player:`_player_p7qf6_176`,active:`_active_p7qf6_193`,winner:`_winner_p7qf6_197`,avatar:`_avatar_p7qf6_201`,centerTable:`_centerTable_p7qf6_235`,deckBox:`_deckBox_p7qf6_242`,playedBox:`_playedBox_p7qf6_243`,playedCards:`_playedCards_p7qf6_271`,notice:`_notice_p7qf6_279`,resultDetail:`_resultDetail_p7qf6_287`,sidePanel:`_sidePanel_p7qf6_298`,scoreRow:`_scoreRow_p7qf6_323`,logPanel:`_logPanel_p7qf6_331`,hand:`_hand_p7qf6_61`,cardButton:`_cardButton_p7qf6_358`,picked:`_picked_p7qf6_368`,card:`_card_p7qf6_29`,red:`_red_p7qf6_399`,black:`_black_p7qf6_403`,small:`_small_p7qf6_407`,preview:`_preview_p7qf6_425`,valid:`_valid_p7qf6_448`},Z=n(),Q=`gandengyan`;function $(...e){return e.filter(Boolean).join(` `)}function we(e,t){return String(e||``).toLowerCase()===String(t||``).toLowerCase()}function Te(e,t){if(typeof window>`u`||!(`speechSynthesis`in window)||!e)return;window.speechSynthesis.cancel();let n=new SpeechSynthesisUtterance(e);n.lang=t,n.rate=1.1,window.speechSynthesis.speak(n)}function Ee(){let{t:e,locale:t}=o(),n=u(e=>e.isDarkMode),r=u(e=>e.setIsDarkMode),i=u(e=>e.addToast),l=a(e=>e.initializeUser),[d,f]=(0,p.useState)(``),[m,h]=(0,p.useState)([]),[g,_]=(0,p.useState)(!1),v=(0,p.useRef)(``),y=(0,p.useRef)(!1),b=se({gameId:Q,onError:e=>i(e,`error`)});(0,p.useEffect)(()=>{l()},[l]),(0,p.useEffect)(()=>{let e=new URLSearchParams(window.location.search).get(`room`)?.toUpperCase();e&&(f(e),v.current=e)},[]),(0,p.useEffect)(()=>{let t=v.current;!t||y.current||!b.isBackendReady||!b.userIdentity||(y.current=!0,v.current=``,b.joinRoom(t).then(t=>{t&&i(e(`game.toast.joinedRoom`),`success`)}))},[b.isBackendReady,b.userIdentity,b.joinRoom,i,e]),(0,p.useEffect)(()=>{if(!b.roomCode)return;let e=`/game/gandengyan?room=${b.roomCode}`;`${window.location.pathname}${window.location.search}`!==e&&window.history.replaceState(null,``,e)},[b.roomCode]);let x=(0,p.useMemo)(()=>ae(b.messages,b.roomCode?{gameId:Q,roomCode:b.roomCode}:{gameId:Q}),[b.messages,b.roomCode]),S=(0,p.useMemo)(()=>oe(b.messages,{gameId:Q,roomCode:b.roomCode}),[b.messages,b.roomCode]),w=S?.payload?.state,T=w?.players.find(e=>we(e.address,b.userIdentity?.address)),E=we(w?.ownerAddress||x.hostAddress,b.userIdentity?.address),D=w?.status===`playing`&&w.currentSeat===T?.seat,O=(0,p.useMemo)(()=>m.map(e=>T?.hand.find(t=>t.id===e)).filter(Boolean),[m,T]),k=(0,p.useMemo)(()=>C(O),[O]),A=b.roomCode&&typeof window<`u`?`${window.location.origin}/game/gandengyan?room=${b.roomCode}`:``,j=(0,p.useRef)(-1),M=(0,p.useRef)(!1);(0,p.useEffect)(()=>{h([])},[w?.seq]),(0,p.useEffect)(()=>{if(!w)return;let n=w.seq;if(j.current<0){j.current=n;return}if(n!==j.current&&(j.current=n,w.status!==`finished`&&(M.current=!1),w.status===`finished`&&w.winnerSeat!==null)){M.current||(M.current=!0,Te(e(`game.gandengyan.speech.gameOver`),t));return}},[t,w?.seq,e]),(0,p.useEffect)(()=>{if(!E||!b.roomCode||!b.userIdentity||S||x.players.length===0)return;let e=le({roomCode:b.roomCode,ownerAddress:b.userIdentity.address,ownerName:b.userIdentity.displayName||b.userIdentity.username,players:x.players});b.sendRoomEvent(`room:state`,{state:e,seq:e.seq})},[b,E,S,x.players]),(0,p.useEffect)(()=>{if(!w||!E||w.status!==`lobby`)return;let e=ue(w,x.players);e&&e.players.length!==w.players.length&&b.sendRoomEvent(`room:state`,{state:e,seq:e.seq})},[b,E,x.players,w]);let N=(0,p.useRef)(0),P=(0,p.useMemo)(()=>b.roomEvents.filter(e=>e.event?.event===`player:leave`),[b.roomEvents]);(0,p.useEffect)(()=>{if(P.length<=N.current)return;let t=P.slice(N.current);N.current=P.length;for(let n of t)i(e(`game.toast.playerLeft`,{player:n.event?.payload?.player?.name||e(`game.player`)}),`info`)},[P,i,e]),(0,p.useEffect)(()=>{if(!w||!E||w.status!==`playing`)return;let e=new Set(x.players.map(e=>e.address.toLowerCase())),t=w.players.find(t=>!e.has(t.address.toLowerCase()));if(!t)return;let n=me(w,t.address);n&&R(n)},[b,E,x.players,w]);async function F(){await b.createRoom()&&i(e(`game.toast.roomCreated`),`success`)}async function I(t){t.preventDefault(),await b.joinRoom(d)&&i(e(`game.toast.joinedRoom`),`success`)}async function L(){A&&(await navigator.clipboard.writeText(A),_(!0),setTimeout(()=>_(!1),1400))}async function R(e){await b.sendRoomEvent(`room:state`,{state:e,seq:e.seq})}async function z(){if(!(!w||!E))try{await R(de(w))}catch(t){i(t instanceof Error?t.message:e(`game.zhajinhua.error.startFailed`),`error`)}}async function B(){await z()}async function V(){if(!w||!b.userIdentity)return;let t=fe(w,b.userIdentity.address,m);if(!t.ok){i(t.error||e(`game.gandengyan.error.playFailed`),`error`);return}await R(t.state)}async function H(){if(!w||!b.userIdentity)return;let t=pe(w,b.userIdentity.address);if(!t.ok){i(t.error||e(`game.gandengyan.error.actionFailed`),`error`);return}await R(t.state)}function U(e){h(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])}return(0,Z.jsx)(te,{sidebar:({closeSidebar:e})=>(0,Z.jsx)(ie,{activeGame:`gandengyan`,closeSidebar:e}),headerTitle:(0,Z.jsx)(`h2`,{className:`header-title`,children:e(`game.gandengyan.title`)}),headerRight:(0,Z.jsxs)(`div`,{className:X.headerActions,children:[w&&(0,Z.jsxs)(`button`,{className:`btn btn-sm`,onClick:L,children:[(0,Z.jsx)(ee,{size:14}),e(g?`common.copied`:`game.action.shareRoom`)]}),(0,Z.jsx)(`button`,{className:`btn btn-icon`,onClick:()=>r(!n),title:e(`common.theme.toggle`),children:n?(0,Z.jsx)(s,{size:16}):(0,Z.jsx)(c,{size:16})})]}),children:(0,Z.jsx)(`main`,{className:X.page,children:w?(0,Z.jsxs)(`section`,{className:X.gameGrid,children:[(0,Z.jsxs)(`div`,{className:X.tablePanel,children:[(0,Z.jsxs)(`div`,{className:X.roomBar,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`strong`,{translate:`no`,children:e(`game.roomLabel`,{room:w.id})}),(0,Z.jsx)(`span`,{children:w.status===`lobby`?e(`game.status.waitingStart`):w.status===`finished`?e(`game.status.finished`):e(`game.status.playing`)})]}),(0,Z.jsx)(`div`,{className:X.badges,children:(0,Z.jsx)(`span`,{children:b.connected?e(`game.status.online`):e(`game.status.offline`)})})]}),(0,Z.jsx)(`div`,{className:X.seats,children:w.players.map(t=>(0,Z.jsx)(De,{player:t,active:w.currentSeat===t.seat,winner:w.winnerSeat===t.seat,relation:ke(T,t,w.players.length,e)},t.seat))}),(0,Z.jsxs)(`div`,{className:X.centerTable,children:[(0,Z.jsxs)(`div`,{className:X.deckBox,children:[(0,Z.jsx)(`span`,{children:e(`game.gandengyan.deck`)}),(0,Z.jsx)(`strong`,{children:w.deckCount})]}),(0,Z.jsx)(`div`,{className:X.playedBox,children:w.table?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`strong`,{children:e(`game.gandengyan.tablePlay`,{player:w.table.playerName,combo:w.table.combo?.label||e(`game.card`)})}),(0,Z.jsx)(`div`,{className:X.playedCards,children:w.table.cards.map(e=>(0,Z.jsx)(Oe,{card:e,small:!0},e.id))})]}):(0,Z.jsx)(`span`,{children:e(`game.gandengyan.waitingLead`)})}),(0,Z.jsxs)(`div`,{className:X.deckBox,children:[(0,Z.jsx)(`span`,{children:e(`game.gandengyan.baseScore`)}),(0,Z.jsx)(`strong`,{children:w.baseScore})]})]}),(0,Z.jsx)(`div`,{className:X.notice,children:w.status===`finished`?w.roundResult?(0,Z.jsxs)(`div`,{className:X.resultDetail,children:[(0,Z.jsxs)(`p`,{children:[e(`game.gandengyan.result.winnerGain`,{player:w.roundResult.winnerName,score:w.roundResult.winnerGain}),w.roundResult.bombCount>0&&e(`game.gandengyan.result.bombCount`,{count:w.roundResult.bombCount})]}),w.roundResult.losers.map(t=>(0,Z.jsx)(`p`,{children:t.sealed?e(`game.gandengyan.result.sealedLoss`,{player:t.name,loss:20}):e(`game.gandengyan.result.cardsLeftLoss`,{player:t.name,cards:t.cardsLeft,loss:t.loss})},t.seat))]}):e(`game.gandengyan.result.winner`,{player:w.players.find(e=>e.seat===w.winnerSeat)?.name||e(`game.player`)}):D?e(`game.gandengyan.status.yourTurn`):e(`game.zhajinhua.status.waitingPlayer`,{player:w.players.find(e=>e.seat===w.currentSeat)?.name||e(`game.player`)})})]}),(0,Z.jsxs)(`aside`,{className:X.sidePanel,children:[(0,Z.jsxs)(`section`,{className:X.panel,children:[(0,Z.jsx)(`h3`,{children:e(`game.gandengyan.roundPanel`)}),E&&w.status===`lobby`&&(0,Z.jsxs)(`button`,{className:`btn btn-primary`,disabled:w.players.length<2,onClick:z,children:[(0,Z.jsx)(ne,{size:16}),e(`game.action.startRound`)]}),E&&w.status===`finished`&&(0,Z.jsxs)(`button`,{className:`btn btn-primary`,onClick:B,children:[(0,Z.jsx)(ce,{size:16}),e(`game.action.nextRound`)]}),!E&&(0,Z.jsx)(`p`,{className:X.status,children:e(`game.waitingHost`)})]}),(0,Z.jsxs)(`section`,{className:X.panel,children:[(0,Z.jsx)(`h3`,{children:e(`game.gandengyan.score`)}),(0,Z.jsxs)(`div`,{className:X.scoreMeta,children:[(0,Z.jsx)(`span`,{children:e(`game.gandengyan.bombCount`,{count:w.bombCount})}),(0,Z.jsx)(`span`,{children:e(`game.gandengyan.discardCount`,{count:w.discardCount})})]}),w.players.map(e=>(0,Z.jsxs)(`div`,{className:X.scoreRow,children:[(0,Z.jsx)(`span`,{translate:`no`,children:e.name}),(0,Z.jsx)(`strong`,{children:e.score})]},e.seat))]}),(0,Z.jsxs)(`section`,{className:$(X.panel,X.logPanel),children:[(0,Z.jsx)(`h3`,{children:e(`game.gandengyan.log`)}),w.log.map((e,t)=>(0,Z.jsx)(`p`,{translate:`no`,children:e},`${e}-${t}`))]})]}),(0,Z.jsxs)(`div`,{className:X.handPanel,children:[(0,Z.jsx)(De,{player:T,active:D,winner:w.winnerSeat===T?.seat}),(0,Z.jsx)(`div`,{className:X.hand,children:T?.hand.map(e=>(0,Z.jsx)(`button`,{className:$(X.cardButton,m.includes(e.id)&&X.picked),onClick:()=>U(e.id),children:(0,Z.jsx)(Oe,{card:e})},e.id))}),(0,Z.jsxs)(`div`,{className:X.actions,children:[(0,Z.jsxs)(`div`,{className:$(X.preview,k&&X.valid),children:[(0,Z.jsx)(`strong`,{children:k?k.label:m.length?e(`game.gandengyan.invalidCombo`):e(`game.gandengyan.selectCards`)}),(0,Z.jsx)(`span`,{children:O.map(e=>e.label).join(` `)||e(`game.gandengyan.jokerOrderHint`)})]}),(0,Z.jsxs)(`button`,{className:`btn btn-primary`,disabled:!D||m.length===0||!k,onClick:V,children:[(0,Z.jsx)(re,{size:16}),e(`game.gandengyan.action.play`)]}),(0,Z.jsx)(`button`,{className:`btn`,disabled:!D||!w.table,onClick:H,children:e(`game.gandengyan.action.pass`)})]})]})]}):(0,Z.jsxs)(`section`,{className:X.entry,children:[(0,Z.jsxs)(`div`,{className:X.entryBrand,children:[(0,Z.jsx)(`div`,{className:X.cardMark,children:e(`game.gandengyan.mark`)}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h1`,{children:e(`game.gandengyan.hero.title`)}),(0,Z.jsx)(`p`,{children:e(`game.hero.desc`)})]})]}),(0,Z.jsxs)(`div`,{className:X.entryPanel,children:[(0,Z.jsxs)(`div`,{className:X.accountLine,children:[(0,Z.jsx)(`span`,{children:e(`game.currentAccount`)}),(0,Z.jsx)(`strong`,{translate:`no`,children:b.userIdentity?.displayName||e(`web3.notSignedIn`)})]}),(0,Z.jsxs)(`button`,{className:`btn btn-primary`,disabled:b.joining,onClick:F,children:[(0,Z.jsx)(ne,{size:16}),e(`game.action.createRoom`)]}),(0,Z.jsxs)(`form`,{onSubmit:I,className:X.joinForm,children:[(0,Z.jsxs)(`label`,{children:[e(`game.roomCode`),(0,Z.jsx)(`input`,{value:d,maxLength:8,onChange:e=>f(e.target.value.toUpperCase()),placeholder:e(`game.roomCode.placeholder`)})]}),(0,Z.jsx)(`button`,{className:`btn`,disabled:b.joining||!d,children:e(`game.action.joinRoom`)})]}),(0,Z.jsx)(`p`,{className:X.status,children:b.isBackendReady?e(`game.status.nodeConnected`):e(`game.status.nodeConnecting`)})]})]})})})}function De({player:e,active:t,winner:n,relation:r=``}){let{t:i}=o();return e?(0,Z.jsxs)(`div`,{className:$(X.player,t&&X.active,n&&X.winner),children:[(0,Z.jsx)(`div`,{className:X.avatar,translate:`no`,children:(0,Z.jsx)(`img`,{src:d(e.address,e.avatar),alt:``})}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`strong`,{translate:`no`,children:e.name}),(0,Z.jsxs)(`span`,{children:[r,r?` · `:``,i(`game.gandengyan.handCount`,{count:e.handCount})]})]})]}):null}function Oe({card:e,small:t=!1}){return(0,Z.jsxs)(`div`,{className:$(X.card,X[e.color],t&&X.small),children:[(0,Z.jsx)(`span`,{children:e.label}),(0,Z.jsx)(`i`,{children:e.suit===`Joker`?`*`:e.label.slice(0,1)})]})}function ke(e,t,n,r){if(!e)return r(`game.gandengyan.position.seat`,{seat:t.seat+1});let i=(t.seat-e.seat+n)%n;return i===0?r(`game.gandengyan.position.me`):n===2?r(`game.gandengyan.position.opponent`):n===3?r(i===1?`game.gandengyan.position.nextOpponent`:`game.gandengyan.position.prevOpponent`):n===4?r(i===1?`game.gandengyan.position.nextOpponent`:i===2?`game.gandengyan.position.partner`:`game.gandengyan.position.prevOpponent`):i%2==0?r(`game.gandengyan.position.seatPartner`,{seat:t.seat+1}):r(`game.gandengyan.position.seatOpponent`,{seat:t.seat+1})}var Ae=i(`/game/gandengyan/`)({component:Ee});export{Ae as Route};
@@ -1 +0,0 @@
1
- import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{C as r,S as i,T as a,a as o,n as s,r as c,s as l,t as u}from"./ui-BpDGD3IR.js";import{a as d}from"./i18n-NjvOSuV6.js";import{t as ee}from"./arrow-right-BU9c_SL4.js";import{n as te,r as ne}from"./LanguageToggle-CSQtRZ3A.js";import{t as f}from"./circle-alert-iuHzciph.js";import{t as p}from"./download-jEPn2njL.js";import{t as m}from"./file-text-DPA1riJ_.js";import{a as h,i as g,n as re,r as ie,t as ae}from"./FilePreviewOverlay-BYZIAMJ-.js";import{t as oe}from"./loader-BXQtdens.js";import{i as se,n as ce,t as le}from"./SidebarHomeLink-DXv0c9Ob.js";import{t as ue}from"./message-square-Dp09WY1I.js";import{t as _}from"./music-B19Tg557.js";import{t as de}from"./OpenSidebarButton-CLSCB7CG.js";import{t as fe}from"./plus-4hygj-1Z.js";import{t as pe}from"./search-DSkiWdvX.js";import{t as me}from"./trash-2-V12tJ8lI.js";import{N as v,c as y,f as he,i as ge,l as _e}from"./index-BI8oNSVC.js";import{t as ve}from"./format-CR8oUWq6.js";import{t as ye}from"./SidebarAccount-CNh0kvtB.js";import{n as be,r as xe,t as Se}from"./downloadValidation-Bzl7cci9.js";import{t as Ce}from"./LogoIcon-B2fFe0l1.js";import{i as b,t as we}from"./userProfile-qcc60tHK.js";import{t as Te}from"./useChannelMessages-BeKF0gwo.js";var Ee=r(`calendar`,[[`path`,{d:`M8 2v4`,key:`1cmpym`}],[`path`,{d:`M16 2v4`,key:`4m81vk`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`4`,rx:`2`,key:`1hopcy`}],[`path`,{d:`M3 10h18`,key:`8toen8`}]]),De=r(`ellipsis`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`19`,cy:`12`,r:`1`,key:`1wjl8i`}],[`circle`,{cx:`5`,cy:`12`,r:`1`,key:`1pcz8c`}]]),Oe=r(`hash`,[[`line`,{x1:`4`,x2:`20`,y1:`9`,y2:`9`,key:`4lhtct`}],[`line`,{x1:`4`,x2:`20`,y1:`15`,y2:`15`,key:`vyu0kd`}],[`line`,{x1:`10`,x2:`8`,y1:`3`,y2:`21`,key:`1ggp8o`}],[`line`,{x1:`16`,x2:`14`,y1:`3`,y2:`21`,key:`weycgp`}]]),ke=r(`pin`,[[`path`,{d:`M12 17v5`,key:`bb1du9`}],[`path`,{d:`M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z`,key:`1nkz8b`}]]),Ae=r(`pin-off`,[[`path`,{d:`M12 17v5`,key:`bb1du9`}],[`path`,{d:`M15 9.34V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H7.89`,key:`znwnzq`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11`,key:`c9qhm2`}]]),je=r(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),x=t(e(),1),S=n();function Me(e){return String(e||``).split(`/`).pop()||e}function Ne(e){return e===`image`?(0,S.jsx)(g,{size:20}):e===`video`?(0,S.jsx)(h,{size:20}):e===`audio`?(0,S.jsx)(_,{size:20}):(0,S.jsx)(m,{size:20})}function Pe({attachment:e,status:t=`idle`,pending:n=!1,onOpen:r}){let{t:i}=d(),a=t===`checking`,o=`ui-file-action chat-attachment-action ${t===`error`?`error`:t===`available`?`available`:``}`.trim(),s=Number.isFinite(e.size)&&e.size>0?ve(e.size):i(`chat.mostboxFile`);return(0,S.jsxs)(`button`,{type:`button`,className:`ui-file-card chat-attachment-card`,onClick:()=>r?.(e),disabled:n||a,title:e.link,translate:`no`,children:[(0,S.jsx)(`span`,{className:`ui-file-icon chat-attachment-icon ${e.kind}`,children:a?(0,S.jsx)(oe,{size:20,className:`ui-spinner chat-attachment-spinner`}):Ne(e.kind)}),(0,S.jsxs)(`span`,{className:`ui-file-info chat-attachment-info`,children:[(0,S.jsx)(`span`,{className:`ui-file-name chat-attachment-name`,translate:`no`,children:Me(e.fileName)}),(0,S.jsx)(`span`,{className:`ui-file-meta chat-attachment-meta`,translate:`yes`,children:n?i(`chat.sending`):s})]}),(0,S.jsx)(`span`,{className:o,translate:`yes`,children:a?i(`chat.checking`):t===`available`?(0,S.jsx)(v,{size:16}):t===`error`?(0,S.jsx)(f,{size:17}):(0,S.jsx)(p,{size:16})})]})}var C=[{key:`image`,labelKey:`chat.attachment.image`,accept:`image/*`,icon:g},{key:`video`,labelKey:`chat.attachment.video`,accept:`video/*`,icon:h},{key:`file`,labelKey:`chat.attachment.file`,accept:``,icon:m}],Fe=C.map(e=>e.accept).join(`,`);function Ie({children:e}){return(0,S.jsx)(`div`,{className:`message-bubble`,translate:`no`,children:e})}function Le({children:e}){return(0,S.jsx)(`div`,{className:`message-bubble has-attachment`,children:e})}function Re({variant:e,pending:t=!1,avatarSrc:n,isOnline:r=!1,author:i,time:a,children:o}){return(0,S.jsxs)(`div`,{className:[`chat-message`,e,t?`pending`:``].filter(Boolean).join(` `),children:[(0,S.jsxs)(`span`,{className:`chat-avatar-wrap`,children:[(0,S.jsx)(`img`,{className:`msg-avatar`,src:n,alt:`avatar`}),r&&(0,S.jsx)(`span`,{className:`chat-online-dot`,"aria-hidden":`true`})]}),(0,S.jsxs)(`div`,{className:`msg-content`,children:[(0,S.jsx)(`span`,{className:`message-author`,translate:`no`,children:i}),o,(0,S.jsx)(`span`,{className:`message-time`,children:a})]})]})}function ze({active:e=!1,pinned:t=!1,unread:n=!1,title:r,onSelect:i,onTogglePin:a,onRename:o,onLeave:s}){let{t:c}=d(),l=!!(a||o||s);return(0,S.jsxs)(`div`,{className:[`sidebar-nav-btn`,e?`active`:``,t?`pinned`:``,n?`unread`:``].filter(Boolean).join(` `),onClick:i,role:`button`,tabIndex:0,onKeyDown:e=>{e.target===e.currentTarget&&e.key===`Enter`&&i?.()},children:[(0,S.jsxs)(`span`,{className:`chat-channel-icon-wrap`,children:[(0,S.jsx)(ue,{size:16}),n&&(0,S.jsx)(`span`,{className:`chat-channel-unread-dot`,title:c(`chat.unread`),"aria-hidden":`true`})]}),(0,S.jsx)(`span`,{className:`chat-channel-title`,children:(0,S.jsx)(`span`,{className:`chat-channel-title-text`,translate:`no`,children:r})}),l&&(0,S.jsx)(u,{ariaLabel:c(`chat.channelActions`),className:`channel-actions-anchor`,placement:`bottom-end`,items:[{key:`pin`,label:c(t?`chat.unpin`:`chat.pin`),icon:t?(0,S.jsx)(Ae,{size:16}):(0,S.jsx)(ke,{size:16}),onSelect:()=>a?.()},{key:`rename`,label:c(`chat.rename`),icon:(0,S.jsx)(ie,{size:16}),onSelect:()=>o?.()},{key:`delete`,label:c(`chat.delete`),icon:(0,S.jsx)(me,{size:16}),onSelect:()=>s?.()}],renderTrigger:e=>(0,S.jsx)(`button`,{...e,className:`leave-channel-btn channel-actions-trigger`,title:c(`common.moreActions`),"aria-label":c(`common.moreActions`),children:(0,S.jsx)(De,{size:16})})})]})}function Be({members:e}){let{t}=d();return e.length===0?(0,S.jsx)(`div`,{className:`ui-empty-inline channel-members-empty`,children:t(`chat.noMembers`)}):(0,S.jsx)(`div`,{className:`channel-members-grid`,children:e.map(e=>(0,S.jsxs)(`div`,{className:`channel-member`,children:[(0,S.jsxs)(`span`,{className:`channel-member-avatar-wrap`,children:[(0,S.jsx)(`img`,{className:`channel-member-avatar`,src:e.avatarSrc,alt:`avatar`}),e.online&&(0,S.jsx)(`span`,{className:`chat-online-dot`,"aria-hidden":`true`})]}),(0,S.jsx)(`span`,{className:`channel-member-name`,translate:`no`,children:e.name})]},e.id))})}function Ve({message:e,placeholder:t,disabled:n=!1,isPublishingAttachment:r=!1,attachmentButtonTitle:i,attachmentInputRef:a,onMessageChange:o,onSend:s,onSelectAttachmentFiles:c}){let{t:l}=d(),te=n||r,ne=n||!e.trim(),f=i||l(`chat.attachment.add`);function p(e,t){t?.(e.currentTarget.files),e.currentTarget.value=``}function m(t){t.key===`Enter`&&e.trim()&&s()}function h(e){if(te)return;let t=a?.current;t&&(t.accept=e,t.click())}return(0,S.jsxs)(`div`,{className:`chat-input-area`,children:[(0,S.jsx)(`input`,{ref:a,type:`file`,accept:Fe,className:`chat-file-input`,onChange:e=>p(e,c)}),(0,S.jsx)(u,{ariaLabel:l(`chat.attachmentType`),placement:`top-start`,disabled:te,items:C.map(e=>{let t=e.icon;return{key:e.key,label:l(e.labelKey),icon:(0,S.jsx)(t,{size:16}),onSelect:()=>h(e.accept)}}),renderTrigger:e=>(0,S.jsx)(`button`,{...e,className:`btn btn-circle chat-tool-btn`,"aria-label":f,children:r?(0,S.jsx)(oe,{size:18,className:`ui-spinner chat-attachment-spinner`}):(0,S.jsx)(fe,{size:18})})}),(0,S.jsx)(`input`,{type:`text`,className:`input input-pill`,placeholder:t,value:e,disabled:n,onChange:e=>o(e.target.value),onKeyDown:m}),(0,S.jsx)(`button`,{type:`button`,className:`btn btn-circle btn-primary send-btn`,onClick:s,disabled:ne,title:l(`chat.sendMessage`),children:(0,S.jsx)(ee,{size:18})})]})}var w=`mostbox.chat.lastReadAt`;function T(e){return Date.parse(e?.lastMessageAt||``)||Date.parse(e?.createdAt||``)||0}function He(e){let t=String(e||``).trim().toLowerCase();return t?`${w}:${t}`:``}function E(e,t=Date.now()){let n=Number(e);return Math.max(0,Math.floor(Number.isFinite(n)&&n>0?n:t))}function Ue(e,t=D()){if(!e||!t)return{};try{let n=t.getItem(e);if(!n)return{};let r=JSON.parse(n);return!r||typeof r!=`object`?{}:Object.entries(r).reduce((e,[t,n])=>{let r=Number(n);return t&&Number.isFinite(r)&&r>=0&&(e[t]=r),e},{})}catch{return{}}}function We(e,t,n=D()){if(!(!e||!n))try{n.setItem(e,JSON.stringify(t))}catch{}}function Ge(e,t,n=Date.now(),r=Date.now()){if(!t)return{changed:!1,value:e};let i=E(n,r);return(e[t]||0)>=i?{changed:!1,value:e}:{changed:!0,value:{...e,[t]:i}}}function Ke(e,t,n=Date.now()){let r=!1,i={...e};for(let e of t){let t=e?.channelKey||e?.name;!t||i[t]!==void 0||(i[t]=E(T(e),n),r=!0)}return{changed:r,value:r?i:e}}function qe(e,{channelName:t,messageTime:n,activeChannelName:r=``,messageAuthor:i=``,userAddress:a=``,now:o=Date.now()}){if(!t)return{changed:!1,notify:!1,value:e};let s=E(n,o),c=t===r,l=String(i||``).toLowerCase()===String(a||``).toLowerCase();if(c||l)return{...Ge(e,t,s,o),notify:!1};let u=e[t]||0;if(u<s)return{changed:!1,notify:!0,value:e};let d=Math.max(0,s-1);return u===d?{changed:!1,notify:!0,value:e}:{changed:!0,notify:!0,value:{...e,[t]:d}}}function Je(e,t){let n=e?.channelKey||e?.name;return T(e)>(t[n]||0)}function D(){if(!(typeof window>`u`))return window.localStorage}var Ye=3,Xe=30,Ze=/^[a-zA-Z0-9_-]+$/,Qe=1e4,$e=12e3,et=1200;function O(e){return e?.channelKey||e?.name||``}function k(e){return e?.channelId||e?.name||``}function A(e){return e?.remark||k(e)}function tt(){return typeof window>`u`?``:(new URLSearchParams(window.location.search).get(`channel`)||``).trim()}var nt=`chat-file`;function rt(e,t){return e.type.startsWith(`image/`)?`image`:e.type.startsWith(`video/`)?`video`:e.type.startsWith(`audio/`)?`audio`:e.type.startsWith(`text/`)?`text`:re(t)}function it(e){return e?`${e.slice(0,6)}...${e.slice(-4)}`:`Unknown`}function at(e){return/#[a-fA-F0-9]{4}$/.test(String(e||``).trim())}function j(e){return String(e||``).trim().toLowerCase()}function ot(e){let t=new Set;return e.forEach(e=>{e.memberAddresses?.forEach(e=>{let n=j(e);n&&t.add(n)})}),[...t]}function st(){if(typeof window>`u`)return;let e=window;return e.AudioContext||e.webkitAudioContext}function ct(){let e=y(e=>e.isDarkMode),t=y(e=>e.setIsDarkMode),n=y(e=>e.hasBackend),r=y(e=>e.addToast),a=y(e=>e.openConnectModal),u=l(e=>e.identity),ee=l(e=>e.openLoginModal),[f,p]=(0,x.useState)([]),[m,h]=(0,x.useState)(null),[g,_]=(0,x.useState)(``),[me,v]=(0,x.useState)(!1),[ve,De]=(0,x.useState)(``),[ke,Ae]=(0,x.useState)(``),[Ne,C]=se(!1),[Fe,w]=(0,x.useState)(``),[E,D]=(0,x.useState)(!1),[ct,lt]=(0,x.useState)(!1),[ut,dt]=se(!1),[ft,pt]=(0,x.useState)(null),[mt,M]=(0,x.useState)(null),[ht,N]=(0,x.useState)(!1),[gt,_t]=(0,x.useState)(``),[vt,yt]=(0,x.useState)(!1),[bt,xt]=(0,x.useState)(null),[St,Ct]=(0,x.useState)(!1),[P,F]=(0,x.useState)({}),[I,L]=(0,x.useState)(null),[wt,Tt]=(0,x.useState)(!1),[Et,Dt]=(0,x.useState)(!1),[Ot,R]=(0,x.useState)({}),[kt,z]=(0,x.useState)([]),B=u?.identity===`user`,At=B&&!Et?u.logo:``,jt=(0,x.useRef)(null),Mt=(0,x.useRef)(null),Nt=(0,x.useRef)(``),Pt=(0,x.useRef)(new Set),Ft=(0,x.useRef)(new Set),V=(0,x.useRef)(null),H=(0,x.useRef)(!1),It=(0,x.useRef)(0),U=(0,x.useRef)(new Map),W=(0,x.useRef)(new Set),G=n===!0,{t:K,compareStrings:Lt,formatDate:Rt,formatTime:zt}=d(),q=(0,x.useCallback)(async(e,t)=>{r(await he(e,t),`error`)},[r]),J=(0,x.useMemo)(()=>He(u?.address),[u?.address]),Bt=(0,x.useCallback)((e,t=Date.now())=>{e&&R(n=>{let r=Ge(n,e,t);return r.changed?(We(J,r.value),r.value):n})},[J]),Y=(0,x.useCallback)(()=>{if(H.current||typeof window>`u`)return;let e=st();if(e)try{let t=V.current||new e;V.current=t,t.state===`suspended`&&t.resume().catch(()=>{}),H.current=!0}catch{}},[]),Vt=(0,x.useCallback)(()=>{if(!H.current)return;let e=Date.now();if(e-It.current<et)return;It.current=e;let t=st();if(t)try{let e=V.current||new t;if(V.current=e,e.state===`suspended`){e.resume().catch(()=>{});return}let n=e.createGain();n.gain.setValueAtTime(1e-4,e.currentTime),n.gain.exponentialRampToValueAtTime(.08,e.currentTime+.015),n.gain.exponentialRampToValueAtTime(1e-4,e.currentTime+.18),n.connect(e.destination),[740,980].forEach((t,r)=>{let i=e.createOscillator();i.type=`sine`,i.frequency.setValueAtTime(t,e.currentTime),i.connect(n),i.start(e.currentTime+r*.035),i.stop(e.currentTime+.16+r*.035)})}catch{}},[]),Ht=(0,x.useCallback)(async(e=m)=>{let t=O(e);if(!t||!G){z([]);return}try{let e=await b.getChannelPeers(t);if(Nt.current!==t)return;z(ot(e))}catch(e){console.warn(`[Chat] Failed to fetch channel peers:`,e instanceof Error?e.message:e)}},[m,G]);function Ut(e,t){switch(e){case`channel:message`:{let e=t?.channelKey||t?.channel,n=t?.message,r=Number(n?.timestamp)||Date.now();if(e){p(t=>t.map(t=>O(t)===e?{...t,lastMessageAt:new Date(r).toISOString()}:t));let t=e===Nt.current;R(i=>{let a=qe(i,{channelName:e,messageTime:r,activeChannelName:t?e:``,messageAuthor:n?.author,userAddress:u?.address});return a.changed&&We(J,a.value),a.notify&&Vt(),a.changed?a.value:i})}break}case`channel:peer:online`:case`channel:peer:offline`:m&&Ht(m);break;case`channel:joined`:case`channel:left`:$();break;case`user:metadata:updated`:t?.scope===`channels`&&$();break;case`download:success`:{let e=U.current.get(t.taskId);e&&(U.current.delete(t.taskId),W.current.delete(e.cid),F(t=>({...t,[e.cid]:{status:`available`}})),r(K(`chat.attachment.downloadCompleted`,{fileName:t.fileName||Me(e.fileName)}),`success`),Zt(e,t.fileName||e.fileName));break}case`download:error`:case`download:cancelled`:{let n=U.current.get(t.taskId);n&&(U.current.delete(t.taskId),W.current.delete(n.cid),F(r=>({...r,[n.cid]:{status:`error`,message:e===`download:cancelled`?K(`chat.attachment.downloadCancelled`):t.error||K(`chat.attachment.downloadFailed`)}})),r(e===`download:cancelled`?K(`chat.attachment.downloadCancelled`):t.error||K(`chat.attachment.downloadFailed`),`error`));break}}}let Wt=(0,x.useMemo)(()=>f.map(e=>O(e)),[f]),{clearMessages:Gt,messages:X,sendMessage:Kt,syncMessages:qt}=Te({isReady:G,enabled:!!u,channelName:O(m),extraSubscribedChannelNames:Wt,peerId:Fe,waitForPeerId:!0,onSyncError:e=>q(e,K(`chat.error.messages`)),onSocketEvent:Ut,onReconnect:$}),Jt=(0,x.useMemo)(()=>{let e=new Map;return X.forEach((t,n)=>{let r=String(t.author||``).trim();if(!r)return;let i=r.toLowerCase(),a=Number(t.timestamp)||0,o=String(t.authorName||``).trim(),s=String(t.avatar||``).trim(),c=e.get(i);if(!c){e.set(i,{address:r,displayName:o,...s?{avatar:s}:{},firstSeenAt:a,lastSeenAt:a,index:n});return}a>=c.lastSeenAt&&(c.lastSeenAt=a,o&&(c.displayName=o),s&&(c.avatar=s))}),[...e.values()].sort((e,t)=>e.firstSeenAt-t.firstSeenAt||e.index-t.index)},[X]),Yt=(0,x.useMemo)(()=>{let e=new Set(kt),t=j(u?.address);return t&&m&&G&&e.add(t),e},[m,G,kt,u?.address]);function Z(){return G?!0:(a(),!1)}function Q(){return u?!0:(ee(),!1)}(0,x.useEffect)(()=>{let e=()=>{_(tt())};return e(),window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},[]),(0,x.useEffect)(()=>{u&&_(tt())},[u?.address]),(0,x.useEffect)(()=>{Dt(!1)},[u?.logo]),(0,x.useEffect)(()=>{Nt.current=O(m)},[m]),(0,x.useEffect)(()=>{R(Ue(J))},[J]),(0,x.useEffect)(()=>{!J||f.length===0||R(e=>{let t=Ke(e,f);return t.changed&&We(J,t.value),t.changed?t.value:e})},[J,f]),(0,x.useEffect)(()=>(window.addEventListener(`pointerdown`,Y,{passive:!0}),window.addEventListener(`keydown`,Y),()=>{window.removeEventListener(`pointerdown`,Y),window.removeEventListener(`keydown`,Y)}),[Y]),(0,x.useEffect)(()=>()=>{V.current?.close().catch(()=>{}),V.current=null,H.current=!1},[]),(0,x.useEffect)(()=>{jt.current?.scrollIntoView({behavior:`smooth`})},[X]),(0,x.useEffect)(()=>{if(!G){w(``);return}_e.get(`/api/node-id`).json().then(e=>w(e.id)).catch(e=>{console.warn(`[Chat] Failed to fetch node ID:`,e.message),q(e,K(`chat.error.nodeId`))})},[G,q,K]),(0,x.useEffect)(()=>{G&&u?(v(!1),$()):v(!1)},[n,G,u?.address]),(0,x.useEffect)(()=>{if(m){if(G){let e=O(m);z([]),qt(e,{replace:!0}),Ht(m)}}else z([])},[m,G,Ht,qt]),(0,x.useEffect)(()=>{if(!g)return;if(!u){Ft.current.has(g)||(Ft.current.add(g),ee());return}if(!G||!me)return;let e=f.find(e=>O(e)===g)||f.find(e=>k(e)===g);if(e&&(!m||O(m)!==O(e))){tn(e);return}if(e&&m&&O(m)===O(e)&&(m.createdAt!==e.createdAt||m.coreKey!==e.coreKey||m.lastMessageAt!==e.lastMessageAt||m.pinned!==e.pinned||m.remark!==e.remark||m.type!==e.type)){h(e);return}if(e)return;let t=`${u.address}:${g}`;if(Pt.current.has(t)||E)return;let n=Xt(g);if(Pt.current.add(t),n){r(n,`error`);return}an(g)},[f,m,g,me,G,E,u?.address]),(0,x.useEffect)(()=>{u||(p([]),v(!1),h(null),_(tt()),M(null),Gt(),Ae(``),w(``),N(!1),xt(null),F({}),R({}),W.current.clear(),U.current.clear())},[Gt,u?.address]);function Xt(e){return e.length<Ye?K(`chat.validation.nameMin`,{count:Ye}):e.length>Xe?K(`chat.validation.nameMax`,{count:Xe}):e.includes(`.`)?K(`chat.validation.dotReserved`):Ze.test(e)?``:K(`chat.validation.allowedChars`)}async function $(){if(!G){v(!1);return}try{p(await b.getChannels()),v(!0)}catch(e){p([]),v(!1),await q(e,K(`chat.error.channelList`))}}function Zt(e,t=e.fileName){let n=re(t);xt({cid:e.cid,fileName:t,subtype:n===`file`?e.kind:n})}async function Qt(e){let t=Se(e.link,K);if(t)return F(n=>({...n,[e.cid]:{status:`error`,message:t}})),!1;try{F(t=>({...t,[e.cid]:{status:`checking`}}));let t=await be.checkDownload(e.link,{timeout:Qe,requestTimeout:$e});return F(n=>({...n,[e.cid]:{status:`available`,message:t.alreadyExists?K(`chat.attachment.localAvailable`):K(`chat.attachment.previewAvailable`)}})),!0}catch(t){let n=await xe(t);return F(t=>({...t,[e.cid]:{status:`error`,message:n}})),!1}}async function $t(e){L(null),await Qt(e)&&await en(e)}async function en(e){if(!W.current.has(e.cid)){W.current.add(e.cid),F(t=>({...t,[e.cid]:{status:`available`}}));try{let t=await be.downloadFile(e.link);if(t.alreadyExists||t.fileName){W.current.delete(e.cid),F(t=>({...t,[e.cid]:{status:`available`}})),Zt({...e,fileName:t.fileName||e.fileName},t.fileName||e.fileName);return}t.taskId&&(U.current.set(t.taskId,e),r(K(`chat.attachment.downloadStarted`),`success`))}catch(t){let n=await xe(t);W.current.delete(e.cid),F(t=>({...t,[e.cid]:{status:`error`,message:n}}))}}}async function tn(e){if(!Q()||!Z())return;let t=O(e);Bt(t,Math.max(T(e),Date.now())),h(e),_(t),window.history.pushState({},``,`?channel=${encodeURIComponent(t)}`)}async function nn(e,t){if(t&&t.stopPropagation(),Q()&&Z()&&!ct){lt(!0);try{if(await b.leaveChannel(e),O(m)===e){h(null),_(``),Gt();let e=new URL(window.location.href);e.searchParams.delete(`channel`),window.history.pushState({},``,e.pathname)}$(),dt.close(),pt(null)}catch(e){await q(e,K(`chat.error.leave`))}finally{lt(!1)}}}async function rn(e){if(!Q()||!Z())return;let t=!e.pinned,n=O(e);try{let e=await b.setChannelPinned(n,t);p(t=>t.map(t=>O(t)===n?{...t,pinned:e.pinned}:t)),h(t=>t&&O(t)===n?{...t,pinned:e.pinned}:t)}catch(e){await q(e,K(t?`chat.error.pin`:`chat.error.unpin`))}}async function an(e){let t=e.trim();if(!t||E)return;let n=Xt(t);if(n){r(n,`error`);return}if(Q()&&Z()){D(!0);try{let e=await b.createChannel(t,`public`,we(u)),n=e.channelKey||e.key||e.name||t,r=f.find(e=>O(e)===n),i={...r,name:e.name||t,channelId:e.channelId||e.name||t,channelKey:e.channelKey||e.key||r?.channelKey,type:e.type||r?.type||`public`,createdAt:e.createdAt||r?.createdAt,coreKey:e.coreKey||e.key||r?.coreKey,localWriterCoreKey:e.localWriterCoreKey||r?.localWriterCoreKey,writerCoreKeys:e.writerCoreKeys||r?.writerCoreKeys,remark:e.remark||r?.remark},a=O(i);p(e=>e.some(e=>O(e)===a)?e.map(e=>O(e)===a?{...e,...i}:e):[...e,i]),C.close(),await tn(i),$()}catch(e){await q(e,K(`chat.error.join`))}finally{D(!1)}}}async function on(e,t){if(!e.trim()||!m||!Q()||!Z())return!1;let n=e.trim(),r=O(m);try{let e=await Kt({channelName:r,content:n,attachment:t});return p(t=>t.map(t=>O(t)===r?{...t,lastMessageAt:new Date(Number(e?.timestamp)||Date.now()).toISOString()}:t)),e&&Bt(r,Number(e.timestamp)||Date.now()),!0}catch(e){return await q(e,K(`chat.error.send`)),!1}}async function sn(){if(!ke.trim())return;let e=ke.trim();Ae(``),await on(e)}function cn(e,t){return`${nt}/${e}/${t}`}async function ln(e){if(!(!e||e.length===0||!m)&&Q()&&Z()&&!St){Ct(!0);try{for(let t of Array.from(e)){let e=cn(k(m),t.name),n=await be.publishFile(t,e),i=n.fileName||e,a=n.link||`most://${n.cid}?filename=${encodeURIComponent(i)}`;await on(a,{kind:rt(t,i),cid:n.cid,fileName:i,link:a,mimeType:t.type||void 0,size:t.size})&&r(K(`chat.attachment.published`,{fileName:Me(i)}),`success`)}}catch(e){await q(e,K(`chat.error.attachmentSend`))}finally{Ct(!1)}}}async function un(e){if(!Q()||!Z())return;let t=P[e.cid];if(t?.status!==`checking`){if(t?.status===`error`){L(e);return}if(t?.status!==`available`){await Qt(e)&&await en(e);return}await en(e)}}async function dn(e,t){if(!Q()||!Z())return;let n=O(e),r=await b.setChannelRemark(n,t);return p(e=>e.map(e=>O(e)===n?{...e,remark:r.remark}:e)),h(e=>e&&O(e)===n?{...e,remark:r.remark}:e),r.remark}async function fn(){if(m)try{await dn(m,gt)}catch(e){await q(e,K(`chat.error.remark`))}}async function pn(e){if(!(!mt||vt)){yt(!0);try{await dn(mt,e),M(null)}catch(e){await q(e,K(`chat.error.rename`))}finally{yt(!1)}}}function mn(e){if(!e.attachment)return(0,S.jsx)(Ie,{children:e.content});let t=e.attachment,n=P[t.cid]?.status;return(0,S.jsx)(Le,{children:(0,S.jsx)(Pe,{attachment:t,status:n,pending:e.pending,onOpen:un})})}function hn(e,t){let n=String(e||``).trim();return n?wt?at(n)?n:t?`${n}#${t.slice(-4).toUpperCase()}`:n:n.replace(/#[a-fA-F0-9]{4}$/,``):it(t)}function gn(){return(0,S.jsx)(Be,{members:Jt.map(e=>({id:e.address,name:hn(e.displayName,e.address),avatarSrc:ge(e.address,e.avatar),online:Yt.has(j(e.address))}))})}let _n=B&&!!g&&!m,vn=m?(0,S.jsx)(`h2`,{className:`header-title`,translate:`no`,children:A(m)}):(0,S.jsx)(`h2`,{className:`header-title`,children:K(`chat.title`)}),yn=ve.trim().toLowerCase(),bn=(0,x.useMemo)(()=>[...f].sort((e,t)=>{let n=Number(!!t.pinned)-Number(!!e.pinned);if(n!==0)return n;let r=T(t)-T(e);return r===0?Lt(A(e),A(t)):r}),[f,Lt]),xn=yn?bn.filter(e=>[A(e),k(e),O(e)].some(e=>e.toLowerCase().includes(yn))):bn;return(0,S.jsxs)(ce,{className:`chat-app-layout`,defaultHide:B,sidebar:({closeSidebar:e})=>(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(le,{onNavigate:e}),(0,S.jsx)(`div`,{className:`chat-channel-search`,children:(0,S.jsxs)(`div`,{className:`ui-input-control`,children:[(0,S.jsx)(pe,{className:`ui-input-icon`,size:15}),(0,S.jsx)(`input`,{type:`search`,className:`input input-compact`,placeholder:K(`chat.search.placeholder`),value:ve,onChange:e=>De(e.target.value),"aria-label":K(`chat.search.placeholder`)})]})}),(0,S.jsx)(`nav`,{className:`sidebar-nav`,children:f.length===0?(0,S.jsx)(`div`,{className:`sidebar-empty-state`,children:(0,S.jsx)(`p`,{children:K(`chat.empty.noChannels`)})}):xn.length===0?(0,S.jsx)(`div`,{className:`sidebar-empty-state`,children:(0,S.jsx)(`p`,{children:K(`chat.empty.noMatches`)})}):xn.map(t=>(0,S.jsx)(ze,{active:O(m)===O(t),pinned:!!t.pinned,unread:Je(t,Ot),title:A(t),onSelect:()=>{tn(t),e()},onTogglePin:()=>void rn(t),onRename:()=>M(t),onLeave:()=>{pt(t),dt.open()}},O(t)))}),(0,S.jsxs)(`button`,{className:`ui-action-dashed create-channel-btn`,onClick:()=>{!Q()||!Z()||C.open()},children:[(0,S.jsx)(fe,{size:16}),K(`chat.joinChannel`)]}),(0,S.jsx)(ye,{})]}),headerTitle:vn,sidebarToggleReplacement:B?(0,S.jsx)(`span`,{className:`sidebar-toggle-static-logo`,"aria-hidden":`true`,children:At?(0,S.jsx)(`img`,{className:`sidebar-toggle-static-logo-img`,src:At,alt:``,onError:()=>Dt(!0)}):(0,S.jsx)(Ce,{size:18})}):void 0,headerRight:(0,S.jsxs)(`div`,{className:`header-right-actions`,children:[(0,S.jsx)(`button`,{className:`btn btn-icon`,onClick:()=>t(!e),title:K(`common.theme.toggle`),children:e?(0,S.jsx)(te,{size:16}):(0,S.jsx)(ne,{size:16})}),m&&(0,S.jsx)(`button`,{className:`btn btn-icon`,onClick:()=>N(!0),title:K(`chat.channelSettings`),children:(0,S.jsx)(je,{size:16})})]}),children:[m?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`chat-messages`,children:[X.length===0?(0,S.jsxs)(`div`,{className:`ui-empty-state chat-messages-empty`,children:[(0,S.jsx)(`div`,{className:`ui-empty-icon empty-icon`,children:(0,S.jsx)(ue,{size:28})}),(0,S.jsx)(`p`,{children:K(`chat.empty.noMessages`)})]}):X.map(e=>{let t=e.author?.toLowerCase()===u?.address.toLowerCase(),n=Yt.has(j(e.author));return(0,S.jsx)(Re,{variant:t?`self`:`other`,pending:e.pending,isOnline:n,avatarSrc:ge(e.author,e.avatar||(t?u.avatar:void 0)),author:hn(e.authorName,e.author),time:zt(e.timestamp),children:mn(e)},e.id||`${e.author}-${e.timestamp}`)}),(0,S.jsx)(`div`,{ref:jt})]}),(0,S.jsx)(Ve,{message:ke,placeholder:K(u?`chat.composer.placeholder`:`chat.composer.signInPlaceholder`),disabled:!u,isPublishingAttachment:St,attachmentInputRef:Mt,onMessageChange:Ae,onSend:sn,onSelectAttachmentFiles:e=>{ln(e)}})]}):_n?(0,S.jsxs)(`div`,{className:`ui-empty-state chat-welcome`,children:[(0,S.jsx)(`div`,{className:`ui-empty-icon ui-empty-icon-lg welcome-icon`,children:(0,S.jsx)(oe,{size:36,className:`ui-spinner`})}),(0,S.jsx)(`h2`,{className:`ui-empty-title`,children:K(`chat.restoring.title`)}),(0,S.jsx)(`p`,{className:`ui-empty-desc`,children:K(`chat.restoring.desc`)})]}):(0,S.jsx)(S.Fragment,{children:(0,S.jsxs)(`div`,{className:`ui-empty-state chat-welcome`,children:[(0,S.jsx)(`div`,{className:`ui-empty-icon ui-empty-icon-lg welcome-icon`,children:(0,S.jsx)(ue,{size:36})}),(0,S.jsx)(`h2`,{className:`ui-empty-title`,children:K(`chat.select.title`)}),(0,S.jsx)(`p`,{className:`ui-empty-desc`,children:K(`chat.select.desc`)}),(0,S.jsx)(de,{label:K(`chat.openChannelList`)})]})}),Ne&&(0,S.jsx)(s,{title:K(`chat.joinChannel`),placeholder:K(`chat.join.placeholder`),confirmText:K(`chat.join.confirm`),validate:Xt,onConfirm:an,onClose:()=>C.close(),isLoading:E,loadingText:K(`chat.join.joining`)}),mt&&(0,S.jsx)(s,{title:K(`chat.renameChannel`),placeholder:K(`chat.remark.placeholder`),defaultValue:mt.remark||``,confirmText:K(`chat.remark.save`),onConfirm:pn,onClose:()=>{vt||M(null)},isLoading:vt,loadingText:K(`chat.remark.saving`),allowEmpty:!0,validate:e=>e.length>50?K(`chat.remark.tooLong`):``}),ut&&ft&&(0,S.jsx)(c,{title:K(`chat.leaveChannel`),message:K(`chat.leaveConfirm`,{channel:A(ft)}),confirmText:K(ct?`chat.leaving`:`chat.leaveChannel`),onConfirm:()=>nn(O(ft),void 0),danger:!0,onClose:()=>{dt.close(),pt(null)}}),I&&(0,S.jsx)(o,{onClose:()=>L(null),children:(0,S.jsxs)(`div`,{className:`confirm-modal`,onClick:e=>e.stopPropagation(),children:[(0,S.jsxs)(`div`,{className:`modal-header`,children:[(0,S.jsx)(`h3`,{children:K(`chat.attachment.noSeedsTitle`)}),(0,S.jsx)(`button`,{type:`button`,className:`btn btn-icon`,onClick:()=>L(null),"aria-label":K(`common.close`),children:(0,S.jsx)(i,{size:18})})]}),(0,S.jsx)(`p`,{children:P[I.cid]?.message||K(`chat.attachment.noSeedsFallback`)}),(0,S.jsxs)(`div`,{className:`modal-actions`,children:[(0,S.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>L(null),children:K(`common.cancel`)}),(0,S.jsx)(`button`,{type:`button`,className:`btn btn-primary`,onClick:()=>$t(I),disabled:P[I.cid]?.status===`checking`,children:P[I.cid]?.status===`checking`?K(`app.checking`):K(`chat.attachment.retryCheck`)})]})]})}),bt&&(0,S.jsx)(ae,{item:bt,isBackendReady:G,getFileDownloadUrl:be.getFileDownloadUrl,onClose:()=>xt(null)}),ht&&m&&(0,S.jsx)(`div`,{className:`channel-detail-overlay`,onClick:()=>N(!1),children:(0,S.jsxs)(`div`,{className:`channel-detail-drawer`,onClick:e=>e.stopPropagation(),children:[(0,S.jsxs)(`div`,{className:`channel-detail-header`,children:[(0,S.jsx)(`h3`,{children:K(`chat.details.title`)}),(0,S.jsx)(`button`,{className:`btn btn-icon`,onClick:()=>N(!1),children:(0,S.jsx)(i,{size:18})})]}),(0,S.jsxs)(`div`,{className:`channel-detail-body`,children:[(0,S.jsxs)(`div`,{className:`channel-detail-section channel-members-section`,children:[(0,S.jsx)(`div`,{className:`channel-detail-label`,children:(0,S.jsx)(`span`,{children:K(`chat.details.members`,{count:Jt.length})})}),gn()]}),!B&&(0,S.jsx)(`div`,{className:`channel-detail-section`,children:(0,S.jsxs)(`label`,{className:`setting-switch`,children:[(0,S.jsx)(`span`,{children:K(`chat.details.showAddressSuffix`)}),(0,S.jsx)(`input`,{type:`checkbox`,checked:wt,onChange:e=>Tt(e.target.checked)})]})}),!B&&(0,S.jsxs)(`div`,{className:`channel-detail-section`,children:[(0,S.jsxs)(`div`,{className:`channel-detail-label`,children:[(0,S.jsx)(Oe,{size:14}),(0,S.jsx)(`span`,{children:K(`chat.details.channelId`)})]}),(0,S.jsx)(`div`,{className:`ui-meta-box channel-detail-value channel-detail-mono`,translate:`no`,children:k(m)})]}),(0,S.jsxs)(`div`,{className:`channel-detail-section`,children:[(0,S.jsxs)(`div`,{className:`channel-detail-label`,children:[(0,S.jsx)(ie,{size:14}),(0,S.jsx)(`span`,{children:K(`chat.remark.placeholder`)})]}),(0,S.jsx)(`input`,{type:`text`,className:`input input-compact`,placeholder:K(`chat.remark.placeholder`),value:gt,onChange:e=>_t(e.target.value),onFocus:()=>_t(m.remark||``),onBlur:()=>fn(),onKeyDown:e=>{e.key===`Enter`&&e.currentTarget.blur()},maxLength:50})]}),(0,S.jsxs)(`div`,{className:`channel-detail-section`,children:[(0,S.jsxs)(`div`,{className:`channel-detail-label`,children:[(0,S.jsx)(Ee,{size:14}),(0,S.jsx)(`span`,{children:K(`chat.channel.createdAt`)})]}),(0,S.jsx)(`div`,{className:`ui-meta-box channel-detail-value`,children:m.createdAt?Rt(m.createdAt):`-`})]})]}),!B&&(0,S.jsx)(`div`,{className:`channel-detail-footer`,children:(0,S.jsx)(`button`,{className:`btn btn-secondary btn-block`,onClick:()=>{N(!1),pt(m),dt.open()},children:K(`chat.leaveChannel`)})})]})})]})}var lt=a(`/chat/`)({component:ct});export{lt as Route};
@@ -1,3 +0,0 @@
1
- import{n as e,o as t}from"./jsx-runtime-Bt-cYkS5.js";import{s as n}from"./ui-BpDGD3IR.js";import{g as r}from"./index-BI8oNSVC.js";import{i,r as a}from"./userProfile-qcc60tHK.js";var o=t(e(),1);function s(e=``,t=[]){let n=[e,...t];return[...new Set(n.filter(Boolean))]}function c(e=[]){return s(``,e).join(`
2
- `)}function l(e,t){let n=new Set(e),r=new Set(t);return{subscribe:[...r].filter(e=>!n.has(e)),unsubscribe:[...n].filter(e=>!r.has(e))}}function u(e){return String(e.id||`${e.author||``}-${e.timestamp||``}-${e.content||``}`)}function d(e){let t=Number(e.timestamp);return Number.isFinite(t)?t:0}function f(e){return e.map((e,t)=>({message:e,index:t})).sort((e,t)=>{let n=d(e.message)-d(t.message);return n===0?e.index-t.index:n}).map(e=>e.message)}function p({isReady:e,enabled:t=!0,channelName:d=``,extraSubscribedChannelNames:p=[],peerId:m=``,waitForPeerId:h=!1,limit:g=100,reconnectBaseDelay:_=2500,acceptMessage:v,getMessageKey:y=u,onSyncError:b,onSocketEvent:x,onReconnect:S}){let C=n(e=>e.identity),[w,T]=(0,o.useState)([]),[E,D]=(0,o.useState)(!1),O=(0,o.useMemo)(()=>c(p),[p]),k=(0,o.useRef)(null),A=(0,o.useRef)(d),j=(0,o.useRef)(p),M=(0,o.useRef)(null),N=(0,o.useRef)(0),P=(0,o.useRef)(v),F=(0,o.useRef)(y),I=(0,o.useRef)(x),L=(0,o.useRef)(b),R=(0,o.useRef)(S),z=(0,o.useRef)(m),B=(0,o.useRef)(new Set);(0,o.useEffect)(()=>{j.current=O?O.split(`
3
- `):[]},[O]),(0,o.useEffect)(()=>{P.current=v},[v]),(0,o.useEffect)(()=>{F.current=y},[y]),(0,o.useEffect)(()=>{I.current=x},[x]),(0,o.useEffect)(()=>{L.current=b},[b]),(0,o.useEffect)(()=>{R.current=S},[S]);let V=(0,o.useCallback)(e=>{let t=P.current;return t?e.filter(t):e},[]),H=(0,o.useCallback)((e,t,n=!0)=>{let r=[...e];for(let e of V(t)){let t=F.current(e);if(n){let n=r.findIndex(t=>t.pending&&t.author?.toLowerCase()===e.author?.toLowerCase()&&t.content===e.content);if(n!==-1){r[n]={...e,id:e.id||t};continue}}r.some(e=>F.current(e)===t)||r.push({...e,id:e.id||t})}return f(r)},[V]),U=(0,o.useCallback)((e,t)=>{k.current?.readyState===WebSocket.OPEN&&k.current.send(JSON.stringify({event:e,data:t}))},[]),W=(0,o.useCallback)(e=>{let t=new Set(e.filter(Boolean)),n=l(B.current,t);for(let e of n.unsubscribe)U(`channel:unsubscribe`,{channel:e});for(let e of n.subscribe)U(`channel:subscribe`,{channel:e});B.current=t},[U]),G=(0,o.useCallback)(()=>s(A.current,j.current),[]),K=(0,o.useCallback)(async(t=A.current,n={})=>{if(!t||!e)return[];try{let e=V(await i.getChannelMessages(t,g));return T(t=>n.replace?f(e):H(t,e,!1)),e}catch(e){return n.replace&&T([]),await L.current?.(e),[]}},[V,e,g,H]);(0,o.useEffect)(()=>{z.current=m,m&&(U(`register`,{peerId:m}),h&&(W(G()),A.current&&K(A.current,{replace:!0})))},[G,m,W,K,h,U]);let q=(0,o.useCallback)(()=>{T([])},[]),J=(0,o.useCallback)(async({channelName:e=A.current,content:t,attachment:n,optimisticId:r})=>{let o=t.trim();if(!e||!o||!C)return null;let s=a(C),c={id:r||`${s.author}-${Date.now()}-${Math.random().toString(36).slice(2)}`,...s,content:o,timestamp:Date.now(),pending:!0,attachment:n};T(e=>f([...e,c]));try{let t=await i.sendChannelMessage({channelName:e,content:o,...s,attachment:n});return T(e=>f(e.map(e=>e.id===c.id?{...t.message,id:t.message.id||F.current(t.message)}:e))),t.message}catch(e){throw T(e=>e.filter(e=>e.id!==c.id)),e}},[C]);return(0,o.useEffect)(()=>{A.current=d,!(!e||!t)&&(d&&K(d,{replace:!0}),(!h||z.current)&&W(G()))},[d,t,O,G,e,W,K,h]),(0,o.useEffect)(()=>{!e||!t||h&&!z.current||W(G())},[t,G,e,W,h]),(0,o.useEffect)(()=>{if(!e||!t){D(!1);return}let n=!1;N.current=0;async function i(){let e=new WebSocket(await r(`/ws`));if(n){e.close();return}e.onopen=()=>{D(!0),N.current=0,z.current&&e.send(JSON.stringify({event:`register`,data:{peerId:z.current}})),(!h||z.current)&&(B.current.clear(),W(G()),A.current&&K(A.current,{replace:!0}),R.current?.())},e.onmessage=e=>{try{let t=JSON.parse(e.data);I.current?.(t.event,t.data),t.event===`channel:message`&&t.data?.channel===A.current&&t.data?.message&&T(e=>H(e,[t.data.message])),t.event===`user:metadata:updated`&&t.data?.scope===`channels`&&A.current&&K(A.current,{replace:!0})}catch{}},e.onclose=()=>{if(D(!1),n)return;let e=N.current;if(e>=20)return;let t=Math.min(_*2**e,3e4);N.current=e+1,M.current=setTimeout(i,t)},e.onerror=()=>e.close(),k.current=e}return i(),()=>{n=!0,M.current&&clearTimeout(M.current),k.current?.close(),k.current=null,B.current.clear()}},[t,G,e,H,_,W,K,h]),{clearMessages:q,connected:E,messages:w,sendMessage:J,setMessages:T,syncMessages:K}}export{p as t};