1 line
10 KiB
JavaScript
1 line
10 KiB
JavaScript
import{B as e,E as t,H as n,I as r,J as i,K as a,P as o,T as s,W as c,Z as l,a as u,b as d,c as f,g as p,i as m,j as h,n as g,p as _,r as v,t as y,w as b}from"./ui-CBKBDzcl.js";import{t as x}from"./arrow-right-Co3jJM9l.js";import{t as S}from"./globe-BYt6yQt4.js";import{n as C,r as w,t as ee}from"./users-DJn4rrjp.js";import{t as T}from"./radio-tower-DcOqbcos.js";import{a as E,n as te}from"./index-Cfr72k3j.js";var D=[[`path`,{d:`M11 20H2`,key:`nlcfvz`}],[`path`,{d:`M11 4.562v16.157a1 1 0 0 0 1.242.97L19 20V5.562a2 2 0 0 0-1.515-1.94l-4-1A2 2 0 0 0 11 4.561z`,key:`au4z13`}],[`path`,{d:`M11 4H8a2 2 0 0 0-2 2v14`,key:`74r1mk`}],[`path`,{d:`M14 12h.01`,key:`1jfl7z`}],[`path`,{d:`M22 20h-3`,key:`vhrsz`}]],ne=t=>e(d,i(t,{iconNode:D,name:`door-open`})),O=[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]],re=t=>e(d,i(t,{iconNode:O,name:`search`})),k=h(`<div><p class="mono-label text-muted-foreground">rooms / registry</p><h1 class="display mt-2 text-4xl sm:text-5xl">房间</h1><p class="mt-3 max-w-xl text-sm text-muted-foreground">创建或进入房间。已接入新分页查询(<code class=font-mono>/api/rooms/query</code>)与管理面创建(<code class=font-mono>/api/manage/rooms</code>),支持搜索、公开度与成员统计。`),A=h(`<input class="h-8 flex-1 border border-line bg-background px-2 text-xs outline-none"placeholder=描述(可选)>`),j=h(`<label class="flex items-center gap-1.5 text-xs"><input type=checkbox>`),M=h(`<div class="flex flex-wrap items-center gap-3 border-t border-line/50 pt-3"><label class="flex items-center gap-2 text-xs"><input type=checkbox>高级`),N=h(`<div class="relative max-w-3xl border border-line bg-card/60 p-3 sm:p-4"><div class="flex flex-col gap-3"><div class="flex flex-col gap-2 sm:flex-row"><div class="flex h-10 flex-1 items-center gap-2.5 border border-line bg-background/70 px-3 transition-colors focus-within:border-ring"><input class="field-mono h-full w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground/50"placeholder="新房间名,如 live-demo"aria-label=房间名>`),ie=h(`<span class="mono-label animate-pulse text-muted-foreground">loading…`),ae=h(`<div class="flex items-center justify-between gap-3 border-b border-line pb-3"><h2 class="flex items-center gap-2 font-semibold">房间列表`),oe=h(`<div class=space-y-2>`),se=h(`<div class="mx-auto max-w-[1400px] space-y-8 px-4 py-8 sm:px-6 sm:py-10"><div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"><div class="flex flex-1 items-center gap-2"><div class="flex h-9 flex-1 max-w-sm items-center gap-2 border border-line bg-background px-3"><input class="h-full w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground/50"placeholder="搜索房间名 / 展示名"></div></div><div class="flex items-center gap-2 text-xs text-muted-foreground"><span class=font-mono> rooms · 第 <!>/<!> 页</span></div></div><section class=space-y-3>`),ce=h(`<div class="flex flex-col items-center gap-3 border border-dashed border-line px-6 py-12 text-center"><span class="flex size-10 items-center justify-center border border-line bg-card text-muted-foreground"></span><div><p class=font-medium>暂无房间</p><p class="mt-1 text-sm text-muted-foreground">`),le=h(`<span class="font-mono text-xs text-muted-foreground">/`),ue=h(`<span class=truncate>· `),de=h(`<div class="group relative border border-line/70 bg-card/40 px-4 py-4 transition-colors hover:border-line hover:bg-accent/30 sm:px-5"><div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"><div class="flex min-w-0 flex-1 items-start gap-3"><div class="min-w-0 flex-1"><div class="flex flex-wrap items-center gap-2"><p class="display truncate text-xl sm:text-2xl"></p></div><div class="mt-1 flex flex-wrap items-center gap-3 text-xs text-muted-foreground"><span class="flex items-center gap-1"></span><span class="flex items-center gap-1"> 成员</span><span class=font-mono> 路分发</span></div></div></div><div class="flex shrink-0 items-center gap-2">`),P=()=>{let i=E(),[d,h]=a([]),[b,D]=a(0),[O,P]=a(1),[F,I]=a(``),[L,R]=a(``),[z,B]=a(``),[V,H]=a(!1),[U,W]=a(``),[fe,G]=a(!1),[K,q]=a(``),[J,pe]=a(!0),[Y,me]=a(!1),X=async()=>{G(!0),W(``);try{if(_.isAdminOrAbove())try{let e=((await p.manageRooms()).rooms||[]).map(e=>({name:e.room.name,display_name:e.room.display_name,description:e.room.description,creator:e.room.creator,is_public:e.room.is_public,status:e.room.status,member_count:e.member_count,targets:e.targets,live:e.live,created_at:e.room.created_at})),t=F().trim().toLowerCase();t&&(e=e.filter(e=>e.name.toLowerCase().includes(t)||e.display_name&&e.display_name.toLowerCase().includes(t))),D(e.length);let n=(O()-1)*12;h(e.slice(n,n+12));return}catch{}try{let e=await p.queryRooms({page:O(),page_size:12,search:F().trim()||void 0}),t=(e.rooms||[]).map(e=>({name:e.name,display_name:e.display_name,description:e.description,creator:e.creator,is_public:e.is_public,status:e.status,member_count:e.member_count??0,targets:[],live:!1,created_at:e.created_at}));try{let e=await p.listRooms(),n=new Map((e.rooms||[]).map(e=>[e.name,(e.targets?.length??0)>0?e.targets:[]]));for(let e of t){let t=n.get(e.name);t&&(e.targets=t,e.live=t.length>0)}}catch{}h(t),D(e.total??t.length);return}catch{}let e=((await p.listRooms()).rooms||[]).map(e=>({name:e.name,display_name:e.name,description:``,creator:``,is_public:!0,status:`active`,member_count:0,targets:e.targets||[],live:(e.targets?.length??0)>0})),t=F().trim().toLowerCase();t&&(e=e.filter(e=>e.name.toLowerCase().includes(t))),D(e.length);let n=(O()-1)*12;h(e.slice(n,n+12))}catch(e){W(String(e?.message||e))}finally{G(!1)}};n(()=>{_.isAuthed()&&X()}),n(()=>{O(),F(),_.isAuthed()&&X()}),l(()=>_.isAuthed()&&X());let Z=()=>{I(L().trim()),P(1)},Q=async()=>{let e=z().trim();if(e){H(!0),W(``);try{if(_.isAdminOrAbove()&&Y())await p.manageCreateRoom({name:e,display_name:e,description:K().trim()||void 0,is_public:J(),require_approval:!1,max_members:100});else try{await p.manageCreateRoom({name:e,display_name:e,description:K().trim()||void 0,is_public:J()})}catch{await p.createRoom(e)}B(``),q(``),await X(),i({to:`/room`,search:{room:e}})}catch(e){W(String(e?.message||e))}finally{H(!1)}}},he=e=>i({to:`/room`,search:{room:e}}),$=()=>Math.max(1,Math.ceil(b()/12));return(()=>{var n=se(),i=n.firstChild,a=i.firstChild,l=a.firstChild,p=l.firstChild,h=a.nextSibling,E=h.firstChild,D=E.firstChild,H=D.nextSibling,W=H.nextSibling.nextSibling;W.nextSibling;var G=i.nextSibling;return s(n,e(f,{get children(){return k()}}),i),s(n,e(r,{get when(){return U()},get children(){return e(y,{tone:`error`,get children(){return U()}})}}),i),s(n,e(f,{delay:1,get children(){var n=N(),i=n.firstChild,a=i.firstChild,o=a.firstChild,l=o.firstChild;return s(n,e(m,{}),i),s(o,e(C,{class:`size-4 shrink-0 text-muted-foreground`}),l),l.$$keydown=e=>{e.key===`Enter`&&Q()},l.$$input=e=>B(e.currentTarget.value),s(a,e(v,{class:`h-10 shrink-0`,onClick:Q,get disabled(){return V()||!z().trim()},get children(){return[e(x,{class:`size-4`}),`创建并进入`]}}),null),s(i,e(r,{get when(){return _.isAdminOrAbove()},get children(){var n=M(),i=n.firstChild.firstChild;return i.addEventListener(`change`,e=>me(e.target.checked)),s(n,e(r,{get when(){return Y()},get children(){return[(()=>{var e=A();return e.$$input=e=>q(e.currentTarget.value),c(()=>e.value=K()),e})(),(()=>{var n=j(),r=n.firstChild;return r.addEventListener(`change`,e=>pe(e.target.checked)),s(n,(()=>{var n=t(()=>!!J());return()=>n()?e(S,{class:`size-3`}):e(w,{class:`size-3`})})(),null),s(n,()=>J()?`公开`:`私密`,null),c(()=>r.checked=J()),n})()]}}),null),c(()=>i.checked=Y()),n}}),null),c(()=>l.value=z()),n}}),i),s(l,e(re,{class:`size-4 text-muted-foreground`}),p),p.$$keydown=e=>{e.key===`Enter`&&Z()},p.$$input=e=>R(e.currentTarget.value),s(a,e(v,{variant:`outline`,class:`h-9`,onClick:Z,children:`搜索`}),null),s(a,e(r,{get when(){return F()},get children(){return e(v,{variant:`ghost`,class:`h-9`,onClick:()=>{R(``),I(``),P(1)},children:`清除`})}}),null),s(E,b,D),s(E,O,H),s(E,$,W),s(h,e(v,{variant:`outline`,class:`h-7 px-2 text-xs`,get disabled(){return O()<=1},onClick:()=>P(e=>Math.max(1,e-1)),children:`上一页`}),null),s(h,e(v,{variant:`outline`,class:`h-7 px-2 text-xs`,get disabled(){return O()>=$()},onClick:()=>P(e=>e+1),children:`下一页`}),null),s(G,e(f,{get children(){var t=ae(),n=t.firstChild,i=n.firstChild;return s(n,e(T,{class:`size-4 text-muted-foreground`}),i),s(t,e(r,{get when(){return fe()},get children(){return ie()}}),null),t}}),null),s(G,e(r,{get when(){return d().length>0},get fallback(){return(()=>{var n=ce(),r=n.firstChild,i=r.nextSibling.firstChild.nextSibling;return s(r,e(ne,{class:`size-5`})),s(i,(()=>{var e=t(()=>!!F());return()=>e()?`无匹配 "${F()}" 的房间`:`创建一个房间后,分发拓扑会在这里出现。`})()),n})()},get children(){var n=oe();return s(n,e(o,{get each(){return d()},children:(n,i)=>e(f,{get delay(){return Math.min(i()+1,6)},get children(){var i=de(),a=i.firstChild,o=a.firstChild,c=o.firstChild,l=c.firstChild,d=l.firstChild,f=l.nextSibling,p=f.firstChild,h=p.nextSibling,_=h.firstChild,y=h.nextSibling,b=y.firstChild,C=o.nextSibling;return s(i,e(m,{}),a),s(o,e(u,{get active(){return!!n.live}}),c),s(d,()=>n.display_name||n.name),s(l,e(r,{get when(){return n.name!==n.display_name},get children(){var e=le();return e.firstChild,s(e,()=>n.name,null),e}}),null),s(l,e(g,{get variant(){return n.live?`success`:`muted`},class:`text-[10px]`,get children(){return n.live?`LIVE`:`IDLE`}}),null),s(l,e(g,{variant:`outline`,class:`gap-1 text-[10px]`,get children(){return[t(()=>t(()=>n.is_public===!1)()?e(w,{class:`size-3`}):e(S,{class:`size-3`})),t(()=>n.is_public===!1?`私密`:`公开`)]}}),null),s(l,e(r,{get when(){return t(()=>!!n.status)()&&n.status!==`active`},get children(){return e(g,{variant:`outline`,class:`border-destructive/40 text-destructive text-[10px]`,get children(){return n.status}})}}),null),s(p,e(te,{class:`size-3`}),null),s(p,()=>n.creator||`-`,null),s(h,e(ee,{class:`size-3`}),_),s(h,()=>n.member_count??0,_),s(y,()=>n.targets?.length??0,b),s(f,e(r,{get when(){return n.description},get children(){var e=ue();return e.firstChild,s(e,()=>n.description,null),e}}),null),s(C,e(v,{variant:`outline`,class:`h-9`,onClick:()=>he(n.name),get children(){return[`进入房间`,e(x,{class:`size-4`})]}})),i}})})),n}}),null),c(()=>p.value=L()),n})()};b([`input`,`keydown`]);export{P as Rooms}; |