{"version":3,"sources":["components/BackToTop.module.scss","components/Tweets.module.scss","components/Spinners.module.scss","components/SiteFooter.module.scss","components/xhrHelpers.module.scss","components/Tweet.module.scss","auth/auth.js","MAGIC_URLS.js","dbShims.js","components/xhrHelpers.js","components/Filters.js","components/Hashtags.js","components/BackToTop.js","components/Tweet.js","components/Tweets.js","filterStyles.js","pages/Speedbag.js","components/Spinners.js","auth/Signin.js","auth/Forgot.js","pages/Login.js","pages/NoMatch.js","components/SiteFooter.js","components/SiteHeader.js","images/logo-speedbag-main.png","App.js","index.js","components/Filters.module.scss","pages/Speedbag.module.scss","components/Hashtags.module.scss","components/SiteHeader.module.scss"],"names":["module","exports","instance","axios","create","baseURL","headers","authContext","createContext","ProvideAuth","children","auth","useState","JSON","parse","sessionStorage","getItem","undefined","user","setUser","authorization","setAuthorization","setUserData","active_feeds","userData","available_feeds","id","email","feeds","map","feed","value","key","label","name","setItem","stringify","signin","password","console","log","Promise","resolve","reject","post","then","response","get","data","catch","signout","delete","removeItem","forgot","useProvideAuth","Provider","useAuth","useContext","Feeds","Colors","HandleError","makeRequest","error","message","onClick","params","reload","HandleLoading","className","style","wrap","spinner","xmlns","viewBox","width","height","cx","cy","r","fill","strokeWidth","strokeLinecap","path","path1","path2","path4","path5","HandleDefault","Filters","teams","activeTeams","callback","team","isActive","find","activeTeam","item","itemActive","teamColor","color","join","Icon","icon","toLowerCase","team_name","Hashtag","tag","count","href","slice","target","rel","Hashtags","tags","visible","setVisible","length","loadMore","BackToTop","inner","window","scrollTo","top","behavior","numberFormat","num","Math","abs","round","sign","toFixed","Tweet","engagement_gain","tweet_id","index","background","position","retweets","fontSize","content","megaNumber","Tweets","tweets","useEffect","twttr","widgets","load","tweet","i","filterStyles","control","provided","borderRadius","border","menu","filterStyleHeader","borderWidth","borderColor","cursor","singleValue","option","state","isFocused","isSelected","indicatorSeparator","display","Speedbag","getTeams","setTeams","setActiveTeams","selectedTeams","teamIds","filter","includes","aggregate","reduce","agg","top_retweets","forEach","t","push","Object","assign","keys","top_hashtags","exists","sort","a","b","retweet_count","nav","isMulti","onChange","placeholder","options","styles","primary","secondary","nextTeam","nextTeams","MiniSpinner","miniSpinner","Signin","isLoading","setIsLoading","setMessage","onSubmit","event","preventDefault","pass","finally","type","Forgot","username","res","success","Login","setForgot","NoMatch","SiteFooter","SiteHeader","active","history","useHistory","isLogin","setIsLogin","isOpen","setIsOpen","handleLogout","listen","location","pathname","document","body","classList","toggle","handleResize","debounce","innerWidth","addEventListener","removeEventListener","menuClasses","menuOpen","container","to","branding","src","alt","logout","title","hamburger","login","select","selectLabel","selectWrap","isSearchable","handleSelectChange","App","setFeed","innerZ","exact","url","client_tag","twitter_data","total_count","total","materials_icon","from","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.30c57a15.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrap\":\"BackToTop_wrap__2OI8e\",\"inner\":\"BackToTop_inner__a0enR\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"loadMore\":\"Tweets_loadMore__12M78\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"miniSpinner\":\"Spinners_miniSpinner__3xu4P\",\"mini-spinner\":\"Spinners_mini-spinner__rOuUR\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrap\":\"SiteFooter_wrap__3fZXK\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrap\":\"xhrHelpers_wrap__3DMpb\",\"spinner\":\"xhrHelpers_spinner__3xA1e\",\"rotator\":\"xhrHelpers_rotator__1KoKb\",\"path\":\"xhrHelpers_path__CZ7FB\",\"dash\":\"xhrHelpers_dash__23JBV\",\"path1\":\"xhrHelpers_path1__3b2iY\",\"path2\":\"xhrHelpers_path2__11jmR\",\"dash_ccw\":\"xhrHelpers_dash_ccw__1wp7n\",\"path3\":\"xhrHelpers_path3__-4inv\",\"path4\":\"xhrHelpers_path4__1msjt\",\"path5\":\"xhrHelpers_path5___vvjj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrap\":\"Tweet_wrap__3GGCr\",\"content\":\"Tweet_content__1HQmn\",\"name\":\"Tweet_name__3wkXQ\",\"retweets\":\"Tweet_retweets__1042D\",\"position\":\"Tweet_position__2YZRi\",\"icon\":\"Tweet_icon__2T-kn\",\"megaNumber\":\"Tweet_megaNumber__2OPL3\"};","import React, { useState, useContext, createContext } from 'react'\nimport { SPEEDBAG_API } from '../MAGIC_URLS'\nimport axios from 'axios'\n\nconst instance = axios.create({\n baseURL: SPEEDBAG_API,\n headers: {'Content-Type': 'application/json'}\n})\n\nconst authContext = createContext()\n\n// Provider component that wraps your app and makes auth object\n// available to any child component that calls useAuth().\nexport function ProvideAuth({ children }) {\n const auth = useProvideAuth()\n\n return (\n \n {children}\n \n )\n}\n\n// Hook for child components to get the auth object and re-render when it changes.\nexport const useAuth = () => {\n return useContext(authContext)\n}\n\n// Provider hook that creates auth object and handles state\nfunction useProvideAuth() {\n const [user, setUser] = useState(JSON.parse(sessionStorage.getItem('user')) || undefined)\n const [authorization, setAuthorization] = useState(JSON.parse(sessionStorage.getItem('authorization')) || undefined)\n\n function setUserData(auth, {user, active_feeds, available_feeds}) {\n // Take user data from server and transform it into what we need\n const userData = {\n id: user.id,\n email: user.email\n }\n userData.feeds = active_feeds.map(feed => {\n return {\n value: feed.key,\n label: feed.name\n }\n })\n\n // Save user data from server\n setUser(userData)\n sessionStorage.setItem('user', JSON.stringify(userData))\n\n // Save auth token from server\n setAuthorization(auth)\n sessionStorage.setItem('authorization', JSON.stringify(auth))\n }\n\n function signin(email, password) {\n console.log('signing in')\n return new Promise((resolve, reject) => {\n let auth\n instance.post(`users/sign_in`, {user: {email, password}})\n .then(response => response ? auth = response.headers.authorization : resolve(false))\n .then(() => instance.get(`feeds`, {headers: {'Authorization': auth}}))\n .then(response => setUserData(auth, response.data))\n .catch(() => reject('Bad username or password'))\n })\n }\n\n function signout() {\n return instance.delete(`users/sign_out`, {headers: {'Authorization': authorization}})\n .then(() => {\n sessionStorage.removeItem('authorization')\n sessionStorage.removeItem('user')\n setAuthorization(false)\n setUser(false)\n })\n }\n\n function forgot(email) {\n console.log(email)\n return instance.post(`users/password`, {user: {email}})\n }\n // Return the user object and auth methods\n // return {user, signin, signout}\n return {user, signin, signout, forgot}\n}\n","// Where does the backend live? (cms, user management, etc)\n// export const SPEEDBAG_API = `http://localhost:3000/api/`\nexport const SPEEDBAG_API = `https://speedbag-react-backend.herokuapp.com/api/`\n// export const SPEEDBAG_API = `https://admin.speedbagmlg.com/api/`\n\n// Where does our data api layer live? (crimson hexagon, etc)\nexport const SPEEDBAG_DATA = `https://speedbag-netbase.herokuapp.com/`\n","// These are the default \"free\" clients any user is allowed to see\nexport const Feeds = [\n {\n value: 'kfc',\n label: 'General Audience'\n // },\n // {\n // value: 'corona_beer',\n // label: 'Corona Beer'\n // },\n // {\n // value: 'grey_goose',\n // label: 'Grey Goose'\n }\n]\n\n// TODO: remove\nexport const Colors = [\n '#ff854f',\n '#51beec',\n '#937ac8',\n '#ff86ab',\n '#ff86ab',\n '#ff86ab',\n '#d26068',\n '#59A990',\n '#4adf8e',\n '#df4aa5',\n '#FFA214',\n '#b48743',\n '#4489f1',\n '#e6cd22',\n '#5f5ccb'\n]\n\n// TODO: remove\n// export const Icons = [\n// 'account_balance',\n// 'house',\n// 'attach_money',\n// 'next_week',\n// 'next_week',\n// 'next_week',\n// 'forum',\n// 'flight',\n// 'local_bar',\n// 'stars',\n// 'healing',\n// 'favorite',\n// 'shopping_cart',\n// 'build',\n// 'drive_eta'\n// ]","import style from './xhrHelpers.module.scss'\n\nexport const HandleError = ({ makeRequest, error }) => {\n return (\n
\n

Something bad happened:

\n

{error.message}

\n \n
\n )\n}\n\nexport const HandleLoading = () => {\n return (\n
\n \n \n \n \n \n \n
\n )\n}\n\nexport const HandleDefault = () => {\n return (\n
Default message before request is made.
\n )\n}\n\n// const HandleContent = ({ makeRequest, data }) => {\n// console.log(data)\n// return (\n//
\n// Loaded!\n// \n//
\n// )\n// }\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Icon from '@material-ui/core/Icon'\nimport style from './Filters.module.scss'\n\nconst Filters = ({ teams, activeTeams, callback }) => {\n return (\n
\n

