{"version":3,"sources":["context/reducers.js","context/index.js","utils/shuffle.js","utils/querybuilder.js","utils/timeconvert.js","utils/getMonth.js","utils/getParams.js","config/index.js","services/axios.js","services/toplist.js","services/isFollowingArtists.js","services/artists.js","services/recently.js","services/tracks.js","services/recommendations.js","services/user.js","services/play.js","services/playlist.js","services/getToken.js","services/followArtist.js","services/unFollowArtist.js","services/isSavedTracks.js","services/saveTrack.js","services/removeSavedTrack.js","services/singin.js","services/firebase/index.js","icons/share-twitter.js","icons/share-facebook.js","icons/share-tumblr.js","components/PlaylistModal/index.js","components/Modal/portal.js","components/Modal/index.js","style/img/icons/bell.svg","icons/reload.js","icons/menu.js","style/img/icons/calendar.svg","utils/CustomSelect.js","components/Header/index.js","icons/plus.js","icons/music-list.js","style/img/icons/logo-white.svg","icons/dashboard.js","icons/apple.js","components/Aside/index.js","style/img/logo-1984.svg","components/Player/index.js","icons/volume-1.js","icons/volume-2.js","icons/volume-x.js","components/Player/volume.js","icons/heart.js","icons/play.js","icons/next.js","icons/prev.js","components/Player/player.js","utils/LoadScript.js","components/Footer/index.js","components/Email/index.js","layout/index.js","PrivateRoute/index.js","utils/ScrollToTop.js","style/img/icons/logo.svg","pages/Login/index.js","pages/Privacy/index.js","components/Loader/itemLoader.js","components/Recently/item.js","components/Recently/index.js","components/Loader/index.js","components/Top/index.js","pages/dashboard.js","pages/Artists/item.js","pages/Artists/index.js","pages/Tracks/index.js","pages/Recent/index.js","pages/Discover/index.js","pages/Playlist/index.js","components/main.js","App.js","index.js"],"names":["reducers","GET_USER","GET_TOPLIST","GET_ARTISTS","GET_TRACKS","GET_RECENTLY","SET_PLAYER","GET_RECOMMENDATIONS","SET_PLAYINGTRACKS","SET_SAVEDTRACKS","SET_PLAYLIST","SET_CURRENTLYPLAYING","SET_ISSAVED","SET_DEVICE","SET_COLLAPSE","SET_TIMERANGE","Context","createContext","initialState","user","data","display_name","email","images","url","loading","error","status","message","topList","artists","tracks","album","recommendations","recently","track","duration_ms","name","playingTracks","source","isSaved","currentlyPlaying","paused","isSetted","playerPlaying","player","playlist","deviceId","timeRange","ranges","long_term","medium_term","short_term","ContextProvider","children","useReducer","state","action","payload","type","reduce","collapsed","Error","dispatch","Provider","value","shuffle","array","temporaryValue","randomIndex","currentIndex","length","Math","floor","random","queryParametrize","query","queryParametrizedUrl","isObject","isEmpty","Object","keys","map","k","encodeURIComponent","join","timeConvert","num","Date","toISOString","slice","dt","locale","undefined","navigator","languages","language","fullMonth","toLocaleDateString","month","fullYear","year","querystring","stringify","refresh_token","localStorage","getItem","grant_type","config","SPOTIFY_AUTH_SCOPES","SPOTIFY_CALLBACK_URL","window","location","origin","SPOTIFY_CLIENT_ID","process","FIREBASE_BASE_URL","SPOTIFY_AUTHORIZE_URL","axiosInstance","axios","create","baseURL","interceptors","request","use","token","headers","common","Promise","reject","createAuthRefreshInterceptor","failedRequest","get","params","getParams","then","tokenRefreshResponse","setItem","access_token","response","resolve","catch","e","signInWithSpotify","cached","getTopList","a","disableCache","hasOwnProperty","limit","time_range","offset","items","genres","seed_artists","i","id","seed_genres","all","country","isSavedTracks","savedTracks","isFollowingArtists","artistsId","ids","getArtists","isFollowArtists","isFollow","getArtistByIds","getRecent","err","getTracks","getRecommendations","cache","getCurrentUser","play","spotify_uris","player_id","put","uris","createPlaylist","post","public","getToken","code","redirect_uri","followArtist","artistId","unFollowArtist","delete","trackIds","saveTrack","trackId","removeSavedTrack","loginUrl","queryBuilder","response_type","client_id","scope","href","firebase","initializeApp","apiKey","authDomain","projectId","storageBucket","messagingSenderId","appId","functions","Icon","xmlns","width","height","fill","viewBox","stroke","strokeWidth","d","PlaylistModal","shareParams","playlistText","setShowModal","addToast","useToasts","useContext","className","onClick","uri","cx","cy","r","strokeLinecap","strokeLinejoin","src","alt","genre","placeholder","readOnly","link","str","el","document","createElement","body","appendChild","select","execCommand","removeChild","copyToClipboard","appearance","autoDismiss","autoDismissTimeout","role","rel","target","desc","Index","useState","modalContainer","useEffect","modalRoot","getElementById","tempEl","append","style","ReactDOM","createPortal","Modal","handleKeyDown","key","overflow","onKeyDown","tabIndex","props","CustomSelect","CalendarIcon","defaultValue","ref","rangeref","useLocation","showModal","title","setShareparams","setPlaylistText","isLoading","setIsLoading","announceRef","useRef","randomAvatar","useMemo","rangeRef","setArtists","current","setTracks","setTopList","setRecently","getRecently","setNewRecommendations","createPlaylistTopTracks","getMonth","addGenreToArtist","generateAndPubishIMG","createPlaylistTopArtists","shuffled","flat","createPlaylistRecentTracks","createPlaylistDiscoverTracks","setTimeout","toPng","opacity","blob","backgroundImage","URL","tracksString","artistDesc","recentlyDesc","discoveryDesc","tracksDesc","metas","searchParams","replace","toBlob","storage","child","refObj","forEach","find","handleCreatePlaylist","pathname","class","mains","querySelectorAll","sidebar","toggle","classList","getTitle","onChange","handleSelectChange","embedWidget","widget","open","BellIcon","xlinkHref","logoutTab","hash","clear","reload","close","SvgComponent","clipPath","fillRule","clipRule","Aside","refModal","showTooltip","setShowTooltip","console","log","Logo","exact","activeClassName","to","onMouseLeave","onKeyUp","color","focus","Player","Volume","volume","strokecolor","defaultProps","prototype","PropTypes","string","isPlaying","Array","isArray","track_window","current_track","transform","PlayerComponent","intervalCurrentState","onSlide","setOnslide","playerVolume","setPlayerVolume","onSpotifyWebPlaybackSDKReady","Spotify","getOAuthToken","cb","on","addListener","device_id","stopInterval","startInterval","connect","handleSaveClick","savedList","setDebounced","_","debounce","seek","load","script","async","defer","onload","onerror","head","setInterval","getCurrentState","clearInterval","playing","max","step","previous_tracks","previousTrack","togglePlay","next_tracks","nextTrack","position","currentTarget","min","duration","setVolume","Footer","Email","emailRef","handleSubmit","preventDefault","email_address","onSubmit","required","Layout","setCurrentUser","PrivateRoute","Component","component","rest","history","useHistory","render","search","queryString","parse","push","withRouter","unlisten","listen","scrollTo","Login","useLayoutEffect","backgroundColor","selected","form","Privacy","MyLoader","speed","foregroundColor","x","y","rx","ry","Item","item","refreshDataset","getOrderedTracks","index","splicedTracks","splice","Recently","Loader","Top","toLowerCase","isTrack","Dashboard","handleFollow","display","checked","Artists","Tracks","setRecommendations","Redirect","playlistId","URLSearchParams","Main","path","Playlist","Recent","Discover","App"],"mappings":"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","file":"static/js/main.5ef5e83b.chunk.js","sourcesContent":["const reducers = {\n    GET_USER: \"getCurrentUser\",\n    GET_TOPLIST: \"getTopList\",\n    GET_ARTISTS: \"getArtists\",\n    GET_TRACKS: \"getTracks\",\n    GET_RECENTLY: \"getRecently\",\n    SET_PLAYER: 'setPlayer',\n    GET_RECOMMENDATIONS: \"getRecommendations\",\n    SET_PLAYINGTRACKS: \"setPlayingTracks\",\n    SET_SAVEDTRACKS: \"setSavedTracks\",\n    SET_PLAYLIST: \"setPlaylist\",\n    SET_CURRENTLYPLAYING: \"setCurrentlyPlaying\",\n    SET_ISSAVED: \"setIsSaved\",\n    SET_DEVICE: \"setDeviceId\",\n    SET_COLLAPSE: \"setCollapse\",\n    SET_TIMERANGE: \"setTimeRange\",\n}\n\nexport default reducers","import React, { createContext, useReducer } from \"react\";\nimport reduce from './reducers'\n\nexport const Context = createContext();\n\nconst initialState = {\n    user: {\n        data: {\n            display_name: null,\n            email: null,\n            images: [{\n                url: null\n            }]\n        },\n        loading: true,\n        error: false,\n        status: '',\n        message: ''\n    },\n    topList: {\n        data: {\n            artists: [{ images: [{ url: null }, { url: null }, { url: null }] }],\n            tracks: [{\n                album: { images: [{ url: null }, { url: null }, { url: null }] }\n            }],\n            recommendations: [{\n                album: { images: [{ url: null }, { url: null }, { url: null }] }\n            }],\n            recently: [{\n                track: { duration_ms: 0, album: { artists: [{ name: null }], images: [{ url: null }, { url: null }, { url: null }] } }\n            }],\n        },\n        loading: true,\n        error: false,\n        status: '',\n        message: ''\n    },\n    artists: {\n        data: [{ images: [{ url: null }, { url: null }, { url: null }] }],\n        loading: true,\n        error: false,\n        status: '',\n        message: ''\n    },\n    tracks: {\n        data: [{\n            album: { images: [{ url: null }, { url: null }, { url: null }] }\n        }],\n        loading: true,\n        error: false,\n        status: '',\n        message: ''\n    },\n    recommendations: {\n        data: [{\n            album: { images: [{ url: null }, { url: null }, { url: null }] }\n        }],\n        loading: true,\n        error: false,\n        status: '',\n        message: ''\n    },\n    recently: {\n        data: [{\n            track: { duration_ms: 0, album: { artists: [{ name: null }], images: [{ url: null }, { url: null }, { url: null }] } }\n        }],\n        loading: true,\n        error: false,\n        status: '',\n        message: ''\n    },\n    playingTracks: {\n        source: \"\",\n        data: [],\n        isSaved: []\n    },\n    currentlyPlaying: {\n        data: { paused: false },\n        loading: true,\n        isSaved: false,\n        isSetted: false,\n    },\n    playerPlaying: false,\n    player: null,\n    playlist: {},\n    deviceId: \"\",\n    timeRange: \"long_term\",\n    ranges: {\n        long_term: \"All Time\",\n        medium_term: \"Last 6 months\",\n        short_term: \"Last month\"\n    },\n    error: {\n        message: \"\"\n    }\n}\n\nconst ContextProvider = ({ children }) => {\n\n    const reducer = (state, action) => {\n        if (action.payload.error) {\n            return {\n                ...state,\n                error: action.payload\n            }\n        }\n        switch (action.type) {\n            case reduce.GET_ARTISTS:\n                return {\n                    ...state,\n                    artists: action.payload\n                };\n            case reduce.SET_PLAYINGTRACKS:\n                return {\n                    ...state,\n                    playingTracks: {\n                        ...state.playingTracks,\n                        data: action.payload.data,\n                    }\n                };\n            case reduce.SET_SAVEDTRACKS:\n                return {\n                    ...state,\n                    playingTracks: {\n                        ...state.playingTracks,\n                        isSaved: action.payload\n                    }\n                };\n            case reduce.SET_CURRENTLYPLAYING:\n                return {\n                    ...state,\n                    currentlyPlaying: {\n                        ...state.currentlyPlaying,\n                        data: action.payload.data,\n                        loading: action.payload.loading,\n                    }\n                }\n            case reduce.GET_RECENTLY:\n                return {\n                    ...state,\n                    recently: action.payload\n                };\n            case reduce.GET_RECOMMENDATIONS:\n                return {\n                    ...state,\n                    recommendations: action.payload\n                };\n            case reduce.GET_TOPLIST:\n                return {\n                    ...state,\n                    topList: action.payload\n                };\n            case reduce.GET_TRACKS:\n                return {\n                    ...state,\n                    tracks: action.payload\n                };\n            case reduce.GET_USER:\n                return {\n                    ...state,\n                    user: action.payload\n                };\n            case reduce.SET_PLAYER:\n                return {\n                    ...state,\n                    player: action.payload\n                };\n            case reduce.SET_PLAYLIST:\n                return {\n                    ...state,\n                    playlist: action.payload\n                };\n\n            case reduce.SET_DEVICE:\n                return {\n                    ...state,\n                    deviceId: action.payload\n                };\n            case reduce.SET_COLLAPSE:\n                return {\n                    ...state,\n                    collapsed: action.payload\n                };\n            case reduce.SET_TIMERANGE:\n                return {\n                    ...state,\n                    timeRange: action.payload\n                };\n            default:\n                throw new Error();\n        }\n    }\n\n    const [state, dispatch] = useReducer(reducer, initialState);\n\n    return (\n        <Context.Provider value={{ state, dispatch }} >\n            {children}\n        </Context.Provider>\n    );\n};\nexport default ContextProvider;","const shuffle = (array) => {\n    let currentIndex = array.length, temporaryValue, randomIndex;\n\n    // While there remain elements to shuffle...\n    while (0 !== currentIndex) {\n\n        // Pick a remaining element...\n        randomIndex = Math.floor(Math.random() * currentIndex);\n        currentIndex -= 1;\n\n        // And swap it with the current element.\n        temporaryValue = array[currentIndex];\n        array[currentIndex] = array[randomIndex];\n        array[randomIndex] = temporaryValue;\n    }\n\n    return array;\n}\n\nexport default shuffle","import { isObject, isEmpty } from \"lodash\";\n\nconst queryParametrize = (url, query) => {\n    let queryParametrizedUrl = url;\n\n    if (isObject(query) && !isEmpty(query)) {\n        queryParametrizedUrl +=\n            \"?\" +\n            Object.keys(query)\n                .map((k) => {\n                    return encodeURIComponent(k) + \"=\" + encodeURIComponent(query[k]);\n                })\n                .join(\"&\");\n    }\n\n    return queryParametrizedUrl;\n};\n\nexport default queryParametrize;\n","function timeConvert(num) {\n    if (num === 0) return '00:00'\n    if (num) return new Date(num).toISOString().slice(14, -5);\n}\n\nexport default timeConvert","const dt = new Date();\nconst locale = navigator.languages != undefined ? navigator.languages[0] : navigator.language;\nconst fullMonth = dt.toLocaleDateString(locale, { month: 'long' });\nconst fullYear = dt.toLocaleDateString(locale, { year: \"numeric\" });\nexport default `${fullMonth} ${fullYear}`","import querystring from 'querystring'\n\nexport default () => {\n    return querystring.stringify({\n        refresh_token: localStorage.getItem('refresh_token'),\n        grant_type: \"refresh_token\"\n    })\n}","const config = {\n  SPOTIFY_AUTH_SCOPES: `user-read-playback-state user-read-currently-playing streaming\n    user-read-email\n    user-read-private\n    user-top-read\n    user-follow-modify\n    user-library-read\n    user-library-modify\n    user-follow-read\n    user-read-recently-played\n    playlist-modify-public\n    playlist-modify-private\n    playlist-read-private\n    playlist-read-collaborative`,\n  SPOTIFY_CALLBACK_URL: `${window.location.origin}/dashboard`,\n  SPOTIFY_CLIENT_ID: process.env.REACT_APP_SPOTIFY_CLIENT_ID,\n  FIREBASE_BASE_URL: process.env.REACT_APP_FIREBASE_BASE_URL,\n  SPOTIFY_AUTHORIZE_URL: \"https://accounts.spotify.com/authorize\",\n};\n\nexport default config;\n","import axios from 'axios';\nimport config from '../config'\nimport { getParams } from '../utils'\nimport { signInWithSpotify } from './index'\nimport createAuthRefreshInterceptor from 'axios-auth-refresh';\n\nconst axiosInstance = axios.create({\n    baseURL: \"https://api.spotify.com/v1\"\n});\n\naxiosInstance.interceptors.request.use(\n    config => {\n        const token = localStorage.getItem('token');\n        if (token) {\n            config.headers.common['Authorization'] = `Bearer ${token}`;\n        }\n        return config;\n    },\n    error => Promise.reject(error)\n);\n\nconst refreshAuthLogic = failedRequest => axios.get(`${config.FIREBASE_BASE_URL}/getFreshToken`, {\n    params: {\n        payload: getParams()\n    }\n}).then(tokenRefreshResponse => {\n    localStorage.setItem('token', tokenRefreshResponse.data.access_token);\n    if (tokenRefreshResponse.data?.refresh_token) {\n        localStorage.setItem('refresh_token', tokenRefreshResponse.data.refresh_token);\n    }\n    failedRequest.response.config.headers['Authorization'] = 'Bearer ' + tokenRefreshResponse.data.access_token;\n    return Promise.resolve();\n}).catch(e => {\n    let err = { ...e }\n    if (err.response.data.error === 'invalid_grant') signInWithSpotify()\n})\n\n\n// Instantiate the interceptor (you can chain it as it returns the axios instance)\ncreateAuthRefreshInterceptor(axiosInstance, refreshAuthLogic);\n\nexport default axiosInstance\n","import { shuffle } from '../utils'\nimport { isSavedTracks } from './index'\nimport axios from './axios'\n\nlet cached = {}\n\nconst getTopList = async (timeRange = \"long_term\", disableCache = false) => {\n    try {\n        if (!cached.hasOwnProperty('tracks') || disableCache) {\n            let { data: { items: tracks } } = await axios.get('/me/top/tracks', {\n                params: {\n                    limit: \"5\",\n                    time_range: timeRange,\n                    offset: \"0\"\n                }\n            })\n            let { data: { items: artists } } = await axios.get('/me/top/artists', {\n                params: {\n                    limit: \"5\",\n                    time_range: timeRange,\n                    offset: \"0\"\n                }\n            })\n\n            let { data: { genres } } = await axios.get('/recommendations/available-genre-seeds');\n            let { data: { tracks: recommendations } } = await axios.get('/recommendations', {\n                params: {\n                    limit: \"5\",\n                    seed_artists: shuffle(artists.map(i => i.id)).slice(1, 2).join``,\n                    seed_genres: shuffle(genres).slice(1, 3).join``\n                }\n            })\n\n            let { data: { items: recently } } = await axios.get('/me/player/recently-played', {\n                params: {\n                    limit: \"5\"\n                }\n            })\n\n            artists = await Promise.all(artists.map(async i => {\n                let { data: { tracks } } = await axios.get(`/artists/${i.id}/top-tracks`, {\n                    params: {\n                        country: \"US\"\n                    }\n                })\n                return {\n                    ...i,\n                    tracks\n                }\n            }));\n            cached = {\n                artists,\n                tracks,\n                recommendations,\n                recently\n            }\n\n        }\n        let savedTracks = await isSavedTracks(cached.recently.map(i => i.track.id))\n        cached.recently = cached.recently.map((i, k) => {\n            return {\n                ...i,\n                track: {\n                    ...i.track,\n                    isSaved: savedTracks[k]\n                }\n            }\n        })\n        return {\n            data: cached,\n            error: false,\n            loading: false\n        }\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default getTopList","import axios from './axios'\n\nconst isFollowingArtists = async (artistsId) => {\n    try {\n        let { data } = await axios.get('/me/following/contains', {\n            params: {\n                ids: artistsId.join(','),\n                type: 'artist'\n            }\n        })\n        return data\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default isFollowingArtists","import axios from './axios'\nimport isFollowingArtists from './isFollowingArtists'\n\nconst getArtists = async (limit = 50, time_range = \"long_term\") => {\n    try {\n        let { data: { items } } = await axios.get('/me/top/artists', {\n            params: {\n                limit,\n                time_range,\n                offset: \"0\"\n            }\n        })\n        let isFollowArtists = await isFollowingArtists(items.map(i => i.id))\n        items = await Promise.all(items.map(async (i, k) => {\n            let { data: { tracks } } = await axios.get(`/artists/${i.id}/top-tracks`, {\n                params: {\n                    country: \"US\"\n                }\n            })\n            return {\n                ...i,\n                isFollow: isFollowArtists[k],\n                tracks\n            }\n        }));\n        return {\n            data: items,\n            error: false,\n            loading: false\n        }\n\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport const getArtistByIds = async (artistsId) => {\n    try {\n        let { data: { artists } } = await axios.get('/artists', {\n            params: {\n                ids: artistsId.join(','),\n            }\n        })\n        return {\n            data: artists,\n            error: false,\n            loading: false\n        }\n\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default getArtists","import { isSavedTracks } from './index'\nimport axios from './axios'\n\nconst getRecent = async (limit = 50, time_range = \"long_term\") => {\n\n    try {\n        let { data: { items } } = await axios.get('/me/player/recently-played', {\n            params: {\n                limit,\n                time_range\n            }\n        })\n        let savedTracks = await isSavedTracks(items.map(i => i.track.id))\n        items = items.map((i, k) => {\n            return {\n                ...i,\n                track: {\n                    ...i.track,\n                    isSaved: savedTracks[k]\n                }\n            }\n        })\n\n        return {\n            data: items,\n            error: false,\n            loading: false\n        }\n\n    } catch (e) {\n        let err = { ...e }\n        if (err.hasOwnProperty('response')) {\n            let { response: { data: { error } } } = err\n            return {\n                error: true,\n                status: error.status,\n                message: error.message\n            }\n        } else {\n            return {\n                error: true,\n                status: \"400\",\n                message: \"Something happend with tracks\"\n            }\n        }\n    }\n}\n\nexport default getRecent","import axios from './axios'\nimport { isSavedTracks } from './index'\n\nconst getTracks = async (limit = 50, time_range = \"long_term\") => {\n\n    try {\n        let { data: { items } } = await axios.get('/me/top/tracks', {\n            params: {\n                limit: limit,\n                time_range,\n                offset: \"0\"\n            }\n        })\n        let savedTracks = await isSavedTracks(items.map(i => i.id))\n        items = items.map((i, k) => {\n            return {\n                ...i,\n                isSaved: savedTracks[k]\n            }\n        })\n        return {\n            data: items,\n            error: false,\n            loading: false\n        }\n\n    } catch (e) {\n        let err = { ...e }\n        if (err.hasOwnProperty('response')) {\n            let { response: { data: { error } } } = err\n            return {\n                error: true,\n                status: error.status,\n                message: error.message\n            }\n        } else {\n            return {\n                error: true,\n                status: \"400\",\n                message: \"Something happend with tracks\"\n            }\n        }\n    }\n}\n\nexport default getTracks","import { shuffle } from '../utils'\nimport axios from './axios'\nimport { isSavedTracks } from './index'\n\nlet items = [];\n\nconst getRecommendations = async (limit = 50, cache = true) => {\n    try {\n        if (items.length === 0 || !cache) {\n            let { data: { items: artists } } = await axios.get('/me/top/artists', {\n                params: {\n                    limit: \"5\",\n                    time_range: 'long_term',\n                    offset: \"0\"\n                }\n            })\n            let { data: { genres } } = await axios.get('/recommendations/available-genre-seeds');\n            let { data: { tracks } } = await axios.get('/recommendations', {\n                params: {\n                    limit,\n                    seed_artists: shuffle(artists.map(i => i.id)).slice(1, 2).join``,\n                    seed_genres: shuffle(genres).slice(1, 3).join``\n                }\n            })\n            items = tracks;\n        }\n        let savedTracks = await isSavedTracks(items.map(i => i.id))\n        items = items.map((i, k) => {\n            return {\n                ...i,\n                isSaved: savedTracks[k]\n            }\n        })\n        return {\n            data: items,\n            error: false,\n            loading: false\n        }\n\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default getRecommendations","import axios from './axios'\n\nconst getCurrentUser = async () => {\n    try {\n        let { data } = await axios.get('/me')\n        return {\n            data: data,\n            loading: false,\n            error: false\n        }\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default getCurrentUser","import axios from './axios'\n\nexport const play = async (spotify_uris, player_id) => {\n    try {\n        await axios.put(`/me/player/play?device_id=${player_id}`, {\n            uris: spotify_uris\n        })\n        return true\n    } catch (e) {\n        let { response: { data: { message } } } = { ...e }\n        return false\n    }\n}\n\nexport default play","import axios from './axios'\n\nconst createPlaylist = async (tracks, name) => {\n\n    try {\n        let { data: { id } } = await axios.post('/me/playlists', {\n            name,\n            public: true\n        })\n\n        await axios.post(`/playlists/${id}/tracks`, {\n            uris: tracks\n        })\n\n        let { data } = await axios.get(`/playlists/${id}`)\n\n        return {\n            data,\n            error: false,\n            loading: false\n        }\n\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default createPlaylist","import config from '../config'\nimport axios from 'axios'\n\nconst getToken = async (code) => {\n    try {\n        let { data } = await axios.get(`${config.FIREBASE_BASE_URL}/getRefreshToken`, {\n            params: {\n                code,\n                redirect_uri: config.SPOTIFY_CALLBACK_URL\n            }\n        })\n        return data\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default getToken","import axios from './axios'\n\nconst followArtist = async (artistId) => {\n    try {\n        return await axios.put('/me/following', {}, {\n            params: {\n                ids: artistId,\n                type: \"artist\"\n            }\n        })\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default followArtist","import axios from './axios'\n\nconst unFollowArtist = async (artistId) => {\n    try {\n        return await axios.delete('/me/following', {\n            params: {\n                ids: artistId,\n                type: \"artist\"\n            }\n        })\n\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default unFollowArtist","import axios from './axios';\n\nconst isSavedTracks = async (trackIds) => {\n    try {\n        let { data } = await axios.get('/me/tracks/contains', {\n            params: {\n                ids: trackIds.join(',')\n            }\n        })\n        return data\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default isSavedTracks","import axios from './axios'\n\nconst saveTrack = async (trackId) => {\n    try {\n        return await axios.put('/me/tracks', {\n            ids: [trackId]\n        })\n\n    } catch (e) {\n            let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default saveTrack","import axios from './axios'\n\nconst removeSavedTrack = async (trackId) => {\n    try {\n        return await axios.delete('/me/tracks', {\n            data: {\n                ids: [trackId]\n            }\n        })\n\n    } catch (e) {\n        let { response: { data: { error } } } = { ...e }\n        return {\n            error: true,\n            status: error.status,\n            message: error.message\n        }\n    }\n}\n\nexport default removeSavedTrack","import config from '../config'\nimport { queryBuilder } from '../utils'\n\nconst signInWithSpotify = () => {\n    const loginUrl = queryBuilder(config.SPOTIFY_AUTHORIZE_URL, {\n        response_type: \"code\",\n        client_id: process.env.REACT_APP_SPOTIFY_CLIENT_ID,\n        redirect_uri: config.SPOTIFY_CALLBACK_URL,\n        scope: config.SPOTIFY_AUTH_SCOPES,\n    });\n    window.location.href = loginUrl;\n}\n\nexport default signInWithSpotify","import firebase from \"firebase\"\n\nconst firebaseConfig = {\n    apiKey: \"AIzaSyDFrDC_w_MyBzGKxv2d8tAdslHuJ3VGeEk\",\n    authDomain: \"echoes-307906.firebaseapp.com\",\n    projectId: \"echoes-307906\",\n    storageBucket: \"echoes-307906.appspot.com\",\n    messagingSenderId: \"245286315902\",\n    appId: \"1:245286315902:web:33b8fabc1f5eaf982eb52f\"\n}\nfirebase.initializeApp(firebaseConfig)\n\nconst functions = firebase.functions()\nexport { functions }\nexport default firebase\n","import React from \"react\";\n\nfunction Icon() {\n    return (\n        <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"46\"\n            height=\"43\"\n            fill=\"none\"\n            viewBox=\"0 0 46 43\"\n        >\n            <path\n                stroke=\"#27C195\"\n                strokeWidth=\"1.892\"\n                d=\"M44.77 21.5c0 11.283-9.562 20.5-21.445 20.5C11.442 42 1.88 32.782 1.88 21.5 1.88 10.216 11.442 1 23.325 1c11.883 0 21.446 9.216 21.446 20.5z\"\n            ></path>\n            <path\n                fill=\"#27C195\"\n                d=\"M32.33 17.442c.886-.665 1.684-1.463 2.305-2.395-.798.355-1.73.621-2.66.71a4.55 4.55 0 002.04-2.572 9.834 9.834 0 01-2.928 1.153 4.657 4.657 0 00-3.415-1.464 4.656 4.656 0 00-4.656 4.657c0 .355.044.71.133 1.064a13.51 13.51 0 01-9.624-4.878c-.4.665-.621 1.463-.621 2.35 0 1.597.798 3.016 2.084 3.859-.753-.045-1.508-.222-2.128-.577v.045a4.663 4.663 0 003.725 4.568c-.355.088-.798.177-1.197.177-.31 0-.577-.044-.887-.089.576 1.863 2.306 3.194 4.346 3.238a9.362 9.362 0 01-5.766 1.996c-.399 0-.753-.045-1.108-.09 2.04 1.331 4.479 2.085 7.14 2.085 8.56 0 13.216-7.051 13.216-13.216v-.62z\"\n            ></path>\n        </svg>\n    );\n}\n\nexport default Icon;\n","import React from \"react\";\n\nfunction Icon() {\n    return (\n        <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"46\"\n            height=\"43\"\n            fill=\"none\"\n            viewBox=\"0 0 46 43\"\n        >\n            <path\n                stroke=\"#27C195\"\n                strokeWidth=\"1.892\"\n                d=\"M44.552 21.5c0 11.283-9.563 20.5-21.445 20.5C11.224 42 1.66 32.782 1.66 21.5 1.661 10.216 11.224 1 23.106 1c11.883 0 21.446 9.216 21.446 20.5z\"\n            ></path>\n            <path\n                fill=\"#27C195\"\n                d=\"M34.106 22.055c0-6.076-4.923-11-10.999-11-6.075 0-10.998 4.924-10.998 11 0 5.499 3.991 10.067 9.269 10.865v-7.672h-2.794v-3.193h2.794V19.66c0-2.75 1.64-4.302 4.124-4.302a16.2 16.2 0 012.484.221v2.706H26.61c-1.375 0-1.818.843-1.818 1.73v2.04h3.06l-.488 3.193h-2.572v7.672c5.277-.798 9.313-5.366 9.313-10.865z\"\n            ></path>\n        </svg>\n    );\n}\n\nexport default Icon;\n","import React from \"react\";\n\nfunction Icon() {\n    return (\n        <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"46\"\n            height=\"43\"\n            fill=\"none\"\n            viewBox=\"0 0 46 43\"\n        >\n            <path\n                stroke=\"#27C195\"\n                strokeWidth=\"1.892\"\n                d=\"M44.122 21.5c0 11.283-9.562 20.5-21.445 20.5C10.794 42 1.23 32.782 1.23 21.5 1.231 10.216 10.794 1 22.677 1c11.883 0 21.445 9.216 21.445 20.5z\"\n            ></path>\n            <path\n                fill=\"#27C195\"\n                d=\"M28.47 28.894c-.56.54-1.712.94-2.815.959h-.124c-3.629 0-4.597-2.77-4.597-4.406v-5.03a.075.075 0 00-.075-.076h-1.755a.075.075 0 01-.075-.075v-2.291c0-.03.019-.058.048-.07 1.875-.73 2.922-2.18 3.198-4.424.015-.124.118-.128.12-.128h2.341c.042 0 .076.034.076.075v4.028c0 .041.033.075.075.075h2.915c.042 0 .076.033.076.075v2.66a.075.075 0 01-.076.076h-2.928a.075.075 0 00-.075.075v4.78c.017 1.076.538 1.622 1.549 1.622.407 0 .873-.095 1.298-.257a.074.074 0 01.098.045l.744 2.208a.076.076 0 01-.018.08zm-3.425 1.686c1.798 0 3.578-.64 4.168-1.415l.118-.156-1.114-3.302a.075.075 0 00-.072-.05h-2.489a.074.074 0 01-.072-.055 1.74 1.74 0 01-.05-.411v-4.039c0-.041.034-.075.076-.075h2.928a.075.075 0 00.075-.075V16.87a.075.075 0 00-.075-.075h-2.916a.075.075 0 01-.075-.075v-4.027a.075.075 0 00-.075-.075H20.36a.869.869 0 00-.85.774c-.255 2.078-1.208 3.326-3 3.924l-.2.067a.075.075 0 00-.051.071v3.548c0 .042.034.075.075.075h1.83v4.37c0 3.488 2.416 5.133 6.882 5.133z\"\n            ></path>\n        </svg>\n    );\n}\n\nexport default Icon;\n","import React, { useContext } from 'react'\nimport { useToasts } from 'react-toast-notifications';\nimport { Context } from \"../../context\";\nimport TwitterIcon from '../../icons/share-twitter'\nimport FacebookIcon from '../../icons/share-facebook'\nimport TumblrIcon from '../../icons/share-tumblr'\n\nexport default function PlaylistModal({ shareParams, playlistText, setShowModal }) {\n\n    const copyToClipboard = str => {\n        const el = document.createElement('textarea');\n        el.value = str;\n        document.body.appendChild(el);\n        el.select();\n        document.execCommand('copy');\n        document.body.removeChild(el);\n    };\n\n    const { addToast } = useToasts()\n\n    const { state: { playlist }, dispatch } = useContext(Context);\n\n    return (\n        <div className=\"modal-content card\">\n            <div className=\"card-body\">\n                <div className=\"d-flex mb-4\">\n                    <div className=\"flex-grow-1\">\n                        <h1 className=\"title\">Playlist Created</h1>\n                        <p className=\"sub-title\">Your playlist created, added to your spotify library and ready to listen here.</p>\n                    </div>\n                    <div className=\"d-flex align-items-center\">\n                        <button\n                            onClick={() => {\n                                dispatch({\n                                    type: \"setPlayingTracks\",\n                                    payload: { data: playlist.data.tracks.items.map(i => { return { uri: i.track.uri, id: i.track.id } }) }\n                                })\n                                setShowModal(false)\n                            }}\n                            className=\"btn btn-dark mr-2 listen-btn\">\n                            <svg\n                                xmlns=\"http://www.w3.org/2000/svg\"\n                                width=\"19\"\n                                height=\"18\"\n                                fill=\"none\"\n                                viewBox=\"0 0 19 18\"\n                            >\n                                <circle cx=\"9.5\" cy=\"9\" r=\"7.5\" stroke=\"#fff\"></circle>\n                                <path fill=\"#fff\" d=\"M12.543 9.222L7.79 6.478v5.488l4.753-2.744z\"></path>\n                            </svg>\n                            <span className=\"listen-here-text\">Listen now</span></button>\n                        <svg\n                            onClick={() => setShowModal(false)}\n                            className=\"close-btn\"\n                            xmlns=\"http://www.w3.org/2000/svg\"\n                            width=\"48\"\n                            height=\"48\"\n                            fill=\"none\"\n                            viewBox=\"0 0 48 48\"\n                        >\n                            <path\n                                fill=\"#fff\"\n                                d=\"M0 6a6 6 0 016-6h36a6 6 0 016 6v36a6 6 0 01-6 6H6a6 6 0 01-6-6V6z\"\n                            ></path>\n                            <path\n                                stroke=\"#B2B2B2\"\n                                strokeLinecap=\"round\"\n                                strokeLinejoin=\"round\"\n                                strokeWidth=\"2\"\n                                d=\"M18 30l12-12m-12 0l12 12\"\n                            ></path>\n                            <path\n                                fill=\"#B2B2B2\"\n                                d=\"M6 1h36v-2H6v2zm41 5v36h2V6h-2zm-5 41H6v2h36v-2zM1 42V6h-2v36h2zm5 5a5 5 0 01-5-5h-2a7 7 0 007 7v-2zm41-5a5 5 0 01-5 5v2a7 7 0 007-7h-2zM42 1a5 5 0 015 5h2a7 7 0 00-7-7v2zM6-1a7 7 0 00-7 7h2a5 5 0 015-5v-2z\"\n                            ></path>\n                        </svg>\n                    </div>\n                </div>\n                <div id=\"my-node\" className=\"dark-bg text-white playlist-modal\">\n                    <div className=\"d-flex flex-column justify-content-center\">\n                        <img width=\"300\" height=\"216\" className=\"playlist-text-img\" src={`/${playlistText}.png`}></img>\n                        <figure className=\"mt-4\">\n                            <img className=\"top-logo\" src=\"/echoes.png\"></img>\n                        </figure>\n                    </div>\n                    <div className=\"top-playlist-wrapper\">\n                        {playlist.data.tracks.items.slice(0, 10).map((i, k) => (\n                            <figure key={i.id} className=\"figure figure-playlist\">\n                                <img width={50} height={50} alt={i.track.album.images[0].url} src={i.track.album.images[0].url} />\n                                <figcaption>\n                                    <span className=\"figure-subtitle mb-1\">#0{k + 1}</span>\n                                    <span className=\"font-weight-bold track\">{playlistText === 'top-artists' ? i.track.artists[0].name : i.track.name}</span>\n                                    <span className=\"figure-subtitle\"> {playlistText === 'top-artists' ? i.track.artists[0].genre : i.track.artists[0].name}</span>\n                                </figcaption>\n                            </figure>\n                        ))}\n                    </div>\n                </div>\n                <div id=\"playlist-cover\"></div>\n                <div className=\"d-flex justify-content-between flex-wrap mt-4\">\n                    <div className=\"d-flex flex-column flex-grow-1\">\n                        <h3>Spotify playlist link</h3>\n                        <div className=\"copy-wrapper mt-3\">\n                            <input placeholder=\"https://playlist.echoesapp.io\" type=\"text\" readOnly value={shareParams.link}></input>\n                            <span\n                                onClick={() => {\n                                    copyToClipboard(shareParams.link)\n                                    addToast('Copied!', { appearance: \"success\", autoDismiss: true, autoDismissTimeout: 2000 })\n                                }}\n                                role=\"button\" className=\"ml-3\">\n                                <svg\n                                    xmlns=\"http://www.w3.org/2000/svg\"\n                                    width=\"32\"\n                                    height=\"32\"\n                                    fill=\"none\"\n                                    viewBox=\"0 0 32 32\"\n                                >\n                                    <path\n                                        fill=\"#828D9C\"\n                                        d=\"M24.14 8.929h-3.427V5.5c.287.22 3.207 3.14 3.427 3.428zM16.133 6.57a4.009 4.009 0 013.008 1.382V5h-6.285a2.353 2.353 0 00-2.213 1.571h5.49zM21.69 10.5a4.008 4.008 0 011.38 3.008v10.204a2.354 2.354 0 001.572-2.212v-11H21.69zm-4.12-1.856v3.427h3.428c-.06-.078-3.349-3.366-3.427-3.427zm0 4.999A1.574 1.574 0 0116 12.07V8.143H9.712A2.36 2.36 0 007.355 10.5v14.143A2.36 2.36 0 009.713 27h9.428a2.36 2.36 0 002.357-2.357v-11H17.57zm0 8.643h-6.285a.786.786 0 010-1.572h6.286a.786.786 0 010 1.572zm0-3.143h-6.285a.785.785 0 010-1.572h6.286a.785.785 0 010 1.572zm0-3.143h-6.285a.786.786 0 010-1.571h6.286a.786.786 0 010 1.571z\"\n                                    ></path>\n                                </svg>\n                            </span>\n                        </div>\n                    </div>\n                    <div className=\"d-flex flex-column social-share-wrapper align-self-end\">\n                        <p className=\"mb-2\">Share in your social networks </p>\n                        <div className=\"d-flex justify-content-center\">\n                            <a rel=\"noreferrer\" target=\"_blank\" href={`http://twitter.com/share?url=${shareParams.link}&text=${shareParams.desc}`}>\n                                <TwitterIcon />\n                            </a>\n                            <a rel=\"noreferrer\" href={`https://www.facebook.com/sharer/sharer.php?u=${shareParams.link}`} target=\"_blank\">\n                                <FacebookIcon />\n                            </a>\n                            <a rel=\"noreferrer\" target=\"_blank\" href={`http://tumblr.com/widgets/share/tool?canonicalUrl=${shareParams.link}`}>\n                                <TumblrIcon />\n                            </a>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    )\n}\n","import { useState, useEffect } from 'react'\nimport ReactDOM from 'react-dom';\n\nexport default function Index({ children }) {\n    const [modalContainer] = useState(document.createElement('div'));\n    useEffect(() => {\n        // Find the root element in your DOM\n        let modalRoot = document.getElementById('modal-root');\n        // If there is no root then create one\n        if (!modalRoot) {\n            const tempEl = document.createElement('div');\n            tempEl.id = 'modal-root';\n            document.body.append(tempEl);\n            modalRoot = tempEl;\n        }\n        // Append modal container to root\n        modalRoot.appendChild(modalContainer);\n        modalContainer.className = 'modal'\n        modalContainer.style.width = \"100%\";\n        return function cleanup() {\n            // On cleanup remove the modal container\n            modalRoot.removeChild(modalContainer);\n        };\n    }, [modalContainer]); // <- The empty array tells react to apply the effect on mount/unmount\n    return ReactDOM.createPortal(children, modalContainer);\n}\n\n","import React, { useEffect } from 'react'\nimport Portal from './portal'\n\nfunction Modal({ setShowModal, children }) {\n\n    const handleKeyDown = ({ key }) => {\n        if (key === 'Escape') setShowModal(false)\n    }\n\n    useEffect(() => {\n        document.body.style.overflow = 'hidden'\n\n        return function cleanup() {\n            document.body.style.overflow = 'auto'\n        }\n    }, [])\n\n    return (\n        <Portal onKeyDown={handleKeyDown}>\n            <div onKeyDown={handleKeyDown} tabIndex={-1} role=\"dialog\" className=\"modal\" onClick={() => setShowModal(false)}></div>\n            {children}\n        </ Portal>\n    )\n}\n\nexport default Modal\n","export default __webpack_public_path__ + \"static/media/bell.d6d2afea.svg\";","import React from \"react\";\n\nfunction Icon(props) {\n    return (\n        <svg\n            {...props}\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"18\"\n            height=\"16\"\n            fill=\"none\"\n            viewBox=\"0 0 18 16\"\n        >\n            <path\n                fill=\"#000\"\n                d=\"M15.891 6.257l-2.587-1.481-1.48 2.587a.592.592 0 00.22.817.562.562 0 00.8-.221l.511-.902a4.811 4.811 0 01-1.634 4.646c-1.65 1.379-4.05 1.515-5.82.29a.6.6 0 00-.681.986 5.968 5.968 0 003.387 1.039 6.025 6.025 0 003.88-1.413 6.049 6.049 0 002.043-5.77l.748.426c.29.17.647.068.817-.222.17-.255.085-.612-.204-.782zM5.067 7.822a.617.617 0 00-.8.273l-.392.766a4.848 4.848 0 011.651-4.545c1.651-1.378 4.05-1.514 5.82-.289a.6.6 0 00.682-.987C9.815 1.525 6.82 1.678 4.76 3.414 3.024 4.861 2.275 7.176 2.752 9.337l-.885-.442a.594.594 0 00-.545 1.055l2.655 1.344L5.322 8.64a.61.61 0 00-.255-.817z\"\n            ></path>\n        </svg>\n    );\n}\n\nexport default Icon;\n","import React from \"react\";\n\nfunction Icon(props) {\n    return (\n        <svg\n            {...props}\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"31\"\n            height=\"31\"\n            fill=\"none\"\n            viewBox=\"0 0 31 31\"\n        >\n            <path\n                fill=\"#000\"\n                d=\"M15.86 1.556c-7.872 0-14.274 6.28-14.274 14 0 7.723 6.402 14.002 14.274 14.002 7.873 0 14.275-6.28 14.275-14.001 0-7.722-6.402-14.001-14.275-14.001zm0 1.866c6.844 0 12.372 5.422 12.372 12.135S22.704 27.69 15.86 27.69c-6.844 0-12.372-5.421-12.372-12.134S9.017 3.422 15.861 3.422zm-5.808 7.468a.969.969 0 00-.659.307.931.931 0 00-.244.675.92.92 0 00.314.646.956.956 0 00.688.239h11.42a.968.968 0 00.68-.269.934.934 0 00.284-.665.918.918 0 00-.283-.665.954.954 0 00-.682-.268H10.15a.963.963 0 00-.098 0zm0 3.733a.967.967 0 00-.659.308.931.931 0 00-.244.675.921.921 0 00.314.645.958.958 0 00.688.24h11.42a.968.968 0 00.68-.27.933.933 0 00.284-.664.918.918 0 00-.283-.665.954.954 0 00-.682-.268H10.15a.963.963 0 00-.098 0zm0 3.734a.969.969 0 00-.659.308.93.93 0 00-.244.674.92.92 0 00.314.646.956.956 0 00.688.239h11.42a.968.968 0 00.68-.269.934.934 0 00.284-.664.917.917 0 00-.283-.665.954.954 0 00-.682-.269H10.15a.963.963 0 00-.098 0z\"\n            ></path>\n        </svg>\n    );\n}\n\nexport default Icon;\n","export default __webpack_public_path__ + \"static/media/calendar.c2893221.svg\";","import React from 'react'\nimport PropTypes from 'prop-types'\nimport CalendarIcon from '../style/img/icons/calendar.svg'\n\nconst CustomSelect = (props) => {\n    return (\n        <div className=\"range-picker mr-3\">\n            <i className=\"filter-icon filter-iconBlack\">\n                <img alt=\"Calendar Icon\" src={CalendarIcon}></img>\n            </i>\n            <select defaultValue={props.defaultValue} ref={props.rangeref} {...props}>\n                <option value=\"long_term\">All time</option>\n                <option value=\"medium_term\">Last 6 months</option>\n                <option value=\"short_term\">Last month</option>\n            </select>\n        </div>\n    )\n}\n\nCustomSelect.propTypes = {\n    rangeref: PropTypes.object,\n    defaultValue: PropTypes.string,\n}\n\nexport default CustomSelect","import React, { useContext, useMemo, useRef, useState } from 'react'\nimport { getMonth, shuffle } from '../../utils/'\nimport firebase from '../../services/firebase/index'\nimport { useToasts } from 'react-toast-notifications';\nimport { toBlob, toPng } from 'html-to-image';\nimport axios from 'axios'\nimport PlaylistModal from '../PlaylistModal'\nimport { useLocation } from 'react-router-dom'\nimport Modal from '../../components/Modal'\nimport { getRecently, createPlaylist, getArtists, getRecommendations, getTopList, getTracks, getArtistByIds } from '../../services'\nimport { Context } from '../../context'\nimport AnnounceKit from \"announcekit-react\";\nimport BellIcon from '../../style/img/icons/bell.svg'\nimport ReloadIcon from '../../icons/reload'\nimport MenuIcon from '../../icons/menu'\nimport config from '../../config'\nimport CustomSelect from '../../utils/CustomSelect'\n\nexport default function Index() {\n\n    const { addToast } = useToasts()\n\n    const location = useLocation();\n\n    const [showModal, setShowModal] = useState(false)\n\n    const [shareParams, setShareparams] = useState({ title: \"\", desc: \"\", link: \"\" })\n\n    const [playlistText, setPlaylistText] = useState('')\n\n    const [isLoading, setIsLoading] = useState(false)\n\n    const { state: { user, tracks, recommendations, recently, artists, ranges, timeRange }, dispatch } = useContext(Context);\n\n    const announceRef = useRef(null)\n\n    const randomAvatar = useMemo(() => Math.floor((Math.random() * 24) + 1), [user])\n\n    const rangeRef = useRef(null)\n\n    const handleLogout = () => {\n        const logoutTab = window.open('https://www.spotify.com/logout', '_blank');\n        setTimeout(() => {\n            window.location.hash = \"\"\n            localStorage.clear();\n            window.location.reload()\n            logoutTab.close()\n        }, 1000);\n    }\n\n    const getTitle = () => {\n        switch (location.pathname) {\n            case \"/dashboard\":\n                return 'Your music streaming stats'\n            case \"/artists\":\n                return 'Top Artists'\n            case \"/tracks\":\n                return 'Top Tracks'\n            case \"/recent\":\n                return 'Recently Played'\n            case \"/discover\":\n                return 'New Discovery'\n            case \"/privacy-policy\":\n                return 'Privacy Policy'\n            default:\n                break;\n        }\n    }\n\n    const handleSelectChange = () => {\n        switch (location.pathname) {\n            case \"/dashboard\":\n                setTopList()\n            case \"/artists\":\n                setArtists()\n            case \"/tracks\":\n                setTracks()\n            case \"/recent\":\n                setRecently()\n            case \"/discover\":\n                return 'Discover'\n            case \"/privacy-policy\":\n                return 'Privacy Policy'\n            default:\n                break;\n        }\n    }\n    const setArtists = async () => {\n        let data = await getArtists(50, rangeRef.current.value);\n        dispatch({ type: \"getArtists\", payload: data })\n    }\n\n    const setTracks = async () => {\n        let data = await getTracks(50, rangeRef.current.value);\n        dispatch({ type: \"getTracks\", payload: data })\n    }\n\n    const setTopList = async () => {\n        let data = await getTopList(rangeRef.current.value, true);\n        dispatch({ type: \"getTopList\", payload: data })\n    }\n\n    const setRecently = async () => {\n        let data = await getRecently(50, rangeRef.current.value);\n        dispatch({ type: \"getRecently\", payload: data })\n    }\n\n    const setNewRecommendations = async () => {\n        setIsLoading(true)\n        let data = await getRecommendations(50, false);\n        dispatch({ type: \"getRecommendations\", payload: data })\n        setIsLoading(false)\n    }\n\n    const createPlaylistTopTracks = async () => {\n        let playlist = await createPlaylist(tracks.data.map(i => i.uri), `Echoes ✤ Top Tracks ✤ ${ranges[timeRange]} ✤ ${getMonth}`)\n        dispatch({ type: \"setPlaylist\", payload: await addGenreToArtist(playlist) })\n        setPlaylistText('top-tracks')\n        setShowModal(true)\n        generateAndPubishIMG(playlist, 'top-tracks')\n    }\n    const createPlaylistTopArtists = async () => {\n        let shuffled = shuffle(artists.data.map(i => i.tracks).flat())\n        let playlist = await createPlaylist(shuffled.slice(0, 100).map(i => i.uri), `Echoes ✤ Top Artists ✤ ${ranges[timeRange]} ✤ ${getMonth}`)\n        dispatch({ type: \"setPlaylist\", payload: await addGenreToArtist(playlist) })\n        setPlaylistText('top-artists')\n        setShowModal(true)\n        generateAndPubishIMG(playlist, 'top-artists')\n    }\n    const createPlaylistRecentTracks = async () => {\n        let playlist = await createPlaylist(recently.data.map(i => i.track.uri), `Echoes ✤ Recently Played Tracks ✤ ${getMonth}`)\n        dispatch({ type: \"setPlaylist\", payload: await addGenreToArtist(playlist) })\n        setPlaylistText('recently-played')\n        setShowModal(true)\n        generateAndPubishIMG(playlist, 'recenty-played')\n    }\n    const createPlaylistDiscoverTracks = async () => {\n        let playlist = await createPlaylist(recommendations.data.map(i => i.uri), `Echoes ✤ New Discovery ✤ ${getMonth}`)\n        dispatch({ type: \"setPlaylist\", payload: await addGenreToArtist(playlist) })\n        setPlaylistText('new-discovery')\n        setShowModal(true)\n        generateAndPubishIMG(playlist, 'new-discovery')\n    }\n\n    const generateAndPubishIMG = (playlist, type) => {\n        setTimeout(() => {\n            toPng(document.getElementById('my-node'), {\n                width: 890,\n                height: 445,\n                style: {\n                    opacity: \"1\",\n                }\n            })\n                .then(async function (blob) {\n                    let coverImg = document.getElementById('playlist-cover');\n                    coverImg.style.backgroundImage = `url(${blob})`\n                    const target = new URL(\"https://echoesapp.io/playlist/\");\n                    const tracksString = playlist.data.tracks.items.slice(0, 10).map(i => i.track?.name).join`, `;\n                    let artistDesc = `Created a music playlist @echoessapp with My Top Artists @Spotify; ${playlist.data.tracks.items.slice(0, 10).map(i => i.track?.artists[0]?.name).join`, `}`;\n                    let recentlyDesc = `Created a music playlist @echoessapp with My Recently Played Tracks @Spotify; ${tracksString} `\n                    let discoveryDesc = `Created a music playlist @echoessapp with New Discovery @Spotify; ${tracksString} `\n                    let tracksDesc = `Created a music playlist @echoessapp with My Top Tracks @Spotify; ${tracksString} `\n\n                    const metas = {\n                        'top-artists': {\n                            title: \"My Top Artists\",\n                            desc: artistDesc.length > 250 ? artistDesc.slice(0, 250) + '...' : artistDesc\n\n                        },\n                        'recenty-played': {\n                            title: \"My Recently Played Tracks\",\n                            desc: recentlyDesc.length > 250 ? recentlyDesc.slice(0, 250) + '...' : recentlyDesc\n                        },\n                        'new-discovery': {\n                            title: \"New Discovery\",\n                            desc: discoveryDesc.length > 250 ? discoveryDesc.slice(0, 250) + '...' : discoveryDesc\n                        },\n                        'top-tracks': {\n                            title: \"My Top Tracks\",\n                            desc: tracksDesc.length > 250 ? tracksDesc.slice(0, 250) + '...' : tracksDesc\n                        }\n                    }\n                    target.searchParams.append(\"playlistId\", playlist.data.id);\n                    target.searchParams.append(\"title\", metas[type].title);\n                    target.searchParams.append(\"desc\", metas[type].desc);\n                    try {\n                        let { data } = await axios.post(`${config.FIREBASE_BASE_URL}/generateUrl`,\n                            { target: target.href })\n                        setShareparams({\n                            title: metas[type].title,\n                            desc: metas[type].desc,\n                            link: data.link.replace('http', 'https'),\n                        })\n                        toBlob(document.getElementById('my-node'), {\n                            width: 790,\n                            height: 384,\n                            style: {\n                                opacity: \"1\",\n                            }\n                        }).then(function (blob) {\n                            const ref = firebase.storage().ref().child(`covers/${playlist.data.id}.png`);\n                            ref.put(blob)\n                        });\n                    } catch (e) {\n                        addToast('Something happend', { appearance: \"error\" })\n                    }\n                });\n        }, 200);\n\n    }\n    const addGenreToArtist = async (playlist) => {\n        let refObj = playlist.data.tracks.items;\n        let artists = await getArtistByIds(refObj.map(i => i.track.artists[0].id).slice(0, 50))\n        refObj.forEach(i => {\n            let genre = artists.data.find(k => i.track.artists[0].id === k.id);\n            i.track.artists[0].genre = genre?.genres[0]\n            return i\n        })\n        return playlist\n    }\n\n\n    const handleCreatePlaylist = async () => {\n        if (location.pathname === '/artists') {\n            createPlaylistTopArtists()\n            return\n        }\n        if (location.pathname === '/recent') {\n            createPlaylistRecentTracks()\n            return\n        }\n        if (location.pathname === '/tracks') {\n            createPlaylistTopTracks()\n            return\n        }\n        if (location.pathname === '/discover') {\n            createPlaylistDiscoverTracks()\n            return\n        }\n\n    }\n\n    if (user.loading || user.error) return false\n\n    return (\n        <>\n            {showModal ? <Modal setShowModal={setShowModal}>\n                <PlaylistModal\n                    setShowModal={setShowModal}\n                    shareParams={shareParams}\n                    playlistText={playlistText} />\n            </Modal> : null}\n            <div id=\"navbar-wrapper\" className=\"main-content\">\n                <div className=\"header px-2\">\n                    <div class=\"dashboard__title d-flex align-items-center\">\n                        <span className=\"navbar-brand\" id=\"sidebar-toggle\">\n                            <i onClick={() => {\n                                const mains = document.querySelectorAll('.main-content')\n                                const sidebar = document.getElementById('sidebar')\n                                const toggle = document.getElementById('toggle-btn')\n                                mains.forEach(i => {\n                                    i.classList.toggle('menu-collapse')\n                                })\n                                sidebar.classList.toggle('menu-collapse')\n                                toggle.classList.toggle('menu-collapse')\n                            }} role=\"button\" className=\"icon-button\">\n                                <MenuIcon id=\"toggle-btn\" className=\"toggle-btn\" />\n                            </i>\n                        </span>\n                        <h1 class=\"page-title\">{getTitle()}</h1>\n                        {location.pathname === '/' || location.pathname === '/dashboard' || location.pathname === '/privacy-policy' ?\n                            null : <button onClick={() => handleCreatePlaylist()} className=\"btn btn-dark ml-md-3\">\n                                <span className=\"ml-auto mr-auto font-weight-bold\">Create a Spotify playlist</span>\n                            </button>}\n                        {location.pathname === '/discover' ?\n                            <button onClick={() => setNewRecommendations()} className=\"btn btn-light ml-md-3\">\n                                <ReloadIcon className={`${isLoading ? 'rotate' : 'rotate-stop'}`} />\n                                <span className=\"font-weight-bold ml-1\">Load new tracks</span>\n                            </button> : null\n                        }\n                    </div>\n                    <div className=\"header-item-group\">\n                        {location.pathname === '/discover' || location.pathname === '/privacy-policy' || location.pathname === '/recent' ? null : <CustomSelect defaultValue={timeRange} rangeref={rangeRef} onChange={(e) => {\n                            dispatch({ type: \"setTimeRange\", payload: e.target.value })\n                            handleSelectChange()\n                        }} />}\n                        <div className=\"header-item\">\n                            <AnnounceKit embedWidget ref={announceRef} widget=\"https://announcekit.co/widgets/v2/5JPhK\">\n                                <span\n                                    onClick={async () => {\n                                        await announceRef.current.open()\n                                    }} className=\"notification-click\">\n                                    <i className=\"icon-bell\">\n                                        <img alt=\"Announcekit Icon\" src={BellIcon}></img>\n                                    </i>\n                                </span>\n                            </AnnounceKit>\n                            {/* Notification tooltip */}\n                        </div>\n                        <div className=\"header-item\">\n                            <span className=\"user-avatar__link\">\n                                <i className=\"user-avatar\">\n                                    {user.data.images.length > 0 ?\n                                        <img alt=\"User Avatar\" src={user.data.images[0].url} /> :\n                                        <img alt=\"User Avatar\" src={`/img/avatars/avatar-${randomAvatar}.png`} />\n                                    }\n                                </i>\n                            </span>\n                            {/* User info Tooltip */}\n                            <div className=\"tooltip-block\" id=\"tooltip-block\">\n                                <span className=\"romb\" />\n                                <div className=\"row relative align-items-center tooltip-block__header\">\n                                    <div className=\"user-img1\">\n                                        {user.data.images.length > 0 ?\n                                            <img alt=\"User Avatar\" src={user.data.images[0].url} /> :\n                                            <img alt=\"User Avatar\" src={`/img/avatars/avatar-${randomAvatar}.png`} />\n                                        }\n                                    </div>\n                                    <span>{user.data.display_name}</span>\n                                </div>\n                                <div className=\"settings-block\">\n                                    <div className=\"d-flex align-items-center settings-block_item settings-block__subscription\">\n                                        <i className=\"preferences-icon log-out-icon\">\n                                            <svg className=\"userIcon\">\n                                                <use xlinkHref=\"#logOut\" />\n                                            </svg>\n                                        </i>\n                                        <span className=\"text-white\" role=\"button\" onClick={handleLogout}>Log out</span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </>\n    )\n}\n","import * as React from \"react\"\n\nfunction SvgComponent(props) {\n  return (\n    <svg\n      width=\"2rem\"\n      height=\"2rem\"\n      viewBox=\"0 0 32 32\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M8 14.857h-.016a1.143 1.143 0 100 2.286h16.031a1.143 1.143 0 100-2.286H8z\"\n        fill=\"#fff\"\n      />\n      <path\n        d=\"M17.143 8v-.016a1.143 1.143 0 10-2.286 0V8 8v16.015a1.143 1.143 0 102.286 0V8z\"\n        fill=\"#fff\"\n      />\n      <path\n        d=\"M16 0C7.177 0 .001 7.177.001 15.999c0 8.822 7.177 15.999 15.999 15.999 8.823 0 15.999-7.177 15.999-15.999C31.999 7.177 24.822 0 16 0zm0 2.286A13.697 13.697 0 0129.714 16 13.697 13.697 0 0116 29.714 13.696 13.696 0 012.286 16 13.696 13.696 0 0116 2.286z\"\n        fill=\"#fff\"\n      />\n    </svg>\n  )\n}\n\nexport default SvgComponent\n","import * as React from \"react\"\n\nfunction SvgComponent(props) {\n    return (\n        <svg\n            width={14}\n            height={14}\n            viewBox=\"0 0 14 14\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n            {...props}\n        >\n            <g clipPath=\"url(#prefix__clip0)\" fill=\"currentColor\">\n                <path d=\"M13.877 10.868l-2.319-2.545a.23.23 0 00-.39.161v5.097c0 .205.248.306.39.161l2.319-2.55a.226.226 0 000-.324z\" />\n                <path d=\"M12.565 4.891c.06.377.415.637.795.574a.691.691 0 00.574-.795c-.52-3.23-3.327-4.515-4.741-4.742a.69.69 0 00-.804.684v8.733a3.833 3.833 0 00-1.736-.399c-1.753 0-3.126 1.07-3.126 2.431 0 1.362 1.373 2.43 3.126 2.43 1.752 0 3.125-1.068 3.125-2.43V1.542c.954.377 2.456 1.29 2.787 3.35zM.75 2.004h5.555a.696.696 0 000-1.39H.75a.696.696 0 000 1.39z\" />\n                <path d=\"M.75 4.782h5.555a.696.696 0 000-1.39H.75a.696.696 0 000 1.39zM7 6.865a.696.696 0 00-.695-.694H.75a.696.696 0 000 1.389h5.556A.696.696 0 007 6.865z\" />\n            </g>\n            <defs>\n                <clipPath id=\"prefix__clip0\">\n                    <path fill=\"#fff\" d=\"M0 0h14v14H0z\" />\n                </clipPath>\n            </defs>\n        </svg>\n    )\n}\n\nexport default SvgComponent\n","export default __webpack_public_path__ + \"static/media/logo-white.da99592b.svg\";","import * as React from \"react\"\n\nfunction SvgComponent(props) {\n  return (\n    <svg\n      width={20}\n      height={20}\n      viewBox=\"0 0 20 20\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M9.167 1.708v9.125h9.125a8.334 8.334 0 11-9.125-9.125zm1.666 0a8.336 8.336 0 017.459 7.459h-7.459V1.708z\"\n        fill=\"#20C933\"\n        opacity={0.4}\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M15.892 4.108a8.336 8.336 0 00-5.059-2.4v7.459h7.459a8.335 8.335 0 00-2.4-5.06z\"\n        fill=\"#20C933\"\n      />\n    </svg>\n  )\n}\n\nexport default SvgComponent\n","import React from \"react\";\n\nfunction Icon() {\n    return (\n        <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"18\"\n            height=\"18\"\n            fill=\"none\"\n            viewBox=\"0 0 18 18\"\n        >\n            <path\n                fill=\"#B2B2B2\"\n                d=\"M4.5 15.75H2.25A.75.75 0 011.5 15V9a.75.75 0 01.75-.75H4.5a.75.75 0 01.75.75v6a.75.75 0 01-.75.75zm5.25 0H7.5a.75.75 0 01-.75-.75V2.25a.75.75 0 01.75-.75h2.25a.75.75 0 01.75.75V15a.75.75 0 01-.75.75zm5.25 0h-2.25A.75.75 0 0112 15V6.75a.75.75 0 01.75-.75H15a.75.75 0 01.75.75V15a.75.75 0 01-.75.75z\"\n            ></path>\n        </svg>\n    );\n}\n\nexport default Icon;\n","import React, { useContext, useState, useRef } from 'react'\nimport firebase from '../../services/firebase/index'\nimport { useToasts } from 'react-toast-notifications';\nimport axios from 'axios'\nimport { toBlob, toPng } from 'html-to-image';\nimport getMonth from '../../utils/getMonth'\nimport { signInWithSpotify, getTracks, createPlaylist, getRecently, getRecommendations, getArtists, getArtistByIds } from '../../services'\nimport { NavLink } from 'react-router-dom'\nimport PlaylistModal from '../PlaylistModal'\nimport { Context } from \"../../context\";\nimport { shuffle } from '../../utils'\nimport Header from '../Header'\nimport Modal from '../../components/Modal'\nimport PlusIcon from '../../icons/plus'\nimport MusicIcon from '../../icons/music-list'\nimport Logo from '../../style/img/icons/logo-white.svg'\nimport DashboardIcon from '../../icons/dashboard'\nimport AppleIcon from '../../icons/apple'\nimport config from '../../config'\n\nfunction Aside() {\n\n    const { addToast } = useToasts()\n\n    const { state: { user, timeRange, ranges }, dispatch } = useContext(Context);\n\n    const [playlistText, setPlaylistText] = useState('')\n\n    const [shareParams, setShareparams] = useState({ title: \"\", desc: \"\", link: \"\" })\n\n    const [showModal, setShowModal] = useState(false)\n\n    const refModal = useRef(null)\n\n    const handleKeyDown = ({ key }) => {\n        if (key === 'Escape') setShowTooltip(false)\n    }\n\n    const [showTooltip, setShowTooltip] = useState(false);\n\n    const createPlaylistTopTracks = async () => {\n        let { data } = await getTracks();\n        if (data.length === 0) return false\n        let playlist = await createPlaylist(data.map(i => i.uri), `Echoes ✤ Top Tracks ✤ ${ranges[timeRange]} ✤ ${getMonth}`)\n        dispatch({ type: \"setPlaylist\", payload: await addGenreToArtist(playlist) })\n        setPlaylistText('top-tracks')\n        setShowModal(true)\n        generateAndPubishIMG(playlist, 'top-tracks')\n    }\n    const createPlaylistTopArtists = async () => {\n        let { data } = await getArtists(10, \"long_term\");\n        if (data.length === 0) return false\n        let shuffled = shuffle(data.map(i => i.tracks).flat())\n        let playlist = await createPlaylist(shuffled.map(i => i.uri), `Echoes ✤ Top Artists ✤ ${ranges[timeRange]} ✤ ${getMonth}`)\n        dispatch({ type: \"setPlaylist\", payload: await addGenreToArtist(playlist) })\n        setPlaylistText('top-artists')\n        setShowModal(true)\n        generateAndPubishIMG(playlist, 'top-artists')\n    }\n    const createPlaylistRecentTracks = async () => {\n        let { data } = await getRecently();\n        if (data.length === 0) return false\n        let playlist = await createPlaylist(data.map(i => i.track.uri), `Echoes ✤ Recently Played Tracks ✤ ${getMonth}`)\n        dispatch({ type: \"setPlaylist\", payload: await addGenreToArtist(playlist) })\n        setPlaylistText('recently-played')\n        setShowModal(true)\n        generateAndPubishIMG(playlist, 'recenty-played')\n    }\n    const createPlaylistDiscoverTracks = async () => {\n        let { data } = await getRecommendations(50, false);\n        if (data.length === 0) return false\n        let playlist = await createPlaylist(data.map(i => i.uri), `Echoes ✤ New Discovery ✤ ${getMonth}`)\n        dispatch({ type: \"setPlaylist\", payload: await addGenreToArtist(playlist) })\n        setPlaylistText('new-discovery')\n        setShowModal(true)\n        generateAndPubishIMG(playlist, 'new-discovery')\n    }\n\n    const generateAndPubishIMG = (playlist, type) => {\n        setTimeout(() => {\n            toPng(document.getElementById('my-node'), {\n                width: 890,\n                height: 445,\n                style: {\n                    opacity: \"1\",\n                }\n            })\n                .then(async function (blob) {\n                    let coverImg = document.getElementById('playlist-cover');\n                    coverImg.style.backgroundImage = `url(${blob})`\n                    const target = new URL(\"https://echoesapp.io/playlist/\");\n                    const tracksString = playlist.data.tracks.items.slice(0, 10).map(i => i.track?.name).join`, `;\n                    let artistDesc = `Created a music playlist @echoessapp with My Top Artists @Spotify; ${playlist.data.tracks.items.slice(0, 10).map(i => i.track?.artists[0]?.name).join`, `}`;\n                    let recentlyDesc = `Created a music playlist @echoessapp with My Recently Played Tracks @Spotify; ${tracksString} `\n                    let discoveryDesc = `Created a music playlist @echoessapp with New Discovery @Spotify; ${tracksString} `\n                    let tracksDesc = `Created a music playlist @echoessapp with My Top Tracks @Spotify; ${tracksString} `\n\n                    const metas = {\n                        'top-artists': {\n                            title: \"My Top Artists\",\n                            desc: artistDesc.length > 250 ? artistDesc.slice(0, 250) + '...' : artistDesc\n\n                        },\n                        'recenty-played': {\n                            title: \"My Recently Played Tracks\",\n                            desc: recentlyDesc.length > 250 ? recentlyDesc.slice(0, 250) + '...' : recentlyDesc\n                        },\n                        'new-discovery': {\n                            title: \"New Discovery\",\n                            desc: discoveryDesc.length > 250 ? discoveryDesc.slice(0, 250) + '...' : discoveryDesc\n                        },\n                        'top-tracks': {\n                            title: \"My Top Tracks\",\n                            desc: tracksDesc.length > 250 ? tracksDesc.slice(0, 250) + '...' : tracksDesc\n                        }\n                    }\n                    target.searchParams.append(\"playlistId\", playlist.data.id);\n                    target.searchParams.append(\"title\", metas[type].title);\n                    target.searchParams.append(\"desc\", metas[type].desc);\n                    try {\n                        let { data } = await axios.post(`${config.FIREBASE_BASE_URL}/generateUrl`,\n                            { target: target.href })\n                        setShareparams({\n                            title: metas[type].title,\n                            desc: metas[type].desc,\n                            link: data.link.replace('http', 'https'),\n                        })\n                        toBlob(document.getElementById('my-node'), {\n                            width: 790,\n                            height: 384,\n                            style: {\n                                opacity: \"1\",\n                            }\n                        }).then(function (blob) {\n                            const ref = firebase.storage().ref().child(`covers/${playlist.data.id}.png`);\n                            ref.put(blob)\n                        });\n                    } catch (e) {\n                        console.log(e)\n                        addToast('Something happend', { appearance: \"error\" })\n                    }\n                });\n        }, 200);\n\n    }\n\n    const addGenreToArtist = async (playlist) => {\n        let refObj = playlist.data.tracks.items;\n        let artists = await getArtistByIds(refObj.map(i => i.track.artists[0].id).slice(0, 50))\n        refObj.forEach(i => {\n            let genre = artists.data.find(k => i.track.artists[0].id === k.id);\n            i.track.artists[0].genre = genre?.genres[0]\n            return i\n        })\n        return playlist\n    }\n\n    if (user.status === \"401\") signInWithSpotify()\n\n    return (\n        <>\n            {showModal ? <Modal setShowModal={setShowModal}>\n                <PlaylistModal\n                    setShowModal={setShowModal}\n                    shareParams={shareParams}\n                    playlistText={playlistText} />\n            </Modal> : null}\n            <aside id=\"sidebar\" className=\"sidebar-wrapper\">\n                <div className=\"sidebar-brand user \">\n                    <a href=\"/dashboard\" id=\"side\"><img alt=\"Echoes Logo\" src={Logo}></img></a>\n                </div>\n                <ul className=\"sidebar-nav\">\n                    <li className=\"parent-menu-active\">\n                        <a href=\"/\">\n                            <i className=\"menu-icon menu-icon_5\"><DashboardIcon />\n                            </i>\n                            <span>Spotify</span>\n                        </a>\n                        <ul className=\"sidebar-submenu\">\n                            <li><NavLink exact activeClassName=\"menu-active\" to=\"/dashboard\">Dashboard</NavLink></li>\n                            <li><NavLink exact activeClassName=\"menu-active\" to=\"/artists\">Top Artists</NavLink></li>\n                            <li><NavLink exact activeClassName=\"menu-active\" to=\"/tracks\">Top Tracks</NavLink></li>\n                            <li><NavLink exact activeClassName=\"menu-active\" to=\"/recent\">Recently Played</NavLink></li>\n                            <li><NavLink exact activeClassName=\"menu-active\" to=\"/discover\">New Discovery</NavLink></li>\n                        </ul>\n                    </li>\n                    <li>\n                        <a className=\"menu-disabled\" >\n                            <i className=\"menu-icon menu-icon_5\"><AppleIcon />\n                            </i>\n                            <span>Apple Music</span>\n                        </a>\n                    </li>\n                </ul>\n                <nav className=\"create-playlist-section ml-3\">\n                    <div className=\"d-flex align-items-center position-relative\">\n                        {showTooltip ?\n                            <div onMouseLeave={() => setShowTooltip(false)} ref={refModal} onKeyUp={handleKeyDown} tabIndex={0} className=\"tooltip-playlist card\">\n                                <div className=\"card-body\">\n                                    <h5>Create new playlist</h5>\n                                    <h6 className=\"sub-title\">Select tracks to create new Spotify playlists. One at a time, create many.</h6>\n                                    <ul>\n                                        <li role=\"button\" onClick={() => createPlaylistTopArtists()} ><MusicIcon color=\"#FF6E6E\" />Tracks from top artists</li>\n                                        <li role=\"button\" onClick={() => createPlaylistTopTracks()} ><MusicIcon color=\"#20C933\" />Top tracks</li>\n                                        <li role=\"button\" onClick={() => createPlaylistRecentTracks()}><MusicIcon color=\"#FFA800\" />Recently Played tracks</li>\n                                        <li role=\"button\" onClick={() => createPlaylistDiscoverTracks()}><MusicIcon color=\"#624CE0\" />Discover new tracks</li>\n                                    </ul>\n                                </div>\n                            </div> : null\n                        }\n                        <div onClick={() => {\n                            setShowTooltip(!showTooltip)\n                            setTimeout(() => {\n                                refModal?.current?.focus()\n                            }, 200);\n                        }}>\n                            <PlusIcon />\n                            <span className=\"ml-3\">New Playlist</span>\n                        </div>\n                    </div>\n                </nav>\n            </aside >\n            <Header user={user.data} />\n        </>\n    )\n}\n\nexport default Aside\n","export default __webpack_public_path__ + \"static/media/logo-1984.fa899f9b.svg\";","import ReactDOM from 'react-dom';\n\n\nconst player = document.getElementById('player-root')\nconst Player = ({ children }) => ReactDOM.createPortal(children, player)\n\n\nexport default Player\n","import React from \"react\";\n\nfunction Icon() {\n    return (\n        <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"24\"\n            height=\"24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            opacity=\"0.7\"\n            strokeWidth=\"1\"\n            viewBox=\"0 0 24 24\"\n        >\n            <path d=\"M11 5L6 9 2 9 2 15 6 15 11 19 11 5z\"></path>\n            <path d=\"M15.54 8.46a5 5 0 010 7.07\"></path>\n        </svg>\n    );\n}\n\nexport default Icon;\n","import React from \"react\";\n\nfunction Icon() {\n    return (\n        <svg\n            opacity=\"0.7\"\n            strokeWidth=\"1\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"24\"\n            height=\"24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            viewBox=\"0 0 24 24\"\n        >\n            <path d=\"M11 5L6 9 2 9 2 15 6 15 11 19 11 5z\"></path>\n            <path d=\"M19.07 4.93a10 10 0 010 14.14M15.54 8.46a5 5 0 010 7.07\"></path>\n        </svg>\n    );\n}\n\nexport default Icon;\n","import React from \"react\";\n\nfunction Icon() {\n    return (\n        <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"24\"\n            height=\"24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            opacity=\"0.7\"\n            strokeWidth=\"1\"\n            viewBox=\"0 0 24 24\"\n        >\n            <path d=\"M11 5L6 9 2 9 2 15 6 15 11 19 11 5z\"></path>\n            <path d=\"M23 9L17 15\"></path>\n            <path d=\"M17 9L23 15\"></path>\n        </svg>\n    );\n}\n\nexport default Icon;\n","import React from 'react'\nimport Volume1 from '../../icons/volume-1'\nimport Volume2 from '../../icons/volume-2'\nimport VolumeX from '../../icons/volume-x'\n\nfunction Volume({ volume }) {\n    switch (true) {\n        case +volume >= 0.5 && volume <= 1:\n            return <Volume2 />\n        case +volume <= 0.4 && volume >= 0.1:\n            return <Volume1 />\n        case +volume === 0:\n            return <VolumeX />\n        default:\n    }\n}\n\nexport default Volume\n","import React from \"react\";\nimport PropTypes from 'prop-types'\n\nfunction Icon(props) {\n\n    return (\n        <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"20\"\n            height=\"19\"\n            fill=\"none\"\n            {...props}\n            viewBox=\"0 0 20 19\"\n        >\n            <path\n                stroke={props.strokecolor}\n                strokeLinecap=\"round\"\n                d=\"M9.633 3.538l.367.395.367-.395.75-.808C12.9.809 15.839.75 17.69 2.598c1.862 1.858 1.92 4.937.127 6.868l-7.45 8.029a.5.5 0 01-.734 0l-7.45-8.029C.39 7.535.448 4.456 2.31 2.598 4.16.751 7.1.808 8.883 2.73l.75.808z\"\n            ></path>\n        </svg>\n    );\n}\n\nIcon.defaultProps = {\n    strokecolor: \"#000\"\n};\n\nIcon.prototype = {\n    strokecolor: PropTypes.string\n}\n\nexport default Icon;\n","import React, { useContext, useMemo } from \"react\";\nimport { Context } from '../context'\nimport PropTypes, { oneOfType } from 'prop-types'\n\nfunction Icon(props) {\n\n    const { state } = useContext(Context);\n\n\n    const isPlaying = useMemo(() => {\n        if (!state.currentlyPlaying.loading) {\n            if (Array.isArray(props.name)) {\n                if (props.name[0] === state.currentlyPlaying.data.track_window.current_track.artists[0].uri) return true\n                return false\n            } else {\n                if (props.name === state.currentlyPlaying.data.track_window.current_track.name) return true\n                return false\n            }\n        } else {\n            return false\n        }\n\n    }, [state.currentlyPlaying])\n\n    if (state.currentlyPlaying.loading) return (\n        <svg\n            role=\"button\"\n            {...props}\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"36\"\n            height=\"36\"\n            fill=\"none\"\n            viewBox=\"0 0 36 36\"\n        >\n            <g opacity=\"0.7\">\n                <circle cx=\"18\" cy=\"18\" r=\"17.5\" stroke={props.color}></circle>\n                <path\n                    fill={props.color}\n                    d=\"M24.848 18.5l-10.696-6.175v12.35L24.848 18.5z\"\n                ></path>\n            </g>\n        </svg>\n    )\n\n    return (\n        <svg\n            role=\"button\"\n            {...props}\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"36\"\n            height=\"36\"\n            fill=\"none\"\n            viewBox=\"0 0 36 36\"\n        >\n            { !state.currentlyPlaying.data.paused && isPlaying ?\n                <g opacity={0.7} stroke={props.color}>\n                    <circle cx={18} cy={18} r={17.5} />\n                    <path d=\"M23 11v14m-10 0V11\" strokeWidth={3} />\n                </g>\n                :\n                <g opacity=\"0.7\">\n                    <circle cx=\"18\" cy=\"18\" r=\"17.5\" stroke={props.color}></circle>\n                    <path\n                        fill={props.color}\n                        d=\"M24.848 18.5l-10.696-6.175v12.35L24.848 18.5z\"\n                    ></path>\n                </g>\n            }\n        </svg>\n    );\n}\n\nIcon.propTypes = {\n    color: PropTypes.string,\n    name: oneOfType([PropTypes.string, PropTypes.array]),\n}\n\nIcon.defaultProps = {\n    color: '#fff'\n};\n\n\nexport default Icon;\n","import React from \"react\";\n\nfunction Icon(props) {\n    return (\n        <svg\n            {...props}\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"14\"\n            height=\"13\"\n            fill=\"none\"\n            viewBox=\"0 0 14 13\"\n        >\n            <g fill=\"#fff\" opacity=\"0.6\">\n                <path d=\"M11.848 6.5L1.152.325v12.35L11.848 6.5z\"></path>\n                <path d=\"M12 1H14V12H12z\"></path>\n            </g>\n        </svg>\n    );\n}\n\nexport default Icon;\n","import React from \"react\";\n\nfunction Icon(props) {\n    return (\n        <svg\n            {...props}\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"14\"\n            height=\"13\"\n            fill=\"none\"\n            viewBox=\"0 0 14 13\"\n        >\n            <g fill=\"#fff\" opacity=\"0.6\">\n                <path d=\"M2.152 6.5l10.696 6.175V.325L2.152 6.5z\"></path>\n                <path d=\"M2 12H4V23H2z\" transform=\"rotate(180 2 12)\"></path>\n            </g>\n        </svg>\n    );\n}\n\nexport default Icon;\n","import React, { useEffect, useState, useContext, useRef, } from 'react'\nimport { play, isSavedTracks, removeSavedTrack, saveTrack } from '../../services/'\nimport { timeConvert, getParams } from '../../utils'\nimport loadSpotifyPlayer from '../../utils/LoadScript'\nimport { Context } from '../../context'\nimport Volume from './volume'\nimport axios from 'axios'\nimport config from '../../config'\nimport HeartIcon from '../../icons/heart'\nimport PlayIcon from '../../icons/play'\nimport NextIcon from '../../icons/next'\nimport PrevIcon from '../../icons/prev'\nimport _ from 'lodash'\n\nexport default function PlayerComponent() {\n\n    let player\n\n    const intervalCurrentState = useRef(null);\n\n    const { dispatch, state } = useContext(Context);\n\n    const [onSlide, setOnslide] = useState(false)\n\n    const [playerVolume, setPlayerVolume] = useState(1)\n\n    window.onSpotifyWebPlaybackSDKReady = async function () {\n        player = new window.Spotify.Player({\n            name: 'Echoes Player',\n            getOAuthToken: async (cb) => {\n                let access_token = localStorage.getItem('token')\n                if (access_token) {\n                    cb(access_token)\n                } else {\n                    let { data: { access_token } } = await axios.get(`${config.FIREBASE_BASE_URL}/getFreshToken`, {\n                        params: {\n                            payload: getParams()\n                        }\n                    })\n                    cb(access_token);\n                }\n            }\n        });\n        // Error handling\n        player.on('initialization_error', ({ message }) => { console.error(message, 'initialization_error'); });\n        player.on('account_error', ({ message }) => { console.error(message, 'account_error'); });\n        player.on('playback_error', ({ message }) => { console.error(message, 'playback_error'); });\n\n        // Ready\n        player.addListener('ready', ({ device_id }) => {\n            dispatch({ type: \"setPlayer\", payload: player })\n            dispatch({ type: \"setDeviceId\", payload: device_id })\n        });\n\n        // Not Ready\n        player.addListener('not_ready', ({ device_id }) => {\n            console.log('Device ID has gone offline', device_id);\n        });\n\n        player.addListener('player_state_changed', (data) => {\n            if (!data) return false\n            stopInterval()\n            dispatch({ type: \"setCurrentlyPlaying\", payload: { data, loading: false } })\n            if (data.paused) {\n                stopInterval()\n            } else {\n                startInterval()\n            }\n        });\n        await player.connect()\n        return 'OK'\n    }\n\n    const handleChange = ({ currentTarget: { value, max, min } }) => {\n        setOnslide(true)\n        setDebounced.current(value, state.player);\n    };\n\n    const setServicesValue = (e, player) => {\n        player.seek(e).then(() => {\n            setTimeout(() => {\n                setOnslide(false)\n            }, 500);\n        });\n    };\n\n    const handleSaveClick = async () => {\n        try {\n            let { isSaved, id } = state.playingTracks.isSaved.find(i => i.id === state.currentlyPlaying.data.track_window.current_track.id) || {};\n            if (isSaved) {\n                await removeSavedTrack(id);\n                let savedList = await isSavedTracks(state.playingTracks.data.map(i => i.id))\n                dispatch({\n                    type: \"setSavedTracks\", payload:\n                        state.playingTracks.data.map((i, k) => {\n                            return {\n                                id: i.id,\n                                uri: i.uri,\n                                isSaved: savedList[k]\n                            }\n                        })\n                })\n\n            } else {\n                await saveTrack(state.currentlyPlaying.data.track_window.current_track.id)\n                let savedList = await isSavedTracks(state.playingTracks.data.map(i => i.id))\n                dispatch({\n                    type: \"setSavedTracks\", payload:\n                        state.playingTracks.data.map((i, k) => {\n                            return {\n                                id: i.id,\n                                uri: i.uri,\n                                isSaved: savedList[k]\n                            }\n                        })\n                })\n            }\n        } catch (e) {\n            throw new Error(e)\n        }\n    }\n\n\n    function handleNextTrack() {\n        state.player.nextTrack().then(() => {\n            console.log('Skipped to next track!');\n        });\n    }\n\n    function handlePreviousTrack() {\n        state.player.previousTrack().then(() => {\n            console.log('Set to previous track!');\n        });\n    }\n\n    const setDebounced = useRef(_.debounce(setServicesValue, 500));\n\n    function handleTogglePlay() {\n        state.player.togglePlay()\n    }\n\n    const handleVolumeChange = (e) => {\n        setPlayerVolume(e.target.value)\n        state.player.setVolume(e.target.value)\n    }\n\n    const load = async () => {\n        try {\n            await loadSpotifyPlayer();\n        } catch (e) {\n            console.log(e)\n        }\n    }\n\n    const startInterval = () => intervalCurrentState.current = setInterval(async () => {\n        try {\n            let data = await player.getCurrentState();\n            if (data) {\n                dispatch({ type: \"setCurrentlyPlaying\", payload: { data, loading: false } })\n            }\n        }\n        catch (e) {\n            console.log(e)\n        }\n    }, 1000)\n\n    const stopInterval = () => clearInterval(intervalCurrentState.current)\n\n    useEffect(() => {\n        load();\n    }, [])\n\n    useEffect(async () => {\n        if (state.playingTracks.data.length > 0) {\n            let savedList = await isSavedTracks(state.playingTracks.data.map(i => i.id))\n            dispatch({\n                type: \"setSavedTracks\", payload:\n                    state.playingTracks.data.map((i, k) => {\n                        return {\n                            id: i.id,\n                            uri: i.uri,\n                            isSaved: savedList[k]\n                        }\n                    })\n            })\n            let success = await play(state.playingTracks.data.map(i => i.uri), state.deviceId);\n\n            if (!success) {\n                await window.onSpotifyWebPlaybackSDKReady()\n                play(state.playingTracks.data.map(i => i.uri), state.deviceId);\n            }\n        }\n    }, [state.playingTracks.data])// eslint-disable-line react-hooks/exhaustive-deps\n\n    if (state.currentlyPlaying.loading) return (\n        <div className=\"player-container\">\n            <div className=\"echoes-player\">\n                <div className=\"album-info d-flex justify-content-between\">\n                    <figure className=\"figure ml-0\">\n                        <figcaption>\n\n                        </figcaption>\n                    </figure>\n                    <HeartIcon fill=\"#b2b2b2\" strokecolor=\"#b2b2b2\" />\n                </div>\n                <div className=\"player\">\n                    <div className=\"player-buttons\">\n                        <PrevIcon />\n                        <PlayIcon playing=\"false\" />\n                        <NextIcon />\n                    </div>\n                    <div className=\"progress-wrapper\">\n                        <span className=\"time-rest\">00:00</span>\n                        <input onChange={() => false} type=\"range\" value={0} max={100} />\n                        <span className=\"time-past\">00:00</span>\n                    </div>\n                </div>\n                <div className=\"volume-wrapper\">\n                    <Volume volume={playerVolume} />\n                    <input onChange={() => false} className=\"ml-3\" step={0.1} type=\"range\" max={1} />\n                </div>\n            </div>\n        </div>\n    )\n\n\n    return (\n        <div className=\"player-container\">\n            <div className=\"echoes-player\">\n                <div className=\"album-info sm-hide d-flex justify-content-between\">\n                    <figure className=\"figure ml-0\">\n                        <img alt={state.currentlyPlaying.data.track_window.current_track.album.name} width=\"50\" height=\"50\" src={state.currentlyPlaying.data.track_window.current_track.album.images[0].url}></img>\n                        <figcaption>\n                            <p title={state.currentlyPlaying.data.track_window.current_track.name} className=\"figure-track-name\">{state.currentlyPlaying.data.track_window.current_track.name}</p>\n                            <p className=\"figure-artist-name\">{state.currentlyPlaying.data.track_window.current_track.artists[0].name}</p>\n                        </figcaption>\n                    </figure>\n                    <HeartIcon onClick={handleSaveClick} strokecolor={state.playingTracks.isSaved.find(i => i.id === state.currentlyPlaying.data.track_window.current_track.id)?.isSaved ? '#b2b2b2' : 'white'} fill={state.playingTracks.isSaved.find(i => i.id === state.currentlyPlaying.data.track_window.current_track.id)?.isSaved ? '#b2b2b2' : 'none'} />\n                </div>\n                <div className=\"player\">\n                    <div className=\"player-buttons\">\n                        {state.currentlyPlaying.data.track_window.previous_tracks.length > 0 ?\n                            <PrevIcon onClick={handlePreviousTrack} /> :\n                            <PrevIcon />}\n                        <PlayIcon name={state.currentlyPlaying.data.track_window.current_track.name} playing={state.currentlyPlaying.paused} onClick={handleTogglePlay} />\n                        {state.currentlyPlaying.data.track_window.next_tracks.length > 0 ?\n                            <NextIcon onClick={handleNextTrack} /> :\n                            <NextIcon />}\n                    </div>\n                    <div className=\"progress-wrapper\">\n                        <span className=\"time-rest\">{timeConvert(state.currentlyPlaying.data.position)}</span>\n                        <input onChange={handleChange} type=\"range\" defaultValue={state.currentlyPlaying.data.position} value={onSlide ? null : state.currentlyPlaying.data.position} max={state.currentlyPlaying.data.duration} />\n                        <span className=\"time-past\">{timeConvert(state.currentlyPlaying.data.duration)}</span>\n                    </div>\n                </div>\n                <div className=\"volume-wrapper\">\n                    <Volume volume={playerVolume} />\n                    <input className=\"ml-3\" step={0.1} onChange={handleVolumeChange} type=\"range\" defaultValue={0.5} value={playerVolume} max={1} />\n                </div>\n            </div>\n        </div>\n    )\n}\n","export default function loadSpotifyPlayer() {\n    return new Promise((resolve, reject) => {\n        const scriptTag = document.getElementById('spotify-player');\n\n        if (!scriptTag) {\n            const script = document.createElement('script');\n            script.id = 'spotify-player';\n            script.type = 'text/javascript';\n            script.async = false;\n            script.defer = true;\n            script.src = 'https://sdk.scdn.co/spotify-player.js';\n            script.onload = () => resolve();\n            script.onerror = (error) => reject(new Error(`loadScript: ${error.message}`));\n            document.head.appendChild(script);\n        } else {\n            resolve();\n        }\n    });\n}","import React from 'react'\nimport { Link } from 'react-router-dom'\nimport Logo from '../../style/img/logo-1984.svg'\nimport Player from '../Player'\nimport SpotifyPlayer from '../Player/player'\n\n\nexport default function Footer() {\n    return (\n        <footer id=\"content-wrapper\" className=\"main bg-dark d-flex justify-content-between main-footer align-items-center main-content\">\n            <Link to=\"privacy-policy\" className=\"footer-text\">Privacy Policy</Link>\n            <div className=\"align-items-center\">\n                <a rel=\"noreferrer\" target=\"_blank\" href=\"https://1984.design/\" className=\"d-flex\">\n                    <span className=\"footer-text\" >Designed & Developed by</span>\n                    <img alt=\"1984 Logo\" className=\"ml-2\" src={Logo}></img>\n                </a>\n            </div>\n            <Player>\n                <SpotifyPlayer />\n            </Player >\n        </footer >\n    )\n}\n","import React, { useRef } from 'react'\nimport axios from 'axios'\nimport { useToasts } from 'react-toast-notifications';\nimport config from '../../config'\n\nexport default function Email() {\n\n    const emailRef = useRef()\n\n    const { addToast } = useToasts()\n\n    const handleSubmit = async (e) => {\n        e.preventDefault()\n        try {\n            await axios.post(`${config.FIREBASE_BASE_URL}/subscribeToMailchimp`, { email_address: emailRef.current.value })\n            addToast('Subscribed!', { appearance: \"success\" })\n        } catch (e) {\n            let { response: { data: { message } } } = { ...e }\n            addToast(message, { appearance: \"error\" })\n        }\n    }\n\n    return (\n        <section className=\"mt-5 mb-5\" id=\"content-wrapper\">\n            <div className=\"container-fluid\">\n                <div className=\"d-flex justify-content-between\">\n                    <div className=\"bg-dark w-100 \">\n                        <div className=\"pt-5 pb-5 px-3 email-wrapper\">\n                            <h1 className=\"text-white text-center \">We sent monthly reports,<br />\n                            right in your inbox.\n                            </h1> <p className=\"text-center mt-2 text-sm\">Some cool statistics regarding your music listening habits.</p>\n                            <div className=\"form\">\n                                <form onSubmit={handleSubmit} id=\"report\">\n                                    <input ref={emailRef} required placeholder=\"Enter your email\" type=\"email\"></input>\n                                    <input className=\"monthly-report\" value=\"Get free monthly reports\" type=\"submit\"></input>\n                                </form>\n                            </div>\n                            <p className=\"text-center mt-4 text-xs\">No spam, and we never share your data.</p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </section >\n    )\n}\n","import React, { useEffect, useContext } from 'react'\nimport { useToasts } from 'react-toast-notifications';\nimport { Context } from '../context'\nimport { getCurrentUser, signInWithSpotify } from '../services'\nimport Aside from '../components/Aside'\nimport Footer from '../components/Footer'\nimport Email from '../components/Email'\nimport '../style/motherboard/style.css'\nimport '../style/motherboard/custom.scss'\n\nfunction Layout({ children }) {\n\n    const { addToast } = useToasts();\n\n    const { dispatch, state: { error } } = useContext(Context)\n\n    const setCurrentUser = async () => {\n        let data = await getCurrentUser();\n        dispatch({ type: \"getCurrentUser\", payload: data })\n    }\n\n    useEffect(() => {\n        setCurrentUser()\n    }, [])// eslint-disable-line react-hooks/exhaustive-deps\n\n    useEffect(() => {\n        if (error.message) {\n            if (error.status == \"401\") {\n                signInWithSpotify()\n                return false\n            }\n            addToast(error.message, { appearance: \"error\" })\n        }\n    }, [error])\n\n    return (\n        <>\n            <Aside />\n            <main id=\"main\" className=\"main main-content\">\n                {children}\n                <Email />\n            </main>\n            <Footer />\n        </>\n    )\n}\n\nexport default Layout\n","import React from 'react'\nimport Layout from '../layout'\nimport queryString from \"query-string\";\nimport { getToken } from '../services'\nimport { Route, Redirect, useHistory } from \"react-router-dom\";\n\nconst PrivateRoute = ({ component: Component, ...rest }) => {\n\n    const history = useHistory();\n\n    return (\n        <Route\n            {...rest}\n            render={() => {\n                if (rest.location.search) {\n                    let { code } = queryString.parse(rest.location.search)\n                    getToken(code, 'client_credentials').then(({ access_token, refresh_token }) => {\n                        if (access_token) {\n                            localStorage.setItem(\"token\", access_token)\n                            localStorage.setItem(\"refresh_token\", refresh_token)\n                            if (rest.location.pathname === '/dashboard') history.push('/dashboard')\n                        }\n                    })\n\n                }\n                let token = localStorage.getItem('token');\n                return (\n                    token !== null ? (\n                        <Layout>\n                            <Component />\n                        </Layout>\n                    ) : (\n                        <Redirect to={\"/login\"} />\n                    )\n                )\n            }\n            }\n        />\n    )\n};\n\n\nexport default PrivateRoute\n","import React, { useEffect, Fragment } from 'react';\nimport { withRouter } from 'react-router-dom';\n\nfunction ScrollToTop({ history, children }) {\n    useEffect(() => {\n        const unlisten = history.listen(() => {\n            window.scrollTo(0, 0);\n        });\n        return () => {\n            unlisten();\n        }\n    }, []);\n\n    return <Fragment>{children}</Fragment>;\n}\n\nexport default withRouter(ScrollToTop);","export default __webpack_public_path__ + \"static/media/logo.f23f9e79.svg\";","import React, { useLayoutEffect } from \"react\";\nimport { signInWithSpotify } from '../../services/index'\nimport Logo from '../../style/img/icons/logo.svg'\n\n\nfunction Login() {\n\n  const handleSubmit = (e) => {\n    e.preventDefault();\n    signInWithSpotify();\n  }\n\n  useLayoutEffect(() => {\n    document.body.style.backgroundColor = \"black\"\n  }, []);\n\n  return <div className=\"container body\">\n    <div className=\"row login__block\">\n      <div className=\"login__block_left col-xl-5 col-lg-5 col-md-12 col-sm-12 ml-auto\">\n        <img width=\"152\" height=\"31\" className=\"mr-auto\" src={Logo}></img>\n        <div className=\"login__block_title mt-5\">\n          Discover your music streaming stats\n      </div>\n        <p className=\"mt-4\">Get insights into your music listening habits with top artists and tracks. Discover new music, create playlists and get monthly reports.</p>\n        <div className=\"login-form\">\n          <form id=\"login-form\" onSubmit={handleSubmit}>\n            <label>Select your service</label>\n            <select className=\"custom-select custom-select_h40\">\n              <option value=\"Spotify\" selected>Spotify</option>\n            </select>\n            <input value=\"Sign-in with Spotify\" type=\"submit\" className=\"sign-up font-weight-bold\" form=\"login-form\">\n            </input>\n          </form>\n          <hr />\n          <div className=\"login__account row justify-content-between align-items-center\">\n            <p className=\"login-info\">Echoes use Spotify Web API, and Spotify Implicit Grant Flow for user Authorization, also require access to your Spotify account to perform but application works as client side only and your Spotify data is not stored to any server. Learn more</p>\n          </div>\n        </div>\n      </div>\n      <div className=\"login__block_right col-xl-5 col-lg-5 col-md-12 col-sm-12 mr-auto\">\n      </div>\n    </div>\n  </div>\n    ;\n}\n\nexport default Login;\n","import React from 'react'\n\nexport default function Privacy() {\n\n    return (\n        <>\n            <section id=\"content-wrapper\">\n                <div className=\"container-fluid\">\n                    <p className=\"flex-1\">Echoes build on third party services, and currently using Spotify Web API, that <br />provides your music metadata and recommendation endpoints.</p>\n                </div>\n            </section>\n            <section className=\"bg-white\" id=\"content-wrapper\">\n                <div className=\"container-fluid\">\n                    <div className=\" revenue__title revenue__title_two\">\n                        <ul className=\"privacy-list\">\n                            <li>\n                                ✤ Echoes is not an official Spotify project, (but an official <a target=\"_blank\" href=\"https://1984.design/\">1984</a> project) and it is built on the public <a href=\"https://developer.spotify.com/\" target=\"_blank\">Spotify Web API</a>, that provides music metadata and recommendation endpoints. Echoes also use Web Playback SDK, which is a client-side JavaScript library which allows us to create a new player in <a href=\"https://www.spotify.com/tr/connect/\" target=\"_blank\">Spotify Connect</a> and play any audio track from Spotify in the browser via <a href=\"https://www.w3.org/TR/encrypted-media/\" target=\"_blank\">Encrypted Media Extensions</a>. It’s the same technology Spotify use to power their <a target=\"_blank\" href=\"https://open.spotify.com/\">Web Player</a> experience.\n                            </li>\n                            <li>\n                                ✤ Echoes also use Spotify Web API, and Spotify Implicit Grant Flow for user Authorization, and require access to your Spotify account to perform. Echoes works as a single page application, and we only reach to our servers for login lifecycle and your Spotify data is not stored in any of our databases.\n                            </li>\n                            <li>\n                                ✤ As Echoes built on Spotify services, when you use or interact with the Spotify Service, they use a variety of technologies to track (Including <a href=\"https://policies.google.com/privacy?hl=en-US\" target=\"_blank\">Google Analytics</a>) and process the personal data they collect about you for various reasons. We recommend you should review <a href=\"https://www.spotify.com/us/legal/privacy-policy/\" target=\"_blank\">Spotify Privacy Policy</a> as well.\n                            </li>\n                            <li>\n                                ✤ Currently, we do not save, track or process any of your Spotify data to any server. However; in our future plans, we want to analyze your listening data on our side to provide more meaningful results, such as weekly/monthly comparisons, top albums, comparing stats with family, friends etc… When this time comes, we'll notify you with the changes.\n                            </li>\n                            <li>\n                                → If you have any questions regarding privacy, your data or any other of your concerns, reach out to us: <a href=\"mailto:echoes@1984.design\">echoes@1984.design</a>\n                            </li>\n                        </ul>\n                        <div className=\"privacy-bottom\">\n                            <hr className=\"privacy-hr\" />\n                            <p>v.1.0 [18 March 2021]</p>\n                        </div>\n                    </div>\n                </div >\n            </section >\n        </>\n    )\n}\n","import React from \"react\"\nimport ContentLoader from \"react-content-loader\"\n\nconst MyLoader = (props) => (\n    <ContentLoader\n        speed={2}\n        width={1220}\n        height={400}\n        viewBox=\"0 0 1220 400\"\n        backgroundColor=\"#f3f3f3\"\n        foregroundColor=\"#ecebeb\"\n        {...props}\n    >\n        <circle cx=\"57\" cy=\"49\" r=\"14\" />\n        <rect x=\"8\" y=\"37\" rx=\"0\" ry=\"0\" width=\"12\" height=\"22\" />\n        <rect x=\"100\" y=\"21\" rx=\"0\" ry=\"0\" width=\"51\" height=\"51\" />\n        <rect x=\"167\" y=\"29\" rx=\"5\" ry=\"5\" width=\"209\" height=\"13\" />\n        <rect x=\"166\" y=\"50\" rx=\"5\" ry=\"5\" width=\"176\" height=\"13\" />\n        <rect x=\"880\" y=\"38\" rx=\"0\" ry=\"0\" width=\"19\" height=\"20\" />\n        <rect x=\"935\" y=\"42\" rx=\"5\" ry=\"5\" width=\"28\" height=\"9\" />\n        <circle cx=\"57\" cy=\"126\" r=\"14\" />\n        <rect x=\"8\" y=\"114\" rx=\"0\" ry=\"0\" width=\"12\" height=\"22\" />\n        <rect x=\"100\" y=\"98\" rx=\"0\" ry=\"0\" width=\"51\" height=\"51\" />\n        <rect x=\"167\" y=\"106\" rx=\"5\" ry=\"5\" width=\"209\" height=\"13\" />\n        <rect x=\"166\" y=\"127\" rx=\"5\" ry=\"5\" width=\"176\" height=\"13\" />\n        <rect x=\"880\" y=\"115\" rx=\"0\" ry=\"0\" width=\"19\" height=\"20\" />\n        <rect x=\"935\" y=\"119\" rx=\"5\" ry=\"5\" width=\"28\" height=\"9\" />\n        <circle cx=\"57\" cy=\"199\" r=\"14\" />\n        <rect x=\"8\" y=\"187\" rx=\"0\" ry=\"0\" width=\"12\" height=\"22\" />\n        <rect x=\"100\" y=\"171\" rx=\"0\" ry=\"0\" width=\"51\" height=\"51\" />\n        <rect x=\"167\" y=\"179\" rx=\"5\" ry=\"5\" width=\"209\" height=\"13\" />\n        <rect x=\"166\" y=\"200\" rx=\"5\" ry=\"5\" width=\"176\" height=\"13\" />\n        <rect x=\"880\" y=\"188\" rx=\"0\" ry=\"0\" width=\"19\" height=\"20\" />\n        <rect x=\"935\" y=\"192\" rx=\"5\" ry=\"5\" width=\"28\" height=\"9\" />\n        <circle cx=\"57\" cy=\"271\" r=\"14\" />\n        <rect x=\"8\" y=\"259\" rx=\"0\" ry=\"0\" width=\"12\" height=\"22\" />\n        <rect x=\"100\" y=\"243\" rx=\"0\" ry=\"0\" width=\"51\" height=\"51\" />\n        <rect x=\"167\" y=\"251\" rx=\"5\" ry=\"5\" width=\"209\" height=\"13\" />\n        <rect x=\"166\" y=\"272\" rx=\"5\" ry=\"5\" width=\"176\" height=\"13\" />\n        <rect x=\"880\" y=\"260\" rx=\"0\" ry=\"0\" width=\"19\" height=\"20\" />\n        <rect x=\"935\" y=\"264\" rx=\"5\" ry=\"5\" width=\"28\" height=\"9\" />\n        <circle cx=\"58\" cy=\"336\" r=\"14\" />\n        <rect x=\"9\" y=\"324\" rx=\"0\" ry=\"0\" width=\"12\" height=\"22\" />\n        <rect x=\"101\" y=\"308\" rx=\"0\" ry=\"0\" width=\"51\" height=\"51\" />\n        <rect x=\"168\" y=\"316\" rx=\"5\" ry=\"5\" width=\"209\" height=\"13\" />\n        <rect x=\"167\" y=\"337\" rx=\"5\" ry=\"5\" width=\"176\" height=\"13\" />\n        <rect x=\"880\" y=\"325\" rx=\"0\" ry=\"0\" width=\"19\" height=\"20\" />\n        <rect x=\"935\" y=\"329\" rx=\"5\" ry=\"5\" width=\"28\" height=\"9\" />\n    </ContentLoader>\n)\n\nexport default MyLoader","import React, { useContext } from 'react'\nimport { Context } from '../../context'\nimport Loader from '../../components/Loader/itemLoader'\nimport Play from '../../icons/play'\nimport { saveTrack, removeSavedTrack } from '../../services/index'\nimport HeartIcon from '../../icons/heart'\nimport { timeConvert } from '../../utils'\n\nexport default function Item({ item, refreshDataset, items }) {\n\n    const { dispatch } = useContext(Context);\n\n    const handleSaveClick = async () => {\n\n        if (item.isSaved) {\n            await removeSavedTrack(item.id);\n            refreshDataset()\n        } else {\n            await saveTrack(item.id)\n            refreshDataset()\n        }\n    }\n\n    const getOrderedTracks = (index) => {\n        let tracks = [...items]\n        let splicedTracks = tracks.splice(index, (tracks.length))\n        return [...splicedTracks, ...tracks].map(i => { return { uri: i.uri ? i.uri : i.track.uri, id: i.id ? i.id : i.track.id } });\n    }\n\n    if (item.loading) return <Loader />\n\n    return (\n        <li >\n            <div className=\"d-flex figure-wrapper\">\n                <p className=\"font-weight-bold\">{item.index}</p>\n                <Play role=\"button\" className=\"ml-2\" onClick={() => {\n                    dispatch({\n                        type: \"setPlayingTracks\", payload: {\n                            data: getOrderedTracks(item.index - 1)\n                        }\n                    })\n                }} name={item.name} color=\"#000000\" />\n            </div>\n            <figure className=\"figure\">\n                <img alt={item.album.name} width=\"50\" height=\"50\" src={item.album.images.length ? item.album.images[1].url : null}></img>\n                <figcaption>\n                    <span className=\"font-weight-bold\">{item.name}</span>\n                    <span className=\"figure-subtitle\">{item.album.artists[0].name}</span>\n                </figcaption>\n            </figure>\n            <div className=\"like-wrapper\" >\n                <HeartIcon onClick={handleSaveClick} fill={item.isSaved ? 'black' : 'none'} />\n                <p className=\"font-weight-bold\">{timeConvert((item.duration_ms))}</p>\n            </div>\n        </li >\n    )\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Item from './item'\nimport { Link } from 'react-router-dom'\n\n\nfunction Recently({ items, refreshDataset }) {\n\n    if (items.length === 0) {\n        return (\n            <section id=\"content-wrapper\">\n                <div className=\"container-fluid\">\n                    <div className=\"dashboard__title d-flex justify-content-between\">\n                        <h1 className=\"page-title\">Recently played tracks</h1>\n                    </div>\n                    <div className=\"mt-4\">\n                        <h6 className=\"mb-3\">Not enough data to display. Listen more music and visit the app again.</h6>\n                        <Link to=\"/recent\" className=\"btn btn-dark btn__refresh_41 ml-0 mr-3 mx-xl-0 my-md-0 my-3\">\n                            <span className=\"m-auto\">See all Recently Played Tracks</span>\n                        </Link>\n                    </div>\n                </div>\n            </section>\n        )\n    }\n\n    return (\n        <section id=\"content-wrapper\">\n            <div className=\"container-fluid\">\n                <div className=\"dashboard__title d-flex justify-content-between\">\n                    <h1 className=\"page-title\">Recently played tracks</h1>\n                </div>\n                <div className=\"mt-4\">\n                    <ul className=\"recenty-played-wrapper\">\n                        {items.map((i, k) => (\n                            <Item key={k} refreshDataset={refreshDataset} items={items} item={{ ...i.track, index: k + 1 }} />\n                        ))}\n                    </ul>\n                    <Link to=\"/recent\" className=\"btn btn-dark btn__refresh_41 ml-0 mr-3 mx-xl-0 my-md-0 my-3\">\n                        <span className=\"m-auto\">See all Recently Played Tracks</span>\n                    </Link>\n                </div>\n            </div>\n        </section>\n    )\n}\n\nRecently.propTypes = {\n    items: PropTypes.array\n}\n\nexport default Recently","import React from 'react'\nimport ContentLoader from 'react-content-loader'\n\nconst Loader = props => (\n    <ContentLoader\n        width={350}\n        height={400}\n        viewBox=\"0 0 350 400\"\n        backgroundColor=\"#f0f0f0\"\n        foregroundColor=\"#dedede\"\n        {...props}\n    >\n        <rect x=\"43\" y=\"304\" rx=\"4\" ry=\"4\" width=\"271\" height=\"9\" />\n        <rect x=\"44\" y=\"323\" rx=\"3\" ry=\"3\" width=\"119\" height=\"6\" />\n        <rect x=\"42\" y=\"77\" rx=\"10\" ry=\"10\" width=\"388\" height=\"217\" />\n    </ContentLoader>\n)\n\n\nexport default Loader","import React, { useContext } from 'react'\nimport Loader from '../Loader'\nimport { Context } from '../../context'\nimport PropTypes from 'prop-types'\nimport Play from '../../icons/play'\nimport { Link } from 'react-router-dom'\n\nfunction Top({ items, data, loading }) {\n\n    const { dispatch } = useContext(Context);\n\n    const getOrderedTracks = (index) => {\n        let tracks = [...items]\n        let splicedTracks = tracks.splice(index + 1, (tracks.length - index + 1))\n        return [...splicedTracks, ...tracks].map(i => { return { uri: i.uri, id: i.id } });\n    }\n\n    if (loading) return <Loader />\n\n    if (items.length === 0) {\n        return (\n            <div className=\"col-xl-4\">\n                <div className=\"card\">\n                    <Link to={`/${data.type.toLowerCase()}`} className=\"btn btn-dark mb-2 font-weight-bold\">\n                        Top {data.type}\n                    </Link>\n                    <h6>Not enough data to display. Listen more music and visit the app again.</h6>\n                </div>\n            </div>\n        )\n    }\n\n    return (\n        <>\n            {data.isTrack ? <div className=\"col-xl-4\">\n                <div className=\"card\">\n                    <div style={{ backgroundImage: `linear-gradient(0deg, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.6)), url('${items[0].album.images.length ? items[0].album.images[1].url : null}')` }} className=\"card-background\">\n                        <div className=\"card-body  d-flex flex-column justify-content-end\">\n                            <Link to={`/${data.type.toLowerCase()}`} className=\"btn btn__white font-weight-bold\">\n                                Top {data.type}\n                            </Link>\n                            <div className=\"d-flex justify-content-between\"><h3 className=\"text-white\">{items[0].name}</h3>\n                                <Play\n                                    name={items[0].name}\n                                    onClick={() => dispatch({ type: \"setPlayingTracks\", payload: { data: items.map(i => { return { uri: i.uri, id: i.id } }) } })}\n                                /></div>\n                            <span className=\"text-white\">{items[0].artists[0].name}</span>\n                        </div>\n                    </div>\n                    <div className=\"px-0 py-3\">\n                        <div className=\"revenue__header d-flex justify-content-between\">\n                            <div className=\"revenue__title revenue__title_two d-flex justify-content-between align-items-center\">\n                                <ul className=\"top-list\">\n                                    {items.slice(1).map((i, k) => (\n                                        <li key={k}>\n                                            <h6 className=\"font-weight-bold\">{k + 1}</h6>\n                                            <figure>\n                                                <img alt={i.album.name} width=\"50\" height=\"50\" src={i.album.images.length ? i.album.images[2].url : null}></img>\n                                                <figcaption title={i.name}>{i.name} <br />\n                                                    <span className=\"figure-subtitle\">{i.artists[0].name}</span>\n                                                </figcaption>\n                                            </figure>\n                                            <Play\n                                                onClick={() => {\n                                                    dispatch({ type: \"setPlayingTracks\", payload: { data: getOrderedTracks(k) } })\n                                                }}\n                                                name={i.name} color=\"#000000\" />\n                                        </li>\n                                    ))}\n                                </ul>\n                            </div>\n                        </div>\n                    </div>\n                    <Link to={`/${data.type.toLowerCase()}`} className=\"btn btn-dark btn__refresh_41 ml-0 mr-3 mx-xl-0 my-md-0 my-3\">\n                        <span className=\"m-auto\">See all Top {data.type}</span>\n                    </Link>\n                </div>\n            </div> : <div className=\"col-xl-4\">\n                <div className=\"card\">\n                    <div style={{ backgroundImage: `linear-gradient(0deg, rgba(0, 0, 0, 0.35), rgba(0, 0, 0, 0.35)), url('${items[0].images.length ? items[0].images[1].url : null}')` }} className=\"card-background\">\n                        <div className=\"card-body  d-flex flex-column justify-content-end\">\n                            <Link to={`/${data.type.toLowerCase()}`} className=\"btn btn__white font-weight-bold\">\n                                Top {data.type}\n                            </Link>\n                            <div className=\"d-flex mb-2 justify-content-between\"><h3 className=\"text-white\">{items[0].name}</h3>\n                                <Play\n                                    onClick={() => dispatch({ type: \"setPlayingTracks\", payload: { data: items[0].tracks.map(i => { return { uri: i.uri, id: i.id } }) } })}\n                                    name={[items[0].uri]} />\n                            </div>\n                        </div>\n                    </div>\n                    <div className=\"px-0 py-3\">\n                        <div className=\"revenue__header d-flex justify-content-between\">\n                            <div className=\"revenue__title revenue__title_two d-flex justify-content-between align-items-center\">\n                                <ul className=\"top-list\">\n                                    {items.slice(1).map((i, k) => (\n                                        <li key={k}>\n                                            <h6 className=\"font-weight-bold\">{k + 1}</h6>\n                                            <figure>\n                                                <img alt={i.name} width=\"50\" height=\"50\" src={i.images.length ? i.images[2].url : null}></img>\n                                                <figcaption title={i.name}>{i.name}</figcaption>\n                                            </figure>\n                                            <Play\n                                                onClick={() => {\n                                                    dispatch({ type: \"setPlayingTracks\", payload: { data: i.tracks.map(i => { return { uri: i.uri, id: i.id } }) } })\n                                                }}\n                                                name={[i.uri]} color=\"#000000\" />\n                                        </li>\n                                    ))}\n                                </ul>\n                            </div>\n                        </div>\n                    </div>\n                    <Link to={`/${data.type.toLowerCase()}`} className=\"btn btn-dark btn__refresh_41 ml-0 mr-3 mx-xl-0 my-md-0 my-3\">\n                        <span className=\"m-auto\">See all Top {data.type}</span>\n                    </Link>\n                </div>\n            </div>}\n        </>\n\n\n    )\n}\n\nTop.defaultProps = {\n    isTrack: true\n};\n\n\nTop.propTypes = {\n    isTrack: PropTypes.bool,\n    items: PropTypes.array\n}\n\nexport default Top","import React, { useEffect, useContext } from \"react\";\nimport { Context } from \"../context\";\nimport { getTopList } from '../services/'\nimport Recently from \"../components/Recently\";\nimport TopItem from '../components/Top/'\n\nfunction Dashboard() {\n\n  const { state, dispatch } = useContext(Context);\n\n  const setTopList = async () => {\n    let data = await getTopList();\n    dispatch({ type: \"getTopList\", payload: data })\n  }\n\n  useEffect(() => {\n    setTopList();\n  }, [])\n\n  if (state.topList.error) return false\n\n  return <>\n    <section className=\"bg-white\" id=\"content-wrapper\">\n      <div className=\"container-fluid\">\n        <div className=\"row justify-content-between\">\n          <TopItem loading={state.topList.loading} items={state.topList.data.artists} data={{ isTrack: false, type: \"Artists\" }} isTrack={false} />\n          <TopItem loading={state.topList.loading} items={state.topList.data.tracks} data={{ isTrack: true, type: \"Tracks\" }} />\n          <TopItem loading={state.topList.loading} items={state.topList.data.recommendations} data={{ isTrack: true, type: \"Discover\" }} />\n        </div>\n      </div>\n    </section>\n    <Recently refreshDataset={setTopList} items={state.topList.data.recently} />\n  </>\n    ;\n}\n\nexport default Dashboard;\n","import React, { useContext } from 'react'\nimport { Context } from '../../context'\nimport PropTypes from 'prop-types'\nimport Play from '../../icons/play'\nimport { followArtist, unFollowArtist } from '../../services'\nimport Loader from '../../components/Loader/itemLoader'\n\n\nfunction Item({ item, setArtists }) {\n\n    const { state, dispatch } = useContext(Context);\n\n    const handleFollow = async () => {\n        if (item.isFollow) {\n            await unFollowArtist(item.id);\n            setArtists();\n        } else {\n            await followArtist(item.id)\n            setArtists();\n        }\n    }\n\n    if (item.loading) return <Loader />\n\n    return (\n        <li>\n            <div className=\"d-flex figure-wrapper\">\n                <p className=\"font-weight-bold\">{item.index}</p>\n                <Play\n                    className=\"ml-2\"\n                    onClick={() => {\n                        dispatch({ type: \"setPlayingTracks\", payload: { data: item.tracks.map(i => { return { uri: i.uri, id: i.id } }) } })\n                    }}\n                    name={[item.uri]} color=\"#000000\" />\n            </div>\n            <figure className=\"figure\">\n                <img alt={item.name} width=\"50\" height=\"50\" src={item.images.length ? item.images[1].url : null}></img>\n                <figcaption>\n                    <span className=\"font-weight-bold\">{item.name}</span>\n                    <span className=\"figure-subtitle\">{item.genres.slice(0, 4).join(', ')}</span>\n                </figcaption>\n            </figure>\n            <div className=\"switcherWithText col-lg-auto col-12 mb-lg-0 like-wrapper\">\n                <label onClick={() => handleFollow()} className=\"switcherWithText_label\">{item.isFollow ? 'Following' : 'Follow'}</label>\n                <input onChange={() => false} type=\"checkbox\" className=\"switcherCheckboxText\" style={{ display: 'none' }} checked={item.isFollow} />\n                <label onClick={() => handleFollow()} className=\"toggle1\">\n                    <span />\n                </label>\n            </div>\n        </li>\n    )\n}\n\n\nItem.propTypes = {\n    isLike: PropTypes.bool\n};\nexport default Item\n\n","import React, { useEffect, useContext } from 'react'\nimport { Context } from \"../../context\";\nimport { getArtists } from '../../services'\nimport Item from './item'\n\nexport default function Artists() {\n\n    const { state: { timeRange, artists }, dispatch } = useContext(Context);\n\n    const setArtists = async () => {\n        let data = await getArtists(50, timeRange);\n        dispatch({ type: \"getArtists\", payload: data })\n    }\n\n    useEffect(() => {\n        setArtists();\n    }, [])// eslint-disable-line react-hooks/exhaustive-deps\n\n    return (\n        <>\n            <section className=\"bg-light-gray\" id=\"content-wrapper\">\n                <div className=\"container-fluid\">\n                    <div className=\" revenue__title revenue__title_two d-flex justify-content-between align-items-center\">\n                        <ul className=\"top-artist-list\">\n                            {artists.data.map((i, k) =>\n                                <Item key={k} setArtists={setArtists} item={{ ...i, index: k + 1, loading: artists.loading }} />)}\n                        </ul>\n                    </div>\n                </div >\n            </section >\n        </>\n    )\n}\n","import React, { useContext, useEffect } from 'react'\nimport { Context } from '../../context'\nimport { getTracks } from '../../services';\nimport Item from '../../components/Recently/item'\n\nexport default function Tracks() {\n\n    const { state: { timeRange, tracks }, dispatch } = useContext(Context);\n\n    const setTracks = async () => {\n        let data = await getTracks(50, timeRange);\n        dispatch({ type: \"getTracks\", payload: data })\n    }\n\n    useEffect(() => {\n        setTracks();\n    }, [])\n\n    return (\n        <section className=\"bg-light-gray\" id=\"content-wrapper\">\n            <div className=\"container-fluid\">\n                <div className=\" revenue__title revenue__title_two d-flex justify-content-between align-items-center\">\n                    <ul className=\"top-artist-list\">\n                        {tracks.data.map((i, k) =>\n                            <Item items={tracks.data} refreshDataset={setTracks} key={k} item={{ ...i, index: k + 1, loading: tracks.loading }} />)}\n                    </ul>\n                </div>\n            </div >\n        </section >\n    )\n}\n","import React, { useEffect, useContext } from 'react'\nimport { Context } from \"../../context\";\nimport Item from '../../components/Recently/item'\nimport { getRecently } from '../../services'\n\nexport default function Artists() {\n\n    const { state: { timeRange, recently }, dispatch } = useContext(Context);\n\n    const setRecently = async () => {\n        let data = await getRecently(50, timeRange);\n        dispatch({ type: \"getRecently\", payload: data })\n    }\n\n    useEffect(() => {\n        setRecently();\n    }, [])\n\n    return (\n        <section className=\"bg-light-gray\" id=\"content-wrapper\">\n            <div className=\"container-fluid\">\n                <div className=\" revenue__title revenue__title_two d-flex justify-content-between align-items-center\">\n                    <ul className=\"top-artist-list\">\n                        {recently.data.map((i, k) =>\n                            <Item refreshDataset={setRecently} items={recently.data} key={i.id} item={{ ...i.track, index: k + 1, loading: recently.loading }} ></Item>\n                        )}\n                    </ul>\n                </div>\n            </div >\n        </section >\n    )\n}\n","import React, { useEffect, useContext, useState } from 'react'\nimport { Context } from \"../../context\";\nimport Item from '../../components/Recently/item'\nimport { getRecommendations } from '../../services'\n\n\nexport default function Artists() {\n\n    const { state, dispatch } = useContext(Context);\n\n    const setRecommendations = async () => {\n        let data = await getRecommendations();\n        dispatch({ type: \"getRecommendations\", payload: data })\n    }\n\n    useEffect(() => {\n        setRecommendations();\n    }, [])// eslint-disable-line react-hooks/exhaustive-deps\n\n    return (\n        <section className=\"bg-white\" id=\"content-wrapper\">\n            <div className=\"container-fluid\">\n                <div className=\" revenue__title revenue__title_two d-flex justify-content-between align-items-center\">\n                    <ul className=\"top-artist-list\">\n                        {state.recommendations.data.map((i, k) =>\n                            <Item refreshDataset={setRecommendations} items={state.recommendations.data} key={i.id} item={{ ...i, index: k + 1, loading: state.recommendations.loading }} ></Item>\n                        )}\n                    </ul>\n                </div>\n            </div >\n        </section >\n    )\n}\n","export default function Redirect() {\n    let params = new URLSearchParams(window.location.search);\n    let playlistId = params.get(\"playlistId\")\n    window.location.href = `https://open.spotify.com/playlist/${playlistId}`\n    return false\n}","import React from \"react\";\nimport PrivateRoute from '../PrivateRoute'\nimport ScrollToTop from '../utils/ScrollToTop'\nimport { BrowserRouter as Router, Switch, Route, Redirect } from \"react-router-dom\";\nimport Login from \"../pages/Login\";\nimport Privacy from \"../pages/Privacy\";\nimport Dashboard from \"../pages/dashboard\";\nimport Artists from \"../pages/Artists\";\nimport Tracks from \"../pages/Tracks\";\nimport Recent from \"../pages/Recent/\";\nimport Discover from \"../pages/Discover\";\nimport Playlist from \"../pages/Playlist\";\n\nconst Main = () => {\n\n  return (\n    <Router>\n      <ScrollToTop />\n      <Switch>\n        <Route exact path=\"/login\" component={Login}></Route>\n        <Route path=\"/playlist\" component={Playlist}></Route>\n        <Route>\n          <Switch>\n            <PrivateRoute exact path=\"/\">\n              <Redirect to=\"/dashboard\" component={Dashboard} />\n            </PrivateRoute>\n            <PrivateRoute exact path=\"/dashboard\" component={Dashboard}></PrivateRoute>\n            <PrivateRoute exact path=\"/artists\" component={Artists}></PrivateRoute>\n            <PrivateRoute exact path=\"/tracks\" component={Tracks}></PrivateRoute>\n            <PrivateRoute exact path=\"/recent\" component={Recent}></PrivateRoute>\n            <PrivateRoute exact path=\"/discover\" component={Discover}></PrivateRoute>\n            <PrivateRoute exact path=\"/privacy-policy\" component={Privacy}></PrivateRoute>\n          </Switch>\n        </Route>\n\n      </Switch>\n\n\n    </Router>\n  );\n};\n\nexport default Main;\n","import React from 'react'\nimport Main from \"./components/main\";\nimport ContextProvider from './context'\n\nfunction App() {\n  return (\n    <ContextProvider>\n      <Main />\n    </ContextProvider >\n  );\n}\n\nexport default App;\n","import React from \"react\";\nimport { ToastProvider } from 'react-toast-notifications';\n\nimport ReactDOM from \"react-dom\";\nimport App from \"./App\";\nimport { BrowserRouter } from \"react-router-dom\";\n\n\nReactDOM.render(\n  <ToastProvider>\n    <BrowserRouter>\n      <App />\n    </BrowserRouter>\n  </ToastProvider>,\n  document.getElementById(\"root\")\n);\n"],"sourceRoot":""}