4 lines
11 KiB
JavaScript
4 lines
11 KiB
JavaScript
import"../chunks/DsnmJJEf.js";import{p as Fe,u as Oe,c as Re,f as be,a as o,b as Ue,i as O,j as ge,e as a,s as r,r as t,n as R,k as e,t as m,l as k,d as i}from"../chunks/BxEwC6Zc.js";import{d as Be,s as n,a as he}from"../chunks/DoLu9QLy.js";import{i as L}from"../chunks/BQKoxf2Q.js";import{e as _e,i as ye}from"../chunks/BLQQas77.js";import{s as z}from"../chunks/BnX5ZnVA.js";import{s as U}from"../chunks/BqOsL1Vv.js";var Pe=i(`<div class="flex min-h-[70vh] flex-col items-center justify-center text-center"><div class="font-800 mb-6 flex h-16 w-16 items-center justify-center rounded-xl bg-accent text-2xl text-surface-900">V</div> <h1 class="text-4xl font-800 tracking-tight">Welcome to <span class="text-accent">Vash Esports</span></h1> <p class="mt-3 max-w-md text-text-secondary">Automated tournament match management for osu! — lobbies, mappools, picks, bans, and
|
|
ELO tracking all in one place.</p> <a href="/login" class="font-600 mt-8 rounded-lg bg-accent px-6 py-3 text-surface-900 transition-colors hover:bg-accent-hover">Sign in with osu!</a> <p class="mt-4 text-xs text-text-secondary">Uses your osu! account. No extra registration needed.</p></div>`),Ge=i('<img alt="" class="h-8 w-8 rounded-full"/>'),He=i('<img alt="" class="h-8 w-8 rounded-full"/>'),Ve=i("<span></span>"),We=i('<a class="flex items-center gap-4 rounded-lg border border-green-500/20 bg-surface-800 p-4 transition-all hover:border-green-500/40 hover:bg-surface-700"><div class="flex flex-1 items-center gap-3"><!> <span class="text-sm font-600"> </span></div> <div class="flex items-center gap-3"><span class="text-xl font-800 tabular-nums"> </span> <span class="text-xs text-text-secondary">vs</span> <span class="text-xl font-800 tabular-nums"> </span></div> <div class="flex flex-1 items-center justify-end gap-3"><span class="text-sm font-600"> </span> <!></div> <span><!> </span></a>'),Ye=i('<div class="mt-8"><div class="flex items-center gap-2"><div class="relative h-2 w-2"><div class="absolute inset-0 animate-ping rounded-full bg-green-400 opacity-75"></div> <div class="relative h-2 w-2 rounded-full bg-green-400"></div></div> <h2 class="text-sm font-600">Live Now</h2></div> <div class="mt-3 flex flex-col gap-2"></div></div>'),ze=i('<div class="flex items-center gap-3"><span class="flex items-center gap-2 text-xs text-yellow-400"><span class="h-1.5 w-1.5 animate-pulse rounded-full bg-yellow-400"></span> </span> <button class="rounded-md border border-red-500/30 px-3 py-1.5 text-xs text-red-400 hover:bg-red-500/10 disabled:opacity-50">Leave Queue</button></div>'),Je=i('<button class="rounded-md bg-accent px-4 py-2 text-sm font-600 text-surface-900 transition-colors hover:bg-accent-hover disabled:opacity-50"> </button>'),Ke=i('<span> </span> <span class="text-xs text-text-secondary">-</span> <span> </span>',1),Xe=i('<span class="text-xs text-text-secondary">vs</span>'),Ze=i('<span class="text-xs text-green-400"> </span>'),$e=i('<a class="flex items-center gap-3 rounded-lg border border-border bg-surface-800 p-3 transition-colors hover:border-accent/30 hover:bg-surface-700"><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="text-sm font-600"> </span> <!> <span class="text-sm font-600"> </span></div> <p class="mt-0.5 text-xs text-text-secondary"> </p></div> <!> <span> </span></a>'),et=i('<div class="rounded-lg border border-dashed border-border py-8 text-center"><p class="text-sm text-text-secondary">No matches yet. <a href="/matches" class="text-accent hover:underline">Create one</a></p></div>'),tt=i('<div class="mx-auto max-w-5xl"><div><h1 class="text-2xl font-700 tracking-tight">Welcome back, <span class="text-accent"> </span></h1> <p class="mt-1 text-sm text-text-secondary">Automated esports match management for osu!</p></div> <div class="mt-6 grid grid-cols-2 gap-3 sm:grid-cols-4"><div class="rounded-lg border border-border bg-surface-800 p-4"><p class="text-2xl font-800 tabular-nums text-text-primary"> </p> <p class="mt-1 text-xs text-text-secondary">Total Matches</p></div> <div class="rounded-lg border border-border bg-surface-800 p-4"><p class="text-2xl font-800 tabular-nums text-green-400"> </p> <p class="mt-1 text-xs text-text-secondary">Completed</p></div> <div class="rounded-lg border border-border bg-surface-800 p-4"><p class="text-2xl font-800 tabular-nums text-text-primary"> </p> <p class="mt-1 text-xs text-text-secondary">Teams</p></div> <div class="rounded-lg border border-border bg-surface-800 p-4"><p class="text-2xl font-800 tabular-nums text-text-primary"> </p> <p class="mt-1 text-xs text-text-secondary">Mappools</p></div></div> <!> <div class="mt-6 rounded-lg border border-border bg-surface-800 p-5"><div class="flex items-center justify-between"><div><h2 class="text-sm font-600">Ranked Queue</h2> <p class="mt-0.5 text-xs text-text-secondary">Find a match at your skill level</p></div> <!></div></div> <div class="mt-8 grid gap-4 lg:grid-cols-3"><div class="lg:col-span-1"><h2 class="text-sm font-600">Quick Actions</h2> <div class="mt-3 flex flex-col gap-2"><a href="/matches" class="flex items-center gap-3 rounded-lg border border-border bg-surface-800 p-3 transition-colors hover:border-accent/40 hover:bg-surface-700"><span class="flex h-8 w-8 items-center justify-center rounded-md bg-accent/10 text-accent">⚔</span> <div><p class="text-sm font-600">New Match</p> <p class="text-xs text-text-secondary">Start a 1v1</p></div></a> <a href="/mappools" class="flex items-center gap-3 rounded-lg border border-border bg-surface-800 p-3 transition-colors hover:border-accent/40 hover:bg-surface-700"><span class="flex h-8 w-8 items-center justify-center rounded-md bg-purple-500/10 text-purple-400">♫</span> <div><p class="text-sm font-600">Mappools</p> <p class="text-xs text-text-secondary">Build a pool</p></div></a> <a href="/teams" class="flex items-center gap-3 rounded-lg border border-border bg-surface-800 p-3 transition-colors hover:border-accent/40 hover:bg-surface-700"><span class="flex h-8 w-8 items-center justify-center rounded-md bg-blue-500/10 text-blue-400">⚑</span> <div><p class="text-sm font-600">Teams</p> <p class="text-xs text-text-secondary">Manage rosters</p></div></a></div></div> <div class="lg:col-span-2"><h2 class="text-sm font-600">Recent Matches</h2> <div class="mt-3 flex flex-col gap-2"></div></div></div></div>');function dt(we,p){Fe(p,!0);const re={CREATED:{label:"Created",color:"text-text-secondary"},LOBBY:{label:"In Lobby",color:"text-yellow-400"},ROLLING:{label:"Rolling",color:"text-yellow-400",dot:"bg-yellow-400"},PICKING:{label:"Picking",color:"text-blue-400",dot:"bg-blue-400"},PLAYING:{label:"Live",color:"text-green-400",dot:"bg-green-400"},FINISHED:{label:"Finished",color:"text-text-secondary"},CANCELLED:{label:"Cancelled",color:"text-red-400"}};let J=ge(null),M=ge(!1);async function B(){try{const c=await fetch("/api/queue");c.ok&&O(J,await c.json(),!0)}catch{}}async function Ie(){O(M,!0);try{const u=await(await fetch("/api/queue",{method:"POST"})).json();if(u.matched&&u.match){window.location.href=`/matches/${u.match.id}`;return}await B()}catch{}O(M,!1)}async function ke(){O(M,!0);try{await fetch("/api/queue",{method:"DELETE"}),await B()}catch{}O(M,!1)}Oe(()=>{if(p.data.user){B();const c=setInterval(B,5e3);return()=>clearInterval(c)}});function Le(c){const u=new Date(c),Q=Date.now()-u.getTime(),j=Math.floor(Q/6e4);if(j<1)return"just now";if(j<60)return`${j}m ago`;const S=Math.floor(j/60);return S<24?`${S}h ago`:`${Math.floor(S/24)}d ago`}var ne=Re(),Me=be(ne);{var je=c=>{var u=Pe();o(c,u)},Ee=c=>{var u=tt(),Q=a(u),j=a(Q),S=r(a(j)),oe=a(S,!0);t(S),t(j),R(2),t(Q);var K=r(Q,2),X=a(K),ce=a(X),Ne=a(ce,!0);t(ce),R(2),t(X);var Z=r(X,2),le=a(Z),Ae=a(le,!0);t(le),R(2),t(Z);var $=r(Z,2),de=a($),Ce=a(de,!0);t(de),R(2),t($);var ie=r($,2),ve=a(ie),Se=a(ve,!0);t(ve),R(2),t(ie),t(K);var xe=r(K,2);{var De=l=>{var s=Ye(),v=r(a(s),2);_e(v,21,()=>p.data.liveMatches,ye,(h,b)=>{const E=k(()=>e(b).participants[0]),g=k(()=>e(b).participants[1]),_=k(()=>re[e(b).state]);var y=We(),N=a(y),P=a(N);{var G=f=>{var I=Ge();m(()=>z(I,"src",e(E).team.avatarUrl)),o(f,I)};L(P,f=>{e(E)?.team.avatarUrl&&f(G)})}var H=r(P,2),te=a(H,!0);t(H),t(N);var D=r(N,2),T=a(D),V=a(T,!0);t(T);var W=r(T,4),Y=a(W,!0);t(W),t(D);var F=r(D,2),A=a(F),ae=a(A,!0);t(A);var d=r(A,2);{var w=f=>{var I=He();m(()=>z(I,"src",e(g).team.avatarUrl)),o(f,I)};L(d,f=>{e(g)?.team.avatarUrl&&f(w)})}t(F);var x=r(F,2),q=a(x);{var C=f=>{var I=Ve();m(()=>U(I,1,`h-1.5 w-1.5 rounded-full ${e(_).dot??""}`)),o(f,I)};L(q,f=>{e(_)?.dot&&f(C)})}var se=r(q);t(x),t(y),m(()=>{z(y,"href",`/matches/${e(b).id??""}`),n(te,e(E)?.team.name??"?"),n(V,e(E)?.score??0),n(Y,e(g)?.score??0),n(ae,e(g)?.team.name??"?"),U(x,1,`flex items-center gap-1.5 text-xs font-500 ${e(_)?.color??""??""}`),n(se,` ${e(_)?.label??""}`)}),o(h,y)}),t(v),t(s),o(l,s)};L(xe,l=>{p.data.liveMatches.length>0&&l(De)})}var ee=r(xe,2),pe=a(ee),qe=r(a(pe),2);{var Qe=l=>{var s=ze(),v=a(s),h=r(a(v));t(v);var b=r(v,2);t(s),m(()=>{n(h,` In queue (${e(J).queueSize??""} searching)`),b.disabled=e(M)}),he("click",b,ke),o(l,s)},Te=l=>{var s=Je(),v=a(s,!0);t(s),m(()=>{s.disabled=e(M),n(v,e(M)?"Joining...":"Find Match")}),he("click",s,Ie),o(l,s)};L(qe,l=>{e(J)?.inQueue?l(Qe):l(Te,!1)})}t(pe),t(ee);var ue=r(ee,2),fe=r(a(ue),2),me=r(a(fe),2);_e(me,21,()=>p.data.recentMatches,ye,(l,s)=>{const v=k(()=>e(s).participants[0]),h=k(()=>e(s).participants[1]),b=k(()=>e(s).config),E=k(()=>re[e(s).state]);var g=$e(),_=a(g),y=a(_),N=a(y),P=a(N,!0);t(N);var G=r(N,2);{var H=d=>{var w=Ke(),x=be(w),q=a(x,!0);t(x);var C=r(x,4),se=a(C,!0);t(C),m(()=>{U(x,1,`text-xs font-700 tabular-nums ${(e(v)?.score??0)>(e(h)?.score??0)?"text-green-400":"text-text-secondary"}`),n(q,e(v)?.score??0),U(C,1,`text-xs font-700 tabular-nums ${(e(h)?.score??0)>(e(v)?.score??0)?"text-green-400":"text-text-secondary"}`),n(se,e(h)?.score??0)}),o(d,w)},te=d=>{var w=Xe();o(d,w)};L(G,d=>{e(s).state==="FINISHED"?d(H):d(te,!1)})}var D=r(G,2),T=a(D,!0);t(D),t(y);var V=r(y,2),W=a(V);t(V),t(_);var Y=r(_,2);{var F=d=>{const w=k(()=>e(s).participants.find(C=>C.teamId===e(s).winnerId));var x=Ze(),q=a(x);t(x),m(()=>n(q,`🏆 ${e(w)?.team.name??""}`)),o(d,x)};L(Y,d=>{e(s).state==="FINISHED"&&e(s).winnerId&&d(F)})}var A=r(Y,2),ae=a(A,!0);t(A),t(g),m(d=>{z(g,"href",`/matches/${e(s).id??""}`),n(P,e(v)?.team.name??"?"),n(T,e(h)?.team.name??"?"),n(W,`${e(s).name?`${e(s).name} · `:""}BO${e(b).bestOf??""}
|
|
· ${d??""}`),U(A,1,`text-xs ${e(E)?.color??"text-text-secondary"??""}`),n(ae,e(E)?.label)},[()=>Le(e(s).finishedAt??e(s).createdAt)]),o(l,g)},l=>{var s=et();o(l,s)}),t(me),t(fe),t(ue),t(u),m(()=>{n(oe,p.data.user.name),n(Ne,p.data.stats.matches),n(Ae,p.data.stats.finished),n(Ce,p.data.stats.teams),n(Se,p.data.stats.mappools)}),o(c,u)};L(Me,c=>{p.data.user?c(Ee,!1):c(je)})}o(we,ne),Ue()}Be(["click"]);export{dt as component};
|