Filter your feed

\n {teams.map(team => {\n const isActive = activeTeams.find(activeTeam => activeTeam.value === team.id)\n const className = isActive ? [style.item, style.itemActive] : [style.item]\n const teamColor = isActive ? {color: team.color} : {}\n return (\n \n )\n })}\n
\n )\n}\n\nFilters.propTypes = {\n teams: PropTypes.array.isRequired,\n activeTeams: PropTypes.array.isRequired,\n callback: PropTypes.func.isRequired\n}\n\nexport default Filters\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport style from './Hashtags.module.scss'\n\nconst VISIBLE_INCREMENT = 10\n\nconst Hashtags = ({ tags }) => {\n const [visible, setVisible] = useState(VISIBLE_INCREMENT)\n\n return (\n
\n

Top Hashtags

\n {tags\n .slice(0, visible)\n .map(tag => )\n }\n {visible < tags.length && (\n \n )}\n
\n )\n}\n\nHashtags.propTypes = {\n tags: PropTypes.array.isRequired\n}\n\nconst Hashtag = ({ tag, count }) => {\n return (\n \n {tag}\n {/* ({count}) */}\n \n )\n}\n\nHashtag.propTypes = {\n tag: PropTypes.string.isRequired,\n count: PropTypes.number.isRequired\n}\n\nexport default Hashtags\n","import React from 'react'\nimport Icon from '@material-ui/core/Icon'\nimport style from './BackToTop.module.scss'\n\nconst BackToTop = () => {\n const scroll = () => {\n window.scrollTo({top: 0, behavior: 'smooth'})\n }\n\n return (\n
\n
\n play_arrow\n
Back To Top
\n
\n
\n )\n}\n\nexport default BackToTop\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Icon from '@material-ui/core/Icon'\nimport style from './Tweet.module.scss'\n\nconst Tweet = ({ color, engagement_gain, name, icon, tweet_id, index }) => {\n return (\n
\n
\n \n # {index + 1}\n \n \n {numberFormat(engagement_gain)}\n whatshot\n \n {name}\n \n {icon.toLowerCase()}\n \n
\n
\n
\n \n
\n
\n
{index + 1}
\n
\n )\n}\n\nconst numberFormat = num => {\n return Math.abs(num) > 999 ?\n Math.round(Math.sign(num)*((Math.abs(num)/1000).toFixed(1)) ) + 'k' :\n Math.sign(num)*Math.abs(num)\n}\n\nconst dateFormat = date => {\n const d = new Date(date)\n const month = new Intl.DateTimeFormat('en-US', {month: 'long'}).format(d)\n return `${month} ${d.getDate()}, ${d.getFullYear()}`\n}\n\nconst nameFormat = url => {\n return `@${url.split('/')[3]}`\n}\n\nconst textFormat = text => {\n const regex = /(https?:\\/\\/[^\\s]+)/g\n return text.replace(regex, '$1')\n}\n\nTweet.propTypes = {\n ////color: PropTypes.string.isRequired,\n // created_at: PropTypes.string.isRequired,\n ////icon: PropTypes.string.isRequired,\n // index: PropTypes.number.isRequired,\n ////name: PropTypes.string.isRequired,\n // retweet_count: PropTypes.number.isRequired,\n // text: PropTypes.string.isRequired,\n // url: PropTypes.string.isRequired\n\n color: PropTypes.string.isRequired,\n comments: PropTypes.number.isRequired,\n engagement_gain: PropTypes.number.isRequired,\n icon: PropTypes.string.isRequired,\n index: PropTypes.number.isRequired,\n likes: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n shares: PropTypes.number.isRequired,\n theme_id: PropTypes.number.isRequired,\n // time_bucket: \n topic_id: PropTypes.number.isRequired,\n tweet_id: PropTypes.string.isRequired\n}\n\nexport default Tweet\n","import React, { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport Tweet from './Tweet'\nimport style from './Tweets.module.scss'\n\nconst VISIBLE_INCREMENT = 5\n\nconst Tweets = ({ tweets }) => {\n const [visible, setVisible] = useState(VISIBLE_INCREMENT)\n console.log(tweets);\n\n useEffect(() => {\n if (window.twttr) {\n window.twttr.widgets.load()\n }\n })\n\n return (\n <>\n {tweets\n .slice(0, visible)\n .map((tweet, i) => )\n }\n {visible < tweets.length && (\n \n )}\n \n )\n}\n\nTweets.propTypes = {\n tweets: PropTypes.array.isRequired\n}\n\nexport default Tweets\n","export const filterStyles = {\n control: (provided) => ({\n ...provided,\n borderRadius: '0',\n border: 'none'\n }),\n menu: (provided) => ({\n ...provided,\n borderRadius: '0'\n })\n}\n\nexport const filterStyleHeader = {\n // container: (provided) => ({\n // ...provided,\n // width: '150px',\n // marginLeft: '10px'\n // }),\n control: (provided) => ({\n ...provided,\n borderRadius: '0',\n borderWidth: '2px',\n borderColor: '#373737',\n background: '#000000',\n cursor: 'pointer'\n }),\n menu: (provided) => ({\n ...provided,\n borderRadius: '0',\n background: '#000000'\n }),\n singleValue: (provided) => ({\n ...provided,\n color: '#ffffff'\n }),\n option: (provided, state) => {\n let background = 'transparent'\n if (state.isFocused) {\n background = '#373737'\n }\n if (state.isSelected) {\n background = '#2684FF'\n }\n return {\n ...provided,\n background: background,\n cursor: 'pointer'\n }\n },\n indicatorSeparator: () => ({\n display: 'none'\n })\n}\n\n\n\n// export const filterStyles = {\n// container: (provided) => ({\n// ...provided,\n// flex: '1 0 auto',\n// display: 'inline-block',\n// width: 'calc(100% - 22px)',\n// }),\n// control: (provided) => ({\n// ...provided,\n// backgroundColor: 'transparent',\n// border: 'none',\n// boxShadow: 'none',\n// cursor: 'pointer',\n// }),\n// menu: (provided) => {\n// const mq = window.matchMedia('(max-width: 767px)')\n// if (mq.matches) {\n// return {\n// ...provided,\n// borderRadius: '0px',\n// minWidth: '190px',\n// left: '-50px'\n// }\n// }\n// return {\n// ...provided,\n// borderRadius: '0px',\n// }\n// },\n// valueContainer: (provided) => ({\n// ...provided,\n// padding: '6px 8px',\n// lineHeight: '1',\n// }),\n// singleValue: (provided) => ({\n// ...provided,\n// // color: theme === 'dark' ? 'white' : 'black',\n// textTransform: 'uppercase',\n// fontVariationSettings: \"'wght' 500, 'wdth' 400\"\n// }),\n// option: (provided, state) => {\n// let backgroundColor = 'white'\n// let color = 'black'\n// if (state.isFocused) {\n// backgroundColor = '#ededed'\n// }\n// if (state.isSelected) {\n// backgroundColor = '#df1995'\n// color = 'white'\n// }\n\n// return {\n// ...provided,\n// cursor: 'pointer',\n// color: color,\n// padding: '15px 20px',\n// lineHeight: '1',\n// backgroundColor: backgroundColor,\n// fontVariationSettings: \"'wght' 500, 'wdth' 400\"\n// }\n// },\n// indicatorSeparator: () => ({\n// display: 'none'\n// })\n// }","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport Select from 'react-select'\nimport Sticky from 'react-stickynode'\nimport Filters from '../components/Filters'\nimport Hashtags from '../components/Hashtags'\nimport BackToTop from '../components/BackToTop'\nimport Tweets from '../components/Tweets'\nimport { filterStyles } from '../filterStyles'\nimport style from './Speedbag.module.scss'\n\nconst Speedbag = ({ data }) => {\n const [teams, setTeams] = useState(getTeams())\n const [activeTeams, setActiveTeams] = useState([])\n\n // Munge whatever tweets and tags we're supposed to care about looking at\n // based on whatever we have selected at the moment.\n function getTeams(selectedTeams = []) {\n const teamIds = selectedTeams.map(team => team.value)\n const teams = teamIds.length ? data.filter(team => teamIds.includes(team.id)) : data\n\n let aggregate = teams.reduce((agg, team) => {\n // Tweets may be dupes, same tweet may live under both \"travel\" and \"culture\" for example.\n // Transfter the team info into the tweet for rendering.\n team.top_retweets.forEach(tweet => {\n const exists = agg.tweets.find(t => t.tweet_id === tweet.tweet_id)\n if (!exists) {\n agg.tweets.push(Object.assign(tweet, {\n name: team.team_name,\n icon: team.icon,\n color: team.color,\n }))\n }\n })\n\n // Count up popularity of each tag so we can sort on it later\n Object.keys(team.top_hashtags).map(tag => {\n const exists = agg.tags.find(t => t.tag === tag)\n const count = team.top_hashtags[tag]\n return exists ? exists.count += count : agg.tags.push({tag, count})\n })\n\n return agg\n }, {tweets:[], tags:[]})\n\n // Do the sorting\n aggregate.tweets.sort((a, b) => b.retweet_count - a.retweet_count)\n aggregate.tags.sort((a, b) => b.count - a.count)\n\n return aggregate\n }\n\n // Clicking filters in the sidebar returns an object\n function filterClick({ id, team_name }) {\n // Create an object for react-select\n const nextTeam = {\n value: id,\n label: team_name\n }\n\n // Remove the clicked filter from the array of active filters\n let nextTeams = activeTeams.filter(team => JSON.stringify(team) !== JSON.stringify(nextTeam))\n // If new and old arrays match, we didn't remove anything, so add this as a filter\n if (nextTeams.length === activeTeams.length) {\n nextTeams.push(nextTeam)\n }\n\n setTeams(getTeams(nextTeams))\n setActiveTeams(nextTeams)\n }\n\n // Using the dropdown filter returns an array of objects\n function filterBlur(activeTeams) {\n setTeams(getTeams(activeTeams))\n setActiveTeams(activeTeams)\n }\n\n return (\n
\n \n
\n \n
\n \n
\n )\n}\n\nSpeedbag.propTypes = {\n data: PropTypes.array.isRequired\n}\n\nexport default Speedbag\n","import React from 'react'\nimport style from './Spinners.module.scss';\n\nexport const MiniSpinner = ({ color = 'black' }) => {\n return (\n
\n
\n
\n
\n
\n
\n )\n}\n\n// TODO: move handleLoading component here\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { useAuth } from './auth'\nimport { MiniSpinner } from '../components/Spinners'\n\nconst Signin = ({ callback }) => {\n let auth = useAuth()\n const [isLoading, setIsLoading] = useState(auth.user)\n const [message, setMessage] = useState(null)\n\n const handleSubmit = event => {\n event.preventDefault()\n const user = event.target.user.value\n const pass = event.target.pass.value\n\n if (user && pass) {\n setIsLoading(true)\n auth.signin(user, pass)\n .catch(message => setMessage(message))\n .finally(() => setIsLoading(false))\n } else {\n setMessage('Please enter both username and password')\n }\n }\n\n return (\n
\n

