UNPKG

dota2-team-randomizer

Version:

A React component for randomizing Dota 2 teams with animations and sound effects

3 lines (2 loc) 9.38 kB
"use strict";var e=require("react");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=t(e),n=function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var a in t=arguments[r])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e},n.apply(this,arguments)};function a(e,t,r,n){return new(r||(r=Promise))((function(a,o){function u(e){try{c(n.next(e))}catch(e){o(e)}}function i(e){try{c(n.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(u,i)}c((n=n.apply(e,t||[])).next())}))}function o(e,t){var r,n,a,o,u={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return o={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function i(i){return function(c){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;o&&(o=0,i[0]&&(u=0)),u;)try{if(r=1,n&&(a=2&i[0]?n.return:i[0]?n.throw||((a=n.return)&&a.call(n),0):n.next)&&!(a=a.call(n,i[1])).done)return a;switch(n=0,a&&(i=[2&i[0],a.value]),i[0]){case 0:case 1:a=i;break;case 4:return u.label++,{value:i[1],done:!1};case 5:u.label++,n=i[1],i=[0];continue;case 7:i=u.ops.pop(),u.trys.pop();continue;default:if(!(a=u.trys,(a=a.length>0&&a[a.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!a||i[1]>a[0]&&i[1]<a[3])){u.label=i[1];break}if(6===i[0]&&u.label<a[1]){u.label=a[1],a=i;break}if(a&&u.label<a[2]){u.label=a[2],u.ops.push(i);break}a[2]&&u.ops.pop(),u.trys.pop();continue}i=t.call(e,u)}catch(e){i=[6,e],n=0}finally{r=a=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}function u(e,t,r){if(r||2===arguments.length)for(var n,a=0,o=t.length;a<o;a++)!n&&a in t||(n||(n=Array.prototype.slice.call(t,0,a)),n[a]=t[a]);return e.concat(n||Array.prototype.slice.call(t))}!function(e,t){void 0===t&&(t={});var r=t.insertAt;if(e&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===r&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=e:a.appendChild(document.createTextNode(e))}}(".dota2-team-randomizer {\r\n text-align: center;\r\n padding: 20px;\r\n max-width: 1200px;\r\n margin: 0 auto;\r\n background-color: #000000;\r\n min-height: 100vh;\r\n color: #ffffff;\r\n box-sizing: border-box;\r\n}\r\n\r\n/* Copy all your existing CSS styles here, but prefix them with .dota2-team-randomizer */\r\n.dota2-team-randomizer h1 {\r\n color: #ffffff;\r\n margin-bottom: 30px;\r\n font-size: clamp(1.8rem, 4vw, 2.5rem);\r\n text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);\r\n}\r\n\r\n/* ... rest of your CSS styles ... */ ");var i="dota2_heroes_cache";module.exports=function(){var t=e.useState([]),c=t[0],l=t[1],s=e.useState([]),f=s[0],d=s[1],m=e.useState(!0),p=m[0],h=m[1],v=e.useState(null),y=v[0],g=v[1],b=e.useState(!1),w=b[0],E=b[1],x=e.useState([]),S=x[0],T=x[1],N=e.useState([]),k=N[0],R=N[1],C=e.useRef(null),_=e.useRef(new Audio("https://cdn.pixabay.com/audio/2022/03/15/audio_bd91fe76ba.mp3")),z=e.useRef(new Audio("https://assets.mixkit.co/active_storage/sfx/2018/2018-preview.mp3")),M=e.useRef(new Audio("https://assets.mixkit.co/active_storage/sfx/2016/2016-preview.mp3")),A=function(e){return void 0===e&&(e=0),a(void 0,void 0,void 0,(function(){var t,r,n,a,u;return o(this,(function(o){switch(o.label){case 0:return o.trys.push([0,3,,6]),[4,fetch("https://api.opendota.com/api/heroes")];case 1:if(!(t=o.sent()).ok)throw new Error("HTTP error! status: ".concat(t.status));return[4,t.json()];case 2:return r=o.sent(),n=r.map((function(e){var t="Support";e.roles.includes("Carry")?t="Carry":e.roles.includes("Nuker")||e.roles.includes("Escape")?t="Mid":e.roles.includes("Durable")||e.roles.includes("Initiator")||e.roles.includes("Jungler")?t="Offlane":e.roles.includes("Support")&&(t="Support");var r=e.name.replace("npc_dota_hero_","");return"dawnbreaker"===r&&(r="dawn_breaker"),"marci"===r&&(r="marci"),"primal_beast"===r&&(r="primal_beast"),{name:e.localized_name,roles:e.roles,primaryRole:t,image:"https://cdn.dota2.com/apps/dota2/images/heroes/".concat(r,"_full.png")}})),a={heroes:n,timestamp:Date.now()},localStorage.setItem(i,JSON.stringify(a)),[2,n];case 3:return u=o.sent(),e<3?[4,(c=1e3*(e+1),new Promise((function(e){return setTimeout(e,c)})))]:[3,5];case 4:return o.sent(),[2,A(e+1)];case 5:throw u;case 6:return[2]}var c}))}))};e.useEffect((function(){a(void 0,void 0,void 0,(function(){var e,t,r;return o(this,(function(n){switch(n.label){case 0:if(n.trys.push([0,7,,8]),e=function(){try{var e=localStorage.getItem(i);if(e){var t=JSON.parse(e),r=t.heroes,n=t.timestamp;if(!(Date.now()-n>864e5))return r}return null}catch(e){return null}}(),!e)return[3,5];l(e),h(!1),n.label=1;case 1:return n.trys.push([1,3,,4]),[4,A()];case 2:return t=n.sent(),l(t),[3,4];case 3:return n.sent(),[3,4];case 4:return[2];case 5:return[4,A()];case 6:return r=n.sent(),l(r),h(!1),[3,8];case 7:return n.sent(),g("Failed to fetch heroes data. Please check your internet connection and try again."),h(!1),[3,8];case 8:return[2]}}))}))}),[]),e.useEffect((function(){return w?(_.current.loop=!0,_.current.volume=.3,_.current.play().catch((function(){}))):(_.current.pause(),_.current.currentTime=0),function(){_.current.pause(),_.current.currentTime=0,z.current.pause(),z.current.currentTime=0,M.current.pause(),M.current.currentTime=0}}),[w]),e.useEffect((function(){S.length>0&&(z.current.currentTime=0,z.current.volume=.3,z.current.play().catch((function(){})))}),[S]),e.useEffect((function(){5===S.length&&setTimeout((function(){M.current.currentTime=0,M.current.volume=.5,M.current.play().catch((function(){})),setTimeout((function(){M.current.pause(),M.current.currentTime=0}),1e4)}),1e3)}),[S]);e.useEffect((function(){return function(){C.current&&clearInterval(C.current)}}),[]);return p?r.default.createElement("div",{className:"dota2-team-randomizer"},r.default.createElement("div",{className:"loading"},r.default.createElement("div",{className:"loading-spinner"}),r.default.createElement("div",null,"Loading heroes data..."))):y?r.default.createElement("div",{className:"dota2-team-randomizer"},r.default.createElement("div",{className:"error"},r.default.createElement("div",{className:"error-icon"},"⚠️"),r.default.createElement("div",null,y),r.default.createElement("button",{onClick:function(){return window.location.reload()},className:"retry-button"},"Retry"))):r.default.createElement("div",{className:"dota2-team-randomizer"},r.default.createElement("h1",null,"Dota 2 Team Randomizer"),r.default.createElement("button",{onClick:function(){if(0!==c.length){E(!0),T([]);var e=u([],c,!0).sort((function(){return.5-Math.random()})).slice(0,5),t=["Carry","Mid","Offlane","Support","Hard Support"],r=e.map((function(e,r){return n(n({},e),{primaryRole:t[r]})})).sort((function(){return.5-Math.random()}));d(r);var a=Array(5).fill(null).map((function(){var e=c[Math.floor(Math.random()*c.length)];return n(n({},e),{primaryRole:"Spinning..."})}));R(a),C.current&&clearInterval(C.current);var o=0;C.current=setInterval((function(){if(o>=5)return clearInterval(C.current),void E(!1);o>=5||R((function(e){var t,a=u([],e,!0),i=c[Math.floor(Math.random()*c.length)];return i&&(a[o]=n(n({},i),{primaryRole:(null===(t=r[o])||void 0===t?void 0:t.primaryRole)||"Spinning..."})),a}))}),50),setTimeout((function(){T([0]),R((function(e){var t=u([],e,!0);return r[0]&&(t[0]=r[0]),t})),o=1}),1e3),setTimeout((function(){T((function(e){return u(u([],e,!0),[1],!1)})),R((function(e){var t=u([],e,!0);return r[1]&&(t[1]=r[1]),t})),o=2}),2e3),setTimeout((function(){T((function(e){return u(u([],e,!0),[2],!1)})),R((function(e){var t=u([],e,!0);return r[2]&&(t[2]=r[2]),t})),o=3}),3e3),setTimeout((function(){T((function(e){return u(u([],e,!0),[3],!1)})),R((function(e){var t=u([],e,!0);return r[3]&&(t[3]=r[3]),t})),o=4}),4e3),setTimeout((function(){T((function(e){return u(u([],e,!0),[4],!1)})),R((function(e){var t=u([],e,!0);return r[4]&&(t[4]=r[4]),t})),o=5}),5e3)}},className:"randomize-button",disabled:w},w?"Spinning...":"Randomize Team"),r.default.createElement("div",{className:"heroes-container"},(w?k:f).slice(0,5).map((function(e,t){return r.default.createElement("div",{key:t,className:"hero-card ".concat(w&&!S.includes(t)?"spinning":"")},r.default.createElement("div",{className:"position-number"},"Pick ",t+1),r.default.createElement("div",{className:"hero-image-container"},r.default.createElement("img",{src:(null==e?void 0:e.image)||"",alt:(null==e?void 0:e.name)||"Hero",className:"hero-image ".concat(w&&!S.includes(t)?"spinning":"")})),r.default.createElement("h3",null,(null==e?void 0:e.name)||"Loading..."),r.default.createElement("div",{className:"hero-primary-role"},r.default.createElement("span",{className:"role-badge primary"},(null==e?void 0:e.primaryRole)||"Loading...")),r.default.createElement("button",{onClick:function(){return function(e){if(0!==c.length){var t=f[e].primaryRole,r=c.filter((function(e){return e.primaryRole===t&&!f.some((function(t){return t.name===e.name}))}));if(r.length>0){var n=r[Math.floor(Math.random()*r.length)],a=u([],f,!0);a[e]=n,d(a)}}}(t)},className:"replace-button",disabled:w},"Replace Hero"))}))))}; //# sourceMappingURL=index.js.map