2 lines
9.7 KiB
JavaScript
2 lines
9.7 KiB
JavaScript
import{k as A,r as d,I as B,l,p as a,s as t,u as p,A as c,v as n,q as g,F as _,x as k,O as M}from"./style-D1Ozo1PL.js";const U={class:"min-h-screen bg-base-200"},$={class:"container mx-auto px-4 py-8"},z={class:"grid grid-cols-1 lg:grid-cols-3 gap-8"},T={class:"lg:col-span-1"},V={class:"card bg-base-100 shadow-lg sticky top-8"},I={class:"card-body"},Y={class:"text-center mb-6"},q={class:"text-3xl font-bold"},G={key:0,class:"flex justify-center py-8"},H={key:1,class:"space-y-4"},J={class:"text-center"},K={key:0,class:"text-4xl font-bold text-primary"},Q={key:1,class:"text-2xl text-base-content/50"},W={class:"text-center"},X={class:"text-2xl font-bold"},Z={class:"text-center"},tt={class:"text-2xl font-bold"},st={class:"lg:col-span-2"},et={class:"card bg-base-100 shadow-lg"},ot={class:"card-body"},lt={for:"file-upload",class:"cursor-pointer flex flex-col items-center gap-3"},at={key:0,class:"mb-6"},nt={class:"space-y-2"},rt={class:"flex-1 min-w-0"},it={class:"font-medium truncate"},dt={class:"text-xs text-base-content/70"},ct=["onClick"],ut={class:"flex gap-3"},bt=["disabled"],mt={key:0,class:"mdi mdi-send mr-2"},pt={class:"card bg-base-100 shadow-lg mt-8"},vt={class:"card-body"},ft={key:0,class:"flex justify-center py-8"},gt={key:1,class:"text-center py-8"},xt={key:2,class:"overflow-x-auto"},ht={class:"table table-zebra w-full"},yt={class:"font-medium"},_t={class:"text-right"},kt={class:"badge badge-primary badge-lg"},wt={key:0,class:"modal modal-open"},jt={class:"modal-box max-w-4xl"},St={class:"flex justify-between items-center mb-4"},Ct={class:"overflow-x-auto"},Dt={class:"table table-zebra w-full"},Ft={class:"font-bold"},Pt={key:0,class:"badge badge-warning badge-lg"},Et={key:1,class:"badge badge-lg"},Lt={key:2,class:"badge badge-lg"},Nt={key:3},Ot={class:"font-medium"},Rt={key:0,class:"badge badge-primary badge-sm ml-2"},At={class:"text-right"},Bt={class:"text-right font-bold"},Mt={key:0,class:"text-center py-8"},Ut=A({__name:"Noita",setup(Tt){const r=d({username:"Player",rank:null,score:0,runsSubmitted:0}),i=d([]),u=d(!1),m=d(!1),x=d([]),h=d(!1),y=d(!1),v=d([]),f=d(!1),F=e=>{const s=e.target;s.files&&(i.value=Array.from(s.files))},P=e=>{e.preventDefault(),e.stopPropagation(),m.value=!0},E=e=>{e.preventDefault(),e.stopPropagation(),m.value=!1},L=e=>{e.preventDefault(),e.stopPropagation(),m.value=!1,e.dataTransfer?.files&&(i.value=Array.from(e.dataTransfer.files))},N=async()=>{if(i.value.length!==0){u.value=!0;try{for(const e of i.value){const s=new FormData;s.append("file",e);const o=await fetch("/api/noita/submit",{method:"POST",body:s});if(!o.ok){const C=await o.json();alert(`Error submitting ${e.name}: ${C.detail||"Unknown error"}`);return}const b=await o.json();console.log("Submission successful:",b)}i.value=[],alert("Run submitted successfully!"),await Promise.all([w(),j(),S()])}catch(e){console.error("Error submitting run:",e),alert("Error submitting run. Please try again.")}finally{u.value=!1}}},O=()=>{window.location.href="/"},w=async()=>{h.value=!0;try{const e=await fetch("/api/noita/objectives");if(!e.ok)throw new Error("Failed to fetch objectives");x.value=await e.json()}catch(e){console.error("Error fetching objectives:",e)}finally{h.value=!1}},j=async()=>{try{const e=await fetch("/api/noita/results");if(!e.ok)throw new Error("Failed to fetch results");const s=await e.json();r.value.score=s.total_score,r.value.runsSubmitted=s.objectives.length}catch(e){console.error("Error fetching results:",e)}},S=async()=>{y.value=!0;try{const e=await fetch("/api/noita/leaderboard");if(!e.ok)throw new Error("Failed to fetch leaderboard");const s=await e.json();v.value=s.leaderboard;const o=v.value.find(b=>b.username===r.value.username);o&&(r.value.rank=o.rank,r.value.score=o.total_score)}catch(e){console.error("Error fetching leaderboard:",e)}finally{y.value=!1}},R=async()=>{try{const e=await fetch("/api/user");if(e.ok){const s=await e.json();s.is_authenticated&&(r.value.username=s.username)}}catch(e){console.error("Error fetching user info:",e)}await Promise.all([w(),j(),S()])};return B(()=>{R()}),(e,s)=>(a(),l("div",U,[t("div",{class:"navbar bg-base-100 shadow-lg"},[t("div",{class:"container mx-auto w-full flex items-center gap-4"},[t("button",{onClick:O,class:"btn btn-primary btn-sm"},[...s[3]||(s[3]=[t("i",{class:"mdi mdi-arrow-left"},null,-1),c(" Back ",-1)])]),s[4]||(s[4]=t("h1",{class:"text-xl font-bold"},"Noita Submitter",-1)),s[5]||(s[5]=t("div",{class:"flex-1"},null,-1)),s[6]||(s[6]=t("a",{href:"/api/docs",class:"btn btn-xs"},"API docs",-1)),s[7]||(s[7]=t("a",{href:"/admin",class:"btn btn-xs btn-warning"},"Admin panel",-1))])]),t("div",$,[t("div",z,[t("div",T,[t("div",V,[s[15]||(s[15]=t("div",{class:"bg-gradient-to-br from-purple-600 to-purple-400 p-6 text-white rounded-t-2xl"},[t("i",{class:"mdi mdi-trophy text-4xl"}),t("h2",{class:"text-2xl font-bold mt-2"},"Your Ranking")],-1)),t("div",I,[t("div",Y,[s[8]||(s[8]=t("p",{class:"text-sm text-base-content/70"},"Player",-1)),t("p",q,n(r.value.username),1)]),s[14]||(s[14]=t("div",{class:"divider"},null,-1)),y.value?(a(),l("div",G,[...s[9]||(s[9]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):(a(),l("div",H,[t("div",J,[s[10]||(s[10]=t("p",{class:"text-sm text-base-content/70 mb-1"},"Current Rank",-1)),r.value.rank!==null?(a(),l("p",K," #"+n(r.value.rank),1)):(a(),l("p",Q,"No rank yet"))]),t("div",W,[s[11]||(s[11]=t("p",{class:"text-sm text-base-content/70 mb-1"},"Total Score",-1)),t("p",X,n(r.value.score.toLocaleString()),1)]),t("div",Z,[s[12]||(s[12]=t("p",{class:"text-sm text-base-content/70 mb-1"},"Objectives Completed",-1)),t("p",tt,n(r.value.runsSubmitted),1)])])),t("button",{onClick:s[0]||(s[0]=o=>f.value=!0),class:"btn btn-outline btn-sm w-full mt-6"},[...s[13]||(s[13]=[t("i",{class:"mdi mdi-trophy mr-1"},null,-1),c(" View Full Leaderboard ",-1)])])])])]),t("div",st,[t("div",et,[t("div",ot,[s[21]||(s[21]=t("h2",{class:"card-title text-2xl mb-6"},[t("i",{class:"mdi mdi-cloud-upload text-purple-500 mr-2"}),c(" Submit Your Run ")],-1)),t("div",{onDragover:P,onDragleave:E,onDrop:L,class:g(["border-2 border-dashed rounded-lg p-8 text-center transition-colors cursor-pointer bg-base-200/50 mb-6",m.value?"border-primary bg-primary/10":"border-base-300 hover:border-primary"])},[t("input",{type:"file",multiple:"",onChange:F,class:"hidden",id:"file-upload",accept:"video/*,image/*"},null,32),t("label",lt,[t("i",{class:g(["mdi text-4xl",m.value?"mdi-cloud-check text-primary":"mdi-file-upload text-base-content/50"])},null,2),s[16]||(s[16]=t("div",null,[t("p",{class:"font-semibold"},"Click to upload or drag and drop"),t("p",{class:"text-sm text-base-content/70"},"Video or image files (MP4, PNG, etc.)")],-1))])],34),i.value.length>0?(a(),l("div",at,[s[19]||(s[19]=t("p",{class:"font-semibold mb-3"},"Selected Files:",-1)),t("div",nt,[(a(!0),l(_,null,k(i.value,(o,b)=>(a(),l("div",{key:b,class:"flex items-center gap-3 bg-base-200 p-3 rounded-lg"},[s[18]||(s[18]=t("i",{class:"mdi mdi-file text-primary"},null,-1)),t("div",rt,[t("p",it,n(o.name),1),t("p",dt,n((o.size/1024/1024).toFixed(2))+" MB",1)]),t("button",{onClick:C=>i.value.splice(b,1),class:"btn btn-ghost btn-xs"},[...s[17]||(s[17]=[t("i",{class:"mdi mdi-close"},null,-1)])],8,ct)]))),128))])])):p("",!0),t("div",ut,[s[20]||(s[20]=t("label",{for:"file-upload",class:"btn btn-outline flex-1"},[t("i",{class:"mdi mdi-folder-open mr-2"}),c(" Choose Files ")],-1)),t("button",{onClick:N,disabled:i.value.length===0||u.value,class:g(["btn btn-primary flex-1",{loading:u.value}])},[u.value?p("",!0):(a(),l("i",mt)),c(" "+n(u.value?"Submitting...":"Submit Run"),1)],10,bt)]),s[22]||(s[22]=t("p",{class:"text-xs text-base-content/70 text-center mt-4"}," Maximum file size: 256 MB per file ",-1))])]),t("div",pt,[t("div",vt,[s[26]||(s[26]=t("h2",{class:"card-title text-2xl mb-6"},[t("i",{class:"mdi mdi-view-list text-purple-500 mr-2"}),c(" Your Objectives ")],-1)),h.value?(a(),l("div",ft,[...s[23]||(s[23]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):x.value.length===0?(a(),l("div",gt,[...s[24]||(s[24]=[t("p",{class:"text-base-content/70 mb-2"},"No objectives completed yet",-1),t("p",{class:"text-sm text-base-content/50"},"Submit your runs to unlock objectives!",-1)])])):(a(),l("div",xt,[t("table",ht,[s[25]||(s[25]=t("thead",null,[t("tr",null,[t("th",null,"Objective ID"),t("th",{class:"text-right"},"Count")])],-1)),t("tbody",null,[(a(!0),l(_,null,k(x.value,o=>(a(),l("tr",{key:o.objectiv_id},[t("td",yt,n(o.objectiv_id),1),t("td",_t,[t("span",kt,n(o.count),1)])]))),128))])])]))])])])])]),f.value?(a(),l("div",wt,[t("div",jt,[t("div",St,[s[28]||(s[28]=t("h3",{class:"font-bold text-lg"},[t("i",{class:"mdi mdi-trophy text-yellow-500 mr-2"}),c(" Global Leaderboard ")],-1)),t("button",{onClick:s[1]||(s[1]=o=>f.value=!1),class:"btn btn-sm btn-circle btn-ghost"},[...s[27]||(s[27]=[t("i",{class:"mdi mdi-close"},null,-1)])])]),t("div",Ct,[t("table",Dt,[s[29]||(s[29]=t("thead",null,[t("tr",null,[t("th",null,"Rank"),t("th",null,"Username"),t("th",{class:"text-right"},"Objectives"),t("th",{class:"text-right"},"Score")])],-1)),t("tbody",null,[(a(!0),l(_,null,k(v.value,o=>(a(),l("tr",{key:o.username,class:g({"bg-primary/20":o.username===r.value.username})},[t("td",Ft,[o.rank===1?(a(),l("span",Pt," 🏆 #"+n(o.rank),1)):o.rank===2?(a(),l("span",Et," 🥈 #"+n(o.rank),1)):o.rank===3?(a(),l("span",Lt," 🥉 #"+n(o.rank),1)):(a(),l("span",Nt,"#"+n(o.rank),1))]),t("td",Ot,[c(n(o.username)+" ",1),o.username===r.value.username?(a(),l("span",Rt," You ")):p("",!0)]),t("td",At,n(o.objectives_count),1),t("td",Bt,n(o.total_score.toLocaleString()),1)],2))),128))])])]),v.value.length===0?(a(),l("div",Mt,[...s[30]||(s[30]=[t("p",{class:"text-base-content/70"},"No entries yet",-1)])])):p("",!0)]),t("div",{class:"modal-backdrop",onClick:s[2]||(s[2]=o=>f.value=!1)})])):p("",!0)]))}}),D="#app",$t=document.querySelector(D),zt=M(Ut,{...$t?.dataset});zt.mount(D);
|