Sign In

\n

Sign in, we have sign in today

\n
\n \n \n

{message}

\n \n
\n \n
\n )\n}\n\nSignin.propTypes = {\n callback: PropTypes.func.isRequired\n}\n\nexport default Signin\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { useAuth } from './auth'\nimport { MiniSpinner } from '../components/Spinners'\n\nconst Forgot = ({ callback }) => {\n let auth = useAuth()\n const [isLoading, setIsLoading] = useState(auth.user)\n const [message, setMessage] = useState(null)\n\n const handleSubmit = event => {\n event.preventDefault()\n const username = event.target.username.value\n\n if (username) {\n setIsLoading(true)\n auth.forgot(username)\n .then(res => {\n let message = res.data.error\n if (res.data.success) {\n message = `${res.data.success} to ${username}`\n event.target.username.value = ''\n }\n setIsLoading(false)\n setMessage(message)\n console.log(res.data, message)\n })\n } else {\n setMessage('Please enter a username')\n }\n }\n\n return (\n
\n

Forgot Password

\n

Forgot password, we have forgot password today

\n
\n \n

{message}

\n \n
\n

\n Already have an account? \n

\n
\n )\n}\n\nForgot.propTypes = {\n callback: PropTypes.func.isRequired\n}\n\nexport default Forgot\n","import React, { useState } from 'react'\nimport Signin from '../auth/Signin'\nimport Forgot from '../auth/Forgot'\n\nconst Login = () => {\n const [forgot, setForgot] = useState(false)\n return (\n
\n { forgot ? \n setForgot(false)}/> : \n setForgot(true)} />\n }\n
\n )\n}\n\nexport default Login\n","import React from 'react'\n\nconst NoMatch = () => {\n return (\n
\n
\n

NoMatch

\n

No match, we have no match today

\n
\n
\n )\n}\n\nexport default NoMatch\n","import React from 'react'\nimport style from './SiteFooter.module.scss'\n\nconst SiteFooter = () => {\n return (\n \n )\n}\n\nexport default SiteFooter\n","import React, { useState, useEffect } from 'react'\nimport { Link, useHistory } from 'react-router-dom'\nimport { useAuth } from '../auth/auth'\nimport { Feeds } from '../dbShims'\nimport PropTypes from 'prop-types'\nimport Select from 'react-select'\nimport Icon from '@material-ui/core/Icon'\nimport { MiniSpinner } from './Spinners'\nimport logo from '../images/logo-speedbag-main.png'\nimport { filterStyleHeader } from '../filterStyles'\nimport style from './SiteHeader.module.scss'\nimport { debounce } from '@material-ui/core'\n\nconst SiteHeader = ({ feeds, active, callback }) => {\n const history = useHistory()\n const auth = useAuth()\n const [isLoading, setIsLoading] = useState(false)\n const [isLogin, setIsLogin] = useState(false)\n const [isOpen, setIsOpen] = useState(false)\n\n history.listen(location => {\n setIsLogin(location.pathname === '/login' ? true : false)\n })\n\n // useEffect(() => {\n // const script = document.createElement('script');\n \n // script.src = \"https://platform.twitter.com/widgets.js\";\n // script.async = true;\n \n // document.body.appendChild(script);\n \n // return () => {\n // document.body.removeChild(script);\n // }\n // }, []);\n\n // toggle 'no-scroll' class on body depending if hamburger menu is open\n useEffect(() => {\n document.body.classList.toggle('no-scroll', isOpen)\n }, [isOpen])\n\n // automatically close hamburger if window is 768 or wider\n useEffect(() => {\n const handleResize = debounce(() => {\n if (window.innerWidth >= 768 && isOpen) {\n setIsOpen(false)\n }\n }, 300)\n handleResize()\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [isOpen])\n\n function handleLogout() {\n setIsLoading(true)\n auth.signout().then(() => {\n setIsOpen(false)\n setIsLoading(false)\n callback(Feeds[0])\n history.push('/')\n })\n }\n\n function handleSelectChange(event) {\n setIsOpen(false)\n callback(event)\n }\n\n const menuClasses = [style.menu]\n if (isOpen) {\n menuClasses.push(style.menuOpen)\n }\n\n return (\n
\n
\n \n \"Speedbag\n \n Speedbag\n \n \n\n { auth.user && (\n
\n \n\n {setIsOpen(!isOpen)}}>\n { isOpen ? (menu_open) : (menu) }\n \n
\n )}\n { !auth.user && !isLogin && (\n \n login\n login\n \n )}\n\n {feeds.length > 1 && (\n
\n Feeds:\n
\n callback(event)}\n options={feeds}\n value={active}\n styles={filterStyleHeader}\n />\n
\n
\n )}\n
\n\n \n
\n {feeds.length > 1 && (\n
\n
\n swap_horizontal_circle\n Change Feed\n
\n handleSelectChange(event)}\n options={feeds}\n value={active}\n styles={filterStyleHeader}\n />\n
\n )}\n\n { auth.user && (\n \n )}\n
\n
\n
\n )\n}\n\nSiteHeader.propTypes = {\n active: PropTypes.object.isRequired,\n callback: PropTypes.func.isRequired,\n feeds: PropTypes.array.isRequired\n}\n\nexport default SiteHeader\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGIAAABgCAYAAADmbacFAAAACXBIWXMAAAsTAAALEwEAmpwYAAAG92lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuZWRhMmIzZmFjLCAyMDIxLzExLzE3LTE3OjIzOjE5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0idXVpZDo1RDIwODkyNDkzQkZEQjExOTE0QTg1OTBEMzE1MDhDOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozMzU5M0JBOTQwNTkxMUVBQTEzRkJGNzNCREQyNzA1NSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozN2Q1NDE0MS02Yjg4LTQ1MWItOTk2ZS1lMjY2ZjdhYzIzZjkiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgSWxsdXN0cmF0b3IgQ0MgMjAxNyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjEtMDQtMTRUMTQ6MDA6MTktMDQ6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTAxLTA1VDEzOjI5OjExLTA1OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTAxLTA1VDEzOjI5OjExLTA1OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjZmZjc5OGM0LWI1ZmMtNDFlMi04NWViLWZjZGFjZjllZTNmZiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2ZmY3OThjNC1iNWZjLTQxZTItODVlYi1mY2RhY2Y5ZWUzZmYiLz4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MGI2YTgzOWEtMGM2NS00ODhiLThiNDktMmM4MWE3ZjMyMDc3IiBzdEV2dDp3aGVuPSIyMDIyLTAxLTA1VDEzOjE0OjUwLTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjMuMSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MzdkNTQxNDEtNmI4OC00NTFiLTk5NmUtZTI2NmY3YWMyM2Y5IiBzdEV2dDp3aGVuPSIyMDIyLTAxLTA1VDEzOjI5OjExLTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjMuMSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPGRjOnRpdGxlPiA8cmRmOkFsdD4gPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij5QcmludDwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDwvcmRmOkRlc2NyaXB0aW9u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\"","import React, { useState } from 'react'\nimport { BrowserRouter as Router, Redirect, Switch, Route } from 'react-router-dom'\nimport { Get } from 'react-axios'\nimport Sticky from 'react-stickynode'\nimport { Feeds, Colors } from './dbShims'\nimport { useAuth } from './auth/auth'\nimport { HandleError, HandleLoading, HandleDefault } from './components/xhrHelpers'\nimport Speedbag from './pages/Speedbag'\nimport Login from './pages/Login'\nimport NoMatch from './pages/NoMatch'\nimport SiteFooter from './components/SiteFooter'\nimport SiteHeader from './components/SiteHeader'\nimport { SPEEDBAG_DATA } from './MAGIC_URLS'\nimport './App.scss'\n\nconst App = () => {\n let auth = useAuth()\n\n const getActiveFeed = () => JSON.parse(sessionStorage.getItem('feed')) || feeds[0]\n const setActiveFeed = feed => {\n sessionStorage.setItem('feed', JSON.stringify(feed))\n setFeed(feed)\n }\n\n const feeds = auth.user ? auth.user.feeds : Feeds\n const [feed, setFeed] = useState(getActiveFeed())\n\n sessionStorage.setItem('feed', JSON.stringify(feed))\n\n const scrubData = data => {\n return data\n .filter(team => team.top_retweets.length) // Remove any teams that came in with no tweets\n .map((team, i) => Object.assign(team, { // Count up total retweets per team, order by that\n total_count: team.top_retweets.reduce((total, tweet) => total += tweet.retweet_count, 0),\n color: Colors[i], // TODO: should come from DB\n icon: team.materials_icon || 'account_box'\n }))\n .sort((a, b) => b.total_count - a.total_count)\n }\n\n return (\n \n \n \n \n\n
\n \n \n \n {(error, response, isLoading, makeRequest, axios) => {\n if (error) {\n return \n }\n else if (response !== null) {\n return \n }\n else if (isLoading) {\n return \n }\n return \n }}\n \n \n \n {auth.user ? (\n \n ) : (\n \n )}\n \n \n \n \n \n
\n\n \n
\n )\n}\n\nexport default App\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { ProvideAuth } from './auth/auth'\nimport './index.css';\nimport App from './App';\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrap\":\"Filters_wrap__2qna2\",\"item\":\"Filters_item__2eqGt\",\"itemActive\":\"Filters_itemActive__3eUU_\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrap\":\"Speedbag_wrap__1teJ7\",\"nav\":\"Speedbag_nav__3IrlN\",\"primary\":\"Speedbag_primary__4PlzN\",\"secondary\":\"Speedbag_secondary__-A__E\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrap\":\"Hashtags_wrap__1qPHe\",\"item\":\"Hashtags_item__3sEQU\",\"loadMore\":\"Hashtags_loadMore__DEff3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrap\":\"SiteHeader_wrap__14pvR\",\"container\":\"SiteHeader_container__upPg1\",\"select\":\"SiteHeader_select__29CPX\",\"logout\":\"SiteHeader_logout__eofMw\",\"selectLabel\":\"SiteHeader_selectLabel__2UJ2G\",\"selectWrap\":\"SiteHeader_selectWrap__3WFQ-\",\"branding\":\"SiteHeader_branding__1lef4\",\"name\":\"SiteHeader_name__aznKK\",\"login\":\"SiteHeader_login__2nnLl\",\"menu\":\"SiteHeader_menu__2yFfc\",\"menuOpen\":\"SiteHeader_menuOpen__26eL2\",\"hamburger\":\"SiteHeader_hamburger__2jZvQ\"};"],"sourceRoot":""}