diff --git a/web/dist/assets/index-B0xoTjru.js b/web/dist/assets/index-DIgvA275.js similarity index 99% rename from web/dist/assets/index-B0xoTjru.js rename to web/dist/assets/index-DIgvA275.js index 899a554..ec53b99 100644 --- a/web/dist/assets/index-B0xoTjru.js +++ b/web/dist/assets/index-DIgvA275.js @@ -4827,4 +4827,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function tde(i,e){return XAe(i)||ZAe(i,e)||oI(i,e)||JAe()}function Lf(i){return YAe(i)||KAe(i)||oI(i)||ede()}function nde(i,e){if(typeof i!="object"||!i)return i;var t=i[Symbol.toPrimitive];if(t!==void 0){var n=t.call(i,e);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(i)}function ide(i){var e=nde(i,"string");return typeof e=="symbol"?e:e+""}function oI(i,e){if(i){if(typeof i=="string")return mw(i,e);var t={}.toString.call(i).slice(8,-1);return t==="Object"&&i.constructor&&(t=i.constructor.name),t==="Map"||t==="Set"?Array.from(i):t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?mw(i,e):void 0}}var br=window.THREE?window.THREE:{WebGLRenderer:Lj,Scene:Xw,PerspectiveCamera:ya,Raycaster:Xz,SRGBColorSpace:_n,TextureLoader:iM,Vector2:mt,Vector3:ue,Box3:Gc,Color:sn,Mesh:zi,SphereGeometry:Eu,MeshBasicMaterial:pA,BackSide:hr,Clock:aD},lI=xs({props:{width:{default:window.innerWidth,onChange:function(e,t,n){isNaN(e)&&(t.width=n)}},height:{default:window.innerHeight,onChange:function(e,t,n){isNaN(e)&&(t.height=n)}},viewOffset:{default:[0,0]},backgroundColor:{default:"#000011"},backgroundImageUrl:{},onBackgroundImageLoaded:{},showNavInfo:{default:!0},skyRadius:{default:5e4},objects:{default:[]},lights:{default:[]},enablePointerInteraction:{default:!0,onChange:function(e,t){t.hoverObj=null,t.tooltip&&t.tooltip.content(null)},triggerUpdate:!1},pointerRaycasterThrottleMs:{default:50,triggerUpdate:!1},lineHoverPrecision:{default:1,triggerUpdate:!1},pointsHoverPrecision:{default:1,triggerUpdate:!1},hoverOrderComparator:{triggerUpdate:!1},hoverFilter:{default:function(){return!0},triggerUpdate:!1},tooltipContent:{triggerUpdate:!1},hoverDuringDrag:{default:!1,triggerUpdate:!1},clickAfterDrag:{default:!1,triggerUpdate:!1},onHover:{default:function(){},triggerUpdate:!1},onClick:{default:function(){},triggerUpdate:!1},onRightClick:{triggerUpdate:!1}},methods:{tick:function(e){if(e.initialised){e.controls.enabled&&e.controls.update&&e.controls.update(Math.min(1,e.clock.getDelta())),e.postProcessingComposer?e.postProcessingComposer.render():e.renderer.render(e.scene,e.camera),e.extraRenderers.forEach(function(a){return a.render(e.scene,e.camera)});var t=+new Date;if(e.enablePointerInteraction&&t-e.lastRaycasterCheck>=e.pointerRaycasterThrottleMs){e.lastRaycasterCheck=t;var n=null;if(e.hoverDuringDrag||!e.isPointerDragging){var r=this.intersectingObjects(e.pointerPos.x,e.pointerPos.y);e.hoverOrderComparator&&r.sort(function(a,l){return e.hoverOrderComparator(a.object,l.object)});var s=r.find(function(a){return e.hoverFilter(a.object)})||null;n=s?s.object:null,e.intersection=s||null}n!==e.hoverObj&&(e.onHover(n,e.hoverObj,e.intersection),e.tooltip.content(n&&Ct(e.tooltipContent)(n,e.intersection)||null),e.hoverObj=n)}e.tweenGroup.update()}return this},getPointerPos:function(e){var t=e.pointerPos,n=t.x,r=t.y;return{x:n,y:r}},cameraPosition:function(e,t,n,r){var s=e.camera;if(t&&e.initialised){var a=t,l=n||{x:0,y:0,z:0};if(!r)g(a),v(l);else{var u=Object.assign({},s.position),h=x();e.tweenGroup.add(new ca(u).to(a,r).easing(os.Quadratic.Out).onUpdate(g).start()),e.tweenGroup.add(new ca(h).to(l,r/3).easing(os.Quadratic.Out).onUpdate(v).start())}return this}return Object.assign({},s.position,{lookAt:x()});function g(S){var w=S.x,R=S.y,C=S.z;w!==void 0&&(s.position.x=w),R!==void 0&&(s.position.y=R),C!==void 0&&(s.position.z=C)}function v(S){var w=new br.Vector3(S.x,S.y,S.z);e.controls.enabled&&e.controls.target?e.controls.target=w:s.lookAt(w)}function x(){return Object.assign(new br.Vector3(0,0,-1e3).applyQuaternion(s.quaternion).add(s.position))}},zoomToFit:function(e){for(var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:10,r=arguments.length,s=new Array(r>3?r-3:0),a=3;a2&&arguments[2]!==void 0?arguments[2]:0,r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:10,s=e.camera;if(t){var a=new br.Vector3(0,0,0),l=Math.max.apply(Math,Lf(Object.entries(t).map(function(S){var w=tde(S,2),R=w[0],C=w[1];return Math.max.apply(Math,Lf(C.map(function(E){return Math.abs(a[R]-E)})))})))*2,u=(1-r*2/e.height)*s.fov,h=l/Math.atan(u*Math.PI/180),g=h/s.aspect,v=Math.max(h,g);if(v>0){var x=a.clone().sub(s.position).normalize().multiplyScalar(-v);this.cameraPosition(x,a,n)}}return this},getBbox:function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:function(){return!0},n=new br.Box3(new br.Vector3(0,0,0),new br.Vector3(0,0,0)),r=e.objects.filter(t);return r.length?(r.forEach(function(s){return n.expandByObject(s)}),Object.assign.apply(Object,Lf(["x","y","z"].map(function(s){return QAe({},s,[n.min[s],n.max[s]])})))):null},getScreenCoords:function(e,t,n,r){var s=new br.Vector3(t,n,r);return s.project(this.camera()),{x:(s.x+1)*e.width/2,y:-(s.y-1)*e.height/2}},getSceneCoords:function(e,t,n){var r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,s=new br.Vector2(t/e.width*2-1,-(n/e.height)*2+1),a=new br.Raycaster;return a.setFromCamera(s,e.camera),Object.assign({},a.ray.at(r,new br.Vector3))},intersectingObjects:function(e,t,n){var r=new br.Vector2(t/e.width*2-1,-(n/e.height)*2+1),s=new br.Raycaster;return s.params.Line.threshold=e.lineHoverPrecision,s.params.Points.threshold=e.pointsHoverPrecision,s.setFromCamera(r,e.camera),s.intersectObjects(e.objects,!0)},renderer:function(e){return e.renderer},scene:function(e){return e.scene},camera:function(e){return e.camera},postProcessingComposer:function(e){return e.postProcessingComposer},controls:function(e){return e.controls},tbControls:function(e){return e.controls}},stateInit:function(){return{scene:new br.Scene,camera:new br.PerspectiveCamera,clock:new br.Clock,tweenGroup:new My,lastRaycasterCheck:0}},init:function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},r=n.controlType,s=r===void 0?"trackball":r,a=n.useWebGPU,l=a===void 0?!1:a,u=n.rendererConfig,h=u===void 0?{}:u,g=n.extraRenderers,v=g===void 0?[]:g,x=n.waitForLoadComplete,S=x===void 0?!0:x;e.innerHTML="",e.appendChild(t.container=document.createElement("div")),t.container.className="scene-container",t.container.style.position="relative",t.container.appendChild(t.navInfo=document.createElement("div")),t.navInfo.className="scene-nav-info",t.navInfo.textContent={orbit:"Left-click: rotate, Mouse-wheel/middle-click: zoom, Right-click: pan",trackball:"Left-click: rotate, Mouse-wheel/middle-click: zoom, Right-click: pan",fly:"WASD: move, R|F: up | down, Q|E: roll, up|down: pitch, left|right: yaw"}[s]||"",t.navInfo.style.display=t.showNavInfo?null:"none",t.tooltip=new jAe(t.container),t.pointerPos=new br.Vector2,t.pointerPos.x=-2,t.pointerPos.y=-2,["pointermove","pointerdown"].forEach(function(w){return t.container.addEventListener(w,function(R){if(w==="pointerdown"&&(t.isPointerPressed=!0),!t.isPointerDragging&&R.type==="pointermove"&&(R.pressure>0||t.isPointerPressed)&&(R.pointerType==="mouse"||R.movementX===void 0||[R.movementX,R.movementY].some(function(B){return Math.abs(B)>1}))&&(t.isPointerDragging=!0),t.enablePointerInteraction){var C=E(t.container);t.pointerPos.x=R.pageX-C.left,t.pointerPos.y=R.pageY-C.top}function E(B){var L=B.getBoundingClientRect(),O=window.pageXOffset||document.documentElement.scrollLeft,z=window.pageYOffset||document.documentElement.scrollTop;return{top:L.top+z,left:L.left+O}}},{passive:!0})}),t.container.addEventListener("pointerup",function(w){t.isPointerPressed&&(t.isPointerPressed=!1,!(t.isPointerDragging&&(t.isPointerDragging=!1,!t.clickAfterDrag))&&requestAnimationFrame(function(){w.button===0&&t.onClick(t.hoverObj||null,w,t.intersection),w.button===2&&t.onRightClick&&t.onRightClick(t.hoverObj||null,w,t.intersection)}))},{passive:!0,capture:!0}),t.container.addEventListener("contextmenu",function(w){t.onRightClick&&w.preventDefault()}),t.renderer=new(l?sO:br.WebGLRenderer)(Object.assign({antialias:!0,alpha:!0},h)),t.renderer.setPixelRatio(Math.min(2,window.devicePixelRatio)),t.container.appendChild(t.renderer.domElement),t.extraRenderers=v,t.extraRenderers.forEach(function(w){w.domElement.style.position="absolute",w.domElement.style.top="0px",w.domElement.style.pointerEvents="none",t.container.appendChild(w.domElement)}),t.postProcessingComposer=new Jce(t.renderer),t.postProcessingComposer.addPass(new ehe(t.scene,t.camera)),t.controls=new{trackball:lce,orbit:Tce,fly:Fce}[s](t.camera,t.renderer.domElement),s==="fly"&&(t.controls.movementSpeed=300,t.controls.rollSpeed=Math.PI/6,t.controls.dragToLook=!0),(s==="trackball"||s==="orbit")&&(t.controls.minDistance=.1,t.controls.maxDistance=t.skyRadius,t.controls.addEventListener("start",function(){t.controlsEngaged=!0}),t.controls.addEventListener("change",function(){t.controlsEngaged&&(t.controlsDragging=!0)}),t.controls.addEventListener("end",function(){t.controlsEngaged=!1,t.controlsDragging=!1})),[t.renderer,t.postProcessingComposer].concat(Lf(t.extraRenderers)).forEach(function(w){return w.setSize(t.width,t.height)}),t.camera.aspect=t.width/t.height,t.camera.updateProjectionMatrix(),t.camera.position.z=1e3,t.scene.add(t.skysphere=new br.Mesh),t.skysphere.visible=!1,t.loadComplete=t.scene.visible=!S,window.scene=t.scene},update:function(e,t){if(e.width&&e.height&&(t.hasOwnProperty("width")||t.hasOwnProperty("height"))){var n,r=e.width,s=e.height;e.container.style.width="".concat(r,"px"),e.container.style.height="".concat(s,"px"),[e.renderer,e.postProcessingComposer].concat(Lf(e.extraRenderers)).forEach(function(S){return S.setSize(r,s)}),e.camera.aspect=r/s;var a=e.viewOffset.slice(0,2);a.some(function(S){return S})&&(n=e.camera).setViewOffset.apply(n,[r,s].concat(Lf(a),[r,s])),e.camera.updateProjectionMatrix()}if(t.hasOwnProperty("viewOffset")){var l,u=e.width,h=e.height,g=e.viewOffset.slice(0,2);g.some(function(S){return S})?(l=e.camera).setViewOffset.apply(l,[u,h].concat(Lf(g),[u,h])):e.camera.clearViewOffset()}if(t.hasOwnProperty("skyRadius")&&e.skyRadius&&(e.controls.hasOwnProperty("maxDistance")&&t.skyRadius&&(e.controls.maxDistance=Math.min(e.controls.maxDistance,e.skyRadius)),e.camera.far=e.skyRadius*2.5,e.camera.updateProjectionMatrix(),e.skysphere.geometry=new br.SphereGeometry(e.skyRadius)),t.hasOwnProperty("backgroundColor")){var v=G0(e.backgroundColor).alpha;v===void 0&&(v=1),e.renderer.setClearColor(new br.Color(Dhe(1,e.backgroundColor)),v)}t.hasOwnProperty("backgroundImageUrl")&&(e.backgroundImageUrl?new br.TextureLoader().load(e.backgroundImageUrl,function(S){S.colorSpace=br.SRGBColorSpace,e.skysphere.material=new br.MeshBasicMaterial({map:S,side:br.BackSide}),e.skysphere.visible=!0,e.onBackgroundImageLoaded&&setTimeout(e.onBackgroundImageLoaded),!e.loadComplete&&x()}):(e.skysphere.visible=!1,e.skysphere.material.map=null,!e.loadComplete&&x())),t.hasOwnProperty("showNavInfo")&&(e.navInfo.style.display=e.showNavInfo?null:"none"),t.hasOwnProperty("lights")&&((t.lights||[]).forEach(function(S){return e.scene.remove(S)}),e.lights.forEach(function(S){return e.scene.add(S)})),t.hasOwnProperty("objects")&&((t.objects||[]).forEach(function(S){return e.scene.remove(S)}),e.objects.forEach(function(S){return e.scene.add(S)}));function x(){e.loadComplete=e.scene.visible=!0}}});function rde(i,e){e===void 0&&(e={});var t=e.insertAt;if(!(typeof document>"u")){var n=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t==="top"&&n.firstChild?n.insertBefore(r,n.firstChild):n.appendChild(r),r.styleSheet?r.styleSheet.cssText=i:r.appendChild(document.createTextNode(i))}}var sde=`.scene-container .clickable { cursor: pointer; }`;rde(sde);function gw(i,e){(e==null||e>i.length)&&(e=i.length);for(var t=0,n=Array(e);t1?l-1:0),h=1;h1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,r=a();if(t.lat===void 0&&t.lng===void 0&&t.altitude===void 0)return r;var s=Object.assign({},r,t);if(["lat","lng","altitude"].forEach(function(u){return s[u]=+s[u]}),!n)l(s);else{for(;r.lng-s.lng>180;)r.lng-=360;for(;r.lng-s.lng<-180;)r.lng+=360;e.tweenGroup.add(new ca(r).to(s,n).easing(os.Cubic.InOut).onUpdate(l).start())}return this;function a(){return e.globe.toGeoCoords(e.renderObjs.cameraPosition())}function l(u){var h=u.lat,g=u.lng,v=u.altitude;e.renderObjs.cameraPosition(e.globe.getCoords(h,g,v)),e.globe.setPointOfView(e.renderObjs.camera())}},getScreenCoords:function(e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),s=1;slocalStorage.getItem("radio-theme")||"default"),[a,l]=Oe.useState([]),[u,h]=Oe.useState(null),[g,v]=Oe.useState([]),[x,S]=Oe.useState(!1),[w,R]=Oe.useState({}),[C,E]=Oe.useState([]),[B,L]=Oe.useState(""),[O,z]=Oe.useState(""),[G,k]=Oe.useState(""),[H,F]=Oe.useState([]),[V,Y]=Oe.useState(!1),[J,te]=Oe.useState([]),[se,ne]=Oe.useState(!1),[Z,oe]=Oe.useState(!1),[fe,be]=Oe.useState(.5),[Se,le]=Oe.useState(null),[we,He]=Oe.useState(!1),[Te,ke]=Oe.useState(!1),_e=Oe.useRef(void 0),De=Oe.useRef(void 0),gt=Oe.useRef(B);Oe.useEffect(()=>{fetch("/api/radio/places").then(X=>X.json()).then(l).catch(console.error),fetch("/api/radio/guilds").then(X=>X.json()).then(X=>{if(E(X),X.length>0){L(X[0].id);const Ee=X[0].voiceChannels.find(je=>je.members>0)??X[0].voiceChannels[0];Ee&&z(Ee.id)}}).catch(console.error),fetch("/api/radio/favorites").then(X=>X.json()).then(te).catch(console.error)},[]),Oe.useEffect(()=>{gt.current=B},[B]),Oe.useEffect(()=>{i!=null&&i.guildId&&"playing"in i&&i.type!=="radio_voicestats"?R(X=>{if(i.playing)return{...X,[i.guildId]:i.playing};const Ee={...X};return delete Ee[i.guildId],Ee}):i!=null&&i.playing&&!(i!=null&&i.guildId)&&R(i.playing),i!=null&&i.favorites&&te(i.favorites),i!=null&&i.volumes&&B&&i.volumes[B]!=null&&be(i.volumes[B]),(i==null?void 0:i.volume)!=null&&(i==null?void 0:i.guildId)===B&&be(i.volume),(i==null?void 0:i.type)==="radio_voicestats"&&i.guildId===gt.current&&le({voicePing:i.voicePing,gatewayPing:i.gatewayPing,status:i.status,channelName:i.channelName,connectedSince:i.connectedSince})},[i,B]),Oe.useEffect(()=>{if(localStorage.setItem("radio-theme",r),t.current&&e.current){const Ee=getComputedStyle(e.current.parentElement).getPropertyValue("--accent-rgb").trim();t.current.pointColor(()=>`rgba(${Ee}, 0.85)`).atmosphereColor(`rgba(${Ee}, 0.25)`)}},[r]);const xt=Oe.useRef(u);xt.current=u;const Mt=Oe.useRef(se);Mt.current=se;const It=Oe.useCallback(()=>{var Ee;const X=(Ee=t.current)==null?void 0:Ee.controls();X&&(X.autoRotate=!1),n.current&&clearTimeout(n.current),n.current=setTimeout(()=>{var st;if(xt.current||Mt.current)return;const je=(st=t.current)==null?void 0:st.controls();je&&(je.autoRotate=!0)},5e3)},[]);Oe.useEffect(()=>{var Ee;const X=(Ee=t.current)==null?void 0:Ee.controls();X&&(u||se?(X.autoRotate=!1,n.current&&clearTimeout(n.current)):X.autoRotate=!0)},[u,se]);const Ke=Oe.useRef(void 0);Ke.current=X=>{h(X),ne(!1),S(!0),v([]),It(),t.current&&t.current.pointOfView({lat:X.geo[1],lng:X.geo[0],altitude:.4},800),fetch(`/api/radio/place/${X.id}/channels`).then(Ee=>Ee.json()).then(Ee=>{v(Ee),S(!1)}).catch(()=>S(!1))},Oe.useEffect(()=>{const X=e.current;if(!X)return;X.clientWidth>0&&X.clientHeight>0&&ke(!0);const Ee=new ResizeObserver(je=>{for(const st of je){const{width:it,height:Ht}=st.contentRect;it>0&&Ht>0&&ke(!0)}});return Ee.observe(X),()=>Ee.disconnect()},[]),Oe.useEffect(()=>{if(!e.current||a.length===0)return;const X=e.current.clientWidth,Ee=e.current.clientHeight;if(t.current){t.current.pointsData(a),X>0&&Ee>0&&t.current.width(X).height(Ee);return}if(X===0||Ee===0)return;const st=getComputedStyle(e.current.parentElement).getPropertyValue("--accent-rgb").trim()||"230, 126, 34",it=new _de(e.current).backgroundColor("rgba(0,0,0,0)").atmosphereColor(`rgba(${st}, 0.25)`).atmosphereAltitude(.12).globeImageUrl("/nasa-blue-marble.jpg").pointsData(a).pointLat(jt=>jt.geo[1]).pointLng(jt=>jt.geo[0]).pointColor(()=>`rgba(${st}, 0.85)`).pointRadius(jt=>Math.max(.12,Math.min(.45,.06+(jt.size??1)*.005))).pointAltitude(.001).pointResolution(24).pointLabel(jt=>`
${jt.title}
${jt.country}
`).onPointClick(jt=>{var kt;return(kt=Ke.current)==null?void 0:kt.call(Ke,jt)}).width(e.current.clientWidth).height(e.current.clientHeight);it.renderer().setPixelRatio(window.devicePixelRatio),it.pointOfView({lat:48,lng:10,altitude:GS});const Ht=it.controls();Ht&&(Ht.autoRotate=!0,Ht.autoRotateSpeed=.3);let Ut=GS;const $t=()=>{const kt=it.pointOfView().altitude;if(Math.abs(kt-Ut)/Ut<.05)return;Ut=kt;const qt=Math.sqrt(kt/GS);it.pointRadius(In=>Math.max(.12,Math.min(.45,.06+(In.size??1)*.005))*Math.max(.15,Math.min(2.5,qt)))};Ht.addEventListener("change",$t),t.current=it;const ln=e.current,wt=()=>It();ln.addEventListener("mousedown",wt),ln.addEventListener("touchstart",wt),ln.addEventListener("wheel",wt);const Zt=()=>{if(e.current&&t.current){const jt=e.current.clientWidth,kt=e.current.clientHeight;jt>0&&kt>0&&t.current.width(jt).height(kt)}};window.addEventListener("resize",Zt);const rn=new ResizeObserver(()=>Zt());return rn.observe(ln),()=>{Ht.removeEventListener("change",$t),ln.removeEventListener("mousedown",wt),ln.removeEventListener("touchstart",wt),ln.removeEventListener("wheel",wt),window.removeEventListener("resize",Zt),rn.disconnect()}},[a,It,Te]);const ot=Oe.useCallback(async(X,Ee,je,st)=>{if(!(!B||!O)){oe(!0);try{(await(await fetch("/api/radio/play",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:B,voiceChannelId:O,stationId:X,stationName:Ee,placeName:je??(u==null?void 0:u.title)??"",country:st??(u==null?void 0:u.country)??""})})).json()).ok&&(R(Ut=>{var $t,ln;return{...Ut,[B]:{stationId:X,stationName:Ee,placeName:je??(u==null?void 0:u.title)??"",country:st??(u==null?void 0:u.country)??"",startedAt:new Date().toISOString(),channelName:((ln=($t=C.find(wt=>wt.id===B))==null?void 0:$t.voiceChannels.find(wt=>wt.id===O))==null?void 0:ln.name)??""}}}),It())}catch(it){console.error(it)}oe(!1)}},[B,O,u,C]),ce=Oe.useCallback(async()=>{B&&(await fetch("/api/radio/stop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:B})}),R(X=>{const Ee={...X};return delete Ee[B],Ee}))},[B]),Ie=Oe.useCallback(X=>{if(k(X),_e.current&&clearTimeout(_e.current),!X.trim()){F([]),Y(!1);return}_e.current=setTimeout(async()=>{try{const je=await(await fetch(`/api/radio/search?q=${encodeURIComponent(X)}`)).json();F(je),Y(!0)}catch{F([])}},350)},[]),We=Oe.useCallback(X=>{var Ee,je,st;if(Y(!1),k(""),F([]),X.type==="channel"){const it=(Ee=X.url.match(/\/listen\/[^/]+\/([^/]+)/))==null?void 0:Ee[1];it&&ot(it,X.title,X.subtitle,"")}else if(X.type==="place"){const it=(je=X.url.match(/\/visit\/[^/]+\/([^/]+)/))==null?void 0:je[1],Ht=a.find(Ut=>Ut.id===it);Ht&&((st=Ke.current)==null||st.call(Ke,Ht))}},[a,ot]),tt=Oe.useCallback(async(X,Ee)=>{try{const st=await(await fetch("/api/radio/favorites",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stationId:X,stationName:Ee,placeName:(u==null?void 0:u.title)??"",country:(u==null?void 0:u.country)??"",placeId:(u==null?void 0:u.id)??""})})).json();st.favorites&&te(st.favorites)}catch{}},[u]),nt=Oe.useCallback(X=>{be(X),B&&(De.current&&clearTimeout(De.current),De.current=setTimeout(()=>{fetch("/api/radio/volume",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:B,volume:X})}).catch(console.error)},100))},[B]),Ft=X=>J.some(Ee=>Ee.stationId===X),dt=B?w[B]:null,he=C.find(X=>X.id===B);return W.jsxs("div",{className:"radio-container","data-theme":r,children:[W.jsxs("header",{className:"radio-topbar",children:[W.jsxs("div",{className:"radio-topbar-left",children:[W.jsx("span",{className:"radio-topbar-logo",children:"๐ŸŒ"}),W.jsx("span",{className:"radio-topbar-title",children:"World Radio"}),C.length>1&&W.jsx("select",{className:"radio-sel",value:B,onChange:X=>{L(X.target.value);const Ee=C.find(st=>st.id===X.target.value),je=(Ee==null?void 0:Ee.voiceChannels.find(st=>st.members>0))??(Ee==null?void 0:Ee.voiceChannels[0]);z((je==null?void 0:je.id)??"")},children:C.map(X=>W.jsx("option",{value:X.id,children:X.name},X.id))}),W.jsxs("select",{className:"radio-sel",value:O,onChange:X=>z(X.target.value),children:[W.jsx("option",{value:"",children:"Voice Channel..."}),he==null?void 0:he.voiceChannels.map(X=>W.jsxs("option",{value:X.id,children:["๐Ÿ”Š"," ",X.name,X.members>0?` (${X.members})`:""]},X.id))]})]}),dt&&W.jsxs("div",{className:"radio-topbar-np",children:[W.jsxs("div",{className:"radio-eq radio-eq-np",children:[W.jsx("span",{}),W.jsx("span",{}),W.jsx("span",{})]}),W.jsxs("div",{className:"radio-np-info",children:[W.jsx("span",{className:"radio-np-name",children:dt.stationName}),W.jsxs("span",{className:"radio-np-loc",children:[dt.placeName,dt.country?`, ${dt.country}`:""]})]})]}),W.jsxs("div",{className:"radio-topbar-right",children:[dt&&W.jsxs(W.Fragment,{children:[W.jsxs("div",{className:"radio-volume",children:[W.jsx("span",{className:"radio-volume-icon",children:fe===0?"๐Ÿ”‡":fe<.4?"๐Ÿ”‰":"๐Ÿ”Š"}),W.jsx("input",{type:"range",className:"radio-volume-slider",min:0,max:1,step:.01,value:fe,onChange:X=>nt(Number(X.target.value))}),W.jsxs("span",{className:"radio-volume-val",children:[Math.round(fe*100),"%"]})]}),W.jsxs("div",{className:"radio-conn",onClick:()=>He(!0),title:"Verbindungsdetails",children:[W.jsx("span",{className:"radio-conn-dot"}),"Verbunden",(Se==null?void 0:Se.voicePing)!=null&&W.jsxs("span",{className:"radio-conn-ping",children:[Se.voicePing,"ms"]})]}),W.jsxs("button",{className:"radio-topbar-stop",onClick:ce,children:["โน"," Stop"]})]}),W.jsx("div",{className:"radio-theme-inline",children:yde.map(X=>W.jsx("div",{className:`radio-theme-dot ${r===X.id?"active":""}`,style:{background:X.color},title:X.label,onClick:()=>s(X.id)},X.id))})]})]}),W.jsxs("div",{className:"radio-globe-wrap",children:[W.jsx("div",{className:"radio-globe",ref:e}),W.jsxs("div",{className:"radio-search",children:[W.jsxs("div",{className:"radio-search-wrap",children:[W.jsx("span",{className:"radio-search-icon",children:"๐Ÿ”"}),W.jsx("input",{className:"radio-search-input",type:"text",placeholder:"Sender oder Stadt suchen...",value:G,onChange:X=>Ie(X.target.value),onFocus:()=>{H.length&&Y(!0)}}),G&&W.jsx("button",{className:"radio-search-clear",onClick:()=>{k(""),F([]),Y(!1)},children:"โœ•"})]}),V&&H.length>0&&W.jsx("div",{className:"radio-search-results",children:H.slice(0,12).map(X=>W.jsxs("button",{className:"radio-search-result",onClick:()=>We(X),children:[W.jsx("span",{className:"radio-search-result-icon",children:X.type==="channel"?"๐Ÿ“ป":X.type==="place"?"๐Ÿ“":"๐ŸŒ"}),W.jsxs("div",{className:"radio-search-result-text",children:[W.jsx("span",{className:"radio-search-result-title",children:X.title}),W.jsx("span",{className:"radio-search-result-sub",children:X.subtitle})]})]},X.id+X.url))})]}),!u&&!se&&W.jsxs("button",{className:"radio-fab",onClick:()=>{ne(!0),h(null)},title:"Favoriten",children:["โญ",J.length>0&&W.jsx("span",{className:"radio-fab-badge",children:J.length})]}),se&&W.jsxs("div",{className:"radio-panel open",children:[W.jsxs("div",{className:"radio-panel-header",children:[W.jsxs("h3",{children:["โญ"," Favoriten"]}),W.jsx("button",{className:"radio-panel-close",onClick:()=>ne(!1),children:"โœ•"})]}),W.jsx("div",{className:"radio-panel-body",children:J.length===0?W.jsx("div",{className:"radio-panel-empty",children:"Noch keine Favoriten"}):J.map(X=>W.jsxs("div",{className:`radio-station ${(dt==null?void 0:dt.stationId)===X.stationId?"playing":""}`,children:[W.jsxs("div",{className:"radio-station-info",children:[W.jsx("span",{className:"radio-station-name",children:X.stationName}),W.jsxs("span",{className:"radio-station-loc",children:[X.placeName,", ",X.country]})]}),W.jsxs("div",{className:"radio-station-btns",children:[W.jsx("button",{className:"radio-btn-play",onClick:()=>ot(X.stationId,X.stationName,X.placeName,X.country),disabled:!O||Z,children:"โ–ถ"}),W.jsx("button",{className:"radio-btn-fav active",onClick:()=>tt(X.stationId,X.stationName),children:"โ˜…"})]})]},X.stationId))})]}),u&&!se&&W.jsxs("div",{className:"radio-panel open",children:[W.jsxs("div",{className:"radio-panel-header",children:[W.jsxs("div",{children:[W.jsx("h3",{children:u.title}),W.jsx("span",{className:"radio-panel-sub",children:u.country})]}),W.jsx("button",{className:"radio-panel-close",onClick:()=>h(null),children:"โœ•"})]}),W.jsx("div",{className:"radio-panel-body",children:x?W.jsxs("div",{className:"radio-panel-loading",children:[W.jsx("div",{className:"radio-spinner"}),"Sender werden geladen..."]}):g.length===0?W.jsx("div",{className:"radio-panel-empty",children:"Keine Sender gefunden"}):g.map(X=>W.jsxs("div",{className:`radio-station ${(dt==null?void 0:dt.stationId)===X.id?"playing":""}`,children:[W.jsxs("div",{className:"radio-station-info",children:[W.jsx("span",{className:"radio-station-name",children:X.title}),(dt==null?void 0:dt.stationId)===X.id&&W.jsxs("span",{className:"radio-station-live",children:[W.jsxs("span",{className:"radio-eq",children:[W.jsx("span",{}),W.jsx("span",{}),W.jsx("span",{})]}),"Live"]})]}),W.jsxs("div",{className:"radio-station-btns",children:[(dt==null?void 0:dt.stationId)===X.id?W.jsx("button",{className:"radio-btn-stop",onClick:ce,children:"โน"}):W.jsx("button",{className:"radio-btn-play",onClick:()=>ot(X.id,X.title),disabled:!O||Z,children:"โ–ถ"}),W.jsx("button",{className:`radio-btn-fav ${Ft(X.id)?"active":""}`,onClick:()=>tt(X.id,X.title),children:Ft(X.id)?"โ˜…":"โ˜†"})]})]},X.id))})]}),W.jsxs("div",{className:"radio-counter",children:["๐Ÿ“ป"," ",a.length.toLocaleString("de-DE")," Sender weltweit"]}),W.jsx("a",{className:"radio-attribution",href:"https://science.nasa.gov/earth/earth-observatory/blue-marble-next-generation/",target:"_blank",rel:"noreferrer",children:"Imagery ยฉ NASA Blue Marble"})]}),we&&(()=>{const X=Se!=null&&Se.connectedSince?Math.floor((Date.now()-new Date(Se.connectedSince).getTime())/1e3):0,Ee=Math.floor(X/3600),je=Math.floor(X%3600/60),st=X%60,it=Ee>0?`${Ee}h ${String(je).padStart(2,"0")}m ${String(st).padStart(2,"0")}s`:je>0?`${je}m ${String(st).padStart(2,"0")}s`:`${st}s`,Ht=Ut=>Ut==null?"var(--text-faint)":Ut<80?"var(--success)":Ut<150?"#f0a830":"#e04040";return W.jsx("div",{className:"radio-modal-overlay",onClick:()=>He(!1),children:W.jsxs("div",{className:"radio-modal",onClick:Ut=>Ut.stopPropagation(),children:[W.jsxs("div",{className:"radio-modal-header",children:[W.jsx("span",{children:"๐Ÿ“ก"}),W.jsx("span",{children:"Verbindungsdetails"}),W.jsx("button",{className:"radio-modal-close",onClick:()=>He(!1),children:"โœ•"})]}),W.jsxs("div",{className:"radio-modal-body",children:[W.jsxs("div",{className:"radio-modal-stat",children:[W.jsx("span",{className:"radio-modal-label",children:"Voice Ping"}),W.jsxs("span",{className:"radio-modal-value",children:[W.jsx("span",{className:"radio-modal-dot",style:{background:Ht((Se==null?void 0:Se.voicePing)??null)}}),(Se==null?void 0:Se.voicePing)!=null?`${Se.voicePing} ms`:"---"]})]}),W.jsxs("div",{className:"radio-modal-stat",children:[W.jsx("span",{className:"radio-modal-label",children:"Gateway Ping"}),W.jsxs("span",{className:"radio-modal-value",children:[W.jsx("span",{className:"radio-modal-dot",style:{background:Ht((Se==null?void 0:Se.gatewayPing)??null)}}),Se&&Se.gatewayPing>=0?`${Se.gatewayPing} ms`:"---"]})]}),W.jsxs("div",{className:"radio-modal-stat",children:[W.jsx("span",{className:"radio-modal-label",children:"Status"}),W.jsx("span",{className:"radio-modal-value",style:{color:(Se==null?void 0:Se.status)==="ready"?"var(--success)":"#f0a830"},children:(Se==null?void 0:Se.status)==="ready"?"Verbunden":(Se==null?void 0:Se.status)??"Warte auf Verbindung"})]}),W.jsxs("div",{className:"radio-modal-stat",children:[W.jsx("span",{className:"radio-modal-label",children:"Kanal"}),W.jsx("span",{className:"radio-modal-value",children:(Se==null?void 0:Se.channelName)||"---"})]}),W.jsxs("div",{className:"radio-modal-stat",children:[W.jsx("span",{className:"radio-modal-label",children:"Verbunden seit"}),W.jsx("span",{className:"radio-modal-value",children:it||"---"})]})]})]})})})()]})}function bde(i,e,t=365){const n=new Date(Date.now()+t*24*60*60*1e3).toUTCString();document.cookie=`${encodeURIComponent(i)}=${encodeURIComponent(e)}; expires=${n}; path=/; SameSite=Lax`}function Sde(i){const e=`${encodeURIComponent(i)}=`,t=document.cookie.split(";");for(const n of t){const r=n.trim();if(r.startsWith(e))return decodeURIComponent(r.slice(e.length))}return null}const us="/api/soundboard";async function A7(i,e,t,n){const r=new URL(`${us}/sounds`,window.location.origin);i&&r.searchParams.set("q",i),e!==void 0&&r.searchParams.set("folder",e),r.searchParams.set("fuzzy","0");const s=await fetch(r.toString());if(!s.ok)throw new Error("Fehler beim Laden der Sounds");return s.json()}async function Tde(){const i=await fetch(`${us}/analytics`);if(!i.ok)throw new Error("Fehler beim Laden der Analytics");return i.json()}async function wde(){const i=await fetch(`${us}/categories`,{credentials:"include"});if(!i.ok)throw new Error("Fehler beim Laden der Kategorien");return i.json()}async function Mde(){const i=await fetch(`${us}/channels`);if(!i.ok)throw new Error("Fehler beim Laden der Channels");return i.json()}async function Ede(){const i=await fetch(`${us}/selected-channels`);if(!i.ok)throw new Error("Fehler beim Laden der Channel-Auswahl");const e=await i.json();return(e==null?void 0:e.selected)||{}}async function Cde(i,e){if(!(await fetch(`${us}/selected-channel`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:i,channelId:e})})).ok)throw new Error("Channel-Auswahl setzen fehlgeschlagen")}async function Rde(i,e,t,n,r){const s=await fetch(`${us}/play`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({soundName:i,guildId:e,channelId:t,volume:n,relativePath:r})});if(!s.ok){const a=await s.json().catch(()=>({}));throw new Error((a==null?void 0:a.error)||"Play fehlgeschlagen")}}async function Nde(i,e,t,n,r){const s=await fetch(`${us}/play-url`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:i,guildId:e,channelId:t,volume:n,filename:r})}),a=await s.json().catch(()=>({}));if(!s.ok)throw new Error((a==null?void 0:a.error)||"Play-URL fehlgeschlagen");return a}async function Dde(i,e){const t=await fetch(`${us}/download-url`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:i,filename:e})}),n=await t.json().catch(()=>({}));if(!t.ok)throw new Error((n==null?void 0:n.error)||"Download fehlgeschlagen");return n}async function Pde(i,e){if(!(await fetch(`${us}/party/start`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:i,channelId:e})})).ok)throw new Error("Partymode Start fehlgeschlagen")}async function Lde(i){if(!(await fetch(`${us}/party/stop`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:i})})).ok)throw new Error("Partymode Stop fehlgeschlagen")}async function d7(i,e){const t=await fetch(`${us}/volume`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:i,volume:e})});if(!t.ok){const n=await t.json().catch(()=>({}));throw new Error((n==null?void 0:n.error)||"Volume aendern fehlgeschlagen")}}async function Ude(i){const e=new URL(`${us}/volume`,window.location.origin);e.searchParams.set("guildId",i);const t=await fetch(e.toString());if(!t.ok)throw new Error("Fehler beim Laden der Lautstaerke");const n=await t.json();return typeof(n==null?void 0:n.volume)=="number"?n.volume:1}async function Bde(){const i=await fetch(`${us}/admin/status`,{credentials:"include"});if(!i.ok)return!1;const e=await i.json();return!!(e!=null&&e.authenticated)}async function Ode(i){return(await fetch(`${us}/admin/login`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({password:i})})).ok}async function Ide(){await fetch(`${us}/admin/logout`,{method:"POST",credentials:"include"})}async function Fde(i){if(!(await fetch(`${us}/admin/sounds/delete`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({paths:i})})).ok)throw new Error("Loeschen fehlgeschlagen")}async function kde(i,e){const t=await fetch(`${us}/admin/sounds/rename`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({from:i,to:e})});if(!t.ok)throw new Error("Umbenennen fehlgeschlagen");const n=await t.json();return n==null?void 0:n.to}function zde(i,e){return new Promise((t,n)=>{const r=new FormData;r.append("files",i);const s=new XMLHttpRequest;s.open("POST",`${us}/upload`),s.upload.onprogress=a=>{a.lengthComputable&&e(Math.round(a.loaded/a.total*100))},s.onload=()=>{var a,l;if(s.status===200)try{const u=JSON.parse(s.responseText);t(((l=(a=u.files)==null?void 0:a[0])==null?void 0:l.name)??i.name)}catch{t(i.name)}else try{n(new Error(JSON.parse(s.responseText).error))}catch{n(new Error(`HTTP ${s.status}`))}},s.onerror=()=>n(new Error("Netzwerkfehler")),s.send(r)})}const Gde=[{id:"default",color:"#5865f2",label:"Discord"},{id:"purple",color:"#9b59b6",label:"Midnight"},{id:"forest",color:"#2ecc71",label:"Forest"},{id:"sunset",color:"#e67e22",label:"Sunset"},{id:"ocean",color:"#3498db",label:"Ocean"}],p7=["#3b82f6","#f59e0b","#8b5cf6","#ec4899","#14b8a6","#f97316","#06b6d4","#ef4444","#a855f7","#84cc16","#d946ef","#0ea5e9","#f43f5e","#10b981"];function qde({data:i}){const[e,t]=Oe.useState([]),[n,r]=Oe.useState(0),[s,a]=Oe.useState([]),[l,u]=Oe.useState([]),[h,g]=Oe.useState({totalSounds:0,totalPlays:0,mostPlayed:[]}),[v,x]=Oe.useState("all"),[S,w]=Oe.useState(""),[R,C]=Oe.useState(""),[E,B]=Oe.useState(""),[L,O]=Oe.useState(!1),[z,G]=Oe.useState(null),[k,H]=Oe.useState([]),[F,V]=Oe.useState(""),Y=Oe.useRef(""),[J,te]=Oe.useState(!1),[se,ne]=Oe.useState(1),[Z,oe]=Oe.useState(""),[fe,be]=Oe.useState({}),[Se,le]=Oe.useState(()=>localStorage.getItem("jb-theme")||"default"),[we,He]=Oe.useState(()=>parseInt(localStorage.getItem("jb-card-size")||"110")),[Te,ke]=Oe.useState(!1),[_e,De]=Oe.useState([]),gt=Oe.useRef(!1),xt=Oe.useRef(void 0),[Mt,It]=Oe.useState(!1),[Ke,ot]=Oe.useState(!1),[ce,Ie]=Oe.useState(""),[We,tt]=Oe.useState([]),[nt,Ft]=Oe.useState(!1),[dt,he]=Oe.useState(""),[X,Ee]=Oe.useState({}),[je,st]=Oe.useState(""),[it,Ht]=Oe.useState(""),[Ut,$t]=Oe.useState(!1),[ln,wt]=Oe.useState([]),[Zt,rn]=Oe.useState(!1),jt=Oe.useRef(0),kt=Oe.useRef(void 0),[qt,In]=Oe.useState(null),[Mi,me]=Oe.useState(!1),[Wt,at]=Oe.useState(null),[bt,Xt]=Oe.useState(""),[zt,xn]=Oe.useState(null),[qi,rr]=Oe.useState(0);Oe.useEffect(()=>{gt.current=Te},[Te]),Oe.useEffect(()=>{Y.current=F},[F]),Oe.useEffect(()=>{const ve=cn=>{var Yn;Array.from(((Yn=cn.dataTransfer)==null?void 0:Yn.items)??[]).some(yi=>yi.kind==="file")&&(jt.current++,$t(!0))},ct=()=>{jt.current=Math.max(0,jt.current-1),jt.current===0&&$t(!1)},Rt=cn=>cn.preventDefault(),Jt=cn=>{var yi;cn.preventDefault(),jt.current=0,$t(!1);const Yn=Array.from(((yi=cn.dataTransfer)==null?void 0:yi.files)??[]).filter(js=>/\.(mp3|wav)$/i.test(js.name));Yn.length&&Hs(Yn)};return window.addEventListener("dragenter",ve),window.addEventListener("dragleave",ct),window.addEventListener("dragover",Rt),window.addEventListener("drop",Jt),()=>{window.removeEventListener("dragenter",ve),window.removeEventListener("dragleave",ct),window.removeEventListener("dragover",Rt),window.removeEventListener("drop",Jt)}},[Mt]);const pn=Oe.useCallback((ve,ct="info")=>{at({msg:ve,type:ct}),setTimeout(()=>at(null),3e3)},[]),$i=Oe.useCallback(ve=>ve.relativePath??ve.fileName,[]),Jr=["youtube.com","www.youtube.com","m.youtube.com","youtu.be","music.youtube.com","instagram.com","www.instagram.com"],Ze=Oe.useCallback(ve=>{const ct=ve.trim();return!ct||/^https?:\/\//i.test(ct)?ct:"https://"+ct},[]),vt=Oe.useCallback(ve=>{try{const ct=new URL(Ze(ve)),Rt=ct.hostname.toLowerCase();return!!(ct.pathname.toLowerCase().endsWith(".mp3")||Jr.some(Jt=>Rt===Jt||Rt.endsWith("."+Jt)))}catch{return!1}},[Ze]),Ot=Oe.useCallback(ve=>{try{const ct=new URL(Ze(ve)),Rt=ct.hostname.toLowerCase();return Rt.includes("youtube")||Rt==="youtu.be"?"youtube":Rt.includes("instagram")?"instagram":ct.pathname.toLowerCase().endsWith(".mp3")?"mp3":null}catch{return null}},[Ze]),ut=F?F.split(":")[0]:"",d=F?F.split(":")[1]:"",ee=Oe.useMemo(()=>k.find(ve=>`${ve.guildId}:${ve.channelId}`===F),[k,F]);Oe.useEffect(()=>{const ve=()=>{const Rt=new Date,Jt=String(Rt.getHours()).padStart(2,"0"),cn=String(Rt.getMinutes()).padStart(2,"0"),Yn=String(Rt.getSeconds()).padStart(2,"0");Xt(`${Jt}:${cn}:${Yn}`)};ve();const ct=setInterval(ve,1e3);return()=>clearInterval(ct)},[]),Oe.useEffect(()=>{(async()=>{try{const[ve,ct]=await Promise.all([Mde(),Ede()]);if(H(ve),ve.length){const Rt=ve[0].guildId,Jt=ct[Rt],cn=Jt&&ve.find(Yn=>Yn.guildId===Rt&&Yn.channelId===Jt);V(cn?`${Rt}:${Jt}`:`${ve[0].guildId}:${ve[0].channelId}`)}}catch(ve){pn((ve==null?void 0:ve.message)||"Channel-Fehler","error")}try{It(await Bde())}catch{}try{const ve=await wde();u(ve.categories||[])}catch{}})()},[]),Oe.useEffect(()=>{localStorage.setItem("jb-theme",Se)},[Se]);const $n=Oe.useRef(null);Oe.useEffect(()=>{const ve=$n.current;if(!ve)return;ve.style.setProperty("--card-size",we+"px");const ct=we/110;ve.style.setProperty("--card-emoji",Math.round(28*ct)+"px"),ve.style.setProperty("--card-font",Math.max(9,Math.round(11*ct))+"px"),localStorage.setItem("jb-card-size",String(we))},[we]),Oe.useEffect(()=>{var ve,ct,Rt,Jt,cn,Yn,yi,js;if(i){if(i.soundboard){const pi=i.soundboard;Array.isArray(pi.party)&&De(pi.party);try{const Pr=pi.selected||{},Ei=(ve=Y.current)==null?void 0:ve.split(":")[0];Ei&&Pr[Ei]&&V(`${Ei}:${Pr[Ei]}`)}catch{}try{const Pr=pi.volumes||{},Ei=(ct=Y.current)==null?void 0:ct.split(":")[0];Ei&&typeof Pr[Ei]=="number"&&ne(Pr[Ei])}catch{}try{const Pr=pi.nowplaying||{},Ei=(Rt=Y.current)==null?void 0:Rt.split(":")[0];Ei&&typeof Pr[Ei]=="string"&&oe(Pr[Ei])}catch{}try{const Pr=pi.voicestats||{},Ei=(Jt=Y.current)==null?void 0:Jt.split(":")[0];Ei&&Pr[Ei]&&In(Pr[Ei])}catch{}}if(i.type==="soundboard_party")De(pi=>{const Pr=new Set(pi);return i.active?Pr.add(i.guildId):Pr.delete(i.guildId),Array.from(Pr)});else if(i.type==="soundboard_channel"){const pi=(cn=Y.current)==null?void 0:cn.split(":")[0];i.guildId===pi&&V(`${i.guildId}:${i.channelId}`)}else if(i.type==="soundboard_volume"){const pi=(Yn=Y.current)==null?void 0:Yn.split(":")[0];i.guildId===pi&&typeof i.volume=="number"&&ne(i.volume)}else if(i.type==="soundboard_nowplaying"){const pi=(yi=Y.current)==null?void 0:yi.split(":")[0];i.guildId===pi&&oe(i.name||"")}else if(i.type==="soundboard_voicestats"){const pi=(js=Y.current)==null?void 0:js.split(":")[0];i.guildId===pi&&In({voicePing:i.voicePing,gatewayPing:i.gatewayPing,status:i.status,channelName:i.channelName,connectedSince:i.connectedSince})}}},[i]),Oe.useEffect(()=>{ke(ut?_e.includes(ut):!1)},[F,_e,ut]),Oe.useEffect(()=>{(async()=>{try{let ve="__all__";v==="recent"?ve="__recent__":S&&(ve=S);const ct=await A7(R,ve,void 0,!1);t(ct.items),r(ct.total),a(ct.folders)}catch(ve){pn((ve==null?void 0:ve.message)||"Sounds-Fehler","error")}})()},[v,S,R,qi,pn]),Oe.useEffect(()=>{Gn()},[qi]),Oe.useEffect(()=>{const ve=Sde("favs");if(ve)try{be(JSON.parse(ve))}catch{}},[]),Oe.useEffect(()=>{try{bde("favs",JSON.stringify(fe))}catch{}},[fe]),Oe.useEffect(()=>{F&&(async()=>{try{const ve=await Ude(ut);ne(ve)}catch{}})()},[F]),Oe.useEffect(()=>{const ve=()=>{te(!1),xn(null)};return document.addEventListener("click",ve),()=>document.removeEventListener("click",ve)},[]),Oe.useEffect(()=>{Ke&&Mt&&ae()},[Ke,Mt]);async function Gn(){try{const ve=await Tde();g(ve)}catch{}}async function Xn(ve){if(!F)return pn("Bitte einen Voice-Channel auswaehlen","error");try{await Rde(ve.name,ut,d,se,ve.relativePath),oe(ve.name),Gn()}catch(ct){pn((ct==null?void 0:ct.message)||"Play fehlgeschlagen","error")}}function un(){var Jt;const ve=Ze(E);if(!ve)return pn("Bitte einen Link eingeben","error");if(!vt(ve))return pn("Nur YouTube, Instagram oder direkte MP3-Links","error");const ct=Ot(ve);let Rt="";if(ct==="mp3")try{Rt=((Jt=new URL(ve).pathname.split("/").pop())==null?void 0:Jt.replace(/\.mp3$/i,""))??""}catch{}G({url:ve,type:ct,filename:Rt,phase:"input"})}async function qn(){if(z){G(ve=>ve?{...ve,phase:"downloading"}:null);try{let ve;const ct=z.filename.trim()||void 0;F&&ut&&d?ve=(await Nde(z.url,ut,d,se,ct)).saved:ve=(await Dde(z.url,ct)).saved,G(Rt=>Rt?{...Rt,phase:"done",savedName:ve}:null),B(""),rr(Rt=>Rt+1),Gn(),setTimeout(()=>G(null),2500)}catch(ve){G(ct=>ct?{...ct,phase:"error",error:(ve==null?void 0:ve.message)||"Fehler"}:null)}}}async function Hs(ve){if(!Mt){pn("Admin-Login erforderlich zum Hochladen","error");return}kt.current&&clearTimeout(kt.current);const ct=ve.map(Jt=>({id:Math.random().toString(36).slice(2),file:Jt,status:"waiting",progress:0}));wt(ct),rn(!0);const Rt=[...ct];for(let Jt=0;Jt{Rt[Jt]={...Rt[Jt],progress:Yn},wt([...Rt])});Rt[Jt]={...Rt[Jt],status:"done",progress:100,savedName:cn}}catch(cn){Rt[Jt]={...Rt[Jt],status:"error",error:(cn==null?void 0:cn.message)??"Fehler"}}wt([...Rt])}rr(Jt=>Jt+1),Gn(),kt.current=setTimeout(()=>{rn(!1),wt([])},3500)}async function li(){if(F){oe("");try{await fetch(`${us}/stop?guildId=${encodeURIComponent(ut)}`,{method:"POST"})}catch{}}}async function Fn(){if(!K.length||!F)return;const ve=K[Math.floor(Math.random()*K.length)];Xn(ve)}async function cs(){if(Te){await li();try{await Lde(ut)}catch{}}else{if(!F)return pn("Bitte einen Channel auswaehlen","error");try{await Pde(ut,d)}catch{}}}async function Ma(ve){const ct=`${ve.guildId}:${ve.channelId}`;V(ct),te(!1);try{await Cde(ve.guildId,ve.channelId)}catch{}}function Ul(ve){be(ct=>({...ct,[ve]:!ct[ve]}))}async function ae(){Ft(!0);try{const ve=await A7("","__all__",void 0,!1);tt(ve.items||[])}catch(ve){pn((ve==null?void 0:ve.message)||"Admin-Sounds konnten nicht geladen werden","error")}finally{Ft(!1)}}function Ue(ve){Ee(ct=>({...ct,[ve]:!ct[ve]}))}function Ye(ve){st($i(ve)),Ht(ve.name)}function $e(){st(""),Ht("")}async function Be(){if(!je)return;const ve=it.trim().replace(/\.(mp3|wav)$/i,"");if(!ve){pn("Bitte einen gueltigen Namen eingeben","error");return}try{await kde(je,ve),pn("Sound umbenannt"),$e(),rr(ct=>ct+1),Ke&&await ae()}catch(ct){pn((ct==null?void 0:ct.message)||"Umbenennen fehlgeschlagen","error")}}async function Bt(ve){if(ve.length!==0)try{await Fde(ve),pn(ve.length===1?"Sound geloescht":`${ve.length} Sounds geloescht`),Ee({}),$e(),rr(ct=>ct+1),Ke&&await ae()}catch(ct){pn((ct==null?void 0:ct.message)||"Loeschen fehlgeschlagen","error")}}async function Vt(){try{await Ode(ce)?(It(!0),Ie(""),pn("Admin eingeloggt")):pn("Falsches Passwort","error")}catch{pn("Login fehlgeschlagen","error")}}async function pt(){try{await Ide(),It(!1),Ee({}),$e(),pn("Ausgeloggt")}catch{}}const K=Oe.useMemo(()=>v==="favorites"?e.filter(ve=>fe[ve.relativePath??ve.fileName]):e,[e,v,fe]),Lt=Oe.useMemo(()=>Object.values(fe).filter(Boolean).length,[fe]),bn=Oe.useMemo(()=>s.filter(ve=>!["__all__","__recent__","__top3__"].includes(ve.key)),[s]),fn=Oe.useMemo(()=>{const ve={};return bn.forEach((ct,Rt)=>{ve[ct.key]=p7[Rt%p7.length]}),ve},[bn]),ui=Oe.useMemo(()=>{const ve=new Set,ct=new Set;return K.forEach((Rt,Jt)=>{const cn=Rt.name.charAt(0).toUpperCase();ve.has(cn)||(ve.add(cn),ct.add(Jt))}),ct},[K]),ci=Oe.useMemo(()=>{const ve={};return k.forEach(ct=>{ve[ct.guildName]||(ve[ct.guildName]=[]),ve[ct.guildName].push(ct)}),ve},[k]),_i=Oe.useMemo(()=>{const ve=dt.trim().toLowerCase();return ve?We.filter(ct=>{const Rt=$i(ct).toLowerCase();return ct.name.toLowerCase().includes(ve)||(ct.folder||"").toLowerCase().includes(ve)||Rt.includes(ve)}):We},[dt,We,$i]),Q=Oe.useMemo(()=>Object.keys(X).filter(ve=>X[ve]),[X]),Ln=Oe.useMemo(()=>_i.filter(ve=>!!X[$i(ve)]).length,[_i,X,$i]),mn=_i.length>0&&Ln===_i.length,yr=h.mostPlayed.slice(0,10),hi=h.totalSounds||n,bs=bt.slice(0,5),fa=bt.slice(5);return W.jsxs("div",{className:"sb-app","data-theme":Se,ref:$n,children:[Te&&W.jsx("div",{className:"party-overlay active"}),W.jsxs("header",{className:"topbar",children:[W.jsxs("div",{className:"topbar-left",children:[W.jsx("div",{className:"sb-app-logo",children:W.jsx("span",{className:"material-icons",style:{fontSize:16,color:"white"},children:"music_note"})}),W.jsx("span",{className:"sb-app-title",children:"Soundboard"}),W.jsxs("div",{className:"channel-dropdown",onClick:ve=>ve.stopPropagation(),children:[W.jsxs("button",{className:`channel-btn ${J?"open":""}`,onClick:()=>te(!J),children:[W.jsx("span",{className:"material-icons cb-icon",children:"headset"}),F&&W.jsx("span",{className:"channel-status"}),W.jsx("span",{className:"channel-label",children:ee?`${ee.channelName}${ee.members?` (${ee.members})`:""}`:"Channel..."}),W.jsx("span",{className:"material-icons chevron",children:"expand_more"})]}),J&&W.jsxs("div",{className:"channel-menu visible",children:[Object.entries(ci).map(([ve,ct])=>W.jsxs(LF.Fragment,{children:[W.jsx("div",{className:"channel-menu-header",children:ve}),ct.map(Rt=>W.jsxs("div",{className:`channel-option ${`${Rt.guildId}:${Rt.channelId}`===F?"active":""}`,onClick:()=>Ma(Rt),children:[W.jsx("span",{className:"material-icons co-icon",children:"volume_up"}),Rt.channelName,Rt.members?` (${Rt.members})`:""]},`${Rt.guildId}:${Rt.channelId}`))]},ve)),k.length===0&&W.jsx("div",{className:"channel-option",style:{color:"var(--text-faint)",cursor:"default"},children:"Keine Channels verfuegbar"})]})]})]}),W.jsx("div",{className:"clock-wrap",children:W.jsxs("div",{className:"clock",children:[bs,W.jsx("span",{className:"clock-seconds",children:fa})]})}),W.jsxs("div",{className:"topbar-right",children:[Z&&W.jsxs("div",{className:"now-playing",children:[W.jsxs("div",{className:"np-waves active",children:[W.jsx("div",{className:"np-wave-bar"}),W.jsx("div",{className:"np-wave-bar"}),W.jsx("div",{className:"np-wave-bar"}),W.jsx("div",{className:"np-wave-bar"})]}),W.jsx("span",{className:"np-label",children:"Last Played:"})," ",W.jsx("span",{className:"np-name",children:Z})]}),F&&W.jsxs("div",{className:"connection",onClick:()=>me(!0),style:{cursor:"pointer"},title:"Verbindungsdetails",children:[W.jsx("span",{className:"conn-dot"}),"Verbunden",(qt==null?void 0:qt.voicePing)!=null&&W.jsxs("span",{className:"conn-ping",children:[qt.voicePing,"ms"]})]}),W.jsx("button",{className:`admin-btn-icon ${Mt?"active":""}`,onClick:()=>ot(!0),title:"Admin",children:W.jsx("span",{className:"material-icons",children:"settings"})})]})]}),W.jsxs("div",{className:"toolbar",children:[W.jsxs("div",{className:"cat-tabs",children:[W.jsxs("button",{className:`cat-tab ${v==="all"?"active":""}`,onClick:()=>{x("all"),w("")},children:["Alle",W.jsx("span",{className:"tab-count",children:n})]}),W.jsx("button",{className:`cat-tab ${v==="recent"?"active":""}`,onClick:()=>{x("recent"),w("")},children:"Neu hinzugefuegt"}),W.jsxs("button",{className:`cat-tab ${v==="favorites"?"active":""}`,onClick:()=>{x("favorites"),w("")},children:["Favoriten",Lt>0&&W.jsx("span",{className:"tab-count",children:Lt})]})]}),W.jsxs("div",{className:"search-wrap",children:[W.jsx("span",{className:"material-icons search-icon",children:"search"}),W.jsx("input",{className:"search-input",type:"text",placeholder:"Suchen...",value:R,onChange:ve=>C(ve.target.value)}),R&&W.jsx("button",{className:"search-clear",onClick:()=>C(""),children:W.jsx("span",{className:"material-icons",style:{fontSize:14},children:"close"})})]}),W.jsxs("div",{className:"url-import-wrap",children:[W.jsx("span",{className:"material-icons url-import-icon",children:Ot(E)==="youtube"?"smart_display":Ot(E)==="instagram"?"photo_camera":"link"}),W.jsx("input",{className:"url-import-input",type:"text",placeholder:"YouTube / Instagram / MP3-Link...",value:E,onChange:ve=>B(ve.target.value),onKeyDown:ve=>{ve.key==="Enter"&&un()}}),E&&W.jsx("span",{className:`url-import-tag ${vt(E)?"valid":"invalid"}`,children:Ot(E)==="youtube"?"YT":Ot(E)==="instagram"?"IG":Ot(E)==="mp3"?"MP3":"?"}),W.jsx("button",{className:"url-import-btn",onClick:()=>{un()},disabled:L||!!E&&!vt(E),title:"Sound herunterladen",children:L?"Laedt...":"Download"})]}),W.jsx("div",{className:"toolbar-spacer"}),W.jsxs("div",{className:"volume-control",children:[W.jsx("span",{className:"material-icons vol-icon",onClick:()=>{const ve=se>0?0:.5;ne(ve),ut&&d7(ut,ve).catch(()=>{})},children:se===0?"volume_off":se<.5?"volume_down":"volume_up"}),W.jsx("input",{type:"range",className:"vol-slider",min:0,max:1,step:.01,value:se,onChange:ve=>{const ct=parseFloat(ve.target.value);ne(ct),ut&&(xt.current&&clearTimeout(xt.current),xt.current=setTimeout(()=>{d7(ut,ct).catch(()=>{})},120))},style:{"--vol":`${Math.round(se*100)}%`}}),W.jsxs("span",{className:"vol-pct",children:[Math.round(se*100),"%"]})]}),W.jsxs("button",{className:"tb-btn random",onClick:Fn,title:"Zufaelliger Sound",children:[W.jsx("span",{className:"material-icons tb-icon",children:"shuffle"}),"Random"]}),W.jsxs("button",{className:`tb-btn party ${Te?"active":""}`,onClick:cs,title:"Party Mode",children:[W.jsx("span",{className:"material-icons tb-icon",children:Te?"celebration":"auto_awesome"}),Te?"Party!":"Party"]}),W.jsxs("button",{className:"tb-btn stop",onClick:li,title:"Alle stoppen",children:[W.jsx("span",{className:"material-icons tb-icon",children:"stop"}),"Stop"]}),W.jsxs("div",{className:"size-control",title:"Button-Groesse",children:[W.jsx("span",{className:"material-icons sc-icon",children:"grid_view"}),W.jsx("input",{type:"range",className:"size-slider",min:80,max:160,value:we,onChange:ve=>He(parseInt(ve.target.value))})]}),W.jsx("div",{className:"theme-selector",children:Gde.map(ve=>W.jsx("div",{className:`theme-dot ${Se===ve.id?"active":""}`,style:{background:ve.color},title:ve.label,onClick:()=>le(ve.id)},ve.id))})]}),W.jsxs("div",{className:"analytics-strip",children:[W.jsxs("div",{className:"analytics-card",children:[W.jsx("span",{className:"material-icons analytics-icon",children:"library_music"}),W.jsxs("div",{className:"analytics-copy",children:[W.jsx("span",{className:"analytics-label",children:"Sounds gesamt"}),W.jsx("strong",{className:"analytics-value",children:hi})]})]}),W.jsxs("div",{className:"analytics-card analytics-wide",children:[W.jsx("span",{className:"material-icons analytics-icon",children:"leaderboard"}),W.jsxs("div",{className:"analytics-copy",children:[W.jsx("span",{className:"analytics-label",children:"Most Played"}),W.jsx("div",{className:"analytics-top-list",children:yr.length===0?W.jsx("span",{className:"analytics-muted",children:"Noch keine Plays"}):yr.map((ve,ct)=>W.jsxs("span",{className:"analytics-chip",children:[ct+1,". ",ve.name," (",ve.count,")"]},ve.relativePath))})]})]})]}),v==="all"&&bn.length>0&&W.jsx("div",{className:"category-strip",children:bn.map(ve=>{const ct=fn[ve.key]||"#888",Rt=S===ve.key;return W.jsxs("button",{className:`cat-chip ${Rt?"active":""}`,onClick:()=>w(Rt?"":ve.key),style:Rt?{borderColor:ct,color:ct}:void 0,children:[W.jsx("span",{className:"cat-dot",style:{background:ct}}),ve.name.replace(/\s*\(\d+\)\s*$/,""),W.jsx("span",{className:"cat-count",children:ve.count})]},ve.key)})}),W.jsx("main",{className:"main",children:K.length===0?W.jsxs("div",{className:"empty-state visible",children:[W.jsx("div",{className:"empty-emoji",children:v==="favorites"?"โญ":"๐Ÿ”‡"}),W.jsx("div",{className:"empty-title",children:v==="favorites"?"Noch keine Favoriten":R?`Kein Sound fuer "${R}" gefunden`:"Keine Sounds vorhanden"}),W.jsx("div",{className:"empty-desc",children:v==="favorites"?"Klick den Stern auf einem Sound!":"Hier gibt's noch nichts zu hoeren."})]}):W.jsx("div",{className:"sound-grid",children:K.map((ve,ct)=>{var Pr;const Rt=ve.relativePath??ve.fileName,Jt=!!fe[Rt],cn=Z===ve.name,Yn=ve.isRecent||((Pr=ve.badges)==null?void 0:Pr.includes("new")),yi=ve.name.charAt(0).toUpperCase(),js=ui.has(ct),pi=ve.folder&&fn[ve.folder]||"var(--accent)";return W.jsxs("div",{className:`sound-card ${cn?"playing":""} ${js?"has-initial":""}`,style:{animationDelay:`${Math.min(ct*20,400)}ms`},onClick:Ei=>{const Zh=Ei.currentTarget,Bl=Zh.getBoundingClientRect(),nl=document.createElement("div");nl.className="ripple";const Bi=Math.max(Bl.width,Bl.height);nl.style.width=nl.style.height=Bi+"px",nl.style.left=Ei.clientX-Bl.left-Bi/2+"px",nl.style.top=Ei.clientY-Bl.top-Bi/2+"px",Zh.appendChild(nl),setTimeout(()=>nl.remove(),500),Xn(ve)},onContextMenu:Ei=>{Ei.preventDefault(),Ei.stopPropagation(),xn({x:Math.min(Ei.clientX,window.innerWidth-170),y:Math.min(Ei.clientY,window.innerHeight-140),sound:ve})},title:`${ve.name}${ve.folder?` (${ve.folder})`:""}`,children:[Yn&&W.jsx("span",{className:"new-badge",children:"NEU"}),W.jsx("span",{className:`fav-star ${Jt?"active":""}`,onClick:Ei=>{Ei.stopPropagation(),Ul(Rt)},children:W.jsx("span",{className:"material-icons fav-icon",children:Jt?"star":"star_border"})}),js&&W.jsx("span",{className:"sound-emoji",style:{color:pi},children:yi}),W.jsx("span",{className:"sound-name",children:ve.name}),ve.folder&&W.jsx("span",{className:"sound-duration",children:ve.folder}),W.jsxs("div",{className:"playing-indicator",children:[W.jsx("div",{className:"wave-bar"}),W.jsx("div",{className:"wave-bar"}),W.jsx("div",{className:"wave-bar"}),W.jsx("div",{className:"wave-bar"})]})]},Rt)})})}),zt&&W.jsxs("div",{className:"ctx-menu visible",style:{left:zt.x,top:zt.y},onClick:ve=>ve.stopPropagation(),children:[W.jsxs("div",{className:"ctx-item",onClick:()=>{Xn(zt.sound),xn(null)},children:[W.jsx("span",{className:"material-icons ctx-icon",children:"play_arrow"}),"Abspielen"]}),W.jsxs("div",{className:"ctx-item",onClick:()=>{Ul(zt.sound.relativePath??zt.sound.fileName),xn(null)},children:[W.jsx("span",{className:"material-icons ctx-icon",children:fe[zt.sound.relativePath??zt.sound.fileName]?"star":"star_border"}),"Favorit"]}),Mt&&W.jsxs(W.Fragment,{children:[W.jsx("div",{className:"ctx-sep"}),W.jsxs("div",{className:"ctx-item danger",onClick:async()=>{const ve=zt.sound.relativePath??zt.sound.fileName;await Bt([ve]),xn(null)},children:[W.jsx("span",{className:"material-icons ctx-icon",children:"delete"}),"Loeschen"]})]})]}),Mi&&(()=>{const ve=qt!=null&&qt.connectedSince?Math.floor((Date.now()-new Date(qt.connectedSince).getTime())/1e3):0,ct=Math.floor(ve/3600),Rt=Math.floor(ve%3600/60),Jt=ve%60,cn=ct>0?`${ct}h ${String(Rt).padStart(2,"0")}m ${String(Jt).padStart(2,"0")}s`:Rt>0?`${Rt}m ${String(Jt).padStart(2,"0")}s`:`${Jt}s`,Yn=yi=>yi==null?"var(--muted)":yi<80?"var(--green)":yi<150?"#f0a830":"#e04040";return W.jsx("div",{className:"conn-modal-overlay",onClick:()=>me(!1),children:W.jsxs("div",{className:"conn-modal",onClick:yi=>yi.stopPropagation(),children:[W.jsxs("div",{className:"conn-modal-header",children:[W.jsx("span",{className:"material-icons",style:{fontSize:20,color:"var(--green)"},children:"cell_tower"}),W.jsx("span",{children:"Verbindungsdetails"}),W.jsx("button",{className:"conn-modal-close",onClick:()=>me(!1),children:W.jsx("span",{className:"material-icons",children:"close"})})]}),W.jsxs("div",{className:"conn-modal-body",children:[W.jsxs("div",{className:"conn-stat",children:[W.jsx("span",{className:"conn-stat-label",children:"Voice Ping"}),W.jsxs("span",{className:"conn-stat-value",children:[W.jsx("span",{className:"conn-ping-dot",style:{background:Yn((qt==null?void 0:qt.voicePing)??null)}}),(qt==null?void 0:qt.voicePing)!=null?`${qt.voicePing} ms`:"---"]})]}),W.jsxs("div",{className:"conn-stat",children:[W.jsx("span",{className:"conn-stat-label",children:"Gateway Ping"}),W.jsxs("span",{className:"conn-stat-value",children:[W.jsx("span",{className:"conn-ping-dot",style:{background:Yn((qt==null?void 0:qt.gatewayPing)??null)}}),qt&&qt.gatewayPing>=0?`${qt.gatewayPing} ms`:"---"]})]}),W.jsxs("div",{className:"conn-stat",children:[W.jsx("span",{className:"conn-stat-label",children:"Status"}),W.jsx("span",{className:"conn-stat-value",style:{color:(qt==null?void 0:qt.status)==="ready"?"var(--green)":"#f0a830"},children:(qt==null?void 0:qt.status)==="ready"?"Verbunden":(qt==null?void 0:qt.status)??"Warte auf Verbindung"})]}),W.jsxs("div",{className:"conn-stat",children:[W.jsx("span",{className:"conn-stat-label",children:"Kanal"}),W.jsx("span",{className:"conn-stat-value",children:(qt==null?void 0:qt.channelName)||"---"})]}),W.jsxs("div",{className:"conn-stat",children:[W.jsx("span",{className:"conn-stat-label",children:"Verbunden seit"}),W.jsx("span",{className:"conn-stat-value",children:cn||"---"})]})]})]})})})(),Wt&&W.jsxs("div",{className:`toast ${Wt.type}`,children:[W.jsx("span",{className:"material-icons toast-icon",children:Wt.type==="error"?"error_outline":"check_circle"}),Wt.msg]}),Ke&&W.jsx("div",{className:"admin-overlay",onClick:ve=>{ve.target===ve.currentTarget&&ot(!1)},children:W.jsxs("div",{className:"admin-panel",children:[W.jsxs("h3",{children:["Admin",W.jsx("button",{className:"admin-close",onClick:()=>ot(!1),children:W.jsx("span",{className:"material-icons",style:{fontSize:18},children:"close"})})]}),Mt?W.jsxs("div",{className:"admin-shell",children:[W.jsxs("div",{className:"admin-header-row",children:[W.jsx("p",{className:"admin-status",children:"Eingeloggt als Admin"}),W.jsxs("div",{className:"admin-actions-inline",children:[W.jsx("button",{className:"admin-btn-action outline",onClick:()=>{ae()},disabled:nt,children:"Aktualisieren"}),W.jsx("button",{className:"admin-btn-action outline",onClick:pt,children:"Logout"})]})]}),W.jsxs("div",{className:"admin-field admin-search-field",children:[W.jsx("label",{children:"Sounds verwalten"}),W.jsx("input",{type:"text",value:dt,onChange:ve=>he(ve.target.value),placeholder:"Nach Name, Ordner oder Pfad filtern..."})]}),W.jsxs("div",{className:"admin-bulk-row",children:[W.jsxs("label",{className:"admin-select-all",children:[W.jsx("input",{type:"checkbox",checked:mn,onChange:ve=>{const ct=ve.target.checked,Rt={...X};_i.forEach(Jt=>{Rt[$i(Jt)]=ct}),Ee(Rt)}}),W.jsxs("span",{children:["Alle sichtbaren auswaehlen (",Ln,"/",_i.length,")"]})]}),W.jsx("button",{className:"admin-btn-action danger",disabled:Q.length===0,onClick:async()=>{window.confirm(`Wirklich ${Q.length} Sound(s) loeschen?`)&&await Bt(Q)},children:"Ausgewaehlte loeschen"})]}),W.jsx("div",{className:"admin-list-wrap",children:nt?W.jsx("div",{className:"admin-empty",children:"Lade Sounds..."}):_i.length===0?W.jsx("div",{className:"admin-empty",children:"Keine Sounds gefunden."}):W.jsx("div",{className:"admin-list",children:_i.map(ve=>{const ct=$i(ve),Rt=je===ct;return W.jsxs("div",{className:"admin-item",children:[W.jsx("label",{className:"admin-item-check",children:W.jsx("input",{type:"checkbox",checked:!!X[ct],onChange:()=>Ue(ct)})}),W.jsxs("div",{className:"admin-item-main",children:[W.jsx("div",{className:"admin-item-name",children:ve.name}),W.jsxs("div",{className:"admin-item-meta",children:[ve.folder?`Ordner: ${ve.folder}`:"Root"," ยท ",ct]}),Rt&&W.jsxs("div",{className:"admin-rename-row",children:[W.jsx("input",{value:it,onChange:Jt=>Ht(Jt.target.value),onKeyDown:Jt=>{Jt.key==="Enter"&&Be(),Jt.key==="Escape"&&$e()},placeholder:"Neuer Name..."}),W.jsx("button",{className:"admin-btn-action primary",onClick:()=>{Be()},children:"Speichern"}),W.jsx("button",{className:"admin-btn-action outline",onClick:$e,children:"Abbrechen"})]})]}),!Rt&&W.jsxs("div",{className:"admin-item-actions",children:[W.jsx("button",{className:"admin-btn-action outline",onClick:()=>Ye(ve),children:"Umbenennen"}),W.jsx("button",{className:"admin-btn-action danger ghost",onClick:async()=>{window.confirm(`Sound "${ve.name}" loeschen?`)&&await Bt([ct])},children:"Loeschen"})]})]},ct)})})})]}):W.jsxs("div",{children:[W.jsxs("div",{className:"admin-field",children:[W.jsx("label",{children:"Passwort"}),W.jsx("input",{type:"password",value:ce,onChange:ve=>Ie(ve.target.value),onKeyDown:ve=>ve.key==="Enter"&&Vt(),placeholder:"Admin-Passwort..."})]}),W.jsx("button",{className:"admin-btn-action primary",onClick:Vt,children:"Login"})]})]})}),Ut&&W.jsx("div",{className:"drop-overlay",children:W.jsxs("div",{className:"drop-zone",children:[W.jsx("span",{className:"material-icons drop-icon",children:"cloud_upload"}),W.jsx("div",{className:"drop-title",children:"MP3 & WAV hier ablegen"}),W.jsx("div",{className:"drop-sub",children:"Mehrere Dateien gleichzeitig moeglich"})]})}),Zt&&ln.length>0&&W.jsxs("div",{className:"upload-queue",children:[W.jsxs("div",{className:"uq-header",children:[W.jsx("span",{className:"material-icons",style:{fontSize:16},children:"upload"}),W.jsx("span",{children:ln.every(ve=>ve.status==="done"||ve.status==="error")?`${ln.filter(ve=>ve.status==="done").length} von ${ln.length} hochgeladen`:`Lade hochโ€ฆ (${ln.filter(ve=>ve.status==="done").length}/${ln.length})`}),W.jsx("button",{className:"uq-close",onClick:()=>{rn(!1),wt([])},children:W.jsx("span",{className:"material-icons",style:{fontSize:14},children:"close"})})]}),W.jsx("div",{className:"uq-list",children:ln.map(ve=>W.jsxs("div",{className:`uq-item uq-${ve.status}`,children:[W.jsx("span",{className:"material-icons uq-file-icon",children:"audio_file"}),W.jsxs("div",{className:"uq-info",children:[W.jsx("div",{className:"uq-name",title:ve.savedName??ve.file.name,children:ve.savedName??ve.file.name}),W.jsxs("div",{className:"uq-size",children:[(ve.file.size/1024).toFixed(0)," KB"]})]}),(ve.status==="waiting"||ve.status==="uploading")&&W.jsx("div",{className:"uq-progress-wrap",children:W.jsx("div",{className:"uq-progress-bar",style:{width:`${ve.progress}%`}})}),W.jsx("span",{className:`material-icons uq-status-icon uq-status-${ve.status}`,children:ve.status==="done"?"check_circle":ve.status==="error"?"error":ve.status==="uploading"?"sync":"schedule"}),ve.status==="error"&&W.jsx("div",{className:"uq-error",children:ve.error})]},ve.id))})]}),z&&W.jsx("div",{className:"dl-modal-overlay",onClick:()=>z.phase!=="downloading"&&G(null),children:W.jsxs("div",{className:"dl-modal",onClick:ve=>ve.stopPropagation(),children:[W.jsxs("div",{className:"dl-modal-header",children:[W.jsx("span",{className:"material-icons",style:{fontSize:20},children:z.type==="youtube"?"smart_display":z.type==="instagram"?"photo_camera":"audio_file"}),W.jsx("span",{children:z.phase==="input"?"Sound herunterladen":z.phase==="downloading"?"Wird heruntergeladen...":z.phase==="done"?"Fertig!":"Fehler"}),z.phase!=="downloading"&&W.jsx("button",{className:"dl-modal-close",onClick:()=>G(null),children:W.jsx("span",{className:"material-icons",style:{fontSize:16},children:"close"})})]}),W.jsxs("div",{className:"dl-modal-body",children:[W.jsxs("div",{className:"dl-modal-url",children:[W.jsx("span",{className:`dl-modal-tag ${z.type??""}`,children:z.type==="youtube"?"YouTube":z.type==="instagram"?"Instagram":"MP3"}),W.jsx("span",{className:"dl-modal-url-text",title:z.url,children:z.url.length>60?z.url.slice(0,57)+"...":z.url})]}),z.phase==="input"&&W.jsxs("div",{className:"dl-modal-field",children:[W.jsx("label",{className:"dl-modal-label",children:"Dateiname"}),W.jsxs("div",{className:"dl-modal-input-wrap",children:[W.jsx("input",{className:"dl-modal-input",type:"text",placeholder:z.type==="mp3"?"Dateiname...":"Wird automatisch erkannt...",value:z.filename,onChange:ve=>G(ct=>ct?{...ct,filename:ve.target.value}:null),onKeyDown:ve=>{ve.key==="Enter"&&qn()},autoFocus:!0}),W.jsx("span",{className:"dl-modal-ext",children:".mp3"})]}),W.jsx("span",{className:"dl-modal-hint",children:"Leer lassen = automatischer Name"})]}),z.phase==="downloading"&&W.jsxs("div",{className:"dl-modal-progress",children:[W.jsx("div",{className:"dl-modal-spinner"}),W.jsx("span",{children:z.type==="youtube"||z.type==="instagram"?"Audio wird extrahiert...":"MP3 wird heruntergeladen..."})]}),z.phase==="done"&&W.jsxs("div",{className:"dl-modal-success",children:[W.jsx("span",{className:"material-icons dl-modal-check",children:"check_circle"}),W.jsxs("span",{children:["Gespeichert als ",W.jsx("b",{children:z.savedName})]})]}),z.phase==="error"&&W.jsxs("div",{className:"dl-modal-error",children:[W.jsx("span",{className:"material-icons",style:{color:"#e74c3c"},children:"error"}),W.jsx("span",{children:z.error})]})]}),z.phase==="input"&&W.jsxs("div",{className:"dl-modal-actions",children:[W.jsx("button",{className:"dl-modal-cancel",onClick:()=>G(null),children:"Abbrechen"}),W.jsxs("button",{className:"dl-modal-submit",onClick:()=>void qn(),children:[W.jsx("span",{className:"material-icons",style:{fontSize:16},children:"download"}),"Herunterladen"]})]}),z.phase==="error"&&W.jsxs("div",{className:"dl-modal-actions",children:[W.jsx("button",{className:"dl-modal-cancel",onClick:()=>G(null),children:"Schliessen"}),W.jsxs("button",{className:"dl-modal-submit",onClick:()=>G(ve=>ve?{...ve,phase:"input",error:void 0}:null),children:[W.jsx("span",{className:"material-icons",style:{fontSize:16},children:"refresh"}),"Nochmal"]})]})]})})]})}const m7={IRON:"#6b6b6b",BRONZE:"#8c6239",SILVER:"#8c8c8c",GOLD:"#d4a017",PLATINUM:"#28b29e",EMERALD:"#1e9e5e",DIAMOND:"#576cce",MASTER:"#9d48e0",GRANDMASTER:"#e44c3e",CHALLENGER:"#f4c874"},Vde={SOLORANKED:"Ranked Solo",FLEXRANKED:"Ranked Flex",NORMAL:"Normal",ARAM:"ARAM",ARENA:"Arena",URF:"URF",BOT:"Co-op vs AI"},Hde="https://ddragon.leagueoflegends.com/cdn/15.5.1/img";function zv(i){return`${Hde}/champion/${i}.png`}function g7(i){const e=Math.floor((Date.now()-new Date(i).getTime())/1e3);return e<60?`${e}s`:e<3600?`${Math.floor(e/60)}m`:e<86400?`${Math.floor(e/3600)}h`:`${Math.floor(e/86400)}d`}function jde(i){const e=Math.floor(i/60),t=i%60;return`${e}:${String(t).padStart(2,"0")}`}function v7(i,e,t){return e===0?"Perfect":((i+t)/e).toFixed(2)}function _7(i,e){const t=i+e;return t>0?Math.round(i/t*100):0}function Wde(i,e){if(!i)return"Unranked";const t=["","I","II","III","IV"];return`${i.charAt(0)}${i.slice(1).toLowerCase()}${e?" "+(t[e]??e):""}`}function $de({data:i}){var we,He,Te,ke;const[e,t]=Oe.useState(""),[n,r]=Oe.useState("EUW"),[s,a]=Oe.useState([]),[l,u]=Oe.useState(null),[h,g]=Oe.useState([]),[v,x]=Oe.useState(!1),[S,w]=Oe.useState(null),[R,C]=Oe.useState([]),[E,B]=Oe.useState(null),[L,O]=Oe.useState({}),[z,G]=Oe.useState(!1),[k,H]=Oe.useState(!1),[F,V]=Oe.useState(null),Y=Oe.useRef(null),J=Oe.useRef(null);Oe.useEffect(()=>{fetch("/api/lolstats/regions").then(_e=>_e.json()).then(a).catch(()=>{}),fetch("/api/lolstats/recent").then(_e=>_e.json()).then(C).catch(()=>{})},[]),Oe.useEffect(()=>{i&&(i.recentSearches&&C(i.recentSearches),i.regions&&!s.length&&a(i.regions))},[i]);const te=Oe.useCallback(async(_e,De,gt)=>{H(!0);try{const xt=`gameName=${encodeURIComponent(_e)}&tagLine=${encodeURIComponent(De)}®ion=${gt}`,Mt=await fetch(`/api/lolstats/renew?${xt}`,{method:"POST"});if(Mt.ok){const It=await Mt.json();return It.last_updated_at&&V(It.last_updated_at),It.renewed??!1}}catch{}return H(!1),!1},[]),se=Oe.useCallback(async(_e,De,gt,xt=!1)=>{var ot,ce;let Mt=_e??"",It=De??"";const Ke=gt??n;if(!Mt){const Ie=e.split("#");Mt=((ot=Ie[0])==null?void 0:ot.trim())??"",It=((ce=Ie[1])==null?void 0:ce.trim())??""}if(!Mt||!It){w("Bitte im Format Name#Tag eingeben");return}x(!0),w(null),u(null),g([]),B(null),O({}),J.current={gameName:Mt,tagLine:It,region:Ke},xt||te(Mt,It,Ke).finally(()=>H(!1));try{const Ie=`gameName=${encodeURIComponent(Mt)}&tagLine=${encodeURIComponent(It)}®ion=${Ke}`,[We,tt]=await Promise.all([fetch(`/api/lolstats/profile?${Ie}`),fetch(`/api/lolstats/matches?${Ie}&limit=10`)]);if(!We.ok){const Ft=await We.json();throw new Error(Ft.error??`Fehler ${We.status}`)}const nt=await We.json();if(u(nt),nt.updated_at&&V(nt.updated_at),tt.ok){const Ft=await tt.json();g(Array.isArray(Ft)?Ft:[])}}catch(Ie){w(Ie.message)}x(!1)},[e,n,te]),ne=Oe.useCallback(async()=>{const _e=J.current;if(!(!_e||k)){H(!0);try{await te(_e.gameName,_e.tagLine,_e.region),await new Promise(De=>setTimeout(De,1500)),await se(_e.gameName,_e.tagLine,_e.region,!0)}finally{H(!1)}}},[te,se,k]),Z=Oe.useCallback(async()=>{if(!(!l||z)){G(!0);try{const _e=`gameName=${encodeURIComponent(l.game_name)}&tagLine=${encodeURIComponent(l.tagline)}®ion=${n}&limit=20`,De=await fetch(`/api/lolstats/matches?${_e}`);if(De.ok){const gt=await De.json();g(Array.isArray(gt)?gt:[])}}catch{}G(!1)}},[l,n,z]),oe=Oe.useCallback(async _e=>{var De;if(E===_e.id){B(null);return}if(B(_e.id),!(((De=_e.participants)==null?void 0:De.length)>=10||L[_e.id]))try{const gt=`region=${n}&createdAt=${encodeURIComponent(_e.created_at)}`,xt=await fetch(`/api/lolstats/match/${encodeURIComponent(_e.id)}?${gt}`);if(xt.ok){const Mt=await xt.json();O(It=>({...It,[_e.id]:Mt}))}}catch{}},[E,L,n]),fe=Oe.useCallback(_e=>{t(`${_e.game_name}#${_e.tag_line}`),r(_e.region),se(_e.game_name,_e.tag_line,_e.region)},[se]),be=Oe.useCallback(_e=>{var gt,xt,Mt;if(!l)return((gt=_e.participants)==null?void 0:gt[0])??null;const De=l.game_name.toLowerCase();return((xt=_e.participants)==null?void 0:xt.find(It=>{var Ke,ot;return((ot=(Ke=It.summoner)==null?void 0:Ke.game_name)==null?void 0:ot.toLowerCase())===De}))??((Mt=_e.participants)==null?void 0:Mt[0])??null},[l]),Se=_e=>{var ce,Ie,We;const De=be(_e);if(!De)return null;const gt=((ce=De.stats)==null?void 0:ce.result)==="WIN",xt=v7(De.stats.kill,De.stats.death,De.stats.assist),Mt=(De.stats.minion_kill??0)+(De.stats.neutral_minion_kill??0),It=_e.game_length_second>0?(Mt/(_e.game_length_second/60)).toFixed(1):"0",Ke=E===_e.id,ot=L[_e.id]??(((Ie=_e.participants)==null?void 0:Ie.length)>=10?_e:null);return W.jsxs("div",{children:[W.jsxs("div",{className:`lol-match ${gt?"win":"loss"}`,onClick:()=>oe(_e),children:[W.jsx("div",{className:"lol-match-result",children:gt?"W":"L"}),W.jsxs("div",{className:"lol-match-champ",children:[W.jsx("img",{src:zv(De.champion_name),alt:De.champion_name,title:De.champion_name}),W.jsx("span",{className:"lol-match-champ-level",children:De.stats.champion_level})]}),W.jsxs("div",{className:"lol-match-kda",children:[W.jsxs("div",{className:"lol-match-kda-nums",children:[De.stats.kill,"/",De.stats.death,"/",De.stats.assist]}),W.jsxs("div",{className:`lol-match-kda-ratio ${xt==="Perfect"?"perfect":Number(xt)>=4?"great":""}`,children:[xt," KDA"]})]}),W.jsxs("div",{className:"lol-match-stats",children:[W.jsxs("span",{children:[Mt," CS (",It,"/m)"]}),W.jsxs("span",{children:[De.stats.ward_place," wards"]})]}),W.jsx("div",{className:"lol-match-items",children:(De.items_names??[]).slice(0,7).map((tt,nt)=>tt?W.jsx("img",{src:zv("Aatrox"),alt:tt,title:tt,style:{background:"var(--bg-deep)"},onError:Ft=>{Ft.target.style.display="none"}},nt):W.jsx("div",{className:"lol-match-item-empty"},nt))}),W.jsxs("div",{className:"lol-match-meta",children:[W.jsx("div",{className:"lol-match-duration",children:jde(_e.game_length_second)}),W.jsx("div",{className:"lol-match-queue",children:Vde[_e.game_type]??_e.game_type}),W.jsxs("div",{className:"lol-match-ago",children:[g7(_e.created_at)," ago"]})]})]}),Ke&&ot&&W.jsx("div",{className:"lol-match-detail",children:le(ot,(We=De.summoner)==null?void 0:We.game_name)})]},_e.id)},le=(_e,De)=>{var Ke,ot,ce,Ie,We;const gt=((Ke=_e.participants)==null?void 0:Ke.filter(tt=>tt.team_key==="BLUE"))??[],xt=((ot=_e.participants)==null?void 0:ot.filter(tt=>tt.team_key==="RED"))??[],Mt=(We=(Ie=(ce=_e.teams)==null?void 0:ce.find(tt=>tt.key==="BLUE"))==null?void 0:Ie.game_stat)==null?void 0:We.is_win,It=(tt,nt,Ft)=>W.jsxs("div",{className:"lol-match-detail-team",children:[W.jsxs("div",{className:`lol-match-detail-team-header ${nt?"win":"loss"}`,children:[Ft," โ€” ",nt?"Victory":"Defeat"]}),tt.map((dt,he)=>{var je,st,it,Ht,Ut,$t,ln,wt,Zt,rn,jt,kt;const X=((st=(je=dt.summoner)==null?void 0:je.game_name)==null?void 0:st.toLowerCase())===(De==null?void 0:De.toLowerCase()),Ee=(((it=dt.stats)==null?void 0:it.minion_kill)??0)+(((Ht=dt.stats)==null?void 0:Ht.neutral_minion_kill)??0);return W.jsxs("div",{className:`lol-detail-row ${X?"me":""}`,children:[W.jsx("img",{className:"lol-detail-champ",src:zv(dt.champion_name),alt:dt.champion_name}),W.jsx("span",{className:"lol-detail-name",title:`${(Ut=dt.summoner)==null?void 0:Ut.game_name}#${($t=dt.summoner)==null?void 0:$t.tagline}`,children:((ln=dt.summoner)==null?void 0:ln.game_name)??dt.champion_name}),W.jsxs("span",{className:"lol-detail-kda",children:[(wt=dt.stats)==null?void 0:wt.kill,"/",(Zt=dt.stats)==null?void 0:Zt.death,"/",(rn=dt.stats)==null?void 0:rn.assist]}),W.jsxs("span",{className:"lol-detail-cs",children:[Ee," CS"]}),W.jsxs("span",{className:"lol-detail-dmg",children:[((((jt=dt.stats)==null?void 0:jt.total_damage_dealt_to_champions)??0)/1e3).toFixed(1),"k"]}),W.jsxs("span",{className:"lol-detail-gold",children:[((((kt=dt.stats)==null?void 0:kt.gold_earned)??0)/1e3).toFixed(1),"k"]})]},he)})]});return W.jsxs(W.Fragment,{children:[It(gt,Mt,"Blue Team"),It(xt,Mt===void 0?void 0:!Mt,"Red Team")]})};return W.jsxs("div",{className:"lol-container",children:[W.jsxs("div",{className:"lol-search",children:[W.jsx("input",{ref:Y,className:"lol-search-input",placeholder:"Summoner Name#Tag",value:e,onChange:_e=>t(_e.target.value),onKeyDown:_e=>_e.key==="Enter"&&se()}),W.jsx("select",{className:"lol-search-region",value:n,onChange:_e=>r(_e.target.value),children:s.map(_e=>W.jsx("option",{value:_e.code,children:_e.code},_e.code))}),W.jsx("button",{className:"lol-search-btn",onClick:()=>se(),disabled:v,children:v?"...":"Search"})]}),R.length>0&&W.jsx("div",{className:"lol-recent",children:R.map((_e,De)=>W.jsxs("button",{className:"lol-recent-chip",onClick:()=>fe(_e),children:[_e.profile_image_url&&W.jsx("img",{src:_e.profile_image_url,alt:""}),_e.game_name,"#",_e.tag_line,_e.tier&&W.jsx("span",{className:"lol-recent-tier",style:{color:m7[_e.tier]},children:_e.tier})]},De))}),S&&W.jsx("div",{className:"lol-error",children:S}),v&&W.jsxs("div",{className:"lol-loading",children:[W.jsx("div",{className:"lol-spinner"}),"Lade Profil..."]}),l&&!v&&W.jsxs(W.Fragment,{children:[W.jsxs("div",{className:"lol-profile",children:[W.jsx("img",{className:"lol-profile-icon",src:l.profile_image_url,alt:""}),W.jsxs("div",{className:"lol-profile-info",children:[W.jsxs("h2",{children:[l.game_name,W.jsxs("span",{children:["#",l.tagline]})]}),W.jsxs("div",{className:"lol-profile-level",children:["Level ",l.level]}),((we=l.ladder_rank)==null?void 0:we.rank)&&W.jsxs("div",{className:"lol-profile-ladder",children:["Ladder Rank #",l.ladder_rank.rank.toLocaleString()," / ",(He=l.ladder_rank.total)==null?void 0:He.toLocaleString()]}),F&&W.jsxs("div",{className:"lol-profile-updated",children:["Updated ",g7(F)," ago"]})]}),W.jsxs("button",{className:`lol-update-btn ${k?"renewing":""}`,onClick:ne,disabled:k,title:"Refresh data from Riot servers",children:[W.jsx("span",{className:"lol-update-icon",children:k?"โŸณ":"โ†ป"}),k?"Updating...":"Update"]})]}),W.jsx("div",{className:"lol-ranked-row",children:(l.league_stats??[]).filter(_e=>_e.game_type==="SOLORANKED"||_e.game_type==="FLEXRANKED").map(_e=>{const De=_e.tier_info,gt=!!(De!=null&&De.tier),xt=m7[(De==null?void 0:De.tier)??""]??"var(--text-normal)";return W.jsxs("div",{className:`lol-ranked-card ${gt?"has-rank":""}`,style:{"--tier-color":xt},children:[W.jsx("div",{className:"lol-ranked-type",children:_e.game_type==="SOLORANKED"?"Ranked Solo/Duo":"Ranked Flex"}),gt?W.jsxs(W.Fragment,{children:[W.jsxs("div",{className:"lol-ranked-tier",style:{color:xt},children:[Wde(De.tier,De.division),W.jsxs("span",{className:"lol-ranked-lp",children:[De.lp," LP"]})]}),W.jsxs("div",{className:"lol-ranked-record",children:[_e.win,"W ",_e.lose,"L",W.jsxs("span",{className:"lol-ranked-wr",children:["(",_7(_e.win??0,_e.lose??0),"%)"]}),_e.is_hot_streak&&W.jsx("span",{className:"lol-ranked-streak",children:"๐Ÿ”ฅ"})]})]}):W.jsx("div",{className:"lol-ranked-tier",children:"Unranked"})]},_e.game_type)})}),((ke=(Te=l.most_champions)==null?void 0:Te.champion_stats)==null?void 0:ke.length)>0&&W.jsxs(W.Fragment,{children:[W.jsx("div",{className:"lol-section-title",children:"Top Champions"}),W.jsx("div",{className:"lol-champs",children:l.most_champions.champion_stats.slice(0,7).map(_e=>{const De=_7(_e.win,_e.lose),gt=_e.play>0?v7(_e.kill/_e.play,_e.death/_e.play,_e.assist/_e.play):"0";return W.jsxs("div",{className:"lol-champ-card",children:[W.jsx("img",{className:"lol-champ-icon",src:zv(_e.champion_name),alt:_e.champion_name}),W.jsxs("div",{children:[W.jsx("div",{className:"lol-champ-name",children:_e.champion_name}),W.jsxs("div",{className:"lol-champ-stats",children:[_e.play," games ยท ",De,"% WR"]}),W.jsxs("div",{className:"lol-champ-kda",children:[gt," KDA"]})]})]},_e.champion_name)})})]}),h.length>0&&W.jsxs(W.Fragment,{children:[W.jsx("div",{className:"lol-section-title",children:"Match History"}),W.jsx("div",{className:"lol-matches",children:h.map(_e=>Se(_e))}),h.length<20&&W.jsx("button",{className:"lol-load-more",onClick:Z,disabled:z,children:z?"Laden...":"Mehr laden"})]})]}),!l&&!v&&!S&&W.jsxs("div",{className:"lol-empty",children:[W.jsx("div",{className:"lol-empty-icon",children:"โš”๏ธ"}),W.jsx("h3",{children:"League of Legends Stats"}),W.jsx("p",{children:"Gib einen Summoner Name#Tag ein und wรคhle die Region"})]})]})}const y7={iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:"stun:stun1.l.google.com:19302"}]};function x7(i){const e=Math.max(0,Math.floor((Date.now()-new Date(i).getTime())/1e3)),t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60;return t>0?`${t}:${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}`:`${n}:${String(r).padStart(2,"0")}`}function Xde({data:i}){var ot,ce;const[e,t]=Oe.useState([]),[n,r]=Oe.useState(()=>localStorage.getItem("streaming_name")||""),[s,a]=Oe.useState("Screen Share"),[l,u]=Oe.useState(""),[h,g]=Oe.useState(null),[v,x]=Oe.useState(null),[S,w]=Oe.useState(null),[R,C]=Oe.useState(!1),[E,B]=Oe.useState(!1),[L,O]=Oe.useState(null),[,z]=Oe.useState(0),G=Oe.useRef(null),k=Oe.useRef(""),H=Oe.useRef(null),F=Oe.useRef(null),V=Oe.useRef(null),Y=Oe.useRef(new Map),J=Oe.useRef(null),te=Oe.useRef(new Map),se=Oe.useRef(null),ne=Oe.useRef(1e3),Z=Oe.useRef(!1),oe=Oe.useRef(null);Oe.useEffect(()=>{Z.current=R},[R]),Oe.useEffect(()=>{oe.current=L},[L]),Oe.useEffect(()=>{if(!(e.length>0||R))return;const We=setInterval(()=>z(tt=>tt+1),1e3);return()=>clearInterval(We)},[e.length,R]),Oe.useEffect(()=>{i!=null&&i.streams&&t(i.streams)},[i]),Oe.useEffect(()=>{n&&localStorage.setItem("streaming_name",n)},[n]);const fe=Oe.useCallback(Ie=>{var We;((We=G.current)==null?void 0:We.readyState)===WebSocket.OPEN&&G.current.send(JSON.stringify(Ie))},[]),be=Oe.useCallback((Ie,We,tt)=>{if(Ie.remoteDescription)Ie.addIceCandidate(new RTCIceCandidate(tt)).catch(()=>{});else{let nt=te.current.get(We);nt||(nt=[],te.current.set(We,nt)),nt.push(tt)}},[]),Se=Oe.useCallback((Ie,We)=>{const tt=te.current.get(We);if(tt){for(const nt of tt)Ie.addIceCandidate(new RTCIceCandidate(nt)).catch(()=>{});te.current.delete(We)}},[]),le=Oe.useCallback(()=>{J.current&&(J.current.close(),J.current=null),V.current&&(V.current.srcObject=null),te.current.clear()},[]),we=Oe.useRef(()=>{});we.current=Ie=>{var We;switch(Ie.type){case"welcome":k.current=Ie.clientId,Ie.streams&&t(Ie.streams);break;case"broadcast_started":w(Ie.streamId),C(!0),Z.current=!0,B(!1);break;case"stream_available":break;case"stream_ended":((We=oe.current)==null?void 0:We.streamId)===Ie.streamId&&(le(),O(null));break;case"viewer_joined":{const tt=Ie.viewerId,nt=Y.current.get(tt);nt&&(nt.close(),Y.current.delete(tt)),te.current.delete(tt);const Ft=new RTCPeerConnection(y7);Y.current.set(tt,Ft);const dt=H.current;if(dt)for(const X of dt.getTracks())Ft.addTrack(X,dt);Ft.onicecandidate=X=>{X.candidate&&fe({type:"ice_candidate",targetId:tt,candidate:X.candidate.toJSON()})};const he=Ft.getSenders().find(X=>{var Ee;return((Ee=X.track)==null?void 0:Ee.kind)==="video"});if(he){const X=he.getParameters();(!X.encodings||X.encodings.length===0)&&(X.encodings=[{}]),X.encodings[0].maxFramerate=60,X.encodings[0].maxBitrate=8e6,he.setParameters(X).catch(()=>{})}Ft.createOffer().then(X=>Ft.setLocalDescription(X)).then(()=>{fe({type:"offer",targetId:tt,sdp:Ft.localDescription})}).catch(console.error);break}case"viewer_left":{const tt=Y.current.get(Ie.viewerId);tt&&(tt.close(),Y.current.delete(Ie.viewerId)),te.current.delete(Ie.viewerId);break}case"offer":{const tt=Ie.fromId;J.current&&(J.current.close(),J.current=null),te.current.delete(tt);const nt=new RTCPeerConnection(y7);J.current=nt,nt.ontrack=Ft=>{V.current&&Ft.streams[0]&&(V.current.srcObject=Ft.streams[0]),O(dt=>dt&&{...dt,phase:"connected"})},nt.onicecandidate=Ft=>{Ft.candidate&&fe({type:"ice_candidate",targetId:tt,candidate:Ft.candidate.toJSON()})},nt.oniceconnectionstatechange=()=>{(nt.iceConnectionState==="failed"||nt.iceConnectionState==="disconnected")&&O(Ft=>Ft&&{...Ft,phase:"error",error:"Verbindung verloren"})},nt.setRemoteDescription(new RTCSessionDescription(Ie.sdp)).then(()=>(Se(nt,tt),nt.createAnswer())).then(Ft=>nt.setLocalDescription(Ft)).then(()=>{fe({type:"answer",targetId:tt,sdp:nt.localDescription})}).catch(console.error);break}case"answer":{const tt=Y.current.get(Ie.fromId);tt&&tt.setRemoteDescription(new RTCSessionDescription(Ie.sdp)).then(()=>Se(tt,Ie.fromId)).catch(console.error);break}case"ice_candidate":{if(!Ie.candidate)break;if(Z.current){const tt=Y.current.get(Ie.fromId);tt&&be(tt,Ie.fromId,Ie.candidate)}else{const tt=J.current;tt&&be(tt,Ie.fromId,Ie.candidate)}break}case"error":Ie.code==="WRONG_PASSWORD"?x(tt=>tt&&{...tt,error:Ie.message}):g(Ie.message),B(!1);break}};const He=Oe.useCallback(()=>{if(G.current&&G.current.readyState===WebSocket.OPEN)return;const Ie=location.protocol==="https:"?"wss":"ws",We=new WebSocket(`${Ie}://${location.host}/ws/streaming`);G.current=We,We.onopen=()=>{ne.current=1e3},We.onmessage=tt=>{let nt;try{nt=JSON.parse(tt.data)}catch{return}we.current(nt)},We.onclose=()=>{G.current=null,(Z.current||oe.current)&&(se.current=setTimeout(()=>{ne.current=Math.min(ne.current*2,1e4),He()},ne.current))},We.onerror=()=>{We.close()}},[]),Te=Oe.useCallback(async()=>{var Ie,We;if(!n.trim()){g("Bitte gib einen Namen ein.");return}if(!l.trim()){g("Passwort ist Pflicht.");return}if(!((Ie=navigator.mediaDevices)!=null&&Ie.getDisplayMedia)){g("Dein Browser unterstรผtzt keine Bildschirmfreigabe.");return}g(null),B(!0);try{const tt=await navigator.mediaDevices.getDisplayMedia({video:{frameRate:{ideal:60},width:{ideal:1920},height:{ideal:1080}},audio:!0});H.current=tt,F.current&&(F.current.srcObject=tt),(We=tt.getVideoTracks()[0])==null||We.addEventListener("ended",()=>{ke()}),He();const nt=()=>{var Ft;((Ft=G.current)==null?void 0:Ft.readyState)===WebSocket.OPEN?fe({type:"start_broadcast",name:n.trim(),title:s.trim()||"Screen Share",password:l.trim()}):setTimeout(nt,100)};nt()}catch(tt){B(!1),tt.name==="NotAllowedError"?g("Bildschirmfreigabe wurde abgelehnt."):g(`Fehler: ${tt.message}`)}},[n,s,l,He,fe]),ke=Oe.useCallback(()=>{var Ie;fe({type:"stop_broadcast"}),(Ie=H.current)==null||Ie.getTracks().forEach(We=>We.stop()),H.current=null,F.current&&(F.current.srcObject=null);for(const We of Y.current.values())We.close();Y.current.clear(),te.current.clear(),C(!1),Z.current=!1,w(null),u("")},[fe]),_e=Oe.useCallback(Ie=>{x({streamId:Ie.id,streamTitle:Ie.title,broadcasterName:Ie.broadcasterName,password:"",error:null})},[]),De=Oe.useCallback(()=>{if(!v)return;if(!v.password.trim()){x(nt=>nt&&{...nt,error:"Passwort eingeben."});return}const{streamId:Ie,password:We}=v;x(null),g(null),O({streamId:Ie,phase:"connecting"}),He();const tt=()=>{var nt;((nt=G.current)==null?void 0:nt.readyState)===WebSocket.OPEN?fe({type:"join_viewer",name:n.trim()||"Viewer",streamId:Ie,password:We.trim()}):setTimeout(tt,100)};tt()},[v,n,He,fe]),gt=Oe.useCallback(()=>{fe({type:"leave_viewer"}),le(),O(null)},[le,fe]);Oe.useEffect(()=>{const Ie=We=>{(Z.current||oe.current)&&We.preventDefault()};return window.addEventListener("beforeunload",Ie),()=>window.removeEventListener("beforeunload",Ie)},[]);const xt=Oe.useRef(null),[Mt,It]=Oe.useState(!1),Ke=Oe.useCallback(()=>{const Ie=xt.current;Ie&&(document.fullscreenElement?document.exitFullscreen().catch(()=>{}):Ie.requestFullscreen().catch(()=>{}))},[]);if(Oe.useEffect(()=>{const Ie=()=>It(!!document.fullscreenElement);return document.addEventListener("fullscreenchange",Ie),()=>document.removeEventListener("fullscreenchange",Ie)},[]),Oe.useEffect(()=>()=>{var Ie;(Ie=H.current)==null||Ie.getTracks().forEach(We=>We.stop());for(const We of Y.current.values())We.close();J.current&&J.current.close(),G.current&&G.current.close(),se.current&&clearTimeout(se.current)},[]),L){const Ie=e.find(We=>We.id===L.streamId);return W.jsxs("div",{className:"stream-viewer-overlay",ref:xt,children:[W.jsxs("div",{className:"stream-viewer-header",children:[W.jsxs("div",{className:"stream-viewer-header-left",children:[W.jsxs("span",{className:"stream-live-badge",children:[W.jsx("span",{className:"stream-live-dot"})," LIVE"]}),W.jsxs("div",{children:[W.jsx("div",{className:"stream-viewer-title",children:(Ie==null?void 0:Ie.title)||"Stream"}),W.jsxs("div",{className:"stream-viewer-subtitle",children:[(Ie==null?void 0:Ie.broadcasterName)||"..."," ",Ie?`ยท ${Ie.viewerCount} Zuschauer`:""]})]})]}),W.jsxs("div",{className:"stream-viewer-header-right",children:[W.jsx("button",{className:"stream-viewer-fullscreen",onClick:Ke,title:Mt?"Vollbild verlassen":"Vollbild",children:Mt?"โœ–":"โ›ถ"}),W.jsx("button",{className:"stream-viewer-close",onClick:gt,children:"Verlassen"})]})]}),W.jsxs("div",{className:"stream-viewer-video",children:[L.phase==="connecting"?W.jsxs("div",{className:"stream-viewer-connecting",children:[W.jsx("div",{className:"stream-viewer-spinner"}),"Verbindung wird hergestellt..."]}):L.phase==="error"?W.jsxs("div",{className:"stream-viewer-connecting",children:[L.error||"Verbindungsfehler",W.jsx("button",{className:"stream-btn",onClick:gt,children:"Zur\\u00FCck"})]}):null,W.jsx("video",{ref:V,autoPlay:!0,playsInline:!0,style:L.phase==="connected"?{}:{display:"none"}})]})]})}return W.jsxs("div",{className:"stream-container",children:[h&&W.jsxs("div",{className:"stream-error",children:[h,W.jsx("button",{className:"stream-error-dismiss",onClick:()=>g(null),children:"ร—"})]}),W.jsxs("div",{className:"stream-topbar",children:[W.jsx("input",{className:"stream-input stream-input-name",placeholder:"Dein Name",value:n,onChange:Ie=>r(Ie.target.value),disabled:R}),W.jsx("input",{className:"stream-input stream-input-title",placeholder:"Stream-Titel",value:s,onChange:Ie=>a(Ie.target.value),disabled:R}),W.jsx("input",{className:"stream-input stream-input-password",type:"password",placeholder:"Passwort",value:l,onChange:Ie=>u(Ie.target.value),disabled:R}),R?W.jsxs("button",{className:"stream-btn stream-btn-stop",onClick:ke,children:["โน"," Stream beenden"]}):W.jsx("button",{className:"stream-btn",onClick:Te,disabled:E,children:E?"Starte...":"๐Ÿ–ฅ๏ธ Stream starten"})]}),e.length===0&&!R?W.jsxs("div",{className:"stream-empty",children:[W.jsx("div",{className:"stream-empty-icon",children:"๐Ÿ“บ"}),W.jsx("h3",{children:"Keine aktiven Streams"}),W.jsx("p",{children:"Starte einen Stream, um deinen Bildschirm zu teilen."})]}):W.jsxs("div",{className:"stream-grid",children:[R&&W.jsxs("div",{className:"stream-tile own broadcasting",children:[W.jsxs("div",{className:"stream-tile-preview",children:[W.jsx("video",{ref:F,autoPlay:!0,playsInline:!0,muted:!0}),W.jsxs("span",{className:"stream-live-badge",children:[W.jsx("span",{className:"stream-live-dot"})," LIVE"]}),W.jsxs("span",{className:"stream-tile-viewers",children:["๐Ÿ‘ฅ"," ",((ot=e.find(Ie=>Ie.id===S))==null?void 0:ot.viewerCount)??0]})]}),W.jsxs("div",{className:"stream-tile-info",children:[W.jsxs("div",{className:"stream-tile-meta",children:[W.jsxs("div",{className:"stream-tile-name",children:[n," (Du)"]}),W.jsx("div",{className:"stream-tile-title",children:s})]}),W.jsx("span",{className:"stream-tile-time",children:S&&((ce=e.find(Ie=>Ie.id===S))!=null&&ce.startedAt)?x7(e.find(Ie=>Ie.id===S).startedAt):"0:00"})]})]}),e.filter(Ie=>Ie.id!==S).map(Ie=>W.jsxs("div",{className:"stream-tile",onClick:()=>_e(Ie),children:[W.jsxs("div",{className:"stream-tile-preview",children:[W.jsx("span",{className:"stream-tile-icon",children:"๐Ÿ–ฅ๏ธ"}),W.jsxs("span",{className:"stream-live-badge",children:[W.jsx("span",{className:"stream-live-dot"})," LIVE"]}),W.jsxs("span",{className:"stream-tile-viewers",children:["๐Ÿ‘ฅ"," ",Ie.viewerCount]}),Ie.hasPassword&&W.jsx("span",{className:"stream-tile-lock",children:"๐Ÿ”’"})]}),W.jsxs("div",{className:"stream-tile-info",children:[W.jsxs("div",{className:"stream-tile-meta",children:[W.jsx("div",{className:"stream-tile-name",children:Ie.broadcasterName}),W.jsx("div",{className:"stream-tile-title",children:Ie.title})]}),W.jsx("span",{className:"stream-tile-time",children:x7(Ie.startedAt)}),W.jsx("button",{className:"stream-tile-menu",onClick:We=>We.stopPropagation(),children:"โ‹ฎ"})]})]},Ie.id))]}),v&&W.jsx("div",{className:"stream-pw-overlay",onClick:()=>x(null),children:W.jsxs("div",{className:"stream-pw-modal",onClick:Ie=>Ie.stopPropagation(),children:[W.jsx("h3",{children:v.broadcasterName}),W.jsx("p",{children:v.streamTitle}),v.error&&W.jsx("div",{className:"stream-pw-modal-error",children:v.error}),W.jsx("input",{className:"stream-input",type:"password",placeholder:"Stream-Passwort",value:v.password,onChange:Ie=>x(We=>We&&{...We,password:Ie.target.value,error:null}),onKeyDown:Ie=>{Ie.key==="Enter"&&De()},autoFocus:!0}),W.jsxs("div",{className:"stream-pw-actions",children:[W.jsx("button",{className:"stream-pw-cancel",onClick:()=>x(null),children:"Abbrechen"}),W.jsx("button",{className:"stream-btn",onClick:De,children:"Beitreten"})]})]})})]})}const Yde={radio:xde,soundboard:qde,lolstats:$de,streaming:Xde};function Qde(){const[i,e]=Oe.useState(!1),[t,n]=Oe.useState([]),[r,s]=Oe.useState(()=>localStorage.getItem("hub_activeTab")??""),a=x=>{s(x),localStorage.setItem("hub_activeTab",x)},[l,u]=Oe.useState({}),h=Oe.useRef(null);Oe.useEffect(()=>{fetch("/api/plugins").then(x=>x.json()).then(x=>{n(x);const S=localStorage.getItem("hub_activeTab"),w=x.some(R=>R.name===S);x.length>0&&!w&&a(x[0].name)}).catch(()=>{})},[]),Oe.useEffect(()=>{let x=null,S;function w(){x=new EventSource("/api/events"),h.current=x,x.onopen=()=>e(!0),x.onmessage=R=>{try{const C=JSON.parse(R.data);C.type==="snapshot"?u(E=>({...E,...C})):C.plugin&&u(E=>({...E,[C.plugin]:{...E[C.plugin]||{},...C}}))}catch{}},x.onerror=()=>{e(!1),x==null||x.close(),S=setTimeout(w,3e3)}}return w(),()=>{x==null||x.close(),clearTimeout(S)}},[]);const g="1.0.0-dev",v={radio:"๐ŸŒ",soundboard:"๐ŸŽต",lolstats:"โš”๏ธ",stats:"๐Ÿ“Š",events:"๐Ÿ“…",games:"๐ŸŽฒ",gamevote:"๐ŸŽฎ",streaming:"๐Ÿ“บ"};return W.jsxs("div",{className:"hub-app",children:[W.jsxs("header",{className:"hub-header",children:[W.jsxs("div",{className:"hub-header-left",children:[W.jsx("span",{className:"hub-logo",children:"๐ŸŽฎ"}),W.jsx("span",{className:"hub-title",children:"Gaming Hub"}),W.jsx("span",{className:`hub-conn-dot ${i?"online":""}`})]}),W.jsx("nav",{className:"hub-tabs",children:t.map(x=>W.jsxs("button",{className:`hub-tab ${r===x.name?"active":""}`,onClick:()=>a(x.name),title:x.description,children:[W.jsx("span",{className:"hub-tab-icon",children:v[x.name]??"๐Ÿ“ฆ"}),W.jsx("span",{className:"hub-tab-label",children:x.name})]},x.name))}),W.jsx("div",{className:"hub-header-right",children:W.jsxs("span",{className:"hub-version",children:["v",g]})})]}),W.jsx("main",{className:"hub-content",children:t.length===0?W.jsxs("div",{className:"hub-empty",children:[W.jsx("span",{className:"hub-empty-icon",children:"๐Ÿ“ฆ"}),W.jsx("h2",{children:"Keine Plugins geladen"}),W.jsx("p",{children:"Plugins werden im Server konfiguriert."})]}):t.map(x=>{const S=Yde[x.name];if(!S)return null;const w=r===x.name;return W.jsx("div",{className:`hub-tab-panel ${w?"active":""}`,style:w?{display:"flex",flexDirection:"column",width:"100%",height:"100%"}:{display:"none"},children:W.jsx(S,{data:l[x.name]||{}})},x.name)})})]})}PF.createRoot(document.getElementById("root")).render(W.jsx(Qde,{})); +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function f7(i,e){var t=Object.keys(i);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(i);e&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(i,r).enumerable})),t.push.apply(t,n)}return t}function jf(i){for(var e=1;e1?l-1:0),h=1;h1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,r=a();if(t.lat===void 0&&t.lng===void 0&&t.altitude===void 0)return r;var s=Object.assign({},r,t);if(["lat","lng","altitude"].forEach(function(u){return s[u]=+s[u]}),!n)l(s);else{for(;r.lng-s.lng>180;)r.lng-=360;for(;r.lng-s.lng<-180;)r.lng+=360;e.tweenGroup.add(new ca(r).to(s,n).easing(os.Cubic.InOut).onUpdate(l).start())}return this;function a(){return e.globe.toGeoCoords(e.renderObjs.cameraPosition())}function l(u){var h=u.lat,g=u.lng,v=u.altitude;e.renderObjs.cameraPosition(e.globe.getCoords(h,g,v)),e.globe.setPointOfView(e.renderObjs.camera())}},getScreenCoords:function(e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),s=1;slocalStorage.getItem("radio-theme")||"default"),[a,l]=Oe.useState([]),[u,h]=Oe.useState(null),[g,v]=Oe.useState([]),[x,S]=Oe.useState(!1),[w,R]=Oe.useState({}),[C,E]=Oe.useState([]),[B,L]=Oe.useState(""),[O,z]=Oe.useState(""),[G,k]=Oe.useState(""),[H,F]=Oe.useState([]),[V,Y]=Oe.useState(!1),[J,te]=Oe.useState([]),[se,ne]=Oe.useState(!1),[Z,oe]=Oe.useState(!1),[fe,be]=Oe.useState(.5),[Se,le]=Oe.useState(null),[we,He]=Oe.useState(!1),[Te,ke]=Oe.useState(!1),_e=Oe.useRef(void 0),De=Oe.useRef(void 0),gt=Oe.useRef(B);Oe.useEffect(()=>{fetch("/api/radio/places").then(X=>X.json()).then(l).catch(console.error),fetch("/api/radio/guilds").then(X=>X.json()).then(X=>{if(E(X),X.length>0){L(X[0].id);const Ee=X[0].voiceChannels.find(je=>je.members>0)??X[0].voiceChannels[0];Ee&&z(Ee.id)}}).catch(console.error),fetch("/api/radio/favorites").then(X=>X.json()).then(te).catch(console.error)},[]),Oe.useEffect(()=>{gt.current=B},[B]),Oe.useEffect(()=>{i!=null&&i.guildId&&"playing"in i&&i.type!=="radio_voicestats"?R(X=>{if(i.playing)return{...X,[i.guildId]:i.playing};const Ee={...X};return delete Ee[i.guildId],Ee}):i!=null&&i.playing&&!(i!=null&&i.guildId)&&R(i.playing),i!=null&&i.favorites&&te(i.favorites),i!=null&&i.volumes&&B&&i.volumes[B]!=null&&be(i.volumes[B]),(i==null?void 0:i.volume)!=null&&(i==null?void 0:i.guildId)===B&&be(i.volume),(i==null?void 0:i.type)==="radio_voicestats"&&i.guildId===gt.current&&le({voicePing:i.voicePing,gatewayPing:i.gatewayPing,status:i.status,channelName:i.channelName,connectedSince:i.connectedSince})},[i,B]),Oe.useEffect(()=>{if(localStorage.setItem("radio-theme",r),t.current&&e.current){const Ee=getComputedStyle(e.current.parentElement).getPropertyValue("--accent-rgb").trim();t.current.pointColor(()=>`rgba(${Ee}, 0.85)`).atmosphereColor(`rgba(${Ee}, 0.25)`)}},[r]);const xt=Oe.useRef(u);xt.current=u;const Mt=Oe.useRef(se);Mt.current=se;const It=Oe.useCallback(()=>{var Ee;const X=(Ee=t.current)==null?void 0:Ee.controls();X&&(X.autoRotate=!1),n.current&&clearTimeout(n.current),n.current=setTimeout(()=>{var st;if(xt.current||Mt.current)return;const je=(st=t.current)==null?void 0:st.controls();je&&(je.autoRotate=!0)},5e3)},[]);Oe.useEffect(()=>{var Ee;const X=(Ee=t.current)==null?void 0:Ee.controls();X&&(u||se?(X.autoRotate=!1,n.current&&clearTimeout(n.current)):X.autoRotate=!0)},[u,se]);const Ke=Oe.useRef(void 0);Ke.current=X=>{h(X),ne(!1),S(!0),v([]),It(),t.current&&t.current.pointOfView({lat:X.geo[1],lng:X.geo[0],altitude:.4},800),fetch(`/api/radio/place/${X.id}/channels`).then(Ee=>Ee.json()).then(Ee=>{v(Ee),S(!1)}).catch(()=>S(!1))},Oe.useEffect(()=>{const X=e.current;if(!X)return;X.clientWidth>0&&X.clientHeight>0&&ke(!0);const Ee=new ResizeObserver(je=>{for(const st of je){const{width:it,height:Ht}=st.contentRect;it>0&&Ht>0&&ke(!0)}});return Ee.observe(X),()=>Ee.disconnect()},[]),Oe.useEffect(()=>{if(!e.current||a.length===0)return;const X=e.current.clientWidth,Ee=e.current.clientHeight;if(t.current){t.current.pointsData(a),X>0&&Ee>0&&t.current.width(X).height(Ee);return}if(X===0||Ee===0)return;const st=getComputedStyle(e.current.parentElement).getPropertyValue("--accent-rgb").trim()||"230, 126, 34",it=new _de(e.current).backgroundColor("rgba(0,0,0,0)").atmosphereColor(`rgba(${st}, 0.25)`).atmosphereAltitude(.12).globeImageUrl("/nasa-blue-marble.jpg").pointsData(a).pointLat(jt=>jt.geo[1]).pointLng(jt=>jt.geo[0]).pointColor(()=>`rgba(${st}, 0.85)`).pointRadius(jt=>Math.max(.12,Math.min(.45,.06+(jt.size??1)*.005))).pointAltitude(.001).pointResolution(24).pointLabel(jt=>`
${jt.title}
${jt.country}
`).onPointClick(jt=>{var kt;return(kt=Ke.current)==null?void 0:kt.call(Ke,jt)}).width(e.current.clientWidth).height(e.current.clientHeight);it.renderer().setPixelRatio(window.devicePixelRatio),it.pointOfView({lat:48,lng:10,altitude:GS});const Ht=it.controls();Ht&&(Ht.autoRotate=!0,Ht.autoRotateSpeed=.3);let Ut=GS;const $t=()=>{const kt=it.pointOfView().altitude;if(Math.abs(kt-Ut)/Ut<.05)return;Ut=kt;const qt=Math.sqrt(kt/GS);it.pointRadius(In=>Math.max(.12,Math.min(.45,.06+(In.size??1)*.005))*Math.max(.15,Math.min(2.5,qt)))};Ht.addEventListener("change",$t),t.current=it;const ln=e.current,wt=()=>It();ln.addEventListener("mousedown",wt),ln.addEventListener("touchstart",wt),ln.addEventListener("wheel",wt);const Zt=()=>{if(e.current&&t.current){const jt=e.current.clientWidth,kt=e.current.clientHeight;jt>0&&kt>0&&t.current.width(jt).height(kt)}};window.addEventListener("resize",Zt);const rn=new ResizeObserver(()=>Zt());return rn.observe(ln),()=>{Ht.removeEventListener("change",$t),ln.removeEventListener("mousedown",wt),ln.removeEventListener("touchstart",wt),ln.removeEventListener("wheel",wt),window.removeEventListener("resize",Zt),rn.disconnect()}},[a,It,Te]);const ot=Oe.useCallback(async(X,Ee,je,st)=>{if(!(!B||!O)){oe(!0);try{(await(await fetch("/api/radio/play",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:B,voiceChannelId:O,stationId:X,stationName:Ee,placeName:je??(u==null?void 0:u.title)??"",country:st??(u==null?void 0:u.country)??""})})).json()).ok&&(R(Ut=>{var $t,ln;return{...Ut,[B]:{stationId:X,stationName:Ee,placeName:je??(u==null?void 0:u.title)??"",country:st??(u==null?void 0:u.country)??"",startedAt:new Date().toISOString(),channelName:((ln=($t=C.find(wt=>wt.id===B))==null?void 0:$t.voiceChannels.find(wt=>wt.id===O))==null?void 0:ln.name)??""}}}),It())}catch(it){console.error(it)}oe(!1)}},[B,O,u,C]),ce=Oe.useCallback(async()=>{B&&(await fetch("/api/radio/stop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:B})}),R(X=>{const Ee={...X};return delete Ee[B],Ee}))},[B]),Ie=Oe.useCallback(X=>{if(k(X),_e.current&&clearTimeout(_e.current),!X.trim()){F([]),Y(!1);return}_e.current=setTimeout(async()=>{try{const je=await(await fetch(`/api/radio/search?q=${encodeURIComponent(X)}`)).json();F(je),Y(!0)}catch{F([])}},350)},[]),We=Oe.useCallback(X=>{var Ee,je,st;if(Y(!1),k(""),F([]),X.type==="channel"){const it=(Ee=X.url.match(/\/listen\/[^/]+\/([^/]+)/))==null?void 0:Ee[1];it&&ot(it,X.title,X.subtitle,"")}else if(X.type==="place"){const it=(je=X.url.match(/\/visit\/[^/]+\/([^/]+)/))==null?void 0:je[1],Ht=a.find(Ut=>Ut.id===it);Ht&&((st=Ke.current)==null||st.call(Ke,Ht))}},[a,ot]),tt=Oe.useCallback(async(X,Ee)=>{try{const st=await(await fetch("/api/radio/favorites",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stationId:X,stationName:Ee,placeName:(u==null?void 0:u.title)??"",country:(u==null?void 0:u.country)??"",placeId:(u==null?void 0:u.id)??""})})).json();st.favorites&&te(st.favorites)}catch{}},[u]),nt=Oe.useCallback(X=>{be(X),B&&(De.current&&clearTimeout(De.current),De.current=setTimeout(()=>{fetch("/api/radio/volume",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:B,volume:X})}).catch(console.error)},100))},[B]),Ft=X=>J.some(Ee=>Ee.stationId===X),dt=B?w[B]:null,he=C.find(X=>X.id===B);return W.jsxs("div",{className:"radio-container","data-theme":r,children:[W.jsxs("header",{className:"radio-topbar",children:[W.jsxs("div",{className:"radio-topbar-left",children:[W.jsx("span",{className:"radio-topbar-logo",children:"๐ŸŒ"}),W.jsx("span",{className:"radio-topbar-title",children:"World Radio"}),C.length>1&&W.jsx("select",{className:"radio-sel",value:B,onChange:X=>{L(X.target.value);const Ee=C.find(st=>st.id===X.target.value),je=(Ee==null?void 0:Ee.voiceChannels.find(st=>st.members>0))??(Ee==null?void 0:Ee.voiceChannels[0]);z((je==null?void 0:je.id)??"")},children:C.map(X=>W.jsx("option",{value:X.id,children:X.name},X.id))}),W.jsxs("select",{className:"radio-sel",value:O,onChange:X=>z(X.target.value),children:[W.jsx("option",{value:"",children:"Voice Channel..."}),he==null?void 0:he.voiceChannels.map(X=>W.jsxs("option",{value:X.id,children:["๐Ÿ”Š"," ",X.name,X.members>0?` (${X.members})`:""]},X.id))]})]}),dt&&W.jsxs("div",{className:"radio-topbar-np",children:[W.jsxs("div",{className:"radio-eq radio-eq-np",children:[W.jsx("span",{}),W.jsx("span",{}),W.jsx("span",{})]}),W.jsxs("div",{className:"radio-np-info",children:[W.jsx("span",{className:"radio-np-name",children:dt.stationName}),W.jsxs("span",{className:"radio-np-loc",children:[dt.placeName,dt.country?`, ${dt.country}`:""]})]})]}),W.jsxs("div",{className:"radio-topbar-right",children:[dt&&W.jsxs(W.Fragment,{children:[W.jsxs("div",{className:"radio-volume",children:[W.jsx("span",{className:"radio-volume-icon",children:fe===0?"๐Ÿ”‡":fe<.4?"๐Ÿ”‰":"๐Ÿ”Š"}),W.jsx("input",{type:"range",className:"radio-volume-slider",min:0,max:1,step:.01,value:fe,onChange:X=>nt(Number(X.target.value))}),W.jsxs("span",{className:"radio-volume-val",children:[Math.round(fe*100),"%"]})]}),W.jsxs("div",{className:"radio-conn",onClick:()=>He(!0),title:"Verbindungsdetails",children:[W.jsx("span",{className:"radio-conn-dot"}),"Verbunden",(Se==null?void 0:Se.voicePing)!=null&&W.jsxs("span",{className:"radio-conn-ping",children:[Se.voicePing,"ms"]})]}),W.jsxs("button",{className:"radio-topbar-stop",onClick:ce,children:["โน"," Stop"]})]}),W.jsx("div",{className:"radio-theme-inline",children:yde.map(X=>W.jsx("div",{className:`radio-theme-dot ${r===X.id?"active":""}`,style:{background:X.color},title:X.label,onClick:()=>s(X.id)},X.id))})]})]}),W.jsxs("div",{className:"radio-globe-wrap",children:[W.jsx("div",{className:"radio-globe",ref:e}),W.jsxs("div",{className:"radio-search",children:[W.jsxs("div",{className:"radio-search-wrap",children:[W.jsx("span",{className:"radio-search-icon",children:"๐Ÿ”"}),W.jsx("input",{className:"radio-search-input",type:"text",placeholder:"Sender oder Stadt suchen...",value:G,onChange:X=>Ie(X.target.value),onFocus:()=>{H.length&&Y(!0)}}),G&&W.jsx("button",{className:"radio-search-clear",onClick:()=>{k(""),F([]),Y(!1)},children:"โœ•"})]}),V&&H.length>0&&W.jsx("div",{className:"radio-search-results",children:H.slice(0,12).map(X=>W.jsxs("button",{className:"radio-search-result",onClick:()=>We(X),children:[W.jsx("span",{className:"radio-search-result-icon",children:X.type==="channel"?"๐Ÿ“ป":X.type==="place"?"๐Ÿ“":"๐ŸŒ"}),W.jsxs("div",{className:"radio-search-result-text",children:[W.jsx("span",{className:"radio-search-result-title",children:X.title}),W.jsx("span",{className:"radio-search-result-sub",children:X.subtitle})]})]},X.id+X.url))})]}),!u&&!se&&W.jsxs("button",{className:"radio-fab",onClick:()=>{ne(!0),h(null)},title:"Favoriten",children:["โญ",J.length>0&&W.jsx("span",{className:"radio-fab-badge",children:J.length})]}),se&&W.jsxs("div",{className:"radio-panel open",children:[W.jsxs("div",{className:"radio-panel-header",children:[W.jsxs("h3",{children:["โญ"," Favoriten"]}),W.jsx("button",{className:"radio-panel-close",onClick:()=>ne(!1),children:"โœ•"})]}),W.jsx("div",{className:"radio-panel-body",children:J.length===0?W.jsx("div",{className:"radio-panel-empty",children:"Noch keine Favoriten"}):J.map(X=>W.jsxs("div",{className:`radio-station ${(dt==null?void 0:dt.stationId)===X.stationId?"playing":""}`,children:[W.jsxs("div",{className:"radio-station-info",children:[W.jsx("span",{className:"radio-station-name",children:X.stationName}),W.jsxs("span",{className:"radio-station-loc",children:[X.placeName,", ",X.country]})]}),W.jsxs("div",{className:"radio-station-btns",children:[W.jsx("button",{className:"radio-btn-play",onClick:()=>ot(X.stationId,X.stationName,X.placeName,X.country),disabled:!O||Z,children:"โ–ถ"}),W.jsx("button",{className:"radio-btn-fav active",onClick:()=>tt(X.stationId,X.stationName),children:"โ˜…"})]})]},X.stationId))})]}),u&&!se&&W.jsxs("div",{className:"radio-panel open",children:[W.jsxs("div",{className:"radio-panel-header",children:[W.jsxs("div",{children:[W.jsx("h3",{children:u.title}),W.jsx("span",{className:"radio-panel-sub",children:u.country})]}),W.jsx("button",{className:"radio-panel-close",onClick:()=>h(null),children:"โœ•"})]}),W.jsx("div",{className:"radio-panel-body",children:x?W.jsxs("div",{className:"radio-panel-loading",children:[W.jsx("div",{className:"radio-spinner"}),"Sender werden geladen..."]}):g.length===0?W.jsx("div",{className:"radio-panel-empty",children:"Keine Sender gefunden"}):g.map(X=>W.jsxs("div",{className:`radio-station ${(dt==null?void 0:dt.stationId)===X.id?"playing":""}`,children:[W.jsxs("div",{className:"radio-station-info",children:[W.jsx("span",{className:"radio-station-name",children:X.title}),(dt==null?void 0:dt.stationId)===X.id&&W.jsxs("span",{className:"radio-station-live",children:[W.jsxs("span",{className:"radio-eq",children:[W.jsx("span",{}),W.jsx("span",{}),W.jsx("span",{})]}),"Live"]})]}),W.jsxs("div",{className:"radio-station-btns",children:[(dt==null?void 0:dt.stationId)===X.id?W.jsx("button",{className:"radio-btn-stop",onClick:ce,children:"โน"}):W.jsx("button",{className:"radio-btn-play",onClick:()=>ot(X.id,X.title),disabled:!O||Z,children:"โ–ถ"}),W.jsx("button",{className:`radio-btn-fav ${Ft(X.id)?"active":""}`,onClick:()=>tt(X.id,X.title),children:Ft(X.id)?"โ˜…":"โ˜†"})]})]},X.id))})]}),W.jsxs("div",{className:"radio-counter",children:["๐Ÿ“ป"," ",a.length.toLocaleString("de-DE")," Sender weltweit"]}),W.jsx("a",{className:"radio-attribution",href:"https://science.nasa.gov/earth/earth-observatory/blue-marble-next-generation/",target:"_blank",rel:"noreferrer",children:"Imagery ยฉ NASA Blue Marble"})]}),we&&(()=>{const X=Se!=null&&Se.connectedSince?Math.floor((Date.now()-new Date(Se.connectedSince).getTime())/1e3):0,Ee=Math.floor(X/3600),je=Math.floor(X%3600/60),st=X%60,it=Ee>0?`${Ee}h ${String(je).padStart(2,"0")}m ${String(st).padStart(2,"0")}s`:je>0?`${je}m ${String(st).padStart(2,"0")}s`:`${st}s`,Ht=Ut=>Ut==null?"var(--text-faint)":Ut<80?"var(--success)":Ut<150?"#f0a830":"#e04040";return W.jsx("div",{className:"radio-modal-overlay",onClick:()=>He(!1),children:W.jsxs("div",{className:"radio-modal",onClick:Ut=>Ut.stopPropagation(),children:[W.jsxs("div",{className:"radio-modal-header",children:[W.jsx("span",{children:"๐Ÿ“ก"}),W.jsx("span",{children:"Verbindungsdetails"}),W.jsx("button",{className:"radio-modal-close",onClick:()=>He(!1),children:"โœ•"})]}),W.jsxs("div",{className:"radio-modal-body",children:[W.jsxs("div",{className:"radio-modal-stat",children:[W.jsx("span",{className:"radio-modal-label",children:"Voice Ping"}),W.jsxs("span",{className:"radio-modal-value",children:[W.jsx("span",{className:"radio-modal-dot",style:{background:Ht((Se==null?void 0:Se.voicePing)??null)}}),(Se==null?void 0:Se.voicePing)!=null?`${Se.voicePing} ms`:"---"]})]}),W.jsxs("div",{className:"radio-modal-stat",children:[W.jsx("span",{className:"radio-modal-label",children:"Gateway Ping"}),W.jsxs("span",{className:"radio-modal-value",children:[W.jsx("span",{className:"radio-modal-dot",style:{background:Ht((Se==null?void 0:Se.gatewayPing)??null)}}),Se&&Se.gatewayPing>=0?`${Se.gatewayPing} ms`:"---"]})]}),W.jsxs("div",{className:"radio-modal-stat",children:[W.jsx("span",{className:"radio-modal-label",children:"Status"}),W.jsx("span",{className:"radio-modal-value",style:{color:(Se==null?void 0:Se.status)==="ready"?"var(--success)":"#f0a830"},children:(Se==null?void 0:Se.status)==="ready"?"Verbunden":(Se==null?void 0:Se.status)??"Warte auf Verbindung"})]}),W.jsxs("div",{className:"radio-modal-stat",children:[W.jsx("span",{className:"radio-modal-label",children:"Kanal"}),W.jsx("span",{className:"radio-modal-value",children:(Se==null?void 0:Se.channelName)||"---"})]}),W.jsxs("div",{className:"radio-modal-stat",children:[W.jsx("span",{className:"radio-modal-label",children:"Verbunden seit"}),W.jsx("span",{className:"radio-modal-value",children:it||"---"})]})]})]})})})()]})}function bde(i,e,t=365){const n=new Date(Date.now()+t*24*60*60*1e3).toUTCString();document.cookie=`${encodeURIComponent(i)}=${encodeURIComponent(e)}; expires=${n}; path=/; SameSite=Lax`}function Sde(i){const e=`${encodeURIComponent(i)}=`,t=document.cookie.split(";");for(const n of t){const r=n.trim();if(r.startsWith(e))return decodeURIComponent(r.slice(e.length))}return null}const us="/api/soundboard";async function A7(i,e,t,n){const r=new URL(`${us}/sounds`,window.location.origin);i&&r.searchParams.set("q",i),e!==void 0&&r.searchParams.set("folder",e),r.searchParams.set("fuzzy","0");const s=await fetch(r.toString());if(!s.ok)throw new Error("Fehler beim Laden der Sounds");return s.json()}async function Tde(){const i=await fetch(`${us}/analytics`);if(!i.ok)throw new Error("Fehler beim Laden der Analytics");return i.json()}async function wde(){const i=await fetch(`${us}/categories`,{credentials:"include"});if(!i.ok)throw new Error("Fehler beim Laden der Kategorien");return i.json()}async function Mde(){const i=await fetch(`${us}/channels`);if(!i.ok)throw new Error("Fehler beim Laden der Channels");return i.json()}async function Ede(){const i=await fetch(`${us}/selected-channels`);if(!i.ok)throw new Error("Fehler beim Laden der Channel-Auswahl");const e=await i.json();return(e==null?void 0:e.selected)||{}}async function Cde(i,e){if(!(await fetch(`${us}/selected-channel`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:i,channelId:e})})).ok)throw new Error("Channel-Auswahl setzen fehlgeschlagen")}async function Rde(i,e,t,n,r){const s=await fetch(`${us}/play`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({soundName:i,guildId:e,channelId:t,volume:n,relativePath:r})});if(!s.ok){const a=await s.json().catch(()=>({}));throw new Error((a==null?void 0:a.error)||"Play fehlgeschlagen")}}async function Nde(i,e,t,n,r){const s=await fetch(`${us}/play-url`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:i,guildId:e,channelId:t,volume:n,filename:r})}),a=await s.json().catch(()=>({}));if(!s.ok)throw new Error((a==null?void 0:a.error)||"Play-URL fehlgeschlagen");return a}async function Dde(i,e){const t=await fetch(`${us}/download-url`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:i,filename:e})}),n=await t.json().catch(()=>({}));if(!t.ok)throw new Error((n==null?void 0:n.error)||"Download fehlgeschlagen");return n}async function Pde(i,e){if(!(await fetch(`${us}/party/start`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:i,channelId:e})})).ok)throw new Error("Partymode Start fehlgeschlagen")}async function Lde(i){if(!(await fetch(`${us}/party/stop`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:i})})).ok)throw new Error("Partymode Stop fehlgeschlagen")}async function d7(i,e){const t=await fetch(`${us}/volume`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({guildId:i,volume:e})});if(!t.ok){const n=await t.json().catch(()=>({}));throw new Error((n==null?void 0:n.error)||"Volume aendern fehlgeschlagen")}}async function Ude(i){const e=new URL(`${us}/volume`,window.location.origin);e.searchParams.set("guildId",i);const t=await fetch(e.toString());if(!t.ok)throw new Error("Fehler beim Laden der Lautstaerke");const n=await t.json();return typeof(n==null?void 0:n.volume)=="number"?n.volume:1}async function Bde(){const i=await fetch(`${us}/admin/status`,{credentials:"include"});if(!i.ok)return!1;const e=await i.json();return!!(e!=null&&e.authenticated)}async function Ode(i){return(await fetch(`${us}/admin/login`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({password:i})})).ok}async function Ide(){await fetch(`${us}/admin/logout`,{method:"POST",credentials:"include"})}async function Fde(i){if(!(await fetch(`${us}/admin/sounds/delete`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({paths:i})})).ok)throw new Error("Loeschen fehlgeschlagen")}async function kde(i,e){const t=await fetch(`${us}/admin/sounds/rename`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({from:i,to:e})});if(!t.ok)throw new Error("Umbenennen fehlgeschlagen");const n=await t.json();return n==null?void 0:n.to}function zde(i,e){return new Promise((t,n)=>{const r=new FormData;r.append("files",i);const s=new XMLHttpRequest;s.open("POST",`${us}/upload`),s.upload.onprogress=a=>{a.lengthComputable&&e(Math.round(a.loaded/a.total*100))},s.onload=()=>{var a,l;if(s.status===200)try{const u=JSON.parse(s.responseText);t(((l=(a=u.files)==null?void 0:a[0])==null?void 0:l.name)??i.name)}catch{t(i.name)}else try{n(new Error(JSON.parse(s.responseText).error))}catch{n(new Error(`HTTP ${s.status}`))}},s.onerror=()=>n(new Error("Netzwerkfehler")),s.send(r)})}const Gde=[{id:"default",color:"#5865f2",label:"Discord"},{id:"purple",color:"#9b59b6",label:"Midnight"},{id:"forest",color:"#2ecc71",label:"Forest"},{id:"sunset",color:"#e67e22",label:"Sunset"},{id:"ocean",color:"#3498db",label:"Ocean"}],p7=["#3b82f6","#f59e0b","#8b5cf6","#ec4899","#14b8a6","#f97316","#06b6d4","#ef4444","#a855f7","#84cc16","#d946ef","#0ea5e9","#f43f5e","#10b981"];function qde({data:i}){const[e,t]=Oe.useState([]),[n,r]=Oe.useState(0),[s,a]=Oe.useState([]),[l,u]=Oe.useState([]),[h,g]=Oe.useState({totalSounds:0,totalPlays:0,mostPlayed:[]}),[v,x]=Oe.useState("all"),[S,w]=Oe.useState(""),[R,C]=Oe.useState(""),[E,B]=Oe.useState(""),[L,O]=Oe.useState(!1),[z,G]=Oe.useState(null),[k,H]=Oe.useState([]),[F,V]=Oe.useState(""),Y=Oe.useRef(""),[J,te]=Oe.useState(!1),[se,ne]=Oe.useState(1),[Z,oe]=Oe.useState(""),[fe,be]=Oe.useState({}),[Se,le]=Oe.useState(()=>localStorage.getItem("jb-theme")||"default"),[we,He]=Oe.useState(()=>parseInt(localStorage.getItem("jb-card-size")||"110")),[Te,ke]=Oe.useState(!1),[_e,De]=Oe.useState([]),gt=Oe.useRef(!1),xt=Oe.useRef(void 0),[Mt,It]=Oe.useState(!1),[Ke,ot]=Oe.useState(!1),[ce,Ie]=Oe.useState(""),[We,tt]=Oe.useState([]),[nt,Ft]=Oe.useState(!1),[dt,he]=Oe.useState(""),[X,Ee]=Oe.useState({}),[je,st]=Oe.useState(""),[it,Ht]=Oe.useState(""),[Ut,$t]=Oe.useState(!1),[ln,wt]=Oe.useState([]),[Zt,rn]=Oe.useState(!1),jt=Oe.useRef(0),kt=Oe.useRef(void 0),[qt,In]=Oe.useState(null),[Mi,me]=Oe.useState(!1),[Wt,at]=Oe.useState(null),[bt,Xt]=Oe.useState(""),[zt,xn]=Oe.useState(null),[qi,rr]=Oe.useState(0);Oe.useEffect(()=>{gt.current=Te},[Te]),Oe.useEffect(()=>{Y.current=F},[F]),Oe.useEffect(()=>{const ve=cn=>{var Yn;Array.from(((Yn=cn.dataTransfer)==null?void 0:Yn.items)??[]).some(yi=>yi.kind==="file")&&(jt.current++,$t(!0))},ct=()=>{jt.current=Math.max(0,jt.current-1),jt.current===0&&$t(!1)},Rt=cn=>cn.preventDefault(),Jt=cn=>{var yi;cn.preventDefault(),jt.current=0,$t(!1);const Yn=Array.from(((yi=cn.dataTransfer)==null?void 0:yi.files)??[]).filter(js=>/\.(mp3|wav)$/i.test(js.name));Yn.length&&Hs(Yn)};return window.addEventListener("dragenter",ve),window.addEventListener("dragleave",ct),window.addEventListener("dragover",Rt),window.addEventListener("drop",Jt),()=>{window.removeEventListener("dragenter",ve),window.removeEventListener("dragleave",ct),window.removeEventListener("dragover",Rt),window.removeEventListener("drop",Jt)}},[Mt]);const pn=Oe.useCallback((ve,ct="info")=>{at({msg:ve,type:ct}),setTimeout(()=>at(null),3e3)},[]),$i=Oe.useCallback(ve=>ve.relativePath??ve.fileName,[]),Jr=["youtube.com","www.youtube.com","m.youtube.com","youtu.be","music.youtube.com","instagram.com","www.instagram.com"],Ze=Oe.useCallback(ve=>{const ct=ve.trim();return!ct||/^https?:\/\//i.test(ct)?ct:"https://"+ct},[]),vt=Oe.useCallback(ve=>{try{const ct=new URL(Ze(ve)),Rt=ct.hostname.toLowerCase();return!!(ct.pathname.toLowerCase().endsWith(".mp3")||Jr.some(Jt=>Rt===Jt||Rt.endsWith("."+Jt)))}catch{return!1}},[Ze]),Ot=Oe.useCallback(ve=>{try{const ct=new URL(Ze(ve)),Rt=ct.hostname.toLowerCase();return Rt.includes("youtube")||Rt==="youtu.be"?"youtube":Rt.includes("instagram")?"instagram":ct.pathname.toLowerCase().endsWith(".mp3")?"mp3":null}catch{return null}},[Ze]),ut=F?F.split(":")[0]:"",d=F?F.split(":")[1]:"",ee=Oe.useMemo(()=>k.find(ve=>`${ve.guildId}:${ve.channelId}`===F),[k,F]);Oe.useEffect(()=>{const ve=()=>{const Rt=new Date,Jt=String(Rt.getHours()).padStart(2,"0"),cn=String(Rt.getMinutes()).padStart(2,"0"),Yn=String(Rt.getSeconds()).padStart(2,"0");Xt(`${Jt}:${cn}:${Yn}`)};ve();const ct=setInterval(ve,1e3);return()=>clearInterval(ct)},[]),Oe.useEffect(()=>{(async()=>{try{const[ve,ct]=await Promise.all([Mde(),Ede()]);if(H(ve),ve.length){const Rt=ve[0].guildId,Jt=ct[Rt],cn=Jt&&ve.find(Yn=>Yn.guildId===Rt&&Yn.channelId===Jt);V(cn?`${Rt}:${Jt}`:`${ve[0].guildId}:${ve[0].channelId}`)}}catch(ve){pn((ve==null?void 0:ve.message)||"Channel-Fehler","error")}try{It(await Bde())}catch{}try{const ve=await wde();u(ve.categories||[])}catch{}})()},[]),Oe.useEffect(()=>{localStorage.setItem("jb-theme",Se)},[Se]);const $n=Oe.useRef(null);Oe.useEffect(()=>{const ve=$n.current;if(!ve)return;ve.style.setProperty("--card-size",we+"px");const ct=we/110;ve.style.setProperty("--card-emoji",Math.round(28*ct)+"px"),ve.style.setProperty("--card-font",Math.max(9,Math.round(11*ct))+"px"),localStorage.setItem("jb-card-size",String(we))},[we]),Oe.useEffect(()=>{var ve,ct,Rt,Jt,cn,Yn,yi,js;if(i){if(i.soundboard){const pi=i.soundboard;Array.isArray(pi.party)&&De(pi.party);try{const Pr=pi.selected||{},Ei=(ve=Y.current)==null?void 0:ve.split(":")[0];Ei&&Pr[Ei]&&V(`${Ei}:${Pr[Ei]}`)}catch{}try{const Pr=pi.volumes||{},Ei=(ct=Y.current)==null?void 0:ct.split(":")[0];Ei&&typeof Pr[Ei]=="number"&&ne(Pr[Ei])}catch{}try{const Pr=pi.nowplaying||{},Ei=(Rt=Y.current)==null?void 0:Rt.split(":")[0];Ei&&typeof Pr[Ei]=="string"&&oe(Pr[Ei])}catch{}try{const Pr=pi.voicestats||{},Ei=(Jt=Y.current)==null?void 0:Jt.split(":")[0];Ei&&Pr[Ei]&&In(Pr[Ei])}catch{}}if(i.type==="soundboard_party")De(pi=>{const Pr=new Set(pi);return i.active?Pr.add(i.guildId):Pr.delete(i.guildId),Array.from(Pr)});else if(i.type==="soundboard_channel"){const pi=(cn=Y.current)==null?void 0:cn.split(":")[0];i.guildId===pi&&V(`${i.guildId}:${i.channelId}`)}else if(i.type==="soundboard_volume"){const pi=(Yn=Y.current)==null?void 0:Yn.split(":")[0];i.guildId===pi&&typeof i.volume=="number"&&ne(i.volume)}else if(i.type==="soundboard_nowplaying"){const pi=(yi=Y.current)==null?void 0:yi.split(":")[0];i.guildId===pi&&oe(i.name||"")}else if(i.type==="soundboard_voicestats"){const pi=(js=Y.current)==null?void 0:js.split(":")[0];i.guildId===pi&&In({voicePing:i.voicePing,gatewayPing:i.gatewayPing,status:i.status,channelName:i.channelName,connectedSince:i.connectedSince})}}},[i]),Oe.useEffect(()=>{ke(ut?_e.includes(ut):!1)},[F,_e,ut]),Oe.useEffect(()=>{(async()=>{try{let ve="__all__";v==="recent"?ve="__recent__":S&&(ve=S);const ct=await A7(R,ve,void 0,!1);t(ct.items),r(ct.total),a(ct.folders)}catch(ve){pn((ve==null?void 0:ve.message)||"Sounds-Fehler","error")}})()},[v,S,R,qi,pn]),Oe.useEffect(()=>{Gn()},[qi]),Oe.useEffect(()=>{const ve=Sde("favs");if(ve)try{be(JSON.parse(ve))}catch{}},[]),Oe.useEffect(()=>{try{bde("favs",JSON.stringify(fe))}catch{}},[fe]),Oe.useEffect(()=>{F&&(async()=>{try{const ve=await Ude(ut);ne(ve)}catch{}})()},[F]),Oe.useEffect(()=>{const ve=()=>{te(!1),xn(null)};return document.addEventListener("click",ve),()=>document.removeEventListener("click",ve)},[]),Oe.useEffect(()=>{Ke&&Mt&&ae()},[Ke,Mt]);async function Gn(){try{const ve=await Tde();g(ve)}catch{}}async function Xn(ve){if(!F)return pn("Bitte einen Voice-Channel auswaehlen","error");try{await Rde(ve.name,ut,d,se,ve.relativePath),oe(ve.name),Gn()}catch(ct){pn((ct==null?void 0:ct.message)||"Play fehlgeschlagen","error")}}function un(){var Jt;const ve=Ze(E);if(!ve)return pn("Bitte einen Link eingeben","error");if(!vt(ve))return pn("Nur YouTube, Instagram oder direkte MP3-Links","error");const ct=Ot(ve);let Rt="";if(ct==="mp3")try{Rt=((Jt=new URL(ve).pathname.split("/").pop())==null?void 0:Jt.replace(/\.mp3$/i,""))??""}catch{}G({url:ve,type:ct,filename:Rt,phase:"input"})}async function qn(){if(z){G(ve=>ve?{...ve,phase:"downloading"}:null);try{let ve;const ct=z.filename.trim()||void 0;F&&ut&&d?ve=(await Nde(z.url,ut,d,se,ct)).saved:ve=(await Dde(z.url,ct)).saved,G(Rt=>Rt?{...Rt,phase:"done",savedName:ve}:null),B(""),rr(Rt=>Rt+1),Gn(),setTimeout(()=>G(null),2500)}catch(ve){G(ct=>ct?{...ct,phase:"error",error:(ve==null?void 0:ve.message)||"Fehler"}:null)}}}async function Hs(ve){if(!Mt){pn("Admin-Login erforderlich zum Hochladen","error");return}kt.current&&clearTimeout(kt.current);const ct=ve.map(Jt=>({id:Math.random().toString(36).slice(2),file:Jt,status:"waiting",progress:0}));wt(ct),rn(!0);const Rt=[...ct];for(let Jt=0;Jt{Rt[Jt]={...Rt[Jt],progress:Yn},wt([...Rt])});Rt[Jt]={...Rt[Jt],status:"done",progress:100,savedName:cn}}catch(cn){Rt[Jt]={...Rt[Jt],status:"error",error:(cn==null?void 0:cn.message)??"Fehler"}}wt([...Rt])}rr(Jt=>Jt+1),Gn(),kt.current=setTimeout(()=>{rn(!1),wt([])},3500)}async function li(){if(F){oe("");try{await fetch(`${us}/stop?guildId=${encodeURIComponent(ut)}`,{method:"POST"})}catch{}}}async function Fn(){if(!K.length||!F)return;const ve=K[Math.floor(Math.random()*K.length)];Xn(ve)}async function cs(){if(Te){await li();try{await Lde(ut)}catch{}}else{if(!F)return pn("Bitte einen Channel auswaehlen","error");try{await Pde(ut,d)}catch{}}}async function Ma(ve){const ct=`${ve.guildId}:${ve.channelId}`;V(ct),te(!1);try{await Cde(ve.guildId,ve.channelId)}catch{}}function Ul(ve){be(ct=>({...ct,[ve]:!ct[ve]}))}async function ae(){Ft(!0);try{const ve=await A7("","__all__",void 0,!1);tt(ve.items||[])}catch(ve){pn((ve==null?void 0:ve.message)||"Admin-Sounds konnten nicht geladen werden","error")}finally{Ft(!1)}}function Ue(ve){Ee(ct=>({...ct,[ve]:!ct[ve]}))}function Ye(ve){st($i(ve)),Ht(ve.name)}function $e(){st(""),Ht("")}async function Be(){if(!je)return;const ve=it.trim().replace(/\.(mp3|wav)$/i,"");if(!ve){pn("Bitte einen gueltigen Namen eingeben","error");return}try{await kde(je,ve),pn("Sound umbenannt"),$e(),rr(ct=>ct+1),Ke&&await ae()}catch(ct){pn((ct==null?void 0:ct.message)||"Umbenennen fehlgeschlagen","error")}}async function Bt(ve){if(ve.length!==0)try{await Fde(ve),pn(ve.length===1?"Sound geloescht":`${ve.length} Sounds geloescht`),Ee({}),$e(),rr(ct=>ct+1),Ke&&await ae()}catch(ct){pn((ct==null?void 0:ct.message)||"Loeschen fehlgeschlagen","error")}}async function Vt(){try{await Ode(ce)?(It(!0),Ie(""),pn("Admin eingeloggt")):pn("Falsches Passwort","error")}catch{pn("Login fehlgeschlagen","error")}}async function pt(){try{await Ide(),It(!1),Ee({}),$e(),pn("Ausgeloggt")}catch{}}const K=Oe.useMemo(()=>v==="favorites"?e.filter(ve=>fe[ve.relativePath??ve.fileName]):e,[e,v,fe]),Lt=Oe.useMemo(()=>Object.values(fe).filter(Boolean).length,[fe]),bn=Oe.useMemo(()=>s.filter(ve=>!["__all__","__recent__","__top3__"].includes(ve.key)),[s]),fn=Oe.useMemo(()=>{const ve={};return bn.forEach((ct,Rt)=>{ve[ct.key]=p7[Rt%p7.length]}),ve},[bn]),ui=Oe.useMemo(()=>{const ve=new Set,ct=new Set;return K.forEach((Rt,Jt)=>{const cn=Rt.name.charAt(0).toUpperCase();ve.has(cn)||(ve.add(cn),ct.add(Jt))}),ct},[K]),ci=Oe.useMemo(()=>{const ve={};return k.forEach(ct=>{ve[ct.guildName]||(ve[ct.guildName]=[]),ve[ct.guildName].push(ct)}),ve},[k]),_i=Oe.useMemo(()=>{const ve=dt.trim().toLowerCase();return ve?We.filter(ct=>{const Rt=$i(ct).toLowerCase();return ct.name.toLowerCase().includes(ve)||(ct.folder||"").toLowerCase().includes(ve)||Rt.includes(ve)}):We},[dt,We,$i]),Q=Oe.useMemo(()=>Object.keys(X).filter(ve=>X[ve]),[X]),Ln=Oe.useMemo(()=>_i.filter(ve=>!!X[$i(ve)]).length,[_i,X,$i]),mn=_i.length>0&&Ln===_i.length,yr=h.mostPlayed.slice(0,10),hi=h.totalSounds||n,bs=bt.slice(0,5),fa=bt.slice(5);return W.jsxs("div",{className:"sb-app","data-theme":Se,ref:$n,children:[Te&&W.jsx("div",{className:"party-overlay active"}),W.jsxs("header",{className:"topbar",children:[W.jsxs("div",{className:"topbar-left",children:[W.jsx("div",{className:"sb-app-logo",children:W.jsx("span",{className:"material-icons",style:{fontSize:16,color:"white"},children:"music_note"})}),W.jsx("span",{className:"sb-app-title",children:"Soundboard"}),W.jsxs("div",{className:"channel-dropdown",onClick:ve=>ve.stopPropagation(),children:[W.jsxs("button",{className:`channel-btn ${J?"open":""}`,onClick:()=>te(!J),children:[W.jsx("span",{className:"material-icons cb-icon",children:"headset"}),F&&W.jsx("span",{className:"channel-status"}),W.jsx("span",{className:"channel-label",children:ee?`${ee.channelName}${ee.members?` (${ee.members})`:""}`:"Channel..."}),W.jsx("span",{className:"material-icons chevron",children:"expand_more"})]}),J&&W.jsxs("div",{className:"channel-menu visible",children:[Object.entries(ci).map(([ve,ct])=>W.jsxs(LF.Fragment,{children:[W.jsx("div",{className:"channel-menu-header",children:ve}),ct.map(Rt=>W.jsxs("div",{className:`channel-option ${`${Rt.guildId}:${Rt.channelId}`===F?"active":""}`,onClick:()=>Ma(Rt),children:[W.jsx("span",{className:"material-icons co-icon",children:"volume_up"}),Rt.channelName,Rt.members?` (${Rt.members})`:""]},`${Rt.guildId}:${Rt.channelId}`))]},ve)),k.length===0&&W.jsx("div",{className:"channel-option",style:{color:"var(--text-faint)",cursor:"default"},children:"Keine Channels verfuegbar"})]})]})]}),W.jsx("div",{className:"clock-wrap",children:W.jsxs("div",{className:"clock",children:[bs,W.jsx("span",{className:"clock-seconds",children:fa})]})}),W.jsxs("div",{className:"topbar-right",children:[Z&&W.jsxs("div",{className:"now-playing",children:[W.jsxs("div",{className:"np-waves active",children:[W.jsx("div",{className:"np-wave-bar"}),W.jsx("div",{className:"np-wave-bar"}),W.jsx("div",{className:"np-wave-bar"}),W.jsx("div",{className:"np-wave-bar"})]}),W.jsx("span",{className:"np-label",children:"Last Played:"})," ",W.jsx("span",{className:"np-name",children:Z})]}),F&&W.jsxs("div",{className:"connection",onClick:()=>me(!0),style:{cursor:"pointer"},title:"Verbindungsdetails",children:[W.jsx("span",{className:"conn-dot"}),"Verbunden",(qt==null?void 0:qt.voicePing)!=null&&W.jsxs("span",{className:"conn-ping",children:[qt.voicePing,"ms"]})]}),W.jsx("button",{className:`admin-btn-icon ${Mt?"active":""}`,onClick:()=>ot(!0),title:"Admin",children:W.jsx("span",{className:"material-icons",children:"settings"})})]})]}),W.jsxs("div",{className:"toolbar",children:[W.jsxs("div",{className:"cat-tabs",children:[W.jsxs("button",{className:`cat-tab ${v==="all"?"active":""}`,onClick:()=>{x("all"),w("")},children:["Alle",W.jsx("span",{className:"tab-count",children:n})]}),W.jsx("button",{className:`cat-tab ${v==="recent"?"active":""}`,onClick:()=>{x("recent"),w("")},children:"Neu hinzugefuegt"}),W.jsxs("button",{className:`cat-tab ${v==="favorites"?"active":""}`,onClick:()=>{x("favorites"),w("")},children:["Favoriten",Lt>0&&W.jsx("span",{className:"tab-count",children:Lt})]})]}),W.jsxs("div",{className:"search-wrap",children:[W.jsx("span",{className:"material-icons search-icon",children:"search"}),W.jsx("input",{className:"search-input",type:"text",placeholder:"Suchen...",value:R,onChange:ve=>C(ve.target.value)}),R&&W.jsx("button",{className:"search-clear",onClick:()=>C(""),children:W.jsx("span",{className:"material-icons",style:{fontSize:14},children:"close"})})]}),W.jsxs("div",{className:"url-import-wrap",children:[W.jsx("span",{className:"material-icons url-import-icon",children:Ot(E)==="youtube"?"smart_display":Ot(E)==="instagram"?"photo_camera":"link"}),W.jsx("input",{className:"url-import-input",type:"text",placeholder:"YouTube / Instagram / MP3-Link...",value:E,onChange:ve=>B(ve.target.value),onKeyDown:ve=>{ve.key==="Enter"&&un()}}),E&&W.jsx("span",{className:`url-import-tag ${vt(E)?"valid":"invalid"}`,children:Ot(E)==="youtube"?"YT":Ot(E)==="instagram"?"IG":Ot(E)==="mp3"?"MP3":"?"}),W.jsx("button",{className:"url-import-btn",onClick:()=>{un()},disabled:L||!!E&&!vt(E),title:"Sound herunterladen",children:L?"Laedt...":"Download"})]}),W.jsx("div",{className:"toolbar-spacer"}),W.jsxs("div",{className:"volume-control",children:[W.jsx("span",{className:"material-icons vol-icon",onClick:()=>{const ve=se>0?0:.5;ne(ve),ut&&d7(ut,ve).catch(()=>{})},children:se===0?"volume_off":se<.5?"volume_down":"volume_up"}),W.jsx("input",{type:"range",className:"vol-slider",min:0,max:1,step:.01,value:se,onChange:ve=>{const ct=parseFloat(ve.target.value);ne(ct),ut&&(xt.current&&clearTimeout(xt.current),xt.current=setTimeout(()=>{d7(ut,ct).catch(()=>{})},120))},style:{"--vol":`${Math.round(se*100)}%`}}),W.jsxs("span",{className:"vol-pct",children:[Math.round(se*100),"%"]})]}),W.jsxs("button",{className:"tb-btn random",onClick:Fn,title:"Zufaelliger Sound",children:[W.jsx("span",{className:"material-icons tb-icon",children:"shuffle"}),"Random"]}),W.jsxs("button",{className:`tb-btn party ${Te?"active":""}`,onClick:cs,title:"Party Mode",children:[W.jsx("span",{className:"material-icons tb-icon",children:Te?"celebration":"auto_awesome"}),Te?"Party!":"Party"]}),W.jsxs("button",{className:"tb-btn stop",onClick:li,title:"Alle stoppen",children:[W.jsx("span",{className:"material-icons tb-icon",children:"stop"}),"Stop"]}),W.jsxs("div",{className:"size-control",title:"Button-Groesse",children:[W.jsx("span",{className:"material-icons sc-icon",children:"grid_view"}),W.jsx("input",{type:"range",className:"size-slider",min:80,max:160,value:we,onChange:ve=>He(parseInt(ve.target.value))})]}),W.jsx("div",{className:"theme-selector",children:Gde.map(ve=>W.jsx("div",{className:`theme-dot ${Se===ve.id?"active":""}`,style:{background:ve.color},title:ve.label,onClick:()=>le(ve.id)},ve.id))})]}),W.jsxs("div",{className:"analytics-strip",children:[W.jsxs("div",{className:"analytics-card",children:[W.jsx("span",{className:"material-icons analytics-icon",children:"library_music"}),W.jsxs("div",{className:"analytics-copy",children:[W.jsx("span",{className:"analytics-label",children:"Sounds gesamt"}),W.jsx("strong",{className:"analytics-value",children:hi})]})]}),W.jsxs("div",{className:"analytics-card analytics-wide",children:[W.jsx("span",{className:"material-icons analytics-icon",children:"leaderboard"}),W.jsxs("div",{className:"analytics-copy",children:[W.jsx("span",{className:"analytics-label",children:"Most Played"}),W.jsx("div",{className:"analytics-top-list",children:yr.length===0?W.jsx("span",{className:"analytics-muted",children:"Noch keine Plays"}):yr.map((ve,ct)=>W.jsxs("span",{className:"analytics-chip",children:[ct+1,". ",ve.name," (",ve.count,")"]},ve.relativePath))})]})]})]}),v==="all"&&bn.length>0&&W.jsx("div",{className:"category-strip",children:bn.map(ve=>{const ct=fn[ve.key]||"#888",Rt=S===ve.key;return W.jsxs("button",{className:`cat-chip ${Rt?"active":""}`,onClick:()=>w(Rt?"":ve.key),style:Rt?{borderColor:ct,color:ct}:void 0,children:[W.jsx("span",{className:"cat-dot",style:{background:ct}}),ve.name.replace(/\s*\(\d+\)\s*$/,""),W.jsx("span",{className:"cat-count",children:ve.count})]},ve.key)})}),W.jsx("main",{className:"main",children:K.length===0?W.jsxs("div",{className:"empty-state visible",children:[W.jsx("div",{className:"empty-emoji",children:v==="favorites"?"โญ":"๐Ÿ”‡"}),W.jsx("div",{className:"empty-title",children:v==="favorites"?"Noch keine Favoriten":R?`Kein Sound fuer "${R}" gefunden`:"Keine Sounds vorhanden"}),W.jsx("div",{className:"empty-desc",children:v==="favorites"?"Klick den Stern auf einem Sound!":"Hier gibt's noch nichts zu hoeren."})]}):W.jsx("div",{className:"sound-grid",children:K.map((ve,ct)=>{var Pr;const Rt=ve.relativePath??ve.fileName,Jt=!!fe[Rt],cn=Z===ve.name,Yn=ve.isRecent||((Pr=ve.badges)==null?void 0:Pr.includes("new")),yi=ve.name.charAt(0).toUpperCase(),js=ui.has(ct),pi=ve.folder&&fn[ve.folder]||"var(--accent)";return W.jsxs("div",{className:`sound-card ${cn?"playing":""} ${js?"has-initial":""}`,style:{animationDelay:`${Math.min(ct*20,400)}ms`},onClick:Ei=>{const Zh=Ei.currentTarget,Bl=Zh.getBoundingClientRect(),nl=document.createElement("div");nl.className="ripple";const Bi=Math.max(Bl.width,Bl.height);nl.style.width=nl.style.height=Bi+"px",nl.style.left=Ei.clientX-Bl.left-Bi/2+"px",nl.style.top=Ei.clientY-Bl.top-Bi/2+"px",Zh.appendChild(nl),setTimeout(()=>nl.remove(),500),Xn(ve)},onContextMenu:Ei=>{Ei.preventDefault(),Ei.stopPropagation(),xn({x:Math.min(Ei.clientX,window.innerWidth-170),y:Math.min(Ei.clientY,window.innerHeight-140),sound:ve})},title:`${ve.name}${ve.folder?` (${ve.folder})`:""}`,children:[Yn&&W.jsx("span",{className:"new-badge",children:"NEU"}),W.jsx("span",{className:`fav-star ${Jt?"active":""}`,onClick:Ei=>{Ei.stopPropagation(),Ul(Rt)},children:W.jsx("span",{className:"material-icons fav-icon",children:Jt?"star":"star_border"})}),js&&W.jsx("span",{className:"sound-emoji",style:{color:pi},children:yi}),W.jsx("span",{className:"sound-name",children:ve.name}),ve.folder&&W.jsx("span",{className:"sound-duration",children:ve.folder}),W.jsxs("div",{className:"playing-indicator",children:[W.jsx("div",{className:"wave-bar"}),W.jsx("div",{className:"wave-bar"}),W.jsx("div",{className:"wave-bar"}),W.jsx("div",{className:"wave-bar"})]})]},Rt)})})}),zt&&W.jsxs("div",{className:"ctx-menu visible",style:{left:zt.x,top:zt.y},onClick:ve=>ve.stopPropagation(),children:[W.jsxs("div",{className:"ctx-item",onClick:()=>{Xn(zt.sound),xn(null)},children:[W.jsx("span",{className:"material-icons ctx-icon",children:"play_arrow"}),"Abspielen"]}),W.jsxs("div",{className:"ctx-item",onClick:()=>{Ul(zt.sound.relativePath??zt.sound.fileName),xn(null)},children:[W.jsx("span",{className:"material-icons ctx-icon",children:fe[zt.sound.relativePath??zt.sound.fileName]?"star":"star_border"}),"Favorit"]}),Mt&&W.jsxs(W.Fragment,{children:[W.jsx("div",{className:"ctx-sep"}),W.jsxs("div",{className:"ctx-item danger",onClick:async()=>{const ve=zt.sound.relativePath??zt.sound.fileName;await Bt([ve]),xn(null)},children:[W.jsx("span",{className:"material-icons ctx-icon",children:"delete"}),"Loeschen"]})]})]}),Mi&&(()=>{const ve=qt!=null&&qt.connectedSince?Math.floor((Date.now()-new Date(qt.connectedSince).getTime())/1e3):0,ct=Math.floor(ve/3600),Rt=Math.floor(ve%3600/60),Jt=ve%60,cn=ct>0?`${ct}h ${String(Rt).padStart(2,"0")}m ${String(Jt).padStart(2,"0")}s`:Rt>0?`${Rt}m ${String(Jt).padStart(2,"0")}s`:`${Jt}s`,Yn=yi=>yi==null?"var(--muted)":yi<80?"var(--green)":yi<150?"#f0a830":"#e04040";return W.jsx("div",{className:"conn-modal-overlay",onClick:()=>me(!1),children:W.jsxs("div",{className:"conn-modal",onClick:yi=>yi.stopPropagation(),children:[W.jsxs("div",{className:"conn-modal-header",children:[W.jsx("span",{className:"material-icons",style:{fontSize:20,color:"var(--green)"},children:"cell_tower"}),W.jsx("span",{children:"Verbindungsdetails"}),W.jsx("button",{className:"conn-modal-close",onClick:()=>me(!1),children:W.jsx("span",{className:"material-icons",children:"close"})})]}),W.jsxs("div",{className:"conn-modal-body",children:[W.jsxs("div",{className:"conn-stat",children:[W.jsx("span",{className:"conn-stat-label",children:"Voice Ping"}),W.jsxs("span",{className:"conn-stat-value",children:[W.jsx("span",{className:"conn-ping-dot",style:{background:Yn((qt==null?void 0:qt.voicePing)??null)}}),(qt==null?void 0:qt.voicePing)!=null?`${qt.voicePing} ms`:"---"]})]}),W.jsxs("div",{className:"conn-stat",children:[W.jsx("span",{className:"conn-stat-label",children:"Gateway Ping"}),W.jsxs("span",{className:"conn-stat-value",children:[W.jsx("span",{className:"conn-ping-dot",style:{background:Yn((qt==null?void 0:qt.gatewayPing)??null)}}),qt&&qt.gatewayPing>=0?`${qt.gatewayPing} ms`:"---"]})]}),W.jsxs("div",{className:"conn-stat",children:[W.jsx("span",{className:"conn-stat-label",children:"Status"}),W.jsx("span",{className:"conn-stat-value",style:{color:(qt==null?void 0:qt.status)==="ready"?"var(--green)":"#f0a830"},children:(qt==null?void 0:qt.status)==="ready"?"Verbunden":(qt==null?void 0:qt.status)??"Warte auf Verbindung"})]}),W.jsxs("div",{className:"conn-stat",children:[W.jsx("span",{className:"conn-stat-label",children:"Kanal"}),W.jsx("span",{className:"conn-stat-value",children:(qt==null?void 0:qt.channelName)||"---"})]}),W.jsxs("div",{className:"conn-stat",children:[W.jsx("span",{className:"conn-stat-label",children:"Verbunden seit"}),W.jsx("span",{className:"conn-stat-value",children:cn||"---"})]})]})]})})})(),Wt&&W.jsxs("div",{className:`toast ${Wt.type}`,children:[W.jsx("span",{className:"material-icons toast-icon",children:Wt.type==="error"?"error_outline":"check_circle"}),Wt.msg]}),Ke&&W.jsx("div",{className:"admin-overlay",onClick:ve=>{ve.target===ve.currentTarget&&ot(!1)},children:W.jsxs("div",{className:"admin-panel",children:[W.jsxs("h3",{children:["Admin",W.jsx("button",{className:"admin-close",onClick:()=>ot(!1),children:W.jsx("span",{className:"material-icons",style:{fontSize:18},children:"close"})})]}),Mt?W.jsxs("div",{className:"admin-shell",children:[W.jsxs("div",{className:"admin-header-row",children:[W.jsx("p",{className:"admin-status",children:"Eingeloggt als Admin"}),W.jsxs("div",{className:"admin-actions-inline",children:[W.jsx("button",{className:"admin-btn-action outline",onClick:()=>{ae()},disabled:nt,children:"Aktualisieren"}),W.jsx("button",{className:"admin-btn-action outline",onClick:pt,children:"Logout"})]})]}),W.jsxs("div",{className:"admin-field admin-search-field",children:[W.jsx("label",{children:"Sounds verwalten"}),W.jsx("input",{type:"text",value:dt,onChange:ve=>he(ve.target.value),placeholder:"Nach Name, Ordner oder Pfad filtern..."})]}),W.jsxs("div",{className:"admin-bulk-row",children:[W.jsxs("label",{className:"admin-select-all",children:[W.jsx("input",{type:"checkbox",checked:mn,onChange:ve=>{const ct=ve.target.checked,Rt={...X};_i.forEach(Jt=>{Rt[$i(Jt)]=ct}),Ee(Rt)}}),W.jsxs("span",{children:["Alle sichtbaren auswaehlen (",Ln,"/",_i.length,")"]})]}),W.jsx("button",{className:"admin-btn-action danger",disabled:Q.length===0,onClick:async()=>{window.confirm(`Wirklich ${Q.length} Sound(s) loeschen?`)&&await Bt(Q)},children:"Ausgewaehlte loeschen"})]}),W.jsx("div",{className:"admin-list-wrap",children:nt?W.jsx("div",{className:"admin-empty",children:"Lade Sounds..."}):_i.length===0?W.jsx("div",{className:"admin-empty",children:"Keine Sounds gefunden."}):W.jsx("div",{className:"admin-list",children:_i.map(ve=>{const ct=$i(ve),Rt=je===ct;return W.jsxs("div",{className:"admin-item",children:[W.jsx("label",{className:"admin-item-check",children:W.jsx("input",{type:"checkbox",checked:!!X[ct],onChange:()=>Ue(ct)})}),W.jsxs("div",{className:"admin-item-main",children:[W.jsx("div",{className:"admin-item-name",children:ve.name}),W.jsxs("div",{className:"admin-item-meta",children:[ve.folder?`Ordner: ${ve.folder}`:"Root"," ยท ",ct]}),Rt&&W.jsxs("div",{className:"admin-rename-row",children:[W.jsx("input",{value:it,onChange:Jt=>Ht(Jt.target.value),onKeyDown:Jt=>{Jt.key==="Enter"&&Be(),Jt.key==="Escape"&&$e()},placeholder:"Neuer Name..."}),W.jsx("button",{className:"admin-btn-action primary",onClick:()=>{Be()},children:"Speichern"}),W.jsx("button",{className:"admin-btn-action outline",onClick:$e,children:"Abbrechen"})]})]}),!Rt&&W.jsxs("div",{className:"admin-item-actions",children:[W.jsx("button",{className:"admin-btn-action outline",onClick:()=>Ye(ve),children:"Umbenennen"}),W.jsx("button",{className:"admin-btn-action danger ghost",onClick:async()=>{window.confirm(`Sound "${ve.name}" loeschen?`)&&await Bt([ct])},children:"Loeschen"})]})]},ct)})})})]}):W.jsxs("div",{children:[W.jsxs("div",{className:"admin-field",children:[W.jsx("label",{children:"Passwort"}),W.jsx("input",{type:"password",value:ce,onChange:ve=>Ie(ve.target.value),onKeyDown:ve=>ve.key==="Enter"&&Vt(),placeholder:"Admin-Passwort..."})]}),W.jsx("button",{className:"admin-btn-action primary",onClick:Vt,children:"Login"})]})]})}),Ut&&W.jsx("div",{className:"drop-overlay",children:W.jsxs("div",{className:"drop-zone",children:[W.jsx("span",{className:"material-icons drop-icon",children:"cloud_upload"}),W.jsx("div",{className:"drop-title",children:"MP3 & WAV hier ablegen"}),W.jsx("div",{className:"drop-sub",children:"Mehrere Dateien gleichzeitig moeglich"})]})}),Zt&&ln.length>0&&W.jsxs("div",{className:"upload-queue",children:[W.jsxs("div",{className:"uq-header",children:[W.jsx("span",{className:"material-icons",style:{fontSize:16},children:"upload"}),W.jsx("span",{children:ln.every(ve=>ve.status==="done"||ve.status==="error")?`${ln.filter(ve=>ve.status==="done").length} von ${ln.length} hochgeladen`:`Lade hochโ€ฆ (${ln.filter(ve=>ve.status==="done").length}/${ln.length})`}),W.jsx("button",{className:"uq-close",onClick:()=>{rn(!1),wt([])},children:W.jsx("span",{className:"material-icons",style:{fontSize:14},children:"close"})})]}),W.jsx("div",{className:"uq-list",children:ln.map(ve=>W.jsxs("div",{className:`uq-item uq-${ve.status}`,children:[W.jsx("span",{className:"material-icons uq-file-icon",children:"audio_file"}),W.jsxs("div",{className:"uq-info",children:[W.jsx("div",{className:"uq-name",title:ve.savedName??ve.file.name,children:ve.savedName??ve.file.name}),W.jsxs("div",{className:"uq-size",children:[(ve.file.size/1024).toFixed(0)," KB"]})]}),(ve.status==="waiting"||ve.status==="uploading")&&W.jsx("div",{className:"uq-progress-wrap",children:W.jsx("div",{className:"uq-progress-bar",style:{width:`${ve.progress}%`}})}),W.jsx("span",{className:`material-icons uq-status-icon uq-status-${ve.status}`,children:ve.status==="done"?"check_circle":ve.status==="error"?"error":ve.status==="uploading"?"sync":"schedule"}),ve.status==="error"&&W.jsx("div",{className:"uq-error",children:ve.error})]},ve.id))})]}),z&&W.jsx("div",{className:"dl-modal-overlay",onClick:()=>z.phase!=="downloading"&&G(null),children:W.jsxs("div",{className:"dl-modal",onClick:ve=>ve.stopPropagation(),children:[W.jsxs("div",{className:"dl-modal-header",children:[W.jsx("span",{className:"material-icons",style:{fontSize:20},children:z.type==="youtube"?"smart_display":z.type==="instagram"?"photo_camera":"audio_file"}),W.jsx("span",{children:z.phase==="input"?"Sound herunterladen":z.phase==="downloading"?"Wird heruntergeladen...":z.phase==="done"?"Fertig!":"Fehler"}),z.phase!=="downloading"&&W.jsx("button",{className:"dl-modal-close",onClick:()=>G(null),children:W.jsx("span",{className:"material-icons",style:{fontSize:16},children:"close"})})]}),W.jsxs("div",{className:"dl-modal-body",children:[W.jsxs("div",{className:"dl-modal-url",children:[W.jsx("span",{className:`dl-modal-tag ${z.type??""}`,children:z.type==="youtube"?"YouTube":z.type==="instagram"?"Instagram":"MP3"}),W.jsx("span",{className:"dl-modal-url-text",title:z.url,children:z.url.length>60?z.url.slice(0,57)+"...":z.url})]}),z.phase==="input"&&W.jsxs("div",{className:"dl-modal-field",children:[W.jsx("label",{className:"dl-modal-label",children:"Dateiname"}),W.jsxs("div",{className:"dl-modal-input-wrap",children:[W.jsx("input",{className:"dl-modal-input",type:"text",placeholder:z.type==="mp3"?"Dateiname...":"Wird automatisch erkannt...",value:z.filename,onChange:ve=>G(ct=>ct?{...ct,filename:ve.target.value}:null),onKeyDown:ve=>{ve.key==="Enter"&&qn()},autoFocus:!0}),W.jsx("span",{className:"dl-modal-ext",children:".mp3"})]}),W.jsx("span",{className:"dl-modal-hint",children:"Leer lassen = automatischer Name"})]}),z.phase==="downloading"&&W.jsxs("div",{className:"dl-modal-progress",children:[W.jsx("div",{className:"dl-modal-spinner"}),W.jsx("span",{children:z.type==="youtube"||z.type==="instagram"?"Audio wird extrahiert...":"MP3 wird heruntergeladen..."})]}),z.phase==="done"&&W.jsxs("div",{className:"dl-modal-success",children:[W.jsx("span",{className:"material-icons dl-modal-check",children:"check_circle"}),W.jsxs("span",{children:["Gespeichert als ",W.jsx("b",{children:z.savedName})]})]}),z.phase==="error"&&W.jsxs("div",{className:"dl-modal-error",children:[W.jsx("span",{className:"material-icons",style:{color:"#e74c3c"},children:"error"}),W.jsx("span",{children:z.error})]})]}),z.phase==="input"&&W.jsxs("div",{className:"dl-modal-actions",children:[W.jsx("button",{className:"dl-modal-cancel",onClick:()=>G(null),children:"Abbrechen"}),W.jsxs("button",{className:"dl-modal-submit",onClick:()=>void qn(),children:[W.jsx("span",{className:"material-icons",style:{fontSize:16},children:"download"}),"Herunterladen"]})]}),z.phase==="error"&&W.jsxs("div",{className:"dl-modal-actions",children:[W.jsx("button",{className:"dl-modal-cancel",onClick:()=>G(null),children:"Schliessen"}),W.jsxs("button",{className:"dl-modal-submit",onClick:()=>G(ve=>ve?{...ve,phase:"input",error:void 0}:null),children:[W.jsx("span",{className:"material-icons",style:{fontSize:16},children:"refresh"}),"Nochmal"]})]})]})})]})}const m7={IRON:"#6b6b6b",BRONZE:"#8c6239",SILVER:"#8c8c8c",GOLD:"#d4a017",PLATINUM:"#28b29e",EMERALD:"#1e9e5e",DIAMOND:"#576cce",MASTER:"#9d48e0",GRANDMASTER:"#e44c3e",CHALLENGER:"#f4c874"},Vde={SOLORANKED:"Ranked Solo",FLEXRANKED:"Ranked Flex",NORMAL:"Normal",ARAM:"ARAM",ARENA:"Arena",URF:"URF",BOT:"Co-op vs AI"},Hde="https://ddragon.leagueoflegends.com/cdn/15.5.1/img";function zv(i){return`${Hde}/champion/${i}.png`}function g7(i){const e=Math.floor((Date.now()-new Date(i).getTime())/1e3);return e<60?`${e}s`:e<3600?`${Math.floor(e/60)}m`:e<86400?`${Math.floor(e/3600)}h`:`${Math.floor(e/86400)}d`}function jde(i){const e=Math.floor(i/60),t=i%60;return`${e}:${String(t).padStart(2,"0")}`}function v7(i,e,t){return e===0?"Perfect":((i+t)/e).toFixed(2)}function _7(i,e){const t=i+e;return t>0?Math.round(i/t*100):0}function Wde(i,e){if(!i)return"Unranked";const t=["","I","II","III","IV"];return`${i.charAt(0)}${i.slice(1).toLowerCase()}${e?" "+(t[e]??e):""}`}function $de({data:i}){var we,He,Te,ke;const[e,t]=Oe.useState(""),[n,r]=Oe.useState("EUW"),[s,a]=Oe.useState([]),[l,u]=Oe.useState(null),[h,g]=Oe.useState([]),[v,x]=Oe.useState(!1),[S,w]=Oe.useState(null),[R,C]=Oe.useState([]),[E,B]=Oe.useState(null),[L,O]=Oe.useState({}),[z,G]=Oe.useState(!1),[k,H]=Oe.useState(!1),[F,V]=Oe.useState(null),Y=Oe.useRef(null),J=Oe.useRef(null);Oe.useEffect(()=>{fetch("/api/lolstats/regions").then(_e=>_e.json()).then(a).catch(()=>{}),fetch("/api/lolstats/recent").then(_e=>_e.json()).then(C).catch(()=>{})},[]),Oe.useEffect(()=>{i&&(i.recentSearches&&C(i.recentSearches),i.regions&&!s.length&&a(i.regions))},[i]);const te=Oe.useCallback(async(_e,De,gt)=>{H(!0);try{const xt=`gameName=${encodeURIComponent(_e)}&tagLine=${encodeURIComponent(De)}®ion=${gt}`,Mt=await fetch(`/api/lolstats/renew?${xt}`,{method:"POST"});if(Mt.ok){const It=await Mt.json();return It.last_updated_at&&V(It.last_updated_at),It.renewed??!1}}catch{}return H(!1),!1},[]),se=Oe.useCallback(async(_e,De,gt,xt=!1)=>{var ot,ce;let Mt=_e??"",It=De??"";const Ke=gt??n;if(!Mt){const Ie=e.split("#");Mt=((ot=Ie[0])==null?void 0:ot.trim())??"",It=((ce=Ie[1])==null?void 0:ce.trim())??""}if(!Mt||!It){w("Bitte im Format Name#Tag eingeben");return}x(!0),w(null),u(null),g([]),B(null),O({}),J.current={gameName:Mt,tagLine:It,region:Ke},xt||te(Mt,It,Ke).finally(()=>H(!1));try{const Ie=`gameName=${encodeURIComponent(Mt)}&tagLine=${encodeURIComponent(It)}®ion=${Ke}`,[We,tt]=await Promise.all([fetch(`/api/lolstats/profile?${Ie}`),fetch(`/api/lolstats/matches?${Ie}&limit=10`)]);if(!We.ok){const Ft=await We.json();throw new Error(Ft.error??`Fehler ${We.status}`)}const nt=await We.json();if(u(nt),nt.updated_at&&V(nt.updated_at),tt.ok){const Ft=await tt.json();g(Array.isArray(Ft)?Ft:[])}}catch(Ie){w(Ie.message)}x(!1)},[e,n,te]),ne=Oe.useCallback(async()=>{const _e=J.current;if(!(!_e||k)){H(!0);try{await te(_e.gameName,_e.tagLine,_e.region),await new Promise(De=>setTimeout(De,1500)),await se(_e.gameName,_e.tagLine,_e.region,!0)}finally{H(!1)}}},[te,se,k]),Z=Oe.useCallback(async()=>{if(!(!l||z)){G(!0);try{const _e=`gameName=${encodeURIComponent(l.game_name)}&tagLine=${encodeURIComponent(l.tagline)}®ion=${n}&limit=20`,De=await fetch(`/api/lolstats/matches?${_e}`);if(De.ok){const gt=await De.json();g(Array.isArray(gt)?gt:[])}}catch{}G(!1)}},[l,n,z]),oe=Oe.useCallback(async _e=>{var De;if(E===_e.id){B(null);return}if(B(_e.id),!(((De=_e.participants)==null?void 0:De.length)>=10||L[_e.id]))try{const gt=`region=${n}&createdAt=${encodeURIComponent(_e.created_at)}`,xt=await fetch(`/api/lolstats/match/${encodeURIComponent(_e.id)}?${gt}`);if(xt.ok){const Mt=await xt.json();O(It=>({...It,[_e.id]:Mt}))}}catch{}},[E,L,n]),fe=Oe.useCallback(_e=>{t(`${_e.game_name}#${_e.tag_line}`),r(_e.region),se(_e.game_name,_e.tag_line,_e.region)},[se]),be=Oe.useCallback(_e=>{var gt,xt,Mt;if(!l)return((gt=_e.participants)==null?void 0:gt[0])??null;const De=l.game_name.toLowerCase();return((xt=_e.participants)==null?void 0:xt.find(It=>{var Ke,ot;return((ot=(Ke=It.summoner)==null?void 0:Ke.game_name)==null?void 0:ot.toLowerCase())===De}))??((Mt=_e.participants)==null?void 0:Mt[0])??null},[l]),Se=_e=>{var ce,Ie,We;const De=be(_e);if(!De)return null;const gt=((ce=De.stats)==null?void 0:ce.result)==="WIN",xt=v7(De.stats.kill,De.stats.death,De.stats.assist),Mt=(De.stats.minion_kill??0)+(De.stats.neutral_minion_kill??0),It=_e.game_length_second>0?(Mt/(_e.game_length_second/60)).toFixed(1):"0",Ke=E===_e.id,ot=L[_e.id]??(((Ie=_e.participants)==null?void 0:Ie.length)>=10?_e:null);return W.jsxs("div",{children:[W.jsxs("div",{className:`lol-match ${gt?"win":"loss"}`,onClick:()=>oe(_e),children:[W.jsx("div",{className:"lol-match-result",children:gt?"W":"L"}),W.jsxs("div",{className:"lol-match-champ",children:[W.jsx("img",{src:zv(De.champion_name),alt:De.champion_name,title:De.champion_name}),W.jsx("span",{className:"lol-match-champ-level",children:De.stats.champion_level})]}),W.jsxs("div",{className:"lol-match-kda",children:[W.jsxs("div",{className:"lol-match-kda-nums",children:[De.stats.kill,"/",De.stats.death,"/",De.stats.assist]}),W.jsxs("div",{className:`lol-match-kda-ratio ${xt==="Perfect"?"perfect":Number(xt)>=4?"great":""}`,children:[xt," KDA"]})]}),W.jsxs("div",{className:"lol-match-stats",children:[W.jsxs("span",{children:[Mt," CS (",It,"/m)"]}),W.jsxs("span",{children:[De.stats.ward_place," wards"]})]}),W.jsx("div",{className:"lol-match-items",children:(De.items_names??[]).slice(0,7).map((tt,nt)=>tt?W.jsx("img",{src:zv("Aatrox"),alt:tt,title:tt,style:{background:"var(--bg-deep)"},onError:Ft=>{Ft.target.style.display="none"}},nt):W.jsx("div",{className:"lol-match-item-empty"},nt))}),W.jsxs("div",{className:"lol-match-meta",children:[W.jsx("div",{className:"lol-match-duration",children:jde(_e.game_length_second)}),W.jsx("div",{className:"lol-match-queue",children:Vde[_e.game_type]??_e.game_type}),W.jsxs("div",{className:"lol-match-ago",children:[g7(_e.created_at)," ago"]})]})]}),Ke&&ot&&W.jsx("div",{className:"lol-match-detail",children:le(ot,(We=De.summoner)==null?void 0:We.game_name)})]},_e.id)},le=(_e,De)=>{var Ke,ot,ce,Ie,We;const gt=((Ke=_e.participants)==null?void 0:Ke.filter(tt=>tt.team_key==="BLUE"))??[],xt=((ot=_e.participants)==null?void 0:ot.filter(tt=>tt.team_key==="RED"))??[],Mt=(We=(Ie=(ce=_e.teams)==null?void 0:ce.find(tt=>tt.key==="BLUE"))==null?void 0:Ie.game_stat)==null?void 0:We.is_win,It=(tt,nt,Ft)=>W.jsxs("div",{className:"lol-match-detail-team",children:[W.jsxs("div",{className:`lol-match-detail-team-header ${nt?"win":"loss"}`,children:[Ft," โ€” ",nt?"Victory":"Defeat"]}),tt.map((dt,he)=>{var je,st,it,Ht,Ut,$t,ln,wt,Zt,rn,jt,kt;const X=((st=(je=dt.summoner)==null?void 0:je.game_name)==null?void 0:st.toLowerCase())===(De==null?void 0:De.toLowerCase()),Ee=(((it=dt.stats)==null?void 0:it.minion_kill)??0)+(((Ht=dt.stats)==null?void 0:Ht.neutral_minion_kill)??0);return W.jsxs("div",{className:`lol-detail-row ${X?"me":""}`,children:[W.jsx("img",{className:"lol-detail-champ",src:zv(dt.champion_name),alt:dt.champion_name}),W.jsx("span",{className:"lol-detail-name",title:`${(Ut=dt.summoner)==null?void 0:Ut.game_name}#${($t=dt.summoner)==null?void 0:$t.tagline}`,children:((ln=dt.summoner)==null?void 0:ln.game_name)??dt.champion_name}),W.jsxs("span",{className:"lol-detail-kda",children:[(wt=dt.stats)==null?void 0:wt.kill,"/",(Zt=dt.stats)==null?void 0:Zt.death,"/",(rn=dt.stats)==null?void 0:rn.assist]}),W.jsxs("span",{className:"lol-detail-cs",children:[Ee," CS"]}),W.jsxs("span",{className:"lol-detail-dmg",children:[((((jt=dt.stats)==null?void 0:jt.total_damage_dealt_to_champions)??0)/1e3).toFixed(1),"k"]}),W.jsxs("span",{className:"lol-detail-gold",children:[((((kt=dt.stats)==null?void 0:kt.gold_earned)??0)/1e3).toFixed(1),"k"]})]},he)})]});return W.jsxs(W.Fragment,{children:[It(gt,Mt,"Blue Team"),It(xt,Mt===void 0?void 0:!Mt,"Red Team")]})};return W.jsxs("div",{className:"lol-container",children:[W.jsxs("div",{className:"lol-search",children:[W.jsx("input",{ref:Y,className:"lol-search-input",placeholder:"Summoner Name#Tag",value:e,onChange:_e=>t(_e.target.value),onKeyDown:_e=>_e.key==="Enter"&&se()}),W.jsx("select",{className:"lol-search-region",value:n,onChange:_e=>r(_e.target.value),children:s.map(_e=>W.jsx("option",{value:_e.code,children:_e.code},_e.code))}),W.jsx("button",{className:"lol-search-btn",onClick:()=>se(),disabled:v,children:v?"...":"Search"})]}),R.length>0&&W.jsx("div",{className:"lol-recent",children:R.map((_e,De)=>W.jsxs("button",{className:"lol-recent-chip",onClick:()=>fe(_e),children:[_e.profile_image_url&&W.jsx("img",{src:_e.profile_image_url,alt:""}),_e.game_name,"#",_e.tag_line,_e.tier&&W.jsx("span",{className:"lol-recent-tier",style:{color:m7[_e.tier]},children:_e.tier})]},De))}),S&&W.jsx("div",{className:"lol-error",children:S}),v&&W.jsxs("div",{className:"lol-loading",children:[W.jsx("div",{className:"lol-spinner"}),"Lade Profil..."]}),l&&!v&&W.jsxs(W.Fragment,{children:[W.jsxs("div",{className:"lol-profile",children:[W.jsx("img",{className:"lol-profile-icon",src:l.profile_image_url,alt:""}),W.jsxs("div",{className:"lol-profile-info",children:[W.jsxs("h2",{children:[l.game_name,W.jsxs("span",{children:["#",l.tagline]})]}),W.jsxs("div",{className:"lol-profile-level",children:["Level ",l.level]}),((we=l.ladder_rank)==null?void 0:we.rank)&&W.jsxs("div",{className:"lol-profile-ladder",children:["Ladder Rank #",l.ladder_rank.rank.toLocaleString()," / ",(He=l.ladder_rank.total)==null?void 0:He.toLocaleString()]}),F&&W.jsxs("div",{className:"lol-profile-updated",children:["Updated ",g7(F)," ago"]})]}),W.jsxs("button",{className:`lol-update-btn ${k?"renewing":""}`,onClick:ne,disabled:k,title:"Refresh data from Riot servers",children:[W.jsx("span",{className:"lol-update-icon",children:k?"โŸณ":"โ†ป"}),k?"Updating...":"Update"]})]}),W.jsx("div",{className:"lol-ranked-row",children:(l.league_stats??[]).filter(_e=>_e.game_type==="SOLORANKED"||_e.game_type==="FLEXRANKED").map(_e=>{const De=_e.tier_info,gt=!!(De!=null&&De.tier),xt=m7[(De==null?void 0:De.tier)??""]??"var(--text-normal)";return W.jsxs("div",{className:`lol-ranked-card ${gt?"has-rank":""}`,style:{"--tier-color":xt},children:[W.jsx("div",{className:"lol-ranked-type",children:_e.game_type==="SOLORANKED"?"Ranked Solo/Duo":"Ranked Flex"}),gt?W.jsxs(W.Fragment,{children:[W.jsxs("div",{className:"lol-ranked-tier",style:{color:xt},children:[Wde(De.tier,De.division),W.jsxs("span",{className:"lol-ranked-lp",children:[De.lp," LP"]})]}),W.jsxs("div",{className:"lol-ranked-record",children:[_e.win,"W ",_e.lose,"L",W.jsxs("span",{className:"lol-ranked-wr",children:["(",_7(_e.win??0,_e.lose??0),"%)"]}),_e.is_hot_streak&&W.jsx("span",{className:"lol-ranked-streak",children:"๐Ÿ”ฅ"})]})]}):W.jsx("div",{className:"lol-ranked-tier",children:"Unranked"})]},_e.game_type)})}),((ke=(Te=l.most_champions)==null?void 0:Te.champion_stats)==null?void 0:ke.length)>0&&W.jsxs(W.Fragment,{children:[W.jsx("div",{className:"lol-section-title",children:"Top Champions"}),W.jsx("div",{className:"lol-champs",children:l.most_champions.champion_stats.slice(0,7).map(_e=>{const De=_7(_e.win,_e.lose),gt=_e.play>0?v7(_e.kill/_e.play,_e.death/_e.play,_e.assist/_e.play):"0";return W.jsxs("div",{className:"lol-champ-card",children:[W.jsx("img",{className:"lol-champ-icon",src:zv(_e.champion_name),alt:_e.champion_name}),W.jsxs("div",{children:[W.jsx("div",{className:"lol-champ-name",children:_e.champion_name}),W.jsxs("div",{className:"lol-champ-stats",children:[_e.play," games ยท ",De,"% WR"]}),W.jsxs("div",{className:"lol-champ-kda",children:[gt," KDA"]})]})]},_e.champion_name)})})]}),h.length>0&&W.jsxs(W.Fragment,{children:[W.jsx("div",{className:"lol-section-title",children:"Match History"}),W.jsx("div",{className:"lol-matches",children:h.map(_e=>Se(_e))}),h.length<20&&W.jsx("button",{className:"lol-load-more",onClick:Z,disabled:z,children:z?"Laden...":"Mehr laden"})]})]}),!l&&!v&&!S&&W.jsxs("div",{className:"lol-empty",children:[W.jsx("div",{className:"lol-empty-icon",children:"โš”๏ธ"}),W.jsx("h3",{children:"League of Legends Stats"}),W.jsx("p",{children:"Gib einen Summoner Name#Tag ein und wรคhle die Region"})]})]})}const y7={iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:"stun:stun1.l.google.com:19302"}]};function x7(i){const e=Math.max(0,Math.floor((Date.now()-new Date(i).getTime())/1e3)),t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60;return t>0?`${t}:${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}`:`${n}:${String(r).padStart(2,"0")}`}function Xde({data:i}){var ot,ce;const[e,t]=Oe.useState([]),[n,r]=Oe.useState(()=>localStorage.getItem("streaming_name")||""),[s,a]=Oe.useState("Screen Share"),[l,u]=Oe.useState(""),[h,g]=Oe.useState(null),[v,x]=Oe.useState(null),[S,w]=Oe.useState(null),[R,C]=Oe.useState(!1),[E,B]=Oe.useState(!1),[L,O]=Oe.useState(null),[,z]=Oe.useState(0),G=Oe.useRef(null),k=Oe.useRef(""),H=Oe.useRef(null),F=Oe.useRef(null),V=Oe.useRef(null),Y=Oe.useRef(new Map),J=Oe.useRef(null),te=Oe.useRef(new Map),se=Oe.useRef(null),ne=Oe.useRef(1e3),Z=Oe.useRef(!1),oe=Oe.useRef(null);Oe.useEffect(()=>{Z.current=R},[R]),Oe.useEffect(()=>{oe.current=L},[L]),Oe.useEffect(()=>{if(!(e.length>0||R))return;const We=setInterval(()=>z(tt=>tt+1),1e3);return()=>clearInterval(We)},[e.length,R]),Oe.useEffect(()=>{i!=null&&i.streams&&t(i.streams)},[i]),Oe.useEffect(()=>{n&&localStorage.setItem("streaming_name",n)},[n]);const fe=Oe.useCallback(Ie=>{var We;((We=G.current)==null?void 0:We.readyState)===WebSocket.OPEN&&G.current.send(JSON.stringify(Ie))},[]),be=Oe.useCallback((Ie,We,tt)=>{if(Ie.remoteDescription)Ie.addIceCandidate(new RTCIceCandidate(tt)).catch(()=>{});else{let nt=te.current.get(We);nt||(nt=[],te.current.set(We,nt)),nt.push(tt)}},[]),Se=Oe.useCallback((Ie,We)=>{const tt=te.current.get(We);if(tt){for(const nt of tt)Ie.addIceCandidate(new RTCIceCandidate(nt)).catch(()=>{});te.current.delete(We)}},[]),le=Oe.useCallback(()=>{J.current&&(J.current.close(),J.current=null),V.current&&(V.current.srcObject=null),te.current.clear()},[]),we=Oe.useRef(()=>{});we.current=Ie=>{var We;switch(Ie.type){case"welcome":k.current=Ie.clientId,Ie.streams&&t(Ie.streams);break;case"broadcast_started":w(Ie.streamId),C(!0),Z.current=!0,B(!1);break;case"stream_available":break;case"stream_ended":((We=oe.current)==null?void 0:We.streamId)===Ie.streamId&&(le(),O(null));break;case"viewer_joined":{const tt=Ie.viewerId,nt=Y.current.get(tt);nt&&(nt.close(),Y.current.delete(tt)),te.current.delete(tt);const Ft=new RTCPeerConnection(y7);Y.current.set(tt,Ft);const dt=H.current;if(dt)for(const X of dt.getTracks())Ft.addTrack(X,dt);Ft.onicecandidate=X=>{X.candidate&&fe({type:"ice_candidate",targetId:tt,candidate:X.candidate.toJSON()})};const he=Ft.getSenders().find(X=>{var Ee;return((Ee=X.track)==null?void 0:Ee.kind)==="video"});if(he){const X=he.getParameters();(!X.encodings||X.encodings.length===0)&&(X.encodings=[{}]),X.encodings[0].maxFramerate=60,X.encodings[0].maxBitrate=8e6,he.setParameters(X).catch(()=>{})}Ft.createOffer().then(X=>Ft.setLocalDescription(X)).then(()=>{fe({type:"offer",targetId:tt,sdp:Ft.localDescription})}).catch(console.error);break}case"viewer_left":{const tt=Y.current.get(Ie.viewerId);tt&&(tt.close(),Y.current.delete(Ie.viewerId)),te.current.delete(Ie.viewerId);break}case"offer":{const tt=Ie.fromId;J.current&&(J.current.close(),J.current=null),te.current.delete(tt);const nt=new RTCPeerConnection(y7);J.current=nt,nt.ontrack=Ft=>{V.current&&Ft.streams[0]&&(V.current.srcObject=Ft.streams[0]),O(dt=>dt&&{...dt,phase:"connected"})},nt.onicecandidate=Ft=>{Ft.candidate&&fe({type:"ice_candidate",targetId:tt,candidate:Ft.candidate.toJSON()})},nt.oniceconnectionstatechange=()=>{(nt.iceConnectionState==="failed"||nt.iceConnectionState==="disconnected")&&O(Ft=>Ft&&{...Ft,phase:"error",error:"Verbindung verloren"})},nt.setRemoteDescription(new RTCSessionDescription(Ie.sdp)).then(()=>(Se(nt,tt),nt.createAnswer())).then(Ft=>nt.setLocalDescription(Ft)).then(()=>{fe({type:"answer",targetId:tt,sdp:nt.localDescription})}).catch(console.error);break}case"answer":{const tt=Y.current.get(Ie.fromId);tt&&tt.setRemoteDescription(new RTCSessionDescription(Ie.sdp)).then(()=>Se(tt,Ie.fromId)).catch(console.error);break}case"ice_candidate":{if(!Ie.candidate)break;if(Z.current){const tt=Y.current.get(Ie.fromId);tt&&be(tt,Ie.fromId,Ie.candidate)}else{const tt=J.current;tt&&be(tt,Ie.fromId,Ie.candidate)}break}case"error":Ie.code==="WRONG_PASSWORD"?x(tt=>tt&&{...tt,error:Ie.message}):g(Ie.message),B(!1);break}};const He=Oe.useCallback(()=>{if(G.current&&G.current.readyState===WebSocket.OPEN)return;const Ie=location.protocol==="https:"?"wss":"ws",We=new WebSocket(`${Ie}://${location.host}/ws/streaming`);G.current=We,We.onopen=()=>{ne.current=1e3},We.onmessage=tt=>{let nt;try{nt=JSON.parse(tt.data)}catch{return}we.current(nt)},We.onclose=()=>{G.current=null,(Z.current||oe.current)&&(se.current=setTimeout(()=>{ne.current=Math.min(ne.current*2,1e4),He()},ne.current))},We.onerror=()=>{We.close()}},[]),Te=Oe.useCallback(async()=>{var Ie,We;if(!n.trim()){g("Bitte gib einen Namen ein.");return}if(!l.trim()){g("Passwort ist Pflicht.");return}if(!((Ie=navigator.mediaDevices)!=null&&Ie.getDisplayMedia)){g("Dein Browser unterstรผtzt keine Bildschirmfreigabe.");return}g(null),B(!0);try{const tt=await navigator.mediaDevices.getDisplayMedia({video:{frameRate:{ideal:60},width:{ideal:1920},height:{ideal:1080}},audio:!0});H.current=tt,F.current&&(F.current.srcObject=tt),(We=tt.getVideoTracks()[0])==null||We.addEventListener("ended",()=>{ke()}),He();const nt=()=>{var Ft;((Ft=G.current)==null?void 0:Ft.readyState)===WebSocket.OPEN?fe({type:"start_broadcast",name:n.trim(),title:s.trim()||"Screen Share",password:l.trim()}):setTimeout(nt,100)};nt()}catch(tt){B(!1),tt.name==="NotAllowedError"?g("Bildschirmfreigabe wurde abgelehnt."):g(`Fehler: ${tt.message}`)}},[n,s,l,He,fe]),ke=Oe.useCallback(()=>{var Ie;fe({type:"stop_broadcast"}),(Ie=H.current)==null||Ie.getTracks().forEach(We=>We.stop()),H.current=null,F.current&&(F.current.srcObject=null);for(const We of Y.current.values())We.close();Y.current.clear(),te.current.clear(),C(!1),Z.current=!1,w(null),u("")},[fe]),_e=Oe.useCallback(Ie=>{x({streamId:Ie.id,streamTitle:Ie.title,broadcasterName:Ie.broadcasterName,password:"",error:null})},[]),De=Oe.useCallback(()=>{if(!v)return;if(!v.password.trim()){x(nt=>nt&&{...nt,error:"Passwort eingeben."});return}const{streamId:Ie,password:We}=v;x(null),g(null),O({streamId:Ie,phase:"connecting"}),He();const tt=()=>{var nt;((nt=G.current)==null?void 0:nt.readyState)===WebSocket.OPEN?fe({type:"join_viewer",name:n.trim()||"Viewer",streamId:Ie,password:We.trim()}):setTimeout(tt,100)};tt()},[v,n,He,fe]),gt=Oe.useCallback(()=>{fe({type:"leave_viewer"}),le(),O(null)},[le,fe]);Oe.useEffect(()=>{const Ie=We=>{(Z.current||oe.current)&&We.preventDefault()};return window.addEventListener("beforeunload",Ie),()=>window.removeEventListener("beforeunload",Ie)},[]);const xt=Oe.useRef(null),[Mt,It]=Oe.useState(!1),Ke=Oe.useCallback(()=>{const Ie=xt.current;Ie&&(document.fullscreenElement?document.exitFullscreen().catch(()=>{}):Ie.requestFullscreen().catch(()=>{}))},[]);if(Oe.useEffect(()=>{const Ie=()=>It(!!document.fullscreenElement);return document.addEventListener("fullscreenchange",Ie),()=>document.removeEventListener("fullscreenchange",Ie)},[]),Oe.useEffect(()=>()=>{var Ie;(Ie=H.current)==null||Ie.getTracks().forEach(We=>We.stop());for(const We of Y.current.values())We.close();J.current&&J.current.close(),G.current&&G.current.close(),se.current&&clearTimeout(se.current)},[]),L){const Ie=e.find(We=>We.id===L.streamId);return W.jsxs("div",{className:"stream-viewer-overlay",ref:xt,children:[W.jsxs("div",{className:"stream-viewer-header",children:[W.jsxs("div",{className:"stream-viewer-header-left",children:[W.jsxs("span",{className:"stream-live-badge",children:[W.jsx("span",{className:"stream-live-dot"})," LIVE"]}),W.jsxs("div",{children:[W.jsx("div",{className:"stream-viewer-title",children:(Ie==null?void 0:Ie.title)||"Stream"}),W.jsxs("div",{className:"stream-viewer-subtitle",children:[(Ie==null?void 0:Ie.broadcasterName)||"..."," ",Ie?`ยท ${Ie.viewerCount} Zuschauer`:""]})]})]}),W.jsxs("div",{className:"stream-viewer-header-right",children:[W.jsx("button",{className:"stream-viewer-fullscreen",onClick:Ke,title:Mt?"Vollbild verlassen":"Vollbild",children:Mt?"โœ–":"โ›ถ"}),W.jsx("button",{className:"stream-viewer-close",onClick:gt,children:"Verlassen"})]})]}),W.jsxs("div",{className:"stream-viewer-video",children:[L.phase==="connecting"?W.jsxs("div",{className:"stream-viewer-connecting",children:[W.jsx("div",{className:"stream-viewer-spinner"}),"Verbindung wird hergestellt..."]}):L.phase==="error"?W.jsxs("div",{className:"stream-viewer-connecting",children:[L.error||"Verbindungsfehler",W.jsx("button",{className:"stream-btn",onClick:gt,children:"Zurรผck"})]}):null,W.jsx("video",{ref:V,autoPlay:!0,playsInline:!0,style:L.phase==="connected"?{}:{display:"none"}})]})]})}return W.jsxs("div",{className:"stream-container",children:[h&&W.jsxs("div",{className:"stream-error",children:[h,W.jsx("button",{className:"stream-error-dismiss",onClick:()=>g(null),children:"ร—"})]}),W.jsxs("div",{className:"stream-topbar",children:[W.jsx("input",{className:"stream-input stream-input-name",placeholder:"Dein Name",value:n,onChange:Ie=>r(Ie.target.value),disabled:R}),W.jsx("input",{className:"stream-input stream-input-title",placeholder:"Stream-Titel",value:s,onChange:Ie=>a(Ie.target.value),disabled:R}),W.jsx("input",{className:"stream-input stream-input-password",type:"password",placeholder:"Passwort",value:l,onChange:Ie=>u(Ie.target.value),disabled:R}),R?W.jsxs("button",{className:"stream-btn stream-btn-stop",onClick:ke,children:["โน"," Stream beenden"]}):W.jsx("button",{className:"stream-btn",onClick:Te,disabled:E,children:E?"Starte...":"๐Ÿ–ฅ๏ธ Stream starten"})]}),e.length===0&&!R?W.jsxs("div",{className:"stream-empty",children:[W.jsx("div",{className:"stream-empty-icon",children:"๐Ÿ“บ"}),W.jsx("h3",{children:"Keine aktiven Streams"}),W.jsx("p",{children:"Starte einen Stream, um deinen Bildschirm zu teilen."})]}):W.jsxs("div",{className:"stream-grid",children:[R&&W.jsxs("div",{className:"stream-tile own broadcasting",children:[W.jsxs("div",{className:"stream-tile-preview",children:[W.jsx("video",{ref:F,autoPlay:!0,playsInline:!0,muted:!0}),W.jsxs("span",{className:"stream-live-badge",children:[W.jsx("span",{className:"stream-live-dot"})," LIVE"]}),W.jsxs("span",{className:"stream-tile-viewers",children:["๐Ÿ‘ฅ"," ",((ot=e.find(Ie=>Ie.id===S))==null?void 0:ot.viewerCount)??0]})]}),W.jsxs("div",{className:"stream-tile-info",children:[W.jsxs("div",{className:"stream-tile-meta",children:[W.jsxs("div",{className:"stream-tile-name",children:[n," (Du)"]}),W.jsx("div",{className:"stream-tile-title",children:s})]}),W.jsx("span",{className:"stream-tile-time",children:S&&((ce=e.find(Ie=>Ie.id===S))!=null&&ce.startedAt)?x7(e.find(Ie=>Ie.id===S).startedAt):"0:00"})]})]}),e.filter(Ie=>Ie.id!==S).map(Ie=>W.jsxs("div",{className:"stream-tile",onClick:()=>_e(Ie),children:[W.jsxs("div",{className:"stream-tile-preview",children:[W.jsx("span",{className:"stream-tile-icon",children:"๐Ÿ–ฅ๏ธ"}),W.jsxs("span",{className:"stream-live-badge",children:[W.jsx("span",{className:"stream-live-dot"})," LIVE"]}),W.jsxs("span",{className:"stream-tile-viewers",children:["๐Ÿ‘ฅ"," ",Ie.viewerCount]}),Ie.hasPassword&&W.jsx("span",{className:"stream-tile-lock",children:"๐Ÿ”’"})]}),W.jsxs("div",{className:"stream-tile-info",children:[W.jsxs("div",{className:"stream-tile-meta",children:[W.jsx("div",{className:"stream-tile-name",children:Ie.broadcasterName}),W.jsx("div",{className:"stream-tile-title",children:Ie.title})]}),W.jsx("span",{className:"stream-tile-time",children:x7(Ie.startedAt)}),W.jsx("button",{className:"stream-tile-menu",onClick:We=>We.stopPropagation(),children:"โ‹ฎ"})]})]},Ie.id))]}),v&&W.jsx("div",{className:"stream-pw-overlay",onClick:()=>x(null),children:W.jsxs("div",{className:"stream-pw-modal",onClick:Ie=>Ie.stopPropagation(),children:[W.jsx("h3",{children:v.broadcasterName}),W.jsx("p",{children:v.streamTitle}),v.error&&W.jsx("div",{className:"stream-pw-modal-error",children:v.error}),W.jsx("input",{className:"stream-input",type:"password",placeholder:"Stream-Passwort",value:v.password,onChange:Ie=>x(We=>We&&{...We,password:Ie.target.value,error:null}),onKeyDown:Ie=>{Ie.key==="Enter"&&De()},autoFocus:!0}),W.jsxs("div",{className:"stream-pw-actions",children:[W.jsx("button",{className:"stream-pw-cancel",onClick:()=>x(null),children:"Abbrechen"}),W.jsx("button",{className:"stream-btn",onClick:De,children:"Beitreten"})]})]})})]})}const Yde={radio:xde,soundboard:qde,lolstats:$de,streaming:Xde};function Qde(){const[i,e]=Oe.useState(!1),[t,n]=Oe.useState([]),[r,s]=Oe.useState(()=>localStorage.getItem("hub_activeTab")??""),a=x=>{s(x),localStorage.setItem("hub_activeTab",x)},[l,u]=Oe.useState({}),h=Oe.useRef(null);Oe.useEffect(()=>{fetch("/api/plugins").then(x=>x.json()).then(x=>{n(x);const S=localStorage.getItem("hub_activeTab"),w=x.some(R=>R.name===S);x.length>0&&!w&&a(x[0].name)}).catch(()=>{})},[]),Oe.useEffect(()=>{let x=null,S;function w(){x=new EventSource("/api/events"),h.current=x,x.onopen=()=>e(!0),x.onmessage=R=>{try{const C=JSON.parse(R.data);C.type==="snapshot"?u(E=>({...E,...C})):C.plugin&&u(E=>({...E,[C.plugin]:{...E[C.plugin]||{},...C}}))}catch{}},x.onerror=()=>{e(!1),x==null||x.close(),S=setTimeout(w,3e3)}}return w(),()=>{x==null||x.close(),clearTimeout(S)}},[]);const g="1.0.0-dev",v={radio:"๐ŸŒ",soundboard:"๐ŸŽต",lolstats:"โš”๏ธ",stats:"๐Ÿ“Š",events:"๐Ÿ“…",games:"๐ŸŽฒ",gamevote:"๐ŸŽฎ",streaming:"๐Ÿ“บ"};return W.jsxs("div",{className:"hub-app",children:[W.jsxs("header",{className:"hub-header",children:[W.jsxs("div",{className:"hub-header-left",children:[W.jsx("span",{className:"hub-logo",children:"๐ŸŽฎ"}),W.jsx("span",{className:"hub-title",children:"Gaming Hub"}),W.jsx("span",{className:`hub-conn-dot ${i?"online":""}`})]}),W.jsx("nav",{className:"hub-tabs",children:t.map(x=>W.jsxs("button",{className:`hub-tab ${r===x.name?"active":""}`,onClick:()=>a(x.name),title:x.description,children:[W.jsx("span",{className:"hub-tab-icon",children:v[x.name]??"๐Ÿ“ฆ"}),W.jsx("span",{className:"hub-tab-label",children:x.name})]},x.name))}),W.jsx("div",{className:"hub-header-right",children:W.jsxs("span",{className:"hub-version",children:["v",g]})})]}),W.jsx("main",{className:"hub-content",children:t.length===0?W.jsxs("div",{className:"hub-empty",children:[W.jsx("span",{className:"hub-empty-icon",children:"๐Ÿ“ฆ"}),W.jsx("h2",{children:"Keine Plugins geladen"}),W.jsx("p",{children:"Plugins werden im Server konfiguriert."})]}):t.map(x=>{const S=Yde[x.name];if(!S)return null;const w=r===x.name;return W.jsx("div",{className:`hub-tab-panel ${w?"active":""}`,style:w?{display:"flex",flexDirection:"column",width:"100%",height:"100%"}:{display:"none"},children:W.jsx(S,{data:l[x.name]||{}})},x.name)})})]})}PF.createRoot(document.getElementById("root")).render(W.jsx(Qde,{})); diff --git a/web/dist/index.html b/web/dist/index.html index d669621..32fe6dc 100644 --- a/web/dist/index.html +++ b/web/dist/index.html @@ -5,7 +5,7 @@ Gaming Hub - + diff --git a/web/src/plugins/streaming/StreamingTab.tsx b/web/src/plugins/streaming/StreamingTab.tsx index 031d6fa..268280e 100644 --- a/web/src/plugins/streaming/StreamingTab.tsx +++ b/web/src/plugins/streaming/StreamingTab.tsx @@ -531,7 +531,7 @@ export default function StreamingTab({ data }: { data: any }) { ) : viewing.phase === 'error' ? (
{viewing.error || 'Verbindungsfehler'} - +
) : null}