(this["webpackJsonpspotify-record-collection"]=this["webpackJsonpspotify-record-collection"]||[]).push([[0],{148:function(e,t,n){},149:function(e,t,n){},150:function(e){e.exports=JSON.parse('{"name":"spotify-record-collection","version":"1.0.27","private":true,"dependencies":{"@testing-library/jest-dom":"^5.11.9","@testing-library/react":"^11.2.3","@testing-library/user-event":"^12.6.2","@types/crypto-js":"^4.0.1","@types/jest":"^26.0.20","@types/node":"^12.19.15","@types/react":"^16.14.2","@types/react-dom":"^16.9.10","@types/react-router":"^5.1.11","@types/react-router-dom":"^5.1.7","axios":"^0.21.1","bootstrap":"^4.6.0","crypto-js":"^4.0.0","crypto-random-string":"^3.3.0","react":"^17.0.1","react-dom":"^17.0.1","react-router":"^5.2.0","react-router-dom":"^5.2.0","react-scripts":"4.0.1","reactstrap":"^8.9.0","typescript":"^4.1.3","web-vitals":"^0.2.4"},"scripts":{"start":"react-scripts start","build":"react-scripts build","test":"react-scripts test","eject":"react-scripts eject"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]}}')},162:function(e,t){},164:function(e,t){},175:function(e,t){},177:function(e,t){},204:function(e,t){},206:function(e,t){},207:function(e,t){},212:function(e,t){},214:function(e,t){},233:function(e,t){},245:function(e,t){},248:function(e,t){},278:function(e,t,n){"use strict";n.r(t);var a=n(2),r=n(1),c=n.n(r),s=n(49),o=n.n(s),i=n(51),u=(n(148),n(149),n(10)),l=n(279);function d(e){var t=n(150);return Object(a.jsxs)("div",{className:"d-flex flex-column min-vh-100",children:[Object(a.jsx)("main",{className:"flex-fill",children:Object(a.jsx)(l.a,{fluid:!0,className:"p-0",children:e.children})}),Object(a.jsx)("footer",{children:Object(a.jsx)(l.a,{className:"text-center",children:Object(a.jsxs)("p",{className:"text-muted",children:["Credits | About | v",t.version]})})})]})}var p=n(11),f=n(9),b=n.n(f),j=n(13),h=n(75),m=n.n(h),O=n(35),x=n.n(O);function v(e){return new Promise((function(t,n){console.log("response status: ".concat(e.status)),(e.status<400?t:n)({ok:e.status>=200&&e.status<300,status:e.status,data:e.data})}))}var g=c.a.createContext({authDetails:void 0,authDetailsUpdated:function(){}}),y=n(280),k=n(281),w=n(298),S=n(282),_="078e53defda343c19205d805139575e0",C="authCodeVerifier",N="authState",A=window.location.origin+"/";function L(){var e=Object(u.e)(),t=Object(r.useContext)(g),n=Object(r.useState)(),c=Object(p.a)(n,2),s=c[0],o=c[1],i=new URLSearchParams(window.parent.location.search),d=i.get("code"),f=i.get("state"),h=i.get("error");Object(r.useEffect)((function(){if(null==h){if(null!=d){var n=localStorage.getItem(N);if(f===n){var a=localStorage.getItem(C);localStorage.removeItem(C),localStorage.removeItem(N),function(e,t,n,a,r){U.apply(this,arguments)}("https://accounts.spotify.com/api/token",d,a,(function(n){t.authDetailsUpdated(n),e.push("/")}),(function(e){400===e.status&&o("".concat(e.data.error,": ").concat(e.data.error_description))}))}else o("Invalid state: The state returned from the OAuth request did not match the state value sent with the initial request.")}}else o(h)}),[d,f,h,o,t,e]);var O=Object(r.useCallback)(Object(j.a)(b.a.mark((function e(){var t,n,a,r;return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=m()({length:128}),localStorage.setItem(C,t),e.next=4,B(t);case 4:n=e.sent,a=m()({length:14,type:"base64"}),localStorage.setItem(N,a),r="https://accounts.spotify.com/authorize?response_type=code&client_id=".concat(_,"&redirect_uri=").concat(encodeURIComponent(A),"&state=").concat(a,"&code_challenge=").concat(n,"&code_challenge_method=S256&scope=").concat("user-library-read"),window.location.href=r;case 9:case"end":return e.stop()}}),e)}))),[]);return Object(a.jsx)(l.a,{children:Object(a.jsx)(y.a,{className:"justify-content-center",children:Object(a.jsxs)(k.a,{md:6,className:"border border-darker rounded text-center p-3",children:[Object(a.jsx)("p",{children:"You need to login to your Spotify account and give permission for us to read your Library."}),s&&Object(a.jsxs)(w.a,{color:"danger",children:["Failed to authenticate: ",s]}),!d&&Object(a.jsxs)(S.a,{className:"bg-spotify border-0 p-2 px-3",onClick:O,children:[Object(a.jsx)("img",{className:"logo float-left",src:"/img/Spotify_Icon_RGB_Black.png",alt:"Spotify Logo"})," Authenticate with Spotify"]})]})})})}function I(e){var t=(new TextEncoder).encode(e);return window.crypto.subtle.digest("SHA-256",t)}function D(e){return btoa(String.fromCharCode.apply(null,Array.from(new Uint8Array(e)))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function B(e){return E.apply(this,arguments)}function E(){return(E=Object(j.a)(b.a.mark((function e(t){var n,a;return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,I(t);case 2:return n=e.sent,a=D(n),e.abrupt("return",a);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function U(){return(U=Object(j.a)(b.a.mark((function e(t,n,a,r,c){var s,o;return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(s=new URLSearchParams).append("client_id",_),s.append("grant_type","authorization_code"),s.append("code",n),s.append("redirect_uri",A),s.append("code_verifier",a),o={headers:{"Content-Type":"application/x-www-form-urlencoded"},validateStatus:function(e){return!0}},e.next=9,x.a.post(t,s,o).then(v).then((function(e){console.log(e),r(e.data)})).catch((function(e){console.log(e.data),c(e)}));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var F=n(142),z=n(78);function R(e,t,n,a){return T.apply(this,arguments)}function T(){return(T=Object(j.a)(b.a.mark((function e(t,n,a,r){var c;return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t||(t="https://api.spotify.com/v1/me/albums?offset=0&limit=50"),e.next=3,x.a.get(t,{headers:{Authorization:"Bearer ".concat(null===(c=n.authDetails)||void 0===c?void 0:c.access_token)},validateStatus:function(e){return!0}}).then(v).then(function(){var e=Object(j.a)(b.a.mark((function e(t){return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:console.log(t),a(t.data);case 2:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()).catch((function(e){console.log(e),401===e.status?n.authDetailsUpdated(void 0):r(e)}));case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function P(e,t,n){return G.apply(this,arguments)}function G(){return(G=Object(j.a)(b.a.mark((function e(t,n,a){var r;return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x.a.get("https://api.spotify.com/v1/me/",{headers:{Authorization:"Bearer ".concat(null===(r=t.authDetails)||void 0===r?void 0:r.access_token)},validateStatus:function(e){return!0}}).then(v).then(function(){var e=Object(j.a)(b.a.mark((function e(t){return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:console.log(t),n(t.data);case 2:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()).catch((function(e){console.log(e),401===e.status?t.authDetailsUpdated(void 0):a(e)}));case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function M(e,t,n,a){return J.apply(this,arguments)}function J(){return(J=Object(j.a)(b.a.mark((function e(t,n,a,r){var c;return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x.a.get(t,{headers:{Authorization:"Bearer ".concat(null===(c=n.authDetails)||void 0===c?void 0:c.access_token)},validateStatus:function(e){return!0}}).then(v).then(function(){var e=Object(j.a)(b.a.mark((function e(t){return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:console.log(t),a(t.data);case 2:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()).catch((function(e){console.log(e),401===e.status?n.authDetailsUpdated(void 0):r(e)}));case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var q=n(283);function H(e){var t=e.isLoading,n=e.message;return Object(a.jsx)(a.Fragment,{children:t&&Object(a.jsx)("div",{className:"loading d-flex justify-content-center",children:Object(a.jsxs)("div",{className:"spinners align-self-center",children:[Object(a.jsx)(q.a,{color:"success"}),Object(a.jsx)(q.a,{color:"danger",children:"Loading"}),Object(a.jsx)(q.a,{color:"warning"}),n&&Object(a.jsx)("p",{children:n})]})})})}function V(e){var t,n=Object(r.useContext)(g),c=e.onLoadCompleted,s=Object(r.useState)(),o=Object(p.a)(s,2),i=o[0],u=o[1],l=Object(r.useState)({total:0,current:0,percentage:0}),d=Object(p.a)(l,2),f=d[0],h=d[1];return Object(r.useEffect)((function(){function e(e,n){return t.apply(this,arguments)}function t(){return(t=Object(j.a)(b.a.mark((function t(r,o){return b.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,R(r,n,function(){var t=Object(j.a)(b.a.mark((function t(n){return b.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(o.push.apply(o,Object(F.a)(n.items.map((function(e){return e.album})))),h(s(n)),!n.next){t.next=6;break}return t.next=5,e(n.next,o);case 5:return t.abrupt("return");case 6:c(a(o));case 7:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),(function(e){u(e.data)}));case 2:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function a(e){return{allAlbums:e,byArtist:r(e)}}function r(e){var t=new Map;return e.forEach((function(e){e.artists.forEach((function(n){var a;t.has(n.name)||t.set(n.name,Object(z.a)(Object(z.a)({},n),{},{albums:[]})),null===(a=t.get(n.name))||void 0===a||a.albums.push(e)}))})),t}function s(e){var t=e.offset+e.items.length,n=Math.round(t/e.total*100);return{current:t,total:e.total,percentage:n}}return e(null,[]),function(){}}),[n,null===(t=n.authDetails)||void 0===t?void 0:t.access_token,c]),Object(a.jsxs)(a.Fragment,{children:[i&&Object(a.jsx)(H,{isLoading:!0,message:"Error: ".concat(i)}),!i&&Object(a.jsx)(H,{isLoading:!0,message:"Loaded ".concat(f.current," of ").concat(f.total," [").concat(f.percentage,"%]")})]})}var W=n(285),Y=n(286),$=n(287),K=n(288);function Q(e){var t=e.artist,n=t.albums.length>1?"bg-spotify":"text-spotify";return Object(a.jsx)("span",{className:"badge ".concat(n," badge-pill"),children:t.albums.length})}function X(e){var t=e.album,n=e.hasBeenOpened,c=e.onAlbumSelected,s=function(){return window.innerWidth<1024?128:256},o=Object(r.useState)(s()),i=Object(p.a)(o,2),u=i[0],l=i[1];Object(r.useEffect)((function(){function e(){l(s())}return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var d=Object(r.useCallback)((function(){c(t)}),[t,c]);return Object(a.jsxs)("div",{className:"alb mr-3 mb-3",style:{width:u,height:u},children:[Object(a.jsx)("img",{src:function(){var e=t.images.filter((function(e){return e.width>=256})).sort((function(e,t){return e.width>t.width?0:-1}))[0];return n?e.url:"/img/Spotify_Icon_RGB_Green.png"}(),width:"100%",alt:t.name}),Object(a.jsx)("button",{onClick:d,className:"hov",children:t.name})]})}var Z=n(284);function ee(e){var t=e.album,n=e.useAppLinks,r=e.onClose;function c(e){var t=Math.floor(e/1e3%60),n=Math.floor(e/6e4%60);return"".concat(n,":").concat(t<10?"0"+t:t)}return Object(a.jsxs)("div",{className:"px-2 py-1 bg-transparent-dark h-100",children:[Object(a.jsx)("button",{type:"button",className:"close m-1 ml-3","aria-label":"Close",onClick:r,children:Object(a.jsx)("span",{"aria-hidden":"true",children:"\xd7"})}),Object(a.jsx)("h5",{children:Object(a.jsx)("a",{href:n?t.uri:t.external_urls.spotify,rel:"noreferrer",target:"_blank",className:"hov",children:t.name})}),Object(a.jsxs)("p",{className:"text-muted",children:[t.release_date," on ",t.label]}),Object(a.jsxs)(Z.a,{className:"text-spotify border-darker",children:[Object(a.jsx)("thead",{children:Object(a.jsxs)("tr",{children:[Object(a.jsx)("th",{scope:"col",children:"#"}),Object(a.jsx)("th",{scope:"col",className:"col-10",children:"Track"}),Object(a.jsx)("th",{scope:"col"})]})}),Object(a.jsx)("tbody",{children:t.tracks.items.map((function(e){return Object(a.jsxs)("tr",{children:[Object(a.jsx)("th",{scope:"row",children:e.track_number}),Object(a.jsx)("td",{children:Object(a.jsx)("a",{href:n?e.uri:e.external_urls.spotify,rel:"noreferrer",target:"_blank",className:"hov",children:e.name})}),Object(a.jsx)("td",{children:c(e.duration_ms)})]})}))})]})]})}function te(e){var t=Object(r.useContext)(g),n=e.artist,c=e.useAppLinks,s=Object(r.useState)(),o=Object(p.a)(s,2),i=o[0],u=o[1],l=Object(r.useState)({isOpen:!1,isFirstOpen:!0}),d=Object(p.a)(l,2),f=d[0],h=d[1],m=Object(r.useState)(),O=Object(p.a)(m,2),x=O[0],v=O[1],w=Object(r.useCallback)(Object(j.a)(b.a.mark((function e(){return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(i){e.next=3;break}return e.next=3,M(n.href,t,(function(e){u(e)}),(function(e){}));case 3:case"end":return e.stop()}}),e)}))),[n.href,t,i]),_=Object(r.useCallback)((function(e){v(e)}),[]);return Object(a.jsxs)(W.a,{className:"bg-transparent border-darker",children:[Object(a.jsxs)(Y.a,{className:"d-flex justify-content-between align-items-center position-relative",children:[Object(a.jsx)(S.a,{color:"link",id:"tog".concat(n.id),onClick:function(){return h((function(e){return{isOpen:!e.isOpen,isFirstOpen:!1}}))},children:n.name}),Object(a.jsx)(Q,{artist:n})]}),Object(a.jsx)($.a,{toggler:"#tog".concat(n.id),onEntered:w,isOpen:f.isOpen,children:Object(a.jsxs)(K.a,{className:x?"":"pr-0 pb-0",children:[Object(a.jsxs)(y.a,{noGutters:!0,children:[Object(a.jsx)(k.a,{children:Object(a.jsx)("div",{className:"d-flex flex-row flex-wrap",children:n.albums.sort((function(e,t){return e.release_date>t.release_date?0:-1})).map((function(e){return Object(a.jsx)(X,{album:e,hasBeenOpened:!f.isFirstOpen,onAlbumSelected:_},e.id)}))})}),x&&Object(a.jsx)(k.a,{sm:5,children:Object(a.jsx)(ee,{album:x,useAppLinks:c,onClose:function(){return _(void 0)}})})]}),Object(a.jsx)("div",{className:"bg",style:function(e){if(!e)return{};if(0===e.length)return{backgroundImage:"url('./img/Spotify_Icon_RGB_Green.png')",backgroundPosition:"top left",backgroundAttachment:"local",backgroundSize:"128px 128px",opacity:.02};var t=e.sort((function(e,t){return e.width>t.width?-1:0}))[0].url;return{backgroundImage:"url('".concat(t,"')"),backgroundPosition:"top right",backgroundRepeat:"repeat-y",backgroundSize:"100% auto",opacity:.1}}(null===i||void 0===i?void 0:i.images)})]})})]})}var ne=n(289),ae=n(290),re=n(291);function ce(){var e,t=Object(r.useState)(),n=Object(p.a)(t,2),c=n[0],s=n[1],o=Object(r.useState)(!1),i=Object(p.a)(o,2),u=i[0],d=i[1],f=Object(r.useCallback)((function(e){s(e)}),[]),b=Object(r.useCallback)((function(){d((function(e){return!e}))}),[]);function j(e){return e.toLowerCase().replace(/^the\s/i,"")}return Object(a.jsxs)(l.a,{children:[!c&&Object(a.jsx)(V,{onLoadCompleted:f}),c&&Object(a.jsxs)(a.Fragment,{children:[Object(a.jsxs)("p",{className:"mb-1",children:["Total Liked Albums: ",c.allAlbums.length," ",Object(a.jsx)("span",{className:"text-muted",children:"|"})," Liked Album Artists: ",c.byArtist.size]}),Object(a.jsx)(ne.a,{check:!0,className:"mb-3 mt-0 ml-1 text-muted",children:Object(a.jsxs)(ae.a,{check:!0,children:[Object(a.jsx)(re.a,{type:"checkbox",checked:u,onChange:b})," ","Use Spotify App links"]})}),Object(a.jsx)("div",{className:"accordion coll",children:(e=c.byArtist,Array.from(e.keys()).sort((function(e,t){return j(e)>j(t)?0:-1})).map((function(t){var n=e.get(t);return Object(a.jsx)(te,{artist:n,useAppLinks:u},n.id)})))})]})]})}var se=n(294),oe=n(295),ie=n(296),ue=n(297),le=n(292),de=n(293);function pe(){var e=Object(r.useContext)(g),t=Object(r.useState)(),n=Object(p.a)(t,2),c=n[0],s=n[1],o=Object(r.useState)(),i=Object(p.a)(o,2),u=i[0],l=i[1];return Object(r.useEffect)((function(){function t(){return(t=Object(j.a)(b.a.mark((function t(){return b.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,P(e,function(){var e=Object(j.a)(b.a.mark((function e(t){return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s(t);case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),(function(e){l(e.data)}));case 2:case"end":return t.stop()}}),t)})))).apply(this,arguments)}return function(){t.apply(this,arguments)}(),function(){}}),[e]),Object(a.jsxs)(le.a,{children:[c&&Object(a.jsx)(de.a,{href:c.external_urls.spotify,rel:"noreferrer",target:"_blank",children:c.display_name}),!c&&u&&Object(a.jsx)("span",{children:"errorMessage"})]})}function fe(){var e=Object(r.useState)(!0),t=Object(p.a)(e,2),n=t[0],c=t[1],s=Object(r.useContext)(g),o=Object(r.useCallback)((function(){s.authDetailsUpdated(void 0)}),[s]);return Object(a.jsxs)(se.a,{dark:!0,expand:"md",className:"bg-spotify mb-3",children:[Object(a.jsxs)(oe.a,{tag:i.b,to:"/",className:"pb-0",children:[Object(a.jsx)("img",{src:"/img/Spotify_Icon_RGB_Black.png",width:"40px",className:"pb-1 mr-1",alt:""})," Spotify Record Collection"]}),Object(a.jsx)(ie.a,{onClick:function(){return c((function(e){return!e}))},className:"mr-2"}),Object(a.jsx)($.a,{isOpen:!n,navbar:!0,children:Object(a.jsxs)(ue.a,{className:"ml-auto",navbar:!0,children:[s.authDetails&&Object(a.jsx)(pe,{}),Object(a.jsx)(le.a,{children:s.authDetails&&Object(a.jsx)(de.a,{href:"#",onClick:o,children:"Sign Out"})})]})})]})}function be(){var e="lastAccessToken",t=Object(r.useState)(),n=Object(p.a)(t,2),c=n[0],s=n[1];Object(r.useEffect)((function(){if(!c){var t=localStorage.getItem(e);t&&s({access_token:t,expires_in:0,scope:"",token_type:"",refresh_token:""})}}),[c]);var o=Object(r.useCallback)((function(t){var n;console.log("Auth Changed: ".concat(null===t||void 0===t?void 0:t.access_token)),(n=null===t||void 0===t?void 0:t.access_token)?localStorage.setItem(e,n):localStorage.removeItem(e),s(t)}),[]);return Object(a.jsxs)(g.Provider,{value:{authDetails:c,authDetailsUpdated:o},children:[Object(a.jsx)(fe,{}),c&&Object(a.jsx)(ce,{}),!c&&Object(a.jsx)(L,{})]})}var je,he=function(){return Object(a.jsx)(d,{children:Object(a.jsx)(u.a,{exact:!0,path:"/",component:be})})},me=function(e){e&&e instanceof Function&&n.e(3).then(n.bind(null,299)).then((function(t){var n=t.getCLS,a=t.getFID,r=t.getFCP,c=t.getLCP,s=t.getTTFB;n(e),a(e),r(e),c(e),s(e)}))},Oe=(n(277),null!==(je=document.getElementsByTagName("base")[0].getAttribute("href"))&&void 0!==je?je:void 0),xe=document.getElementById("root");o.a.render(Object(a.jsx)(c.a.StrictMode,{children:Object(a.jsx)(i.a,{basename:Oe,children:Object(a.jsx)(he,{})})}),xe),me()}},[[278,1,2]]]); //# sourceMappingURL=main.5c5f2025.chunk.js.map