{"version":3,"sources":["webpack:///./src/constants.ts","webpack:///./src/components/pages/dashboard/challenge/constants.ts","webpack:///./src/components/language-select/language-select.tsx","webpack:///./src/components/plot/plot.tsx","webpack:///./src/components/pages/dashboard/challenge/images/ibm.svg","webpack:///./src/components/pages/dashboard/challenge/images/lenovo.svg","webpack:///./src/components/pages/dashboard/challenge/images/mozilla.svg","webpack:///./src/components/pages/dashboard/challenge/images/sap.svg","webpack:///./src/components/share-buttons/share-buttons.tsx","webpack:///./src/components/share-modal/share-modal.tsx","webpack:///./src/components/pages/dashboard/awards/star.svg","webpack:///./src/components/pages/dashboard/awards/stars.svg","webpack:///./src/components/pages/dashboard/challenge/images/stars-disabled.svg","webpack:///./src/components/pages/dashboard/challenge/images/stars.svg","webpack:///./src/components/onboarding-modal/images/dashboard.png","webpack:///./src/components/onboarding-modal/images/invite.jpg","webpack:///./src/components/onboarding-modal/images/contribute.png","webpack:///./src/components/onboarding-modal/images/1-red-copy.svg","webpack:///./src/components/invite-modal/images/mail.svg","webpack:///./src/hooks/use-router.ts","webpack:///./src/components/pages/dashboard/stats/contribution-activity.tsx","webpack:///./src/components/pages/dashboard/stats/stats-card.tsx","webpack:///./src/components/pages/dashboard/stats/leaderboard-card.tsx","webpack:///./src/components/pages/dashboard/ui.tsx","webpack:///./src/components/pages/dashboard/stats/progress-card.tsx","webpack:///./src/components/pages/dashboard/stats/stats.tsx","webpack:///./src/components/pages/dashboard/goals/custom-goal-steps.tsx","webpack:///./src/components/pages/dashboard/goals/custom-goal.tsx","webpack:///./src/components/pages/dashboard/goals/goal-row.tsx","webpack:///./src/components/pages/dashboard/goals/goals.tsx","webpack:///./src/components/pages/dashboard/awards/awards.tsx","webpack:///./src/components/pages/dashboard/challenge/team-avatar.tsx","webpack:///./src/components/pages/dashboard/challenge/weekly-challenge-board.tsx","webpack:///./src/components/pages/dashboard/challenge/weekly-challenge.tsx","webpack:///./src/components/pages/dashboard/challenge/challenge-list.tsx","webpack:///./src/components/pages/dashboard/challenge/leaderboard-card.tsx","webpack:///./src/components/pages/dashboard/challenge/team-card.tsx","webpack:///./src/components/pages/dashboard/challenge/challenge-offline.tsx","webpack:///./src/components/onboarding-modal/onboarding-modal.tsx","webpack:///./src/components/pages/dashboard/challenge/challenge.tsx","webpack:///./src/components/invite-modal/invite-modal.tsx","webpack:///./src/components/pages/dashboard/dashboard.tsx"],"names":["DAILY_GOALS","Object","freeze","speak","listen","BENEFITS","WHATS_PUBLIC","challengeLogos","ibm","background","border","url","require","lenovo","mozilla","sap","getNow","dateParam","location","search","match","date","dateStr","dateObj","Date","isNaN","getTime","isValidDate","isChallengeLive","challenge","now","start","end","isBeforeChallenge","pilotDates","isEnrolled","account","_a","enrollment","weeklyChallengeCopy","title","subtitle","explanation","FINAL_CHALLENGE_WEEK","length","contributableLocales","ALL_LOCALES","value","onChange","React","Downshift","initialInputValue","getItemProps","highlightedIndex","isOpen","toggleMenu","className","onClick","Localized","id","concat","map","l","i","key","assign","join","item","Y_OFFSET","TOTAL_LINE_MARGIN","LINE_OFFSET","TEXT_OFFSET","PLOT_PADDING","Plot","constructor","state","width","svgRef","updateSize","this","setState","current","getBoundingClientRect","componentDidMount","window","addEventListener","componentWillUnmount","removeEventListener","render","props","children","data","formatNumber","max","renderXTickLabel","tickCount","tickMultipliers","__rest","tickMultiplier","slice","reverse","find","m","ticks","height","ref","Array","from","_","y","x","dominantBaseline","textAnchor","Math","round","x1","y1","x2","y2","stroke","datum","BAR_HEIGHT","n","toString","BarPlot","reduce","d","toLocaleString","hour","minute","replace","barWidth","getBarX","offset","stopColor","fill","module","exports","SHARE_URL","URLS","HTTP_ROOT","withLocalization","getString","shareTextId","locale","useLocale","addNotification","useAction","Notifications","actions","addPill","encodedShareText","encodeURIComponent","link","shareURLInputRef","useRef","select","document","execCommand","trackSharing","FontIcon","type","readOnly","href","target","rel","text","Modal","innerClassName","src","alt","elems","bold","ShareButtons","useRouter","useContext","RouterContext","ContributionActivity","api","fetchContributionActivity","connect","StatsCard","iconButtons","overlay","tabs","currentLocale","setLocale","useState","selectedTab","setSelectedTab","keys","useEffect","label","LanguageSelect","Lottie","lazy","animationData","FetchRow","UnconnectedLeaderboard","rows","isAtEnd","playingClipIndex","audioRef","scroller","youRow","playAvatarClip","clipUrl","position","self","trackVoiceAvatar","play","pause","currentTime","scrollToUser","row","scrollTop","offsetTop","updateScrollIndicator","el","style","setProperty","min","scrollHeight","clientHeight","forLocale","fetchLeaderboard","fetchMore","cursor","globalLocale","trackDashboard","newRows","allRows","filter","r1","r2","clientHash","sort","defaultOptions","loop","autoplay","rendererSettings","preserveAspectRatio","items","prevPosition","nextPosition","Infinity","you","isProduction","avatarClipUrl","Avatar","avatar_url","preload","onEnded","onError","onMouseEnter","onMouseLeave","username","Suspense","fallback","options","eventListeners","total","MicIcon","OldPlayIcon","floor","onScroll","Leaderboard","forwardRef","LeaderboardCard","useAccount","saveAccount","User","showInfo","setShowInfo","showOverlay","setShowOverlay","leaderboardRef","Boolean","visible","BookmarkIcon","EyeIcon","EyeOffIcon","Icon","PlayOutlineIcon","display","InfoIcon","CrossIcon","LocalizedGetAttribute","attribute","Toggle","offText","onText","defaultChecked","event","checked","vars","minutes","profileLink","LocaleLink","to","PROFILE_INFO","recorded-clips","validated-clips","Fraction","numerator","denominator","percentage","Circle","radius","strokeW","center","rest","strokeWidth","r","cx","cy","CircleProgress","circumference","PI","size","color","strokeDasharray","strokeDashoffset","ProgressCard","personalCurrent","personalGoal","custom_goals","customGoals","useAPI","overallCurrent","setOverallCurrent","fetchDailyClipsCount","fetchDailyVotesCount","fetchAndSetOverallCount","overallGoal","isSpeak","customGoal","g","currentCustomGoal","undefined","hasCustomGoalForThis","goalsPath","DASHBOARD","GOALS","amount","LinkButton","rounded","left","goal","outline","absolute","toLocaleRouteBuilder","SPEAK","LISTEN","StatsPage","allGoals","dashboardLocale","goals","globalGoals","o","Buttons","ArrowButton","ArrowLeft","CloseButton","ViewGoal","onNext","days_interval","PenIcon","toUpperCase","nextButtonProps","history","toLocaleRoute","hours","language","attrs","LabeledSelect","Button","disabled","push","closeButtonProps","currentFields","marginBottom","totalHours","periodMonths","people","clipsPerDay","completedFields","daysInterval","subscribed","setSubscribed","privacyAgreed","setPrivacyAgreed","isSubscribed","useIsSubscribed","basket_token","getManageSubscriptionURL","SettingsIcon","privacyLink","PRIVACY","blank","TERMS","CheckIcon","showShareModal","setShowShareModal","isWeekly","ShareModal","count","onRequestClose","ShareIcon","STATE_KEYS","STEPS","Radio","onChecked","StepButtons","setStepIndex","stepIndex","touchedStepIndex","isCompleted","isActive","CompletedFields","states","completedStates","stateKey","labelId","findIndex","k","CurrentFields","currentStateKey","name","obj","CustomGoal","email","refreshUser","refresh","hasStartParam","includes","pathname","setTouchedStepIndex","initialState","showOverwriteModal","setShowOverwriteModal","showAbortEditModal","setShowAbortEditModal","Step","steps","handleNext","confirmed","nextIndex","createGoal","locales","some","accent","subscribeToNewsletter","showViewGoal","buttons","Cancel","Yes","Exit","visibility","Wave","viewBox","stopOpacity","fillRule","opacity","mixBlendMode","transform","xlinkHref","GoalBox","isNext","streaks","clips","votes","toLocaleDateString","year","month","day","GoalRow","goalInfo","GoalsPage","entries","NoAwardsPage","INTERVAL_LABELS","1","7","AwardBox","award","AwardsPage","seenAwards","then","awards","a","buckets","bucket","team","logo","boxSizing","padding","WeeklyChallengeBoard","isDisabled","week","individualAvatarUrl","teamToken","weekly","user","role","speak_total","listen_total","TeamAvatar","invite","invite_total","WeeklyChallenge","currentWeek","pastWeek","notifications","useNotifications","index","notification","kind","NotificationPill","ChevronDown","PointsIcon","ChallengeList","callService","service","fetchTopMembers","member","fetchTopTeams","fetchTopContributors","transformRankingToString","ranking","String","challengeComplete","isYou","toLowerCase","w1_points","w1","w2_points","w2","w3_points","w3","points","approved","accuracy","Percentage","FilledCheckIcon","showVisibleIcon","recorded","validated","TeamboardCard","teamboardRef","justifyContent","withRouter","duration","addAchievement","earlyEnroll","img","OperationButtons","PlayOutlineGreenIcon","OnboardingModal","step","setStep","stepData","isLastStep","trackChallenge","prevStep","SkipIcon","Overlay","hideOverlay","radio","setVisibleRadio","visibleForTeam","visibleForAll","LabeledCheckbox","showOnboardingModal","setShowOnboardingModal","setWeekly","fetchWeeklyProgress","_b","LeaderBoardCard","challengeTeams","readableName","TeamBoardCard","scrollTo","top","behavior","ChallengeOffline","Redirect","copiedRecently","setCopiedRecently","inputRef","timer","setTimeout","fetchInviteStatus","showInviteSendToast","hasEarnedSessionToast","challengeEnded","sessionStorage","setItem","JSON","stringify","clearTimeout","BalanceText","origin","TopBar","setShowInviteModal","isAboveMdWidth","setIsAboveMdWidth","isChallengeEnrolled","isChallengeTabSelected","endsWith","pathParts","split","unseenAwards","seen_at","isContributable","titleBarLocales","dropdownLocales","checkSize","innerWidth","LocaleNavLink","CHALLENGE","STATS","path","AWARDS","NATIVE_NAMES","ChallengeBar","DashboardContent","Page","setAllGoals","fetchGoals","setAllPoints","fetchChallengePoints","Dashboard","showInviteModal","pages","subPath","defaultPage","unshift","ChallengePage","useLayoutEffect","InviteModal","parse","getItem","removeItem","setInviteContributeAchievement","Switch","Route","exact","params"],"mappings":"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","file":"6.js?id=51e6dc670453b982b6ee","sourcesContent":["export const DAILY_GOALS = Object.freeze({\n  speak: [120, 250],\n  listen: [240],\n});\n\nexport const BENEFITS = [\n  'rich-data',\n  'improve-audio',\n  'keep-track',\n  'compare-progress',\n  'view-goals',\n  'join-newsletter',\n];\n\nexport const WHATS_PUBLIC = [\n  'email-not-public',\n  'recordings-and-locale-public',\n  'username-optin-public',\n  'demographic-deidentified-clarity',\n  'username-email-not-demographic',\n];\n","import { ChallengeDuration, ChallengeTeamToken } from 'common';\nimport { UserClient } from 'common';\n\nexport const challengeLogos: {\n  [key in ChallengeTeamToken]: {\n    background: string;\n    border: boolean;\n    url: string;\n  };\n} = {\n  ibm: { background: '#fff', border: true, url: require('./images/ibm.svg') },\n  lenovo: {\n    background: '#fff',\n    border: true,\n    url: require('./images/lenovo.svg'),\n  },\n  mozilla: {\n    background: '#000',\n    border: false,\n    url: require('./images/mozilla.svg'),\n  },\n  sap: { background: '#fff', border: true, url: require('./images/sap.svg') },\n};\n\nconst isValidDate = (dateStr: string) => {\n  const dateObj = new Date(dateStr);\n  return dateObj instanceof Date && !isNaN(dateObj.getTime());\n};\n\nconst getNow = () => {\n  const dateParam =\n    location.search && location.search.match(/date=(\\d+-\\d+-\\d+)/);\n  const date = dateParam?.[1];\n  return date && isValidDate(date) ? new Date(date) : new Date();\n};\n\nexport const isChallengeLive = (challenge: ChallengeDuration) => {\n  const now = getNow();\n  return now >= challenge.start && now < challenge.end;\n};\n\nexport const isBeforeChallenge = (challenge: ChallengeDuration) => {\n  const now = getNow();\n  return now < challenge.start;\n};\n\nexport const pilotDates: ChallengeDuration = {\n  start: new Date('2019-11-19'),\n  end: new Date('2019-12-10'),\n};\n\nexport const isEnrolled = (account: UserClient) =>\n  account?.enrollment?.challenge;\n\nexport const weeklyChallengeCopy = [\n  {\n    title: 'Sign up and Contribute',\n    subtitle: 'Win a prize by being the team with the highest sign up rate',\n    explanation:\n      'This is the percentage of team invites that have been accepted out of the current total sent.',\n  },\n  {\n    title: \"Let's get social\",\n    subtitle: 'The most socially active team wins the prize',\n    explanation:\n      'This is the number of invites your team has sent inviting others to join the Open Voice Challenge',\n  },\n  {\n    title: 'Top the Leaderboard',\n    subtitle:\n      'The team that validates the highest percentage of voice clips wins the prize',\n    explanation:\n      'This is the percentage of clips the team has accurately validated',\n  },\n];\n\nexport const FINAL_CHALLENGE_WEEK = weeklyChallengeCopy.length - 1;\n","import { Localized } from '@fluent/react';\nimport Downshift from 'downshift';\nimport * as React from 'react';\n\nconst contributableLocales = require('../../../../locales/contributable.json') as string[];\n\nimport './language-select.css';\n\nexport const ALL_LOCALES = 'all-locales';\n\nexport default ({\n  value,\n  onChange,\n}: {\n  value: string;\n  onChange: (locale: string) => any;\n}) => (\n  <Downshift initialInputValue={value} onChange={onChange}>\n    {({ getItemProps, highlightedIndex, isOpen, toggleMenu }) => (\n      <div className=\"language-select\" onClick={() => toggleMenu()}>\n        <Localized id={value}>\n          <div className=\"current\" />\n        </Localized>\n        {isOpen && (\n          <ul onClick={() => toggleMenu()}>\n            {[ALL_LOCALES].concat(contributableLocales).map((l, i) => (\n              <Localized key={l} id={l}>\n                <li\n                  className={[\n                    l === value ? 'selected' : '',\n                    highlightedIndex === i ? 'highlighted' : '',\n                  ].join(' ')}\n                  {...getItemProps({ item: l })}\n                  value={l}\n                />\n              </Localized>\n            ))}\n          </ul>\n        )}\n      </div>\n    )}\n  </Downshift>\n);\n","import * as React from 'react';\n\nexport const Y_OFFSET = 10;\nexport const TOTAL_LINE_MARGIN = 154;\nexport const TEXT_OFFSET = 40;\nexport const LINE_OFFSET = TEXT_OFFSET + 5;\nexport const PLOT_PADDING = 13;\n\nimport './plot.css';\n\nexport type PlotProps = {\n  children: (state: { max: number; width: number }) => React.ReactNode;\n  data: any[];\n  formatNumber: (n: number) => string;\n  max: number;\n  renderXTickLabel: (datum: any, i: number) => React.ReactNode;\n  tickCount: number;\n  tickMultipliers: number[];\n} & React.SVGProps<SVGElement>;\n\nexport default class Plot extends React.Component<\n  PlotProps,\n  {\n    width: number;\n  }\n> {\n  state: {\n    width: number;\n  } = {\n    width: 0,\n  };\n\n  svgRef = React.createRef<SVGSVGElement>();\n\n  async componentDidMount() {\n    window.addEventListener('resize', this.updateSize);\n    this.updateSize();\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.updateSize);\n  }\n\n  updateSize = () => {\n    this.setState({\n      width: this.svgRef.current.getBoundingClientRect().width,\n    });\n  };\n\n  render() {\n    let {\n      children,\n      data,\n      formatNumber,\n      max,\n      renderXTickLabel,\n      tickCount,\n      tickMultipliers,\n      ...props\n    } = this.props;\n    const { width } = this.state;\n\n    const tickMultiplier =\n      tickMultipliers\n        .slice()\n        .reverse()\n        .find(m => max > m) || 1;\n    const ticks = (tickCount - 1) * tickMultiplier;\n\n    max = max + (ticks - (max % ticks));\n\n    return (\n      <svg\n        width=\"100%\"\n        height=\"100%\"\n        className=\"plot\"\n        {...props}\n        ref={this.svgRef}>\n        {Array.from({ length: tickCount }).map((_, i) => {\n          const y = (i * TOTAL_LINE_MARGIN) / tickCount + Y_OFFSET;\n          return (\n            <React.Fragment key={i}>\n              <text\n                className=\"tick-label\"\n                x={TEXT_OFFSET}\n                y={y}\n                dominantBaseline=\"middle\"\n                textAnchor=\"end\">\n                {formatNumber(\n                  Math.round(((tickCount - 1 - i) * max) / (tickCount - 1))\n                )}\n              </text>\n              <line\n                x1={LINE_OFFSET}\n                y1={y}\n                x2={width + PLOT_PADDING}\n                y2={y}\n                stroke=\"rgba(0,0,0,0.2)\"\n              />\n            </React.Fragment>\n          );\n        })}\n        {data.map((datum, i) => (\n          <text\n            key={i}\n            className=\"x tick-label\"\n            x={\n              LINE_OFFSET +\n              i * ((width - PLOT_PADDING - TEXT_OFFSET) / data.length)\n            }\n            y={Y_OFFSET + TOTAL_LINE_MARGIN}>\n            {renderXTickLabel(datum, i)}\n          </text>\n        ))}\n        {children({ width, max })}\n      </svg>\n    );\n  }\n}\n\nconst BAR_COUNT = 10;\nconst BAR_WIDTH_LG = 15;\nconst BAR_WIDTH_XS = 7;\nconst TICK_COUNT = 4;\nconst BAR_HEIGHT = TOTAL_LINE_MARGIN * ((TICK_COUNT - 1) / TICK_COUNT);\n\nfunction formatNumber(n: number) {\n  return n > 1000 ? Math.round(n / 1000) + 'k' : n.toString();\n}\n\nexport const BarPlot = ({\n  data,\n}: {\n  data: { date: string; value: number }[];\n}) => (\n  <Plot\n    data={data}\n    formatNumber={formatNumber}\n    max={(data || []).reduce((max, d) => Math.max(max, d.value), 0)}\n    renderXTickLabel={({ date }) => {\n      const timeString = new Date(date)\n        .toLocaleString([], {\n          hour: '2-digit',\n          minute: '2-digit',\n        })\n        .replace(':00 ', '')\n        .replace(/\\./g, '');\n\n      return timeString;\n    }}\n    tickCount={TICK_COUNT}\n    tickMultipliers={[5, 10, 100, 1000]}>\n    {({ max, width }) => {\n      const barWidth = width < 400 ? BAR_WIDTH_XS : BAR_WIDTH_LG;\n      const getBarX = (i: number) =>\n        LINE_OFFSET +\n        PLOT_PADDING -\n        barWidth / 2 +\n        (i * (width - PLOT_PADDING - TEXT_OFFSET)) / BAR_COUNT;\n\n      return (\n        <>\n          {Array.from({ length: BAR_COUNT }).map((_, i) => (\n            <rect\n              key={i}\n              className=\"bg\"\n              x={getBarX(i)}\n              y={Y_OFFSET}\n              width={barWidth}\n              height={BAR_HEIGHT}\n            />\n          ))}\n\n          <defs>\n            <linearGradient id=\"blue-purple\" x2=\"0%\" y2=\"100%\">\n              <stop offset=\"5%\" stopColor=\"#88d1f1\" />\n              <stop offset=\"95%\" stopColor=\"#b1b5e5\" />\n            </linearGradient>\n          </defs>\n          {(data || []).map(({ value }: any, i: number) => {\n            const height = (value * BAR_HEIGHT) / max || 0;\n            return (\n              <rect\n                key={i}\n                fill=\"url(#blue-purple)\"\n                className={i + 1 === BAR_COUNT ? 'current' : ''}\n                x={getBarX(i)}\n                y={Y_OFFSET + BAR_HEIGHT - height}\n                width={barWidth}\n                height={height}\n              />\n            );\n          })}\n        </>\n      );\n    }}\n  </Plot>\n);\n","module.exports = __webpack_public_path__ + \"d88c16c3d756a31c343700e0e26d9192.svg\";","module.exports = __webpack_public_path__ + \"6a6a438d4cddcfec4d51f0bd644f154a.svg\";","module.exports = __webpack_public_path__ + \"a914cfc32246a0eee02b5fa521269781.svg\";","module.exports = __webpack_public_path__ + \"723827e558eaea61ef4e2741e9fcd8f4.svg\";","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { useRef } from 'react';\nimport { trackSharing } from '../../services/tracker';\nimport { Notifications } from '../../stores/notifications';\nimport { FontIcon } from '../ui/icons';\nimport { useLocale } from '../locale-helpers';\nimport URLS from '../../urls';\n\nimport './share-buttons.css';\nimport { useAction } from '../../hooks/store-hooks';\n\nconst SHARE_URL = URLS.HTTP_ROOT;\n\ninterface Props extends WithLocalizationProps {\n  shareTextId?: string;\n}\n\nfunction ShareButtons({ getString, shareTextId }: Props) {\n  const [locale] = useLocale();\n  const addNotification = useAction(Notifications.actions.addPill);\n  const encodedShareText = encodeURIComponent(\n    shareTextId\n      ? getString(shareTextId, { link: SHARE_URL })\n      : getString('share-text', { link: SHARE_URL })\n  );\n  const shareURLInputRef = useRef(null);\n\n  return (\n    <>\n      <button\n        id=\"link-copy\"\n        className=\"share-button\"\n        onClick={() => {\n          shareURLInputRef.current.select();\n          document.execCommand('copy');\n          trackSharing('link', locale);\n\n          addNotification(\n            <>\n              <FontIcon type=\"link\" className=\"icon\" />{' '}\n              <Localized id=\"link-copied\">\n                <span />\n              </Localized>\n            </>\n          );\n        }}>\n        <input type=\"text\" readOnly value={SHARE_URL} ref={shareURLInputRef} />\n        <FontIcon type=\"link\" />\n      </button>\n      <a\n        className=\"share-button\"\n        href={\n          'https://www.facebook.com/sharer/sharer.php?u=' +\n          encodeURIComponent(SHARE_URL)\n        }\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        onClick={() => trackSharing('facebook', locale)}>\n        <FontIcon type=\"facebook\" />\n      </a>\n      <a\n        className=\"share-button\"\n        href={'https://twitter.com/intent/tweet?text=' + encodedShareText}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        onClick={() => trackSharing('twitter', locale)}>\n        <FontIcon type=\"twitter\" />\n      </a>\n      <a\n        className=\"share-button\"\n        href={'https://de.linkedin.com/company/kenbun'}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        onClick={() => trackSharing('linkedin', locale)}>\n        <FontIcon type=\"linkedin\" />\n      </a>\n    </>\n  );\n}\n\nexport default withLocalization(ShareButtons);\n","import { Localized } from '@fluent/react';\nimport * as React from 'react';\nimport Modal from '../modal/modal';\nimport ShareButtons from '../share-buttons/share-buttons';\n\nimport './share-modal.css';\n\nexport default ({\n  shareTextId,\n  title,\n  text,\n  ...props\n}: {\n  onRequestClose: () => any;\n  shareTextId?: string;\n  title?: React.ReactNode;\n  text?: React.ReactNode;\n}) => (\n  <Modal innerClassName=\"share-modal\" {...props}>\n    <div className=\"image-container\">\n      <img className=\"mars\" src=\"/img/mars.svg\" alt=\"Robot\" />\n    </div>\n    {title ? (\n      <h1>{title}</h1>\n    ) : (\n      <Localized id=\"share-title-new\" elems={{ bold: <b /> }}>\n        <h1 />\n      </Localized>\n    )}\n    {text && <p>{text}</p>}\n    <div className=\"share-buttons\">\n      <ShareButtons {...{ shareTextId }} />\n    </div>\n  </Modal>\n);\n","module.exports = __webpack_public_path__ + \"6da66396a441e5698d0067a10c1ed2fe.svg\";","module.exports = __webpack_public_path__ + \"fe78694a26ed01b4d4f25c4d8d87c585.svg\";","module.exports = __webpack_public_path__ + \"ec9b352c80c59fbe4a4679e7422c98f1.svg\";","module.exports = __webpack_public_path__ + \"86dbebdb5d1d98f4a55a652beb7ba65e.svg\";","module.exports = __webpack_public_path__ + \"b26e3833c6360586802d77c75f01337f.png\";","module.exports = __webpack_public_path__ + \"2a8de167cf0cde6ea9b91b745fe8d105.jpg\";","module.exports = __webpack_public_path__ + \"ee7f16983e987478358a50fd85fb6e60.png\";","module.exports = __webpack_public_path__ + \"243a226eeb4cfe7363adee00e1da87b6.svg\";","module.exports = __webpack_public_path__ + \"61daed2d17bd8a27b1e946a36981bcaf.svg\";","import { useContext } from 'react';\nimport { __RouterContext as RouterContext } from 'react-router';\n\nexport function useRouter() {\n  return useContext(RouterContext);\n}\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport API from '../../../../services/api';\nimport StateTree from '../../../../stores/tree';\nimport { BarPlot } from '../../../plot/plot';\n\ninterface PropsFromState {\n  api: API;\n}\n\ninterface Props extends PropsFromState {\n  locale: string;\n  from: 'you' | 'everyone';\n}\n\ninterface State {\n  data: any[];\n}\n\nclass ContributionActivity extends React.Component<Props> {\n  state: State = { data: [] };\n\n  async componentDidMount() {\n    const { api, from, locale } = this.props;\n    await this.setState({\n      data: await api.fetchContributionActivity(from, locale),\n    });\n  }\n  render() {\n    return <BarPlot data={this.state.data} />;\n  }\n}\n\nexport default connect<PropsFromState>(({ api }: StateTree) => ({ api }))(\n  ContributionActivity\n);\n","import { Localized } from '@fluent/react';\nimport * as React from 'react';\nimport { useState, useEffect } from 'react';\nimport LanguageSelect, {\n  ALL_LOCALES,\n} from '../../../language-select/language-select';\n\nimport './stats-card.css';\n\nexport default function StatsCard({\n  className,\n  title,\n  iconButtons,\n  overlay,\n  tabs,\n  challenge,\n  currentLocale,\n}: {\n  className?: string;\n  title: string;\n  iconButtons?: React.ReactNode;\n  overlay?: React.ReactNode;\n  tabs?: { [label: string]: (props: { locale?: string }) => any };\n  challenge?: boolean;\n  currentLocale?: string;\n}) {\n  const [locale, setLocale] = useState(ALL_LOCALES);\n  const [selectedTab, setSelectedTab] = useState(Object.keys(tabs)[0]);\n  useEffect(() => setLocale(currentLocale ? currentLocale : ALL_LOCALES), [\n    currentLocale,\n  ]);\n\n  return (\n    <div className={'stats-card ' + (className || '')}>\n      {overlay}\n      <div className=\"stats-card__inner\">\n        <div className=\"title-and-icon\">\n          {challenge ? (\n            <h2 className=\"challenge-title\">{title}</h2>\n          ) : (\n            <Localized id={title}>\n              <h2 />\n            </Localized>\n          )}\n          {iconButtons}\n        </div>\n        <div className=\"filters\">\n          <div className=\"tabs\">\n            {Object.keys(tabs).map(label => {\n              return challenge ? (\n                <button\n                  key={label}\n                  type=\"button\"\n                  className={label == selectedTab ? 'selected' : ''}\n                  onClick={() => setSelectedTab(label)}>\n                  {label}\n                </button>\n              ) : (\n                <Localized key={label} id={label}>\n                  <button\n                    type=\"button\"\n                    className={label == selectedTab ? 'selected' : ''}\n                    onClick={() => setSelectedTab(label)}\n                  />\n                </Localized>\n              );\n            })}\n          </div>\n          {challenge ? (\n            <span className=\"english-only\">English Only</span>\n          ) : (\n            <LanguageSelect value={locale} onChange={setLocale} />\n          )}\n        </div>\n        <div className=\"content\">\n          {tabs[selectedTab]({ locale: locale == ALL_LOCALES ? null : locale })}\n        </div>\n      </div>\n    </div>\n  );\n}\n","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { useRef, useState } from 'react';\nimport { connect } from 'react-redux';\nimport { useAccount, useAction } from '../../../../hooks/store-hooks';\nimport API from '../../../../services/api';\nimport { trackDashboard, trackVoiceAvatar } from '../../../../services/tracker';\nimport { Locale } from '../../../../stores/locale';\nimport StateTree from '../../../../stores/tree';\nimport { User } from '../../../../stores/user';\nimport URLS from '../../../../urls';\nimport { LocaleLink, LocalizedGetAttribute } from '../../../locale-helpers';\n\nimport {\n  BookmarkIcon,\n  CheckIcon,\n  CrossIcon,\n  EyeIcon,\n  EyeOffIcon,\n  InfoIcon,\n  MicIcon,\n  OldPlayIcon,\n  PlayIcon,\n  PlayOutlineIcon,\n} from '../../../ui/icons';\nimport { Avatar, Toggle } from '../../../ui/ui';\nimport StatsCard from './stats-card';\nimport { isProduction } from '../../../../utility';\nimport { Suspense, lazy } from 'react';\nconst Lottie = lazy(() => import('react-lottie'));\nconst animationData = require('../../../layout/data.json');\n\nimport './leaderboard.css';\n\nconst FETCH_SIZE = 5;\n\nfunction formatNumber(n: number) {\n  return n > 1000 ? Math.floor(n / 1000) + 'k' : n;\n}\n\ninterface PropsFromState {\n  api: API;\n  globalLocale: Locale.State;\n}\n\ninterface Props extends PropsFromState {\n  ref: { current: any };\n  locale: string;\n  type: 'clip' | 'vote';\n}\n\nconst FetchRow = (props: React.HTMLProps<HTMLButtonElement>) => (\n  <li className=\"more\">\n    <button {...(props as any)}>\n      <div>...</div>\n    </button>\n  </li>\n);\n\nconst RateColumn = withLocalization(\n  ({ getString, value }: { value: number } & WithLocalizationProps) => (\n    <div className=\"rate\">\n      <div className=\"exact\">\n        {value == null ? getString('not-available-abbreviation') : value}\n      </div>\n      <div className=\"rounded\">\n        {value == null\n          ? getString('not-available-abbreviation')\n          : Math.round(value)}\n      </div>\n      <div className=\"percent\">{'%'}</div>\n    </div>\n  )\n);\n\ninterface State {\n  rows: { position: number; [key: string]: any }[];\n  isAtEnd: boolean;\n  playingClipIndex: number;\n}\n\nclass UnconnectedLeaderboard extends React.Component<Props, State> {\n  state: State = {\n    rows: [],\n    isAtEnd: false,\n    playingClipIndex: null,\n  };\n  audioRef = React.createRef<HTMLAudioElement>();\n\n  scroller: { current: HTMLUListElement | null } = React.createRef();\n  youRow: { current: HTMLLIElement | null } = React.createRef();\n\n  async componentDidMount() {\n    const { api, locale, type } = this.props;\n    this.setState(\n      {\n        rows: await api.forLocale(locale).fetchLeaderboard(type),\n      },\n      this.scrollToUser\n    );\n  }\n\n  async fetchMore(cursor: [number, number]) {\n    const { api, globalLocale, locale, type } = this.props;\n    trackDashboard('leaderboard-load-more', globalLocale);\n    const newRows = await api.forLocale(locale).fetchLeaderboard(type, cursor);\n    this.setState(\n      ({ rows }) => {\n        const allRows = [\n          ...newRows,\n          ...rows.filter(\n            r1 => !newRows.find((r2: any) => r1.clientHash == r2.clientHash)\n          ),\n        ];\n        allRows.sort((r1, r2) => (r1.position > r2.position ? 1 : -1));\n        return {\n          rows: allRows,\n          isAtEnd: newRows.length == 0,\n        };\n      },\n      () => {\n        this.updateScrollIndicator();\n      }\n    );\n  }\n\n  playAvatarClip = function (clipUrl: string, position: any, self: boolean) {\n    const { locale } = this.props;\n    trackVoiceAvatar(self ? 'self-listen' : 'listen', locale);\n\n    if (this.state.playingClipIndex === null) {\n      this.setState({ playingClipIndex: position });\n\n      this.audioRef.current.src = clipUrl;\n\n      this.audioRef.current.play();\n    } else {\n      this.audioRef.current.pause();\n      this.audioRef.current.currentTime = 0;\n      this.setState({ playingClipIndex: null });\n    }\n  };\n\n  scrollToUser = () => {\n    const row = this.youRow.current;\n    if (!row) return;\n\n    const scroller = this.scroller.current;\n    scroller.scrollTop = row.offsetTop - scroller.offsetTop;\n    this.updateScrollIndicator();\n  };\n\n  updateScrollIndicator = () => {\n    const SIZE = 32;\n    const el = this.scroller.current;\n    el.style.setProperty(\n      '--before-height',\n      Math.min(el.scrollTop, SIZE) + 'px'\n    );\n    el.style.setProperty(\n      '--after-height',\n      Math.min(el.scrollHeight - el.scrollTop - el.clientHeight, SIZE) + 'px'\n    );\n  };\n\n  render() {\n    const { rows, isAtEnd, playingClipIndex } = this.state;\n    const defaultOptions = {\n      loop: true,\n      autoplay: true,\n      animationData: animationData,\n      rendererSettings: {\n        preserveAspectRatio: 'xMidYMid slice',\n      },\n    };\n\n    // TODO: Render <Fetchrow>s outside of `items` to flatten the list.\n    const items = rows.map((row, i) => {\n      const prevPosition = i > 0 ? rows[i - 1].position : null;\n      const nextPosition =\n        i < rows.length - 1 ? rows[i + 1].position : isAtEnd ? 0 : Infinity;\n      return [\n        prevPosition && prevPosition + 1 < row.position ? (\n          <FetchRow\n            key={row.position + 'prev'}\n            onClick={() =>\n              this.fetchMore([\n                Math.max(prevPosition + 1, row.position - FETCH_SIZE),\n                row.position,\n              ])\n            }\n          />\n        ) : null,\n        <li\n          key={row.position}\n          className={'row ' + (row.you ? 'you' : '')}\n          ref={row.you ? this.youRow : null}>\n          <div className=\"position\">\n            {row.position < 9 && '0'}\n            {row.position + 1}\n          </div>\n\n          {!isProduction() ? (\n            row.avatarClipUrl === null ? (\n              <div className=\"avatar-container\">\n                <Avatar url={row.avatar_url} />\n              </div>\n            ) : (\n              <div>\n                <audio\n                  preload=\"auto\"\n                  ref={this.audioRef}\n                  onEnded={() => this.setState({ playingClipIndex: null })}\n                  onError={() => this.setState({ playingClipIndex: null })}\n                />\n                <button\n                  className=\"avatar-container\"\n                  onMouseEnter={() =>\n                    this.playAvatarClip(\n                      row.avatarClipUrl,\n                      row.position,\n                      row.you\n                    )\n                  }\n                  onMouseLeave={() =>\n                    this.playAvatarClip(\n                      row.avatarClipUrl,\n                      row.position,\n                      row.you\n                    )\n                  }\n                  onClick={() =>\n                    this.playAvatarClip(\n                      row.avatarClipUrl,\n                      row.position,\n                      row.you\n                    )\n                  }>\n                  <div>\n                    <Avatar url={row.avatar_url} />\n                  </div>\n                </button>\n              </div>\n            )\n          ) : (\n            <div className=\"avatar-container\">\n              <Avatar url={row.avatar_url} />\n            </div>\n          )}\n\n          <div className=\"username\" title={row.username}>\n            {row.username || '???'}\n            {row.you && (\n              <>\n                {' ('}\n                <Localized id=\"you\">\n                  <span />\n                </Localized>\n                )\n              </>\n            )}\n          </div>\n          {playingClipIndex === row.position && (\n            <div className=\"lottie\">\n              <Suspense fallback={<div />}>\n                <div className=\"animation\">\n                  <Lottie\n                    options={defaultOptions}\n                    eventListeners={[]}\n                    height={80}\n                    width={250}\n                  />\n                </div>\n              </Suspense>{' '}\n            </div>\n          )}\n          <div className=\"total\" title={row.total}>\n            {this.props.type == 'clip' ? (\n              <MicIcon />\n            ) : (\n              <OldPlayIcon className=\"play\" />\n            )}\n            {formatNumber(row.total)}\n          </div>\n        </li>,\n        nextPosition &&\n        nextPosition - 1 > row.position &&\n        nextPosition - FETCH_SIZE > row.position ? (\n          <FetchRow\n            key={row.position + 'next'}\n            onClick={() =>\n              this.fetchMore([\n                row.position + 1,\n                Math.min(row.position + 1 + FETCH_SIZE, nextPosition - 1),\n              ])\n            }\n          />\n        ) : null,\n      ];\n    });\n\n    return (\n      <ul\n        className=\"leaderboard\"\n        ref={this.scroller}\n        onScroll={this.updateScrollIndicator}>\n        {items}\n      </ul>\n    );\n  }\n}\nconst Leaderboard = connect<PropsFromState>(\n  ({ api, locale }: StateTree) => ({\n    api,\n    globalLocale: locale,\n  }),\n  null,\n  null,\n  { forwardRef: true }\n)(UnconnectedLeaderboard);\n\nconst FilledCheckIcon = () => (\n  <div className=\"filled-check\">\n    <CheckIcon />\n  </div>\n);\n\nconst Percentage = () => <div className=\"percent\">%</div>;\n\nexport default function LeaderboardCard({\n  currentLocale,\n}: {\n  currentLocale?: string;\n}) {\n  const account = useAccount();\n  const saveAccount = useAction(User.actions.saveAccount);\n\n  const [showInfo, setShowInfo] = useState(false);\n  const [showOverlay, setShowOverlay] = useState(false);\n\n  const leaderboardRef = useRef(null);\n\n  return (\n    <StatsCard\n      key=\"leaderboard\"\n      {...{ currentLocale }}\n      className={'leaderboard-card ' + (showOverlay ? 'has-overlay' : '')}\n      title=\"top-contributors\"\n      iconButtons={\n        <div className=\"icon-buttons\">\n          {Boolean(account?.visible) && (\n            <>\n              <button\n                type=\"button\"\n                onClick={() => {\n                  leaderboardRef.current.scrollToUser();\n                }}>\n                <BookmarkIcon />{' '}\n                <Localized id=\"show-ranking\">\n                  <span className=\"text\" />\n                </Localized>\n              </button>\n\n              <div className=\"icon-divider\" />\n            </>\n          )}\n\n          <button type=\"button\" onClick={() => setShowOverlay(true)}>\n            {account?.visible ? <EyeIcon /> : <EyeOffIcon />}\n            <Localized id=\"set-visibility\">\n              <span className=\"text\" />\n            </Localized>\n          </button>\n\n          <div className=\"icon-divider\" />\n\n          <div\n            className=\"leaderboard-info\"\n            onMouseEnter={() => setShowInfo(true)}\n            onMouseLeave={() => setShowInfo(false)}>\n            {showInfo && (\n              <div className=\"info-menu\">\n                <ul>\n                  {[\n                    { Icon: MicIcon, label: 'speak-goal-text' },\n                    { Icon: PlayOutlineIcon, label: 'listen-goal-text' },\n                  ].map(({ Icon, label }) => (\n                    <li key={label}>\n                      <div className=\"icon\">\n                        <Icon />\n                      </div>{' '}\n                      <Localized id={label}>\n                        <span />\n                      </Localized>\n                    </li>\n                  ))}\n                </ul>\n                <div style={{ height: 10 }}>\n                  <div className=\"triangle\" />\n                </div>\n              </div>\n            )}\n            <button\n              className={showInfo ? 'active' : ''}\n              style={{ display: 'flex' }}\n              onClick={() => setShowInfo(!showInfo)}\n              type=\"button\">\n              <InfoIcon />\n            </button>\n          </div>\n        </div>\n      }\n      overlay={\n        showOverlay && (\n          <div className=\"leaderboard-overlay\">\n            <button\n              className=\"close-overlay\"\n              type=\"button\"\n              onClick={() => setShowOverlay(false)}>\n              <CrossIcon />\n            </button>\n            <LocalizedGetAttribute\n              id=\"leaderboard-visibility\"\n              attribute=\"label\">\n              {label => <h2>{label}</h2>}\n            </LocalizedGetAttribute>\n            <Toggle\n              offText=\"hidden\"\n              onText=\"visible\"\n              defaultChecked={Boolean(account.visible)}\n              onChange={(event: any) => {\n                saveAccount({ visible: event.target.checked });\n              }}\n            />\n            <Localized id=\"visibility-explainer\" vars={{ minutes: 20 }}>\n              <p className=\"explainer\" />\n            </Localized>\n            <div className=\"info\">\n              <InfoIcon />\n              <Localized\n                id=\"visibility-overlay-note\"\n                elems={{\n                  profileLink: <LocaleLink to={URLS.PROFILE_INFO} />,\n                }}>\n                <p className=\"note\" />\n              </Localized>\n            </div>\n          </div>\n        )\n      }\n      tabs={{\n        'recorded-clips': ({ locale }) => (\n          <Leaderboard\n            key={'c' + locale}\n            locale={locale}\n            type=\"clip\"\n            ref={leaderboardRef}\n          />\n        ),\n        'validated-clips': ({ locale }) => (\n          <Leaderboard\n            key={'v' + locale}\n            locale={locale}\n            type=\"vote\"\n            ref={leaderboardRef}\n          />\n        ),\n      }}\n    />\n  );\n}\n","import * as React from 'react';\n\nimport './ui.css';\n\nexport function Fraction({\n  numerator,\n  denominator,\n  percentage,\n  className,\n}: {\n  numerator: React.ReactNode;\n  denominator?: React.ReactNode;\n  percentage?: boolean;\n  className?: string;\n}) {\n  return (\n    <div\n      className={`fraction${className ? ` ${className}` : ''}${\n        numerator <= 99 ? ' md-right' : ''\n      }`}>\n      <div className=\"numerator\">{numerator}</div>\n      <div className=\"denominator\">\n        {percentage ? ' % ' : ' / '}\n        {denominator}\n      </div>\n    </div>\n  );\n}\n\nconst Circle = ({\n  radius,\n  strokeW,\n  center,\n  ...rest\n}: React.SVGProps<SVGCircleElement> & {\n  radius: number;\n  strokeW: number;\n  center: number;\n}) => (\n  <circle\n    strokeWidth={strokeW}\n    r={radius}\n    cx={center}\n    cy={center}\n    fill=\"transparent\"\n    {...rest}\n  />\n);\n\nconst RADIUS = 30;\nconst STROKE = 2;\n\nexport function CircleProgress({\n  className = '',\n  value,\n  denominator,\n  radius = RADIUS,\n  strokeW = STROKE,\n}: {\n  className?: string;\n  value: number;\n  denominator?: number; // If unset, we show `value` as a percentage.\n  radius?: number;\n  strokeW?: number;\n}) {\n  if (0.1 <= value || value <= 0.99) {\n    radius = 44;\n  } else if (value >= 1) {\n    radius = 50;\n  }\n  const circumference = 2 * Math.PI * radius;\n  const center = radius + strokeW;\n  const size = center * 2;\n  return (\n    <div\n      className={`circle-progress ${className}`}\n      style={{ color: 'var(--red)' }}>\n      <svg width={size} height={size}>\n        <Circle radius={radius} strokeW={strokeW} center={center} />\n        <Circle\n          radius={radius}\n          strokeW={strokeW}\n          center={center}\n          className=\"progress-circle\"\n          strokeDasharray={circumference}\n          strokeDashoffset={\n            circumference * Math.max(1 - value / (denominator || 1), 0)\n          }\n        />\n        {/* {!denominator && (\n            <text\n              x={center}\n              y={center}\n              textAnchor=\"middle\"\n              dominantBaseline=\"central\">\n              {Math.round(100 * value)}%\n            </text>\n        )} */}\n      </svg>\n      {denominator ? (\n        <Fraction numerator={value} denominator={denominator} />\n      ) : (\n        <Fraction\n          numerator={\n            Math.round(100 * value) >= 100 ? '100' : Math.round(100 * value)\n          }\n          percentage\n        />\n      )}\n    </div>\n  );\n}\n","import { Localized } from '@fluent/react';\nimport * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport { DAILY_GOALS } from '../../../../constants';\nimport { useAccount, useAPI } from '../../../../hooks/store-hooks';\nimport { trackDashboard } from '../../../../services/tracker';\nimport URLS from '../../../../urls';\nimport {\n  LocaleLink,\n  toLocaleRouteBuilder,\n  useLocale,\n} from '../../../locale-helpers';\nimport { MicIcon, OldPlayIcon } from '../../../ui/icons';\nimport { LinkButton } from '../../../ui/ui';\nimport { CircleProgress, Fraction } from '../ui';\n\nimport './progress-card.css';\n\ninterface Props {\n  type: 'speak' | 'listen';\n  locale: string;\n  personalCurrent?: number;\n  personalGoal?: number;\n}\n\nexport default function ProgressCard({\n  locale,\n  personalCurrent,\n  personalGoal,\n  type,\n}: Props) {\n  const [globalLocale] = useLocale();\n  const { custom_goals: customGoals } = useAccount() || {};\n  let api = useAPI();\n  const [overallCurrent, setOverallCurrent] = useState(null);\n\n  async function fetchAndSetOverallCount() {\n    if (!locale) {\n      trackDashboard('change-language', globalLocale);\n    }\n    api = api.forLocale(locale || null);\n    setOverallCurrent(\n      await (type === 'speak'\n        ? api.fetchDailyClipsCount()\n        : api.fetchDailyVotesCount())\n    );\n  }\n\n  useEffect(() => {\n    fetchAndSetOverallCount();\n  }, []);\n\n  const overallGoal = DAILY_GOALS[type][0];\n  const isSpeak = type == 'speak';\n  const customGoal = customGoals?.find(g => g.locale == locale);\n  const currentCustomGoal = customGoal ? customGoal.current[type] : undefined;\n  const hasCustomGoalForThis = currentCustomGoal !== undefined;\n  const goalsPath = URLS.DASHBOARD + (locale ? '/' + locale : '') + URLS.GOALS;\n\n  return (\n    <div className={'progress-card ' + type}>\n      <div className=\"personal\">\n        {hasCustomGoalForThis ? (\n          <Fraction\n            numerator={currentCustomGoal}\n            denominator={customGoal.amount}\n          />\n        ) : (\n          <Fraction\n            numerator={\n              typeof personalCurrent == 'number' ? personalCurrent : '?'\n            }\n            denominator={\n              (personalGoal == Infinity ? (\n                <div className=\"infinity\">∞</div>\n              ) : (\n                personalGoal\n              )) || '?'\n            }\n          />\n        )}\n        <Localized id={isSpeak ? 'clips-you-recorded' : 'clips-you-validated'}>\n          <div className=\"description\" />\n        </Localized>\n        <div className=\"custom-goal-section\">\n          {customGoal && hasCustomGoalForThis ? (\n            <LocaleLink className=\"custom-goal-link\" to={goalsPath}>\n              <CircleProgress value={currentCustomGoal / customGoal.amount} />\n              <div className=\"custom-goal-text\">\n                <Localized\n                  id={\n                    currentCustomGoal / customGoal.amount < 1\n                      ? 'toward-next-goal'\n                      : 'goal-reached'\n                  }>\n                  <span />\n                </Localized>\n              </div>\n            </LocaleLink>\n          ) : (\n            !customGoal && (\n              <Localized id=\"create-custom-goal\">\n                <LinkButton rounded to={goalsPath} />\n              </Localized>\n            )\n          )}\n        </div>\n      </div>\n\n      <div className=\"progress-wrap\">\n        <div className=\"progress\">\n          <div className=\"icon-wrap\">\n            {isSpeak ? (\n              <MicIcon />\n            ) : (\n              <OldPlayIcon style={{ position: 'relative', left: 3 }} />\n            )}\n          </div>\n        </div>\n      </div>\n\n      <div className=\"overall\">\n        <Fraction\n          numerator={overallCurrent == null ? '?' : overallCurrent}\n          denominator={overallGoal}\n        />\n        <Localized\n          id={\n            isSpeak ? 'todays-recorded-progress' : 'todays-validated-progress'\n          }>\n          <div className=\"description\" />\n        </Localized>\n        <Localized id=\"help-reach-goal\" vars={{ goal: overallGoal }}>\n          <LinkButton\n            rounded\n            outline\n            absolute\n            to={toLocaleRouteBuilder(locale || globalLocale)(\n              isSpeak ? URLS.SPEAK : URLS.LISTEN\n            )}\n            onClick={() =>\n              trackDashboard(isSpeak ? 'speak-cta' : 'listen-cta', globalLocale)\n            }\n          />\n        </Localized>\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport Props from '../props';\nimport ContributionActivity from './contribution-activity';\nimport LeaderboardCard from './leaderboard-card';\nimport ProgressCard from './progress-card';\nimport StatsCard from './stats-card';\n\nimport './stats.css';\n\nconst StatsPage = ({ allGoals, dashboardLocale }: Props) =>\n  allGoals ? (\n    <div className=\"stats-page\">\n      <div className=\"cards\">\n        {['speak', 'listen'].map(type => {\n          const [current, goals] = allGoals.globalGoals[\n            type == 'speak' ? 'clips' : 'votes'\n          ];\n          return (\n            <ProgressCard\n              key={type + dashboardLocale}\n              type={type as any}\n              locale={dashboardLocale}\n              personalCurrent={current}\n              personalGoal={\n                allGoals\n                  ? (goals.find(g => !g.date) || { goal: Infinity }).goal\n                  : null\n              }\n            />\n          );\n        })}\n      </div>\n\n      <div className=\"cards\">\n        <StatsCard\n          key=\"contribution\"\n          title=\"contribution-activity\"\n          currentLocale={dashboardLocale}\n          tabs={['you', 'everyone'].reduce(\n            (o: any, from: any) => ({\n              ...o,\n              [from]: ({ locale }: { locale: string }) => (\n                <ContributionActivity\n                  key={locale + from}\n                  {...{ from, locale }}\n                />\n              ),\n            }),\n            {}\n          )}\n        />\n        <LeaderboardCard currentLocale={dashboardLocale} />\n      </div>\n    </div>\n  ) : null;\n\nexport default StatsPage;\n","import { Localized, withLocalization } from '@fluent/react';\nimport * as React from 'react';\nimport { useState } from 'react';\nimport { CustomGoal, CustomGoalParams } from 'common';\nimport { UserClient } from 'common';\nimport URLS from '../../../../urls';\nimport { useAccount, useIsSubscribed } from '../../../../hooks/store-hooks';\nimport { useRouter } from '../../../../hooks/use-router';\nimport { getManageSubscriptionURL } from '../../../../utility';\nimport {\n  contributableLocales,\n  LocaleLink,\n  useLocale,\n} from '../../../locale-helpers';\nimport ShareModal from '../../../share-modal/share-modal';\nimport {\n  ArrowLeft,\n  CheckIcon,\n  CrossIcon,\n  PenIcon,\n  SettingsIcon,\n  ShareIcon,\n} from '../../../ui/icons';\nimport { Button, LabeledSelect, LinkButton } from '../../../ui/ui';\nimport { CircleProgress, Fraction } from '../ui';\nimport { useEffect } from 'react';\n\nconst Buttons = ({ children, ...props }: React.HTMLProps<HTMLDivElement>) => (\n  <div className=\"buttons padded\" {...props}>\n    {children}\n    <div className=\"filler\" />\n  </div>\n);\n\nconst ArrowButton = (props: React.HTMLProps<HTMLButtonElement>) => (\n  <button className=\"arrow-button\" type={'button' as any} {...props}>\n    <ArrowLeft />\n  </button>\n);\n\nconst CloseButton = (props: React.HTMLProps<HTMLButtonElement>) => (\n  <button type={'button' as any} className=\"close-button\" {...props}>\n    <CrossIcon />\n  </button>\n);\n\nexport const ViewGoal = ({\n  locale,\n  onNext,\n  customGoal: { amount, current, days_interval },\n}: {\n  locale: string;\n  onNext: () => any;\n  customGoal: CustomGoal;\n}) => (\n  <div className=\"padded view-goal\">\n    <div className=\"top\">\n      <h2>Custom Goals</h2>\n      <button className=\"edit-button\" type=\"button\" onClick={onNext}>\n        <PenIcon />\n      </button>\n    </div>\n    {Object.keys(current).map(key => {\n      const value = (current as any)[key];\n      return (\n        <div key={key} className={'goal-box ' + key}>\n          <Fraction numerator={value} denominator={amount} />\n\n          <div className=\"relative\">\n            <CircleProgress value={value / amount} />\n            <div className=\"interval\">\n              {days_interval == 7 ? 'Of weekly goal' : 'Of daily goal'}\n            </div>\n          </div>\n\n          <LinkButton\n            className=\"cta\"\n            rounded\n            absolute\n            to={'/' + locale + (key == 'speak' ? URLS.SPEAK : URLS.LISTEN)}>\n            {key[0].toUpperCase() + key.slice(1)}\n          </LinkButton>\n        </div>\n      );\n    })}\n  </div>\n);\n\ninterface CustomGoalStepProps {\n  dashboardLocale: string;\n\n  completedFields: React.ReactNode;\n  currentFields: React.ReactNode;\n\n  closeButtonProps: React.HTMLProps<HTMLButtonElement>;\n  nextButtonProps: React.HTMLProps<HTMLButtonElement>;\n\n  state: CustomGoalParams;\n\n  subscribed: boolean;\n  setSubscribed: (subscribed: boolean) => void;\n}\n\ninterface AccountProps {\n  account: UserClient;\n}\n\nexport default [\n  withLocalization(({ getString, dashboardLocale, nextButtonProps }: any) => {\n    const { history } = useRouter();\n    const [, toLocaleRoute] = useLocale();\n    const [locale, setLocale] = useState('');\n    return (\n      <>\n        <div className=\"text\">\n          <Localized id=\"build-custom-goal\">\n            <h1 />\n          </Localized>\n          <Localized\n            id={\n              dashboardLocale\n                ? 'help-reach-hours-pluralized'\n                : 'help-reach-hours-general-pluralized'\n            }\n            vars={{\n              hours: 10000,\n              language: getString(dashboardLocale),\n            }}>\n            <span className=\"sub-head\" />\n          </Localized>\n        </div>\n\n        <div className=\"waves\">\n          <img className=\"mars\" src=\"/img/mars.svg\" alt=\"Mars Robot\" />\n        </div>\n\n        {!dashboardLocale && (\n          <div className=\"select-wrap\">\n            <Localized\n              id=\"request-language-form-language\"\n              attrs={{ label: true }}>\n              <LabeledSelect\n                value={locale}\n                onChange={(event: any) => setLocale(event.target.value)}>\n                <option key=\"empty\" value=\"\" />\n                {contributableLocales.map(l => (\n                  <Localized id={l}>\n                    <option key={l} value={l} />\n                  </Localized>\n                ))}\n              </LabeledSelect>\n            </Localized>\n          </div>\n        )}\n\n        <Localized id=\"set-a-goal\">\n          <Button\n            className=\"get-started-button\"\n            rounded\n            {...nextButtonProps}\n            disabled={!dashboardLocale && !locale}\n            onClick={\n              dashboardLocale\n                ? nextButtonProps.onClick\n                : () => {\n                    history.push(\n                      toLocaleRoute(\n                        URLS.DASHBOARD + '/' + locale + URLS.GOALS + '?start'\n                      )\n                    );\n                  }\n            }\n          />\n        </Localized>\n      </>\n    );\n  }),\n\n  ({ closeButtonProps, currentFields, nextButtonProps }) => (\n    <>\n      <div className=\"padded\">\n        <Localized id=\"goal-type\">\n          <h2 />\n        </Localized>\n        {currentFields}\n      </div>\n      <Buttons style={{ marginBottom: 20 }}>\n        <CloseButton {...closeButtonProps} />\n        <ArrowButton {...nextButtonProps} />\n      </Buttons>\n      <div className=\"waves\">\n        <img className=\"mars\" src=\"/img/mars.svg\" alt=\"Mars Robot\" />\n        <div className=\"text\">\n          <Localized id=\"cant-decide\">\n            <h4 />\n          </Localized>\n          <Localized\n            id=\"activity-needed-calculation-plural\"\n            vars={{\n              totalHours: 10000,\n              periodMonths: 6,\n              people: 1000,\n              clipsPerDay: 45,\n            }}>\n            <p />\n          </Localized>\n        </div>\n      </div>\n    </>\n  ),\n\n  ({\n    closeButtonProps,\n    completedFields,\n    currentFields,\n    nextButtonProps,\n    state,\n  }) => (\n    <>\n      <div className=\"padded\">\n        {completedFields}\n        <Localized\n          id={state.daysInterval == 7 ? 'how-many-a-week' : 'how-many-per-day'}>\n          <h2 />\n        </Localized>\n        {currentFields}\n      </div>\n      <Buttons>\n        <CloseButton {...closeButtonProps} />\n        <ArrowButton {...nextButtonProps} />\n      </Buttons>\n    </>\n  ),\n\n  ({ closeButtonProps, completedFields, currentFields, nextButtonProps }) => (\n    <>\n      <div className=\"padded\">\n        {completedFields}\n        <Localized id=\"which-goal-type\">\n          <h2 />\n        </Localized>\n        {currentFields}\n      </div>\n      <Buttons>\n        <CloseButton {...closeButtonProps} />\n        <ArrowButton {...nextButtonProps} />\n      </Buttons>\n    </>\n  ),\n\n  ({\n    closeButtonProps,\n    completedFields,\n    nextButtonProps,\n\n    subscribed,\n    setSubscribed,\n  }: CustomGoalStepProps & AccountProps) => {\n    const account = useAccount();\n    const [privacyAgreed, setPrivacyAgreed] = useState(false);\n    const isSubscribed = useIsSubscribed();\n\n    return (\n      <div className=\"padded\">\n        {completedFields}\n        {account.basket_token ? (\n          isSubscribed !== null && (\n            <>\n              <Localized\n                id={\n                  isSubscribed\n                    ? 'receiving-emails-info'\n                    : 'not-receiving-emails-info'\n                }\n                elems={{ bold: <b /> }}>\n                <p className=\"subscription-info\" />\n              </Localized>\n              <a\n                className=\"manage-subscriptions\"\n                href={getManageSubscriptionURL(account)}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\">\n                <Localized id=\"manage-email-subscriptions\">\n                  <span />\n                </Localized>\n                <SettingsIcon />\n              </a>\n            </>\n          )\n        ) : (\n          <>\n            <label className=\"box\">\n              <input\n                type=\"checkbox\"\n                checked={subscribed}\n                onChange={event => setSubscribed(event.target.checked)}\n              />\n              <Localized id=\"email-opt-in-info\">\n                <div className=\"content\" />\n              </Localized>\n            </label>\n            <label className=\"box\">\n              <input\n                type=\"checkbox\"\n                checked={privacyAgreed}\n                onChange={event => setPrivacyAgreed(event.target.checked)}\n              />\n              <div className=\"content\">\n                <Localized\n                  id=\"accept-privacy\"\n                  elems={{\n                    privacyLink: <LocaleLink to={URLS.PRIVACY} blank />,\n                  }}>\n                  <span />\n                </Localized>\n              </div>\n            </label>\n            <Localized id=\"read-terms-q\">\n              <LocaleLink to={URLS.TERMS} className=\"terms\" blank />\n            </Localized>\n          </>\n        )}\n        <Buttons>\n          <CloseButton {...closeButtonProps} />\n          <Button\n            rounded\n            className=\"submit\"\n            {...nextButtonProps}\n            disabled={subscribed && !privacyAgreed}>\n            <CheckIcon />{' '}\n            <Localized id=\"confirm-goal\">\n              <span />\n            </Localized>\n          </Button>\n        </Buttons>\n      </div>\n    );\n  },\n\n  withLocalization(({ getString, nextButtonProps, state }: any) => {\n    const [showShareModal, setShowShareModal] = useState(false);\n    const isWeekly = state.daysInterval == 7;\n    return (\n      <div className=\"padded\">\n        {showShareModal && (\n          <ShareModal\n            title={getString('help-share-goal')}\n            text={getString(\n              isWeekly\n                ? 'share-n-weekly-contribution-goal'\n                : 'share-n-daily-contribution-goal',\n              {\n                count: state.amount,\n                type: getString('share-goal-type-' + state.type),\n              }\n            )}\n            shareTextId=\"goal-share-text\"\n            onRequestClose={() => {\n              setShowShareModal(false);\n              const { onClick } = nextButtonProps as any;\n              if (onClick) {\n                onClick();\n              }\n            }}\n          />\n        )}\n        <div className=\"check\">\n          <div className=\"shadow\" />\n          <CheckIcon />\n        </div>\n        <Localized id={isWeekly ? 'weekly-goal-created' : 'daily-goal-created'}>\n          <h2 />\n        </Localized>\n        <p>\n          <Localized id=\"track-progress\">\n            <span />\n          </Localized>\n          <br />\n          <Localized id=\"return-to-edit-goal\">\n            <span />\n          </Localized>\n        </p>\n        <Button\n          rounded\n          className=\"share-button\"\n          onClick={() => setShowShareModal(true)}>\n          <ShareIcon />{' '}\n          <Localized id=\"share-goal\">\n            <span />\n          </Localized>\n        </Button>\n        <CloseButton {...nextButtonProps} />\n      </div>\n    );\n  }),\n] as React.ComponentType<CustomGoalStepProps>[];\n","import { Localized } from '@fluent/react';\nimport * as React from 'react';\nimport { useState } from 'react';\nimport { CustomGoalParams } from 'common';\nimport { useAccount, useAction, useAPI } from '../../../../hooks/store-hooks';\nimport { User } from '../../../../stores/user';\nimport Modal from '../../../modal/modal';\nimport { PenIcon } from '../../../ui/icons';\nimport steps, { ViewGoal } from './custom-goal-steps';\n\nimport './custom-goal.css';\nimport { useRouter } from '../../../../hooks/use-router';\n\nconst STATE_KEYS: ReadonlyArray<keyof CustomGoalParams> = [\n  null, // first step has no state\n  'daysInterval',\n  'amount',\n  'type',\n];\n\nconst STEPS = {\n  INTRO: 0,\n  EDIT_START: 1,\n  SUBMIT: 4,\n  COMPLETED: 5,\n};\n\nconst Radio = ({\n  children,\n  onChecked,\n  ...props\n}: {\n  children: React.ReactNode;\n  onChecked?: () => any;\n} & React.HTMLProps<HTMLInputElement>) => (\n  <label className=\"box\">\n    <input\n      type=\"radio\"\n      onChange={event => event.target.checked && onChecked && onChecked()}\n      {...props}\n    />\n    <div className=\"content\">{children}</div>\n  </label>\n);\n\nfunction StepButtons({\n  setStepIndex,\n  state,\n  stepIndex,\n  touchedStepIndex,\n}: {\n  setStepIndex: (index: number) => void;\n  state: CustomGoalParams;\n  stepIndex: number;\n  touchedStepIndex: number;\n}) {\n  return (\n    <div className=\"padded step-buttons\">\n      {stepIndex > 0 &&\n        stepIndex < 5 &&\n        [...(Array(4) as any).keys()].map(i => {\n          const n = i + 1;\n          const isCompleted =\n            state[STATE_KEYS[n]] != null && touchedStepIndex >= n;\n          const isActive = n == stepIndex;\n          return (\n            <React.Fragment key={i}>\n              <div\n                className={[\n                  'step-button',\n                  isActive ? 'active' : '',\n                  isCompleted ? 'completed' : '',\n                ].join(' ')}>\n                <button\n                  type=\"button\"\n                  onClick={() => setStepIndex(n)}\n                  disabled={n > 1 && state[STATE_KEYS[n - 1]] == null}>\n                  {n}\n                </button>\n              </div>\n              {n < 4 && (\n                <>\n                  <div\n                    className={\n                      'line ' + (isCompleted || isActive ? 'fill' : '')\n                    }\n                  />\n                  <div className={'line ' + (isCompleted ? 'fill' : '')} />\n                </>\n              )}\n            </React.Fragment>\n          );\n        })}\n    </div>\n  );\n}\n\nfunction CompletedFields({\n  setStepIndex,\n  state,\n  states,\n  stepIndex,\n}: {\n  setStepIndex: (index: number) => void;\n  state: CustomGoalParams;\n  states: any;\n  stepIndex: number;\n}) {\n  const completedStates =\n    stepIndex > STEPS.SUBMIT ? [] : STATE_KEYS.slice(1, stepIndex);\n  return (\n    <div className=\"fields completed\">\n      {completedStates.map(stateKey => {\n        if (!states[stateKey]) return null;\n        const [labelId, value] = states[stateKey].find(\n          ([, value]: any) => value == state[stateKey]\n        );\n        return (\n          <Radio key={stateKey} checked disabled>\n            <Localized\n              {...(stateKey == 'amount'\n                ? { id: 'n-clips-pluralized', vars: { count: value } }\n                : {\n                    id:\n                      stateKey == 'type' && value == 'both'\n                        ? 'both-speak-and-listen-long'\n                        : labelId,\n                  })}>\n              <span />\n            </Localized>\n            <button\n              type=\"button\"\n              onClick={() =>\n                setStepIndex(STATE_KEYS.findIndex(k => k == stateKey))\n              }>\n              <PenIcon />\n            </button>\n          </Radio>\n        );\n      })}\n    </div>\n  );\n}\n\nfunction CurrentFields({\n  setState,\n  state,\n  states,\n  stepIndex,\n}: {\n  setState: (state: CustomGoalParams) => void;\n  state: CustomGoalParams;\n  states: any;\n  stepIndex: number;\n}) {\n  const currentStateKey = STATE_KEYS[stepIndex];\n  return (\n    <div className=\"fields\">\n      {(states[currentStateKey] || []).map(([labelId, value]: any) =>\n        value == null ? null : (\n          <Radio\n            key={value}\n            name={currentStateKey}\n            checked={value == state[currentStateKey]}\n            onChecked={() =>\n              setState({\n                ...state,\n                [currentStateKey]: value,\n                // reset following states\n                ...STATE_KEYS.slice(stepIndex + 1).reduce(\n                  (obj: any, key: string) => {\n                    obj[key] = null;\n                    return obj;\n                  },\n                  {}\n                ),\n              })\n            }>\n            {currentStateKey == 'amount' ? (\n              <>\n                <Localized id=\"n-clips-pluralized\" vars={{ count: value }}>\n                  <span />\n                </Localized>\n                <Localized id={labelId}>\n                  <span className=\"right\" />\n                </Localized>\n              </>\n            ) : (\n              <Localized id={labelId}>\n                <span />\n              </Localized>\n            )}\n          </Radio>\n        )\n      )}\n    </div>\n  );\n}\n\nexport default function CustomGoal({\n  dashboardLocale,\n}: {\n  dashboardLocale: string;\n}) {\n  const { history, location } = useRouter();\n  const api = useAPI();\n  const account = useAccount();\n  const { custom_goals, email } = account || {};\n  const customGoal = custom_goals?.find(g => g.locale == dashboardLocale);\n  const refreshUser = useAction(User.actions.refresh);\n  const saveAccount = useAction(User.actions.saveAccount);\n\n  const hasStartParam = location.search.includes('start');\n  const [stepIndex, setStepIndex] = useState(\n    !customGoal && hasStartParam ? STEPS.EDIT_START : STEPS.INTRO\n  );\n  if (hasStartParam) {\n    history.replace(location.pathname);\n  }\n\n  const [touchedStepIndex, setTouchedStepIndex] = useState(STEPS.INTRO);\n  const [subscribed, setSubscribed] = useState(false);\n  const initialState = customGoal\n    ? {\n        daysInterval: customGoal.days_interval,\n        amount: customGoal.amount,\n        type:\n          Object.keys(customGoal.current).length == 1\n            ? Object.keys(customGoal.current)[0]\n            : 'both',\n      }\n    : {\n        daysInterval: null,\n        amount: null,\n        type: null,\n      };\n  const [state, setState] = useState<CustomGoalParams>(initialState);\n  const [showOverwriteModal, setShowOverwriteModal] = useState(false);\n  const [showAbortEditModal, setShowAbortEditModal] = useState(false);\n\n  const Step = steps[stepIndex];\n\n  const states: any = {\n    daysInterval: [\n      ['daily-goal', 1],\n      ['weekly-goal', 7],\n    ],\n    amount: [\n      ['easy', 15],\n      ['average', 30],\n      ['difficult', 45],\n      ['pro', 60],\n    ].map(([labelId, value]) => [\n      labelId + '-difficulty',\n      (state.daysInterval || 0) * (value as number),\n    ]),\n    type: [\n      ['speak', 'speak'],\n      ['listen', 'listen'],\n      ['both-speak-and-listen', 'both'],\n    ],\n  };\n\n  async function handleNext(confirmed = false) {\n    const nextIndex = (stepIndex + 1) % steps.length;\n    if (customGoal && !confirmed && nextIndex == STEPS.EDIT_START) {\n      setShowOverwriteModal(true);\n      return;\n    }\n    setStepIndex(nextIndex);\n    setTouchedStepIndex(Math.max(touchedStepIndex, nextIndex));\n    if (nextIndex == STEPS.COMPLETED) {\n      setTouchedStepIndex(STEPS.INTRO);\n      await api.createGoal(dashboardLocale, state);\n      if (!account.locales.some(l => l.locale == dashboardLocale)) {\n        await saveAccount({\n          ...account,\n          locales: account.locales.concat({\n            locale: dashboardLocale,\n            accent: '',\n          }),\n        });\n      }\n      if (subscribed) {\n        await api.subscribeToNewsletter(email);\n      }\n      refreshUser();\n    }\n  }\n\n  const showViewGoal = stepIndex == STEPS.INTRO && customGoal;\n  return (\n    <div className={'custom-goal ' + (showViewGoal ? '' : 'step-' + stepIndex)}>\n      {showOverwriteModal && (\n        <Modal\n          buttons={{\n            Cancel: () => setShowOverwriteModal(false),\n            Yes: () => {\n              setShowOverwriteModal(false);\n              handleNext(true);\n            },\n          }}\n          onRequestClose={() => setShowOverwriteModal(false)}>\n          <Localized id=\"lose-goal-progress-warning\">\n            <span />\n          </Localized>\n          <br />\n          <Localized id=\"want-to-continue\">\n            <span />\n          </Localized>\n        </Modal>\n      )}\n      {showAbortEditModal && (\n        <Modal\n          buttons={{\n            Exit: () => setShowAbortEditModal(false),\n            Yes: () => {\n              setShowAbortEditModal(false);\n              setState(initialState);\n              setTouchedStepIndex(STEPS.INTRO);\n              setStepIndex(STEPS.INTRO);\n            },\n          }}\n          onRequestClose={() => setShowAbortEditModal(false)}>\n          <Localized id=\"finish-editing\">\n            <span />\n          </Localized>\n          <br />\n          <Localized id=\"lose-changes-warning\">\n            <span />\n          </Localized>\n        </Modal>\n      )}\n      <StepButtons\n        setStepIndex={i => {\n          setTouchedStepIndex(Math.max(touchedStepIndex, i));\n          setStepIndex(i);\n        }}\n        {...{ state, stepIndex, touchedStepIndex }}\n      />\n      {showViewGoal ? (\n        <ViewGoal\n          locale={dashboardLocale}\n          onNext={() => handleNext()}\n          customGoal={customGoal}\n        />\n      ) : (\n        <Step\n          closeButtonProps={{\n            onClick: () => {\n              setShowAbortEditModal(true);\n            },\n            style: customGoal ? {} : { visibility: 'hidden' },\n          }}\n          completedFields={\n            <CompletedFields {...{ setStepIndex, state, states, stepIndex }} />\n          }\n          currentFields={\n            <CurrentFields {...{ setState, state, states, stepIndex }} />\n          }\n          nextButtonProps={{\n            disabled:\n              stepIndex > STEPS.INTRO &&\n              stepIndex < STEPS.SUBMIT &&\n              state[STATE_KEYS[stepIndex]] == null,\n            onClick: () => handleNext(),\n          }}\n          state={state}\n          {...{ dashboardLocale, subscribed, setSubscribed }}\n        />\n      )}\n    </div>\n  );\n}\n","import * as React from 'react';\nimport { Localized } from '@fluent/react';\nimport { GlobalGoal } from 'common';\n\nimport './goal-row.css';\n\nconst Wave = () => (\n  <svg width=\"160\" height=\"70\" viewBox=\"0 0 160 70\">\n    <defs>\n      <linearGradient id=\"wave-b\" x1=\"50%\" x2=\"50%\" y1=\"100%\" y2=\"0%\">\n        <stop offset=\"0%\" stopColor=\"#FF4F5E\" stopOpacity=\"0\" />\n        <stop offset=\"100%\" stopColor=\"rgba(0,0,0,.4)\" />\n      </linearGradient>\n      <path\n        id=\"wave-a\"\n        d=\"M0 45.229c21.074-18.809 28.61-2.594 54.87-2.594C83.025 42.635 86.378 21 111.59 21c27.04 0 29.061 20.902 48.41 24.229V91H0V45.229z\"\n      />\n    </defs>\n    <use\n      fill=\"url(#wave-b)\"\n      fillRule=\"evenodd\"\n      opacity=\".5\"\n      style={{ mixBlendMode: 'multiply' }}\n      transform=\"matrix(-1 0 0 1 160 -21)\"\n      xlinkHref=\"#wave-a\"\n    />\n  </svg>\n);\n\nconst GoalBox = ({\n  date,\n  goal,\n  isNext,\n  type,\n}: GlobalGoal & { isNext: boolean; type: string }) => (\n  <div className={'goal-box ' + type + (date ? ' done' : '')}>\n    {(date || isNext) && <Wave />}\n    <div className=\"goal\">{goal}</div>\n    <hr />\n    <Localized\n      id={\n        ({\n          streaks: 'days',\n          clips: 'recordings',\n          votes: 'validations',\n        } as any)[type]\n      }\n      vars={{ count: goal }}>\n      <div className=\"unit\" />\n    </Localized>\n    {date && (\n      <div className=\"date\">\n        {new Date(date).toLocaleDateString(undefined, {\n          year: 'numeric',\n          month: 'short',\n          day: 'numeric',\n        })}\n      </div>\n    )}\n  </div>\n);\n\nexport default function GoalRow({\n  goalInfo: [type, [current, goals]],\n}: {\n  goalInfo: [string, [number, GlobalGoal[]]];\n}) {\n  return (\n    <div className=\"goal-row\">\n      <Localized\n        id={({ clips: 'speak', votes: 'listen' } as any)[type] || type}>\n        <h3 />\n      </Localized>\n      <div className=\"goal-boxes\">\n        {goals.map((goal, i) => (\n          <GoalBox\n            key={i}\n            {...goal}\n            type={type}\n            isNext={(goals[i - 1] || ({} as any)).date}\n          />\n        ))}\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport Props from '../props';\nimport CustomGoal from './custom-goal';\nimport GoalRow from './goal-row';\n\nimport './goals.css';\n\nconst GoalsPage = ({ allGoals, dashboardLocale }: Props) => (\n  <div className=\"goals-inner\">\n    <div className=\"goal-rows\">\n      {allGoals &&\n        Object.entries(allGoals.globalGoals).map((goalInfo, i) => (\n          <GoalRow key={i} goalInfo={goalInfo} />\n        ))}\n    </div>\n    <CustomGoal key={dashboardLocale} {...{ dashboardLocale }} />\n  </div>\n);\n\nexport default GoalsPage;\n","import * as React from 'react';\nimport { useEffect } from 'react';\nimport { useAccount, useAction, useAPI } from '../../../../hooks/store-hooks';\nimport { User } from '../../../../stores/user';\nimport URLS from '../../../../urls';\nimport { MicIcon, PlayOutlineIcon } from '../../../ui/icons';\nimport { LinkButton } from '../../../ui/ui';\nimport Props from '../props';\n\nimport './awards.css';\n\nconst NoAwardsPage = ({ dashboardLocale }: { dashboardLocale: string }) => (\n  <div className=\"no-awards-page\">\n    <img src={require('./stars.svg')} alt=\"Stars\" />\n    <h1>Earn your first award, create a goal</h1>\n    <LinkButton\n      rounded\n      to={\n        URLS.DASHBOARD +\n        (dashboardLocale ? '/' + dashboardLocale : '') +\n        URLS.GOALS\n      }>\n      Get started with goals\n    </LinkButton>\n    <p>When you complete a personal goal, your awards will show up here.</p>\n  </div>\n);\n\nconst INTERVAL_LABELS: { [key: number]: string } = {\n  1: 'Daily',\n  7: 'Weekly',\n};\n\nconst Wave = () => (\n  <svg className=\"wave\" width=\"172\" height=\"70\" viewBox=\"0 0 172 70\">\n    <defs>\n      <linearGradient id=\"wave-b\" x1=\"50%\" x2=\"50%\" y1=\"100%\" y2=\"0%\">\n        <stop offset=\"0%\" stopColor=\"#040101\" stopOpacity=\"0\" />\n        <stop offset=\"100%\" stopColor=\"#000\" stopOpacity=\"0.3\" />\n      </linearGradient>\n      <path\n        id=\"wave-a\"\n        d=\"M0 49.237c22.655-18.809 30.755-2.594 58.986-2.594C89.25 46.643 100.896 10 128 10c21 0 26 9 44 16.117V80H0V49.237z\"\n      />\n    </defs>\n    <use\n      fill=\"url(#wave-b)\"\n      fillRule=\"evenodd\"\n      opacity=\".5\"\n      transform=\"matrix(-1 0 0 1 172 -10)\"\n      xlinkHref=\"#wave-a\"\n    />\n  </svg>\n);\n\nconst AwardBox = ({ award }: any) => (\n  <li className={'award-box ' + award.type}>\n    <Wave />\n    <img className=\"star\" src={require('./star.svg')} alt=\"Star\" />\n    <div className=\"interval\">\n      {INTERVAL_LABELS[award.days_interval] || award.days_interval}\n    </div>\n    <div className=\"line\" />\n    <div className=\"amount\">{award.amount} Clips</div>\n    <div className=\"type\">\n      {award.type[0].toUpperCase() + award.type.slice(1)}\n    </div>\n    <div className=\"icon\">\n      {({ speak: <MicIcon />, listen: <PlayOutlineIcon /> } as any)[award.type]}\n    </div>\n  </li>\n);\n\nexport default function AwardsPage({ dashboardLocale }: Props) {\n  const account = useAccount();\n  const api = useAPI();\n  const refreshUser = useAction(User.actions.refresh);\n\n  useEffect(() => {\n    api.seenAwards().then(() => {\n      refreshUser();\n    });\n  }, []);\n\n  if (!account) {\n    return null;\n  }\n\n  const awards = account.awards.filter(\n    a => !dashboardLocale || a.locale == dashboardLocale\n  );\n\n  if (awards.length == 0) {\n    return <NoAwardsPage {...{ dashboardLocale }} />;\n  }\n\n  const buckets = awards.reduce((buckets, award) => {\n    const bucket = buckets[award.days_interval];\n    buckets[award.days_interval] = bucket ? [...bucket, award] : [award];\n    return buckets;\n  }, []);\n\n  return (\n    <div className=\"award-lists\">\n      {buckets.map((bucket: any[], i: number) =>\n        bucket ? (\n          <React.Fragment key={i}>\n            <h2>{INTERVAL_LABELS[i] || i}</h2>\n            <ul>\n              {bucket.map((award, i) => (\n                <AwardBox key={i} award={award} />\n              ))}\n            </ul>\n          </React.Fragment>\n        ) : null\n      )}\n    </div>\n  );\n}\n","import * as React from 'react';\nimport { Avatar } from '../../../ui/ui';\nimport { ChallengeTeamToken } from 'common';\nimport { challengeLogos } from './constants';\n\nexport default ({ team }: { team: ChallengeTeamToken }) => {\n  const logo = challengeLogos[team];\n  if (!logo) return null;\n  const { url, background, border } = logo;\n  return (\n    <Avatar\n      className=\"team\"\n      url={url}\n      style={{\n        background,\n        boxSizing: 'border-box',\n        padding: '5px',\n        ...(border && {\n          border: '2px solid var(--grey)',\n        }),\n      }}\n    />\n  );\n};\n","import * as React from 'react';\nimport { LocaleLink } from '../../../locale-helpers';\nimport { CircleProgress, Fraction } from '../../../pages/dashboard/ui';\nimport { WeeklyChallenge, ChallengeTeamToken } from 'common';\nimport { Avatar } from '../../../ui/ui';\nimport URLS from '../../../../urls';\nimport TeamAvatar from './team-avatar';\nimport { weeklyChallengeCopy } from './constants';\nimport './weekly-challenge-board.css';\n\nexport default function WeeklyChallengeBoard({\n  isDisabled,\n  week,\n  individualAvatarUrl,\n  teamToken,\n  weekly,\n}: {\n  isDisabled?: boolean;\n  week: number;\n  individualAvatarUrl: string;\n  teamToken: ChallengeTeamToken;\n  weekly?: WeeklyChallenge;\n}) {\n  const { user, team } = weekly || {};\n  return (\n    <div className={`challenge-board ${isDisabled ? 'disabled' : ''}`}>\n      <div className=\"title-container\">\n        <img\n          className=\"icon\"\n          src={\n            isDisabled\n              ? require('./images/stars-disabled.svg')\n              : require('./images/stars.svg')\n          }\n          alt=\"\"\n          role=\"presentation\"\n        />\n        <p className=\"title\">{weeklyChallengeCopy[week].title}</p>\n        <div className=\"week-container\">Week {week + 1}</div>\n      </div>\n      {!isDisabled && (\n        <div className=\"challenge-board-content\">\n          <div className=\"content-row\">\n            <div className=\"column avatar-container\">\n              <Avatar url={individualAvatarUrl ? individualAvatarUrl : ''} />\n              <p>Individual</p>\n            </div>\n            <div className=\"column challenge-stats\">\n              <div className=\"container\">\n                <LocaleLink className=\"speak-btn\" to={URLS.SPEAK}>\n                  Speak\n                  <span className=\"speak-icon\"></span>\n                </LocaleLink>\n                <CircleProgress\n                  className=\"speak-bar progress-desktop\"\n                  value={user.speak}\n                  denominator={user.speak_total}\n                  strokeW={4}\n                  radius={66}\n                />\n                <Fraction\n                  numerator={user.speak}\n                  denominator={user.speak_total}\n                  className=\"speak-bar progress-mobile\"\n                />\n              </div>\n              <div className=\"divider\" />\n              <div className=\"container\">\n                <LocaleLink className=\"listen-btn\" to={URLS.LISTEN}>\n                  Listen\n                  <span className=\"listen-icon\"></span>\n                </LocaleLink>\n                <CircleProgress\n                  className=\"listen-bar progress-desktop\"\n                  value={user.listen}\n                  denominator={user.listen_total}\n                  strokeW={4}\n                  radius={66}\n                />\n                <Fraction\n                  numerator={user.listen}\n                  denominator={user.listen_total}\n                  className=\"listen-bar progress-mobile\"\n                />\n              </div>\n            </div>\n          </div>\n          <div className=\"content-row\">\n            <div className=\"column avatar-container\">\n              <TeamAvatar team={teamToken} />\n              <p>Team</p>\n            </div>\n            <div className=\"column challenge-stats team-stats\">\n              <div className=\"container team\">\n                {/* TODO: Change .team-text and .team-invite classNames. */}\n                <p className=\"team-text\">\n                  {weeklyChallengeCopy[week].subtitle}\n                </p>\n                <div className=\"v-divider\" />\n                <p className=\"team-invite\">\n                  {weeklyChallengeCopy[week].explanation}\n                </p>\n              </div>\n              <div className=\"container invite\">\n                <CircleProgress\n                  className=\"team-bar progress-desktop\"\n                  value={team.invite / team.invite_total}\n                  strokeW={4}\n                  radius={66}\n                />\n                <Fraction\n                  numerator={(100 * team.invite) / team.invite_total}\n                  className=\"team-bar progress-mobile\"\n                  percentage\n                />\n                <p className=\"team-invite-total\">\n                  of {team.invite_total} invites\n                </p>\n              </div>\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n","import * as React from 'react';\nimport WeeklyChallengeBoard from './weekly-challenge-board';\nimport { WeeklyChallenge } from 'common';\nimport { useAccount, useNotifications } from '../../../../hooks/store-hooks';\nimport NotificationPill from '../../../notification-pill/notification-pill';\nimport { FINAL_CHALLENGE_WEEK, weeklyChallengeCopy } from './constants';\nimport { ChevronDown } from '../../../ui/icons';\nimport './weekly-challenge.css';\n\nexport default function WeeklyChallenge({\n  weekly,\n}: {\n  weekly?: WeeklyChallenge;\n}) {\n  let currentWeek = weekly.week;\n  let pastWeek: Array<number> = [];\n  switch (currentWeek) {\n    case 0:\n      break;\n    case 1:\n      pastWeek.push(currentWeek - 1);\n      break;\n    case 2:\n      pastWeek.push(currentWeek - 1);\n      pastWeek.push(currentWeek - 2);\n      break;\n  }\n  const label = pastWeek.length === 0 ? 'Future' : 'Past';\n  const account = useAccount();\n  const notifications = useNotifications();\n\n  return (\n    <div className=\"weekly-container\">\n      <div className=\"weekly-topbar\">\n        <h2>Weekly Challenge</h2>\n        <div className=\"weeks\">\n          <span className=\"week\">Week</span>\n          {weeklyChallengeCopy.map((_, index) => (\n            <span\n              key={index}\n              className={`week-number ${\n                currentWeek === index ? 'active' : ''\n              }`}>\n              {index + 1}\n            </span>\n          ))}\n        </div>\n        <div className=\"week-points\">\n          {notifications\n            .map(\n              notification =>\n                notification.kind == 'pill' &&\n                notification.type === 'achievement' && (\n                  <NotificationPill\n                    key={notification.id}\n                    notification={notification}\n                  />\n                )\n            )\n            .reverse()}\n        </div>\n      </div>\n      <div className=\"weekly-content\">\n        <div>\n          <p className=\"weekly-title\">Current challenge</p>\n          {weekly && (\n            <WeeklyChallengeBoard\n              week={currentWeek}\n              individualAvatarUrl={account.avatar_url}\n              teamToken={account.enrollment.team}\n              weekly={weekly}\n            />\n          )}\n          <p className=\"challenge-dropdown\">\n            Show All Challenges <ChevronDown />\n          </p>\n        </div>\n        {currentWeek < FINAL_CHALLENGE_WEEK && (\n          <div>\n            <p className=\"weekly-title\">Next challenge</p>\n            {weekly && (\n              <WeeklyChallengeBoard\n                isDisabled\n                week={currentWeek + 1}\n                individualAvatarUrl={account.avatar_url}\n                teamToken={account.enrollment.team}\n              />\n            )}\n          </div>\n        )}\n        <div>\n          <p className=\"weekly-title\">{`${\n            currentWeek ? 'Past' : 'Future'\n          } challenge${currentWeek === FINAL_CHALLENGE_WEEK ? 's' : ''}`}</p>\n          {currentWeek === 0\n            ? weekly && (\n                <WeeklyChallengeBoard\n                  isDisabled\n                  week={currentWeek + 2}\n                  individualAvatarUrl={account.avatar_url}\n                  teamToken={account.enrollment.team}\n                />\n              )\n            : pastWeek.map(\n                (value, index) =>\n                  weekly && (\n                    <WeeklyChallengeBoard\n                      isDisabled\n                      week={value}\n                      key={index}\n                      individualAvatarUrl={account.avatar_url}\n                      teamToken={account.enrollment.team}\n                    />\n                  )\n              )}\n        </div>\n      </div>\n    </div>\n  );\n}\n","// Largely copied from `leaderboard-card.tsx`.\n// TODO: Refactor to reduce duplication with the LeaderboardCard component.\nimport * as React from 'react';\nimport API from '../../../../services/api';\nimport { User } from '../../../../stores/user';\nimport StateTree from '../../../../stores/tree';\nimport { Avatar } from '../../../ui/ui';\nimport TeamAvatar from './team-avatar';\nimport { CheckIcon } from '../../../ui/icons';\nimport { connect } from 'react-redux';\nimport { challengeTeams } from 'common';\n\nconst PointsIcon = ({ className }: { className: string }) => (\n  <div className={`star-points ${className}`} />\n);\nconst FetchRow = (props: React.HTMLProps<HTMLButtonElement>) => (\n  <li className=\"more\">\n    <button {...(props as any)}>\n      <div>...</div>\n    </button>\n  </li>\n);\n\nconst FETCH_SIZE = 5;\nconst locale = 'en';\n\ninterface PropsFromState {\n  api: API;\n  user: User.State;\n}\n\ninterface Props extends PropsFromState {\n  ref: { current: any };\n  service: string;\n  team?: boolean;\n  type?: 'clip' | 'vote';\n  week?: number;\n  challengeComplete?: boolean;\n}\n\ninterface State {\n  rows: { position: number; [key: string]: any }[];\n  isAtEnd: boolean;\n}\n\nclass ChallengeList extends React.Component<Props, State> {\n  state: State = {\n    rows: [],\n    isAtEnd: false,\n  };\n  scroller: { current: HTMLUListElement | null } = React.createRef();\n  youRow: { current: HTMLLIElement | null } = React.createRef();\n\n  updateScrollIndicator = () => {\n    const SIZE = 32;\n    const el = this.scroller.current;\n    el.style.setProperty(\n      '--before-height',\n      Math.min(el.scrollTop, SIZE) + 'px'\n    );\n    el.style.setProperty(\n      '--after-height',\n      Math.min(el.scrollHeight - el.scrollTop - el.clientHeight, SIZE) + 'px'\n    );\n  };\n\n  callService = (cursor?: [number, number]) => {\n    const { service, api, type } = this.props;\n    switch (service) {\n      case 'team-progress':\n        api.fetchTopMembers(locale, type, cursor).then(member => {\n          this.setState(\n            ({ rows }) => {\n              const allRows = [...rows, ...member];\n              return {\n                rows: allRows,\n                isAtEnd: member.length == 0,\n              };\n            },\n            () => {\n              this.updateScrollIndicator();\n            }\n          );\n        });\n        break;\n      case 'top-teams':\n        api.fetchTopTeams(locale, cursor).then(data => {\n          this.setState(\n            ({ rows }) => {\n              const allRows = [...rows, ...data];\n              return {\n                rows: allRows,\n                isAtEnd: data.length == 0,\n              };\n            },\n            () => {\n              this.updateScrollIndicator();\n            }\n          );\n        });\n        break;\n      case 'top-contributors':\n        api.fetchTopContributors(locale, type, cursor).then(data => {\n          this.setState(\n            ({ rows }) => {\n              const allRows = [...rows, ...data];\n              return {\n                rows: allRows,\n                isAtEnd: data.length == 0,\n              };\n            },\n            () => {\n              this.updateScrollIndicator();\n            }\n          );\n        });\n\n        break;\n    }\n  };\n  componentDidMount() {\n    this.callService();\n  }\n\n  fetchMore = (cursor: [number, number]) => {\n    this.callService(cursor);\n  };\n\n  scrollToUser = () => {\n    const row = this.youRow.current;\n    if (!row) return;\n\n    this.scroller.current.scrollTop =\n      row.offsetTop - this.scroller.current.offsetTop;\n    this.updateScrollIndicator();\n  };\n\n  transformRankingToString = (ranking: number) => {\n    switch (ranking) {\n      case 1:\n        return '1st';\n      case 2:\n        return '2nd';\n      case 3:\n        return '3rd';\n      default:\n        return String(ranking) + 'th';\n    }\n  };\n\n  render() {\n    const { rows, isAtEnd } = this.state;\n    const { user, team, week, challengeComplete } = this.props;\n    // TODO: Render <Fetchrow>s outside of `items` to flatten the list.\n\n    const items = rows.map((row, i) => {\n      const prevPosition = i > 0 ? rows[i - 1].position : null;\n      const nextPosition =\n        i < rows.length - 1 ? rows[i + 1].position : isAtEnd ? 0 : Infinity;\n      const isYou =\n        row.name ===\n        (team ? user.account.enrollment.team : user.account.username);\n      return [\n        !!prevPosition && prevPosition + 1 < row.position && (\n          <FetchRow\n            key={row.position + 'prev'}\n            onClick={() =>\n              this.fetchMore([\n                Math.max(prevPosition + 1, row.position - FETCH_SIZE),\n                row.position,\n              ])\n            }\n          />\n        ),\n        team ? (\n          <li\n            key={row.position}\n            className={`row team${isYou ? ' you' : ''}`}\n            ref={isYou ? this.youRow : null}>\n            <div className=\"ranking\">\n              <div className=\"position\">\n                {row.position + 1 < 10 && '0'}\n                {row.position + 1}\n              </div>\n              <div className=\"avatar-container\">\n                <TeamAvatar team={row.name.toLowerCase()} />\n              </div>\n              <div className=\"username\" title={row.name}>\n                {row.name || '???'}\n              </div>\n            </div>\n            <div className=\"week\" title=\"Week\">\n              {row.w1_points && week > 0 ? (\n                <>\n                  <PointsIcon\n                    className={row.w1 <= 3 ? `star-points-${row.w1}` : ''}\n                  />\n                  {this.transformRankingToString(row.w1)}\n                </>\n              ) : (\n                '--'\n              )}\n            </div>\n            <div className=\"week\" title=\"Week\">\n              {row.w2_points && week > 1 ? (\n                <>\n                  <PointsIcon\n                    className={row.w2 <= 3 ? `star-points-${row.w2}` : ''}\n                  />\n                  {this.transformRankingToString(row.w2)}\n                </>\n              ) : (\n                '--'\n              )}\n            </div>\n            <div className=\"week\" title=\"Week\">\n              {row.w3_points && (week > 2 || challengeComplete) ? (\n                <>\n                  <PointsIcon\n                    className={row.w3 <= 3 ? `star-points-${row.w3}` : ''}\n                  />\n                  {this.transformRankingToString(row.w3)}\n                </>\n              ) : (\n                '--'\n              )}\n            </div>\n            <div className=\"total\">{row.w3_points || 'N/A'}</div>\n          </li>\n        ) : (\n          <li\n            key={row.position}\n            className={`row${isYou ? ' you' : ''}`}\n            ref={isYou ? this.youRow : null}>\n            <div className=\"ranking\">\n              <div className=\"position\">\n                {row.position + 1 < 10 && '0'}\n                {row.position + 1}\n              </div>\n              <div className=\"avatar-container\">\n                <Avatar url={row.avatar_url} />\n              </div>\n              <div className=\"username\" title={row.name}>\n                {row.name || '???'}\n              </div>\n            </div>\n            <div className=\"point\" title={row.points}>\n              <PointsIcon\n                className={\n                  row.position < 3 ? `star-points-${row.position + 1}` : ''\n                }\n              />\n              {row.points}\n            </div>\n            <div className=\"approved\" title={row.approved}>\n              <CheckIcon />\n              {row.approved}\n            </div>\n            <div className=\"accuracy\">{row.accuracy || 'N/A'} %</div>\n          </li>\n        ),\n        !!nextPosition &&\n          nextPosition - 1 > row.position &&\n          nextPosition - FETCH_SIZE > row.position && (\n            <FetchRow\n              key={row.position + 'next'}\n              onClick={() =>\n                this.fetchMore([\n                  row.position + 1,\n                  Math.min(row.position + 1 + FETCH_SIZE, nextPosition - 1),\n                ])\n              }\n            />\n          ),\n      ];\n    });\n    // [TODO]: This should be a <table>.\n    return (\n      <ul\n        className=\"leaderboard\"\n        ref={this.scroller}\n        onScroll={this.updateScrollIndicator}>\n        <li className=\"header\" key=\"header\">\n          {team ? (\n            <>\n              <span className=\"ranking\">Ranking & Name</span>\n              <span className=\"week\">W1</span>\n              <span className=\"week\">W2</span>\n              <span className=\"week\">W3</span>\n              <span className=\"total\">Total Points</span>\n            </>\n          ) : (\n            <>\n              <span className=\"ranking\">Ranking & Name</span>\n              <span className=\"point\">Points</span>\n              <span className=\"approved\">Approved</span>\n              <span className=\"accuracy\">Accuracy</span>\n            </>\n          )}\n        </li>\n        {items}\n      </ul>\n    );\n  }\n}\nexport default connect<PropsFromState>(\n  ({ api, user }: StateTree) => ({\n    api,\n    user,\n  }),\n  null,\n  null,\n  { forwardRef: true }\n)(ChallengeList);\n","import * as React from 'react';\nimport { useRef, useState } from 'react';\nimport { useAccount } from '../../../../hooks/store-hooks';\n\nimport {\n  BookmarkIcon,\n  CheckIcon,\n  EyeIcon,\n  EyeOffIcon,\n  InfoIcon,\n} from '../../../ui/icons';\n\nimport StatsCard from '../stats/stats-card';\nimport ChallengeList from './challenge-list';\n\nconst Percentage = () => <div className=\"percent\">%</div>;\nconst FilledCheckIcon = () => (\n  <div className=\"filled-check\">\n    <CheckIcon />\n  </div>\n);\nconst PointsIcon = () => <div className=\"star-points\" />;\n\nexport default function LeaderboardCard({\n  title,\n  showVisibleIcon,\n  showOverlay,\n  service,\n  team,\n}: {\n  title: string;\n  showVisibleIcon?: boolean;\n  showOverlay?: (event: React.MouseEvent<HTMLInputElement>) => void;\n  service: 'top-teams' | 'team-progress' | 'top-contributors';\n  team?: boolean;\n}) {\n  const account = useAccount();\n\n  const [showInfo, setShowInfo] = useState(false);\n\n  const leaderboardRef = useRef(null);\n  return (\n    <StatsCard\n      key=\"leaderboard\"\n      className=\"leaderboard-card\"\n      title={title}\n      challenge={true}\n      iconButtons={\n        <div className=\"icon-buttons\">\n          {Boolean(account.visible) && (\n            <>\n              <button\n                type=\"button\"\n                onClick={() => {\n                  leaderboardRef.current.scrollToUser();\n                }}>\n                <BookmarkIcon /> <span className=\"text\">Show my ranking</span>\n              </button>\n\n              <div className=\"icon-divider\" />\n            </>\n          )}\n          {showVisibleIcon && (\n            <>\n              <button type=\"button\" onClick={showOverlay}>\n                {account.visible ? <EyeIcon /> : <EyeOffIcon />}\n                <span className=\"text\">Set my visibility</span>\n              </button>\n              <div className=\"icon-divider\" />\n            </>\n          )}\n          <div\n            className=\"leaderboard-info\"\n            onMouseEnter={() => setShowInfo(true)}\n            onMouseLeave={() => setShowInfo(false)}>\n            {showInfo && (\n              <div className=\"info-menu\">\n                <ul>\n                  {[\n                    { Icon: PointsIcon, label: 'Points' },\n                    { Icon: FilledCheckIcon, label: 'Total Approved' },\n                    { Icon: Percentage, label: 'Overall Accuracy' },\n                  ].map(({ Icon, label }) => (\n                    <li key={label}>\n                      <div className=\"info-icon\">\n                        <Icon />\n                      </div>{' '}\n                      <span>{label}</span>\n                    </li>\n                  ))}\n                </ul>\n                <div style={{ height: 10 }}>\n                  <div className=\"triangle\" />\n                </div>\n              </div>\n            )}\n            <button\n              className={showInfo ? 'active' : ''}\n              style={{ display: 'flex' }}\n              onClick={() => setShowInfo(!showInfo)}\n              type=\"button\">\n              <InfoIcon />\n            </button>\n          </div>\n        </div>\n      }\n      tabs={{\n        recorded: () => (\n          <ChallengeList\n            key=\"recorded-list\"\n            type=\"clip\"\n            service={service}\n            ref={leaderboardRef}\n          />\n        ),\n        validated: () => (\n          <ChallengeList\n            key=\"validated-list\"\n            type=\"vote\"\n            service={service}\n            ref={leaderboardRef}\n          />\n        ),\n      }}\n    />\n  );\n}\n","import * as React from 'react';\nimport { useRef, useState } from 'react';\nimport { useAccount } from '../../../../hooks/store-hooks';\n\nimport {\n  BookmarkIcon,\n  CheckIcon,\n  EyeIcon,\n  EyeOffIcon,\n  InfoIcon,\n} from '../../../ui/icons';\n\nimport ChallengeList from './challenge-list';\n\nconst Percentage = () => <div className=\"percent\">%</div>;\nconst FilledCheckIcon = () => (\n  <div className=\"filled-check\">\n    <CheckIcon />\n  </div>\n);\nconst PointsIcon = () => <div className=\"star-points\" />;\n\nexport default function TeamboardCard({\n  title,\n  showVisibleIcon,\n  showOverlay,\n  week,\n  challengeComplete,\n}: {\n  title: string;\n  showVisibleIcon?: boolean;\n  showOverlay?: (event: React.MouseEvent<HTMLInputElement>) => void;\n  week?: number;\n  challengeComplete?: boolean;\n}) {\n  const account = useAccount();\n\n  const [showInfo, setShowInfo] = useState(false);\n\n  const teamboardRef = useRef(null);\n  return (\n    <div className=\"stats-card leaderboard-card\">\n      <div className=\"stats-card__inner\">\n        <div className=\"title-and-icon\">\n          <h2 className=\"challenge-title\">{title}</h2>\n          <div className=\"icon-buttons\">\n            {Boolean(account.visible) && (\n              <>\n                <button\n                  type=\"button\"\n                  onClick={() => {\n                    teamboardRef.current.scrollToUser();\n                  }}>\n                  <BookmarkIcon /> <span className=\"text\">Show my ranking</span>\n                </button>\n\n                <div className=\"icon-divider\" />\n              </>\n            )}\n            {showVisibleIcon && (\n              <>\n                <button type=\"button\" onClick={showOverlay}>\n                  {account.visible ? <EyeIcon /> : <EyeOffIcon />}\n                  <span className=\"text\">Set my visibility</span>\n                </button>\n                <div className=\"icon-divider\" />\n              </>\n            )}\n            <div\n              className=\"leaderboard-info\"\n              onMouseEnter={() => setShowInfo(true)}\n              onMouseLeave={() => setShowInfo(false)}>\n              {showInfo && (\n                <div className=\"info-menu\">\n                  <ul>\n                    {[\n                      { Icon: PointsIcon, label: 'Points' },\n                      { Icon: FilledCheckIcon, label: 'Total Approved' },\n                      { Icon: Percentage, label: 'Overall Accuracy' },\n                    ].map(({ Icon, label }) => (\n                      <li key={label}>\n                        <div className=\"info-icon\">\n                          <Icon />\n                        </div>{' '}\n                        <span>{label}</span>\n                      </li>\n                    ))}\n                  </ul>\n                  <div style={{ height: 10 }}>\n                    <div className=\"triangle\" />\n                  </div>\n                </div>\n              )}\n              <button\n                className={showInfo ? 'active' : ''}\n                style={{ display: 'flex' }}\n                onClick={() => setShowInfo(!showInfo)}\n                type=\"button\">\n                <InfoIcon />\n              </button>\n            </div>\n          </div>\n        </div>\n        <div className=\"filters\" style={{ justifyContent: 'flex-end' }}>\n          <span className=\"english-only\">English Only</span>\n        </div>\n        <div className=\"content\">\n          <ChallengeList\n            key=\"team-list\"\n            service=\"top-teams\"\n            ref={teamboardRef}\n            team\n            challengeComplete={challengeComplete}\n            week={week}\n          />\n        </div>\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport { useEffect } from 'react';\nimport { RouteComponentProps, withRouter } from 'react-router';\nimport { LocaleLink } from '../../../locale-helpers';\nimport { ChallengeDuration } from 'common';\nimport { isBeforeChallenge } from './constants';\nimport { LinkButton } from '../../../ui/ui';\nimport URLS from '../../../../urls';\nimport { Notifications } from '../../../../stores/notifications';\nimport { useAction } from '../../../../hooks/store-hooks';\nimport './challenge-offline.css';\n\nfunction ChallengeOffline({\n  duration,\n  location,\n}: { duration: ChallengeDuration } & RouteComponentProps<any, any, any>) {\n  const addAchievement = useAction(Notifications.actions.addAchievement);\n  const dateFormat = { year: 'numeric', month: 'short', day: 'numeric' };\n\n  useEffect(() => {\n    if (isBeforeChallenge && location.state?.earlyEnroll) {\n      addAchievement(\n        50,\n        'Bonus! You signed up in time for some extra points.',\n        'success'\n      );\n    }\n  }, []);\n\n  return isBeforeChallenge(duration) ? (\n    <div className=\"challenge-blank-state pre-challenge\">\n      <div className=\"challenge-cta\">\n        <h1 className=\"challenge-header\">\n          The Open Voice Challenge will start on{' '}\n          {duration.start.toLocaleString('en-US', dateFormat)}\n        </h1>\n        <div>\n          <LocaleLink className=\"speak-btn\" to={URLS.SPEAK}>\n            Speak\n            <span className=\"speak-icon\"></span>\n          </LocaleLink>\n          <LocaleLink className=\"listen-btn\" to={URLS.LISTEN}>\n            Listen\n            <span className=\"listen-icon\"></span>\n          </LocaleLink>\n        </div>\n        <p className=\"challenge-alt\">\n          In the mean time you can still contribute to Common Voice\n        </p>\n      </div>\n    </div>\n  ) : (\n    <div className=\"challenge-blank-state post-challenge\">\n      <div className=\"challenge-cta\">\n        <h1 className=\"challenge-header\">\n          While you wait for the next one, create a custom goal!\n        </h1>\n        <LinkButton className=\"custom-goal-button\" rounded to={URLS.GOALS}>\n          Create a custom goal\n        </LinkButton>\n      </div>\n    </div>\n  );\n}\n\nexport default withRouter(ChallengeOffline);\n","import * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport { Button } from '../ui/ui';\nimport { PlayOutlineGreenIcon, MicIcon, SkipIcon } from '../ui/icons';\nimport Modal from '../modal/modal';\nimport URLS from '../../urls';\nimport { LocaleLink } from '../locale-helpers';\nimport { trackChallenge } from '../../services/tracker';\nimport './onboarding-modal.css';\n\ninterface Step {\n  title: string;\n  alt?: string;\n  img?: string;\n}\ninterface Props {\n  onRequestClose: () => void;\n}\n\ntype StepType = Step;\n\nconst STEPS: Array<StepType> = [\n  {\n    title: 'Track your team and indvidual progress on the challenge dashboard',\n    img: require('./images/dashboard.png'),\n    alt: 'dashboard',\n  },\n  {\n    title: 'Invite friends and colleagues to join your challenge team',\n    img: require('./images/invite.jpg'),\n    alt: 'invite',\n  },\n  {\n    title:\n      'Earn points by contributing your voice and validating recorded clips',\n    img: require('./images/contribute.png'),\n    alt: 'contribute',\n  },\n  {\n    title: 'Ready to get started?',\n  },\n];\nconst OperationButtons = () => {\n  return (\n    <div className=\"operation-buttons\">\n      <div className=\"speak-btn\">\n        <LocaleLink to={URLS.SPEAK}>\n          Speak\n          <MicIcon />\n        </LocaleLink>\n      </div>\n      <div className=\"listen-btn\">\n        <LocaleLink to={URLS.LISTEN}>\n          Listen\n          <PlayOutlineGreenIcon />\n        </LocaleLink>\n      </div>\n    </div>\n  );\n};\nconst OnboardingModal = ({ onRequestClose }: Props) => {\n  let [step, setStep] = useState<number>(0);\n  const stepData = STEPS[step];\n  const isLastStep = step === STEPS.length - 1;\n  useEffect(() => trackChallenge('modal-onboarding'), []);\n\n  return (\n    <Modal innerClassName=\"onboarding-modal\" onRequestClose={onRequestClose}>\n      <div className=\"step-container\">\n        {++step} of {STEPS.length}\n      </div>\n      <p className=\"onboarding-modal-title\">{stepData.title}</p>\n      {isLastStep ? (\n        <div className=\"wave\">\n          <img src={require('./images/1-red-copy.svg')} className=\"red-copy\" />\n        </div>\n      ) : (\n        <div className=\"image-container\">\n          <img src={stepData.img} alt={stepData.alt} />\n        </div>\n      )}\n      {isLastStep ? (\n        <OperationButtons />\n      ) : (\n        <div className=\"onboarding-buttons\">\n          <Button\n            rounded\n            outline\n            onClick={() => {\n              setStep(prevStep => prevStep + 1);\n            }}>\n            Next\n            <SkipIcon />\n          </Button>\n        </div>\n      )}\n    </Modal>\n  );\n};\nexport default OnboardingModal;\n","import * as React from 'react';\nimport { useState, useEffect, useRef } from 'react';\nimport { Redirect, RouteComponentProps, withRouter } from 'react-router';\nimport { challengeTeams } from 'common';\nimport WeeklyChallenge from './weekly-challenge';\nimport LeaderBoardCard from './leaderboard-card';\nimport TeamBoardCard from './team-card';\nimport ChallengeOffline from './challenge-offline';\nimport URLS from '../../../../urls';\nimport { LocaleLink } from '../../../locale-helpers';\nimport { useAccount, useAction, useAPI } from '../../../../hooks/store-hooks';\nimport { User } from '../../../../stores/user';\nimport { CrossIcon, InfoIcon } from '../../../ui/icons';\nimport { LabeledCheckbox } from '../../../ui/ui';\nimport { Notifications } from '../../../../stores/notifications';\nimport { trackChallenge } from '../../../../services/tracker';\nimport OnboardingModal from '../../../onboarding-modal/onboarding-modal';\nimport { isChallengeLive, pilotDates } from './constants';\nimport Props from '../props';\nimport './challenge.css';\n\nconst Overlay = ({ hideOverlay }: { hideOverlay?: () => void }) => {\n  const account = useAccount();\n  const saveAccount = useAction(User.actions.saveAccount);\n  const [radio, setVisibleRadio] = useState(account.visible);\n  const visibleForTeam = useRef(null);\n  const visibleForAll = useRef(null);\n  const VISIBLE_FOR_TEAM = 2;\n  const VISIBLE_FOR_ALL = 1;\n  return (\n    <div className=\"leaderboard-overlay\">\n      <button className=\"close-overlay\" type=\"button\" onClick={hideOverlay}>\n        <CrossIcon />\n      </button>\n      <h2>Leaderboard Visibility</h2>\n      <div className=\"toggle-input\">\n        <input\n          type=\"checkbox\"\n          defaultChecked={Boolean(account.visible)}\n          onChange={(event: any) => {\n            setVisibleRadio(event.target.checked);\n            if (!event.target.checked) {\n              saveAccount({ visible: 0 });\n            }\n          }}\n        />\n        <div>Hidden</div>\n        <div>Visible</div>\n      </div>\n      {Boolean(radio) && (\n        <div className=\"visible-btns\">\n          <LabeledCheckbox\n            label=\"Visible for all\"\n            defaultChecked={account.visible === VISIBLE_FOR_ALL}\n            ref={visibleForAll}\n            onChange={(event: any) => {\n              if (event.target.checked) {\n                saveAccount({ visible: VISIBLE_FOR_ALL });\n                visibleForTeam.current.checked = false;\n              }\n            }}\n          />\n          <LabeledCheckbox\n            label=\"Visible for team only\"\n            defaultChecked={account.visible === VISIBLE_FOR_TEAM}\n            ref={visibleForTeam}\n            onChange={(event: any) => {\n              if (event.target.checked) {\n                saveAccount({ visible: VISIBLE_FOR_TEAM });\n                visibleForAll.current.checked = false;\n              }\n            }}\n          />\n        </div>\n      )}\n      <p className=\"explainer\">\n        This setting controls your leaderboard visibility. When hidden, your\n        progress will be private. This means your image, user name and progress\n        will not appear on the leaderboard.\n      </p>\n      <div className=\"info\">\n        <InfoIcon />\n        <p className=\"note\">\n          Note: When set to 'Visible', this setting can be changed from the{' '}\n          <LocaleLink to={URLS.PROFILE_INFO}>Profile page</LocaleLink>\n        </p>\n      </div>\n    </div>\n  );\n};\n\nfunction ChallengePage(props: Props & RouteComponentProps<any, any, any>) {\n  const [showOverlay, setShowOverlay] = useState(false);\n  // [TODO]: Hook this up to the DB so we only see it once.\n  const addAchievement = useAction(Notifications.actions.addAchievement);\n  const [showOnboardingModal, setShowOnboardingModal] = useState(\n    props.location.state?.showOnboardingModal\n  );\n  const [weekly, setWeekly] = useState(null);\n  const account = useAccount();\n  const api = useAPI();\n  useEffect(() => {\n    api.fetchWeeklyProgress().then(value => value && setWeekly(value));\n  }, []);\n  useEffect(() => trackChallenge('dashboard-view'), []);\n\n  const isEnrolled = account?.enrollment?.team && account.enrollment.challenge;\n\n  return !isEnrolled ? (\n    <Redirect to={URLS.DASHBOARD} /> // TODO: it shouldn't even try to fetch any challenge data in useEffect if not enrolled\n  ) : isChallengeLive(pilotDates) ? (\n    <div className=\"challenge challenge-container\">\n      {showOnboardingModal && (\n        <OnboardingModal\n          onRequestClose={() => {\n            setShowOnboardingModal(false);\n            if (props.location.state?.earlyEnroll) {\n              addAchievement(\n                50,\n                'Bonus! You signed up in time for some extra points.'\n              );\n            }\n          }}\n        />\n      )}\n      {weekly && <WeeklyChallenge weekly={weekly} />}\n      {account?.enrollment && (\n        <div className={`range-container ${showOverlay ? 'has-overlay' : ''}`}>\n          {showOverlay && <Overlay hideOverlay={() => setShowOverlay(false)} />}\n          <div className=\"leader-board\">\n            <LeaderBoardCard\n              title={`${\n                challengeTeams[account.enrollment.team].readableName\n              } Team Progress`}\n              showVisibleIcon\n              showOverlay={() => setShowOverlay(true)}\n              service=\"team-progress\"\n            />\n          </div>\n          <div className=\"leader-board\">\n            {weekly && (\n              <TeamBoardCard\n                title=\"Overall Challenge Top Team\"\n                week={weekly.week}\n                challengeComplete={weekly.challengeComplete}\n              />\n            )}\n          </div>\n          <div className=\"leader-board\">\n            <LeaderBoardCard\n              title=\"Overall Challenge Top Contributors\"\n              showVisibleIcon\n              showOverlay={() => {\n                setShowOverlay(true);\n                window.scrollTo({\n                  top: 0,\n                  behavior: 'smooth',\n                });\n              }}\n              service=\"top-contributors\"\n            />\n          </div>\n        </div>\n      )}\n    </div>\n  ) : (\n    <ChallengeOffline duration={pilotDates} />\n  );\n}\n\nexport default withRouter(ChallengePage);\n","/**\n * NOTE: Want to add a mailto form to this component? Start here:\n *       https://github.com/mozilla/common-voice/pull/2440\n */\nimport * as React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport BalanceText from 'react-balance-text';\nimport Modal, { ModalProps } from '../modal/modal';\nimport { FontIcon } from '../ui/icons';\nimport { Button } from '../ui/ui';\nimport { useAPI } from '../../hooks/store-hooks';\nimport { trackChallenge } from '../../services/tracker';\nimport { Enrollment } from 'common';\n\nimport './invite-modal.css';\n\nexport interface InviteModalProps extends ModalProps {\n  enrollment: Enrollment;\n}\n\nexport default ({\n  enrollment: { challenge, team, invite },\n  ...props\n}: InviteModalProps) => {\n  const [copiedRecently, setCopiedRecently] = useState<boolean>(false);\n  const inputRef = useRef();\n  const api = useAPI();\n  // Reset the button's copied state after a brief timeout.\n  useEffect(() => {\n    if (copiedRecently) {\n      const timer = setTimeout(() => {\n        setCopiedRecently(false);\n      }, 2000);\n      // To check whether or not it is the first invite.\n      api\n        .fetchInviteStatus()\n        .then(\n          ({\n            showInviteSendToast = false,\n            hasEarnedSessionToast = false,\n            challengeEnded = true,\n          }) => {\n            sessionStorage.setItem(\n              'showInviteSendToast',\n              JSON.stringify(showInviteSendToast)\n            );\n            sessionStorage.setItem(\n              'hasEarnedSessionToast',\n              JSON.stringify(hasEarnedSessionToast)\n            );\n            sessionStorage.setItem(\n              'challengeEnded',\n              JSON.stringify(challengeEnded)\n            );\n          }\n        );\n      sessionStorage.setItem('hasShared', 'true');\n\n      return () => clearTimeout(timer);\n    }\n  }, [copiedRecently]);\n  useEffect(() => trackChallenge('modal-invite'), []);\n\n  return (\n    <Modal {...props} innerClassName=\"invite-modal\">\n      <img alt=\"\" src={require('./images/mail.svg')} role=\"presentation\" />\n\n      <h1>\n        <BalanceText>\n          Invite colleagues and friends to join your challenge team\n        </BalanceText>\n      </h1>\n\n      <input\n        readOnly\n        ref={inputRef}\n        type=\"text\"\n        value={`${window.location.origin}/?challenge=${challenge}&team=${team}&invite=${invite}`}\n      />\n\n      <Button\n        rounded\n        onClick={() => {\n          if (inputRef.current) {\n            (inputRef.current as HTMLInputElement).select();\n            document.execCommand('copy');\n            setCopiedRecently(true);\n          }\n        }}>\n        {copiedRecently ? 'Copied' : 'Copy link'}\n        <FontIcon type=\"link\" className=\"icon\" />\n      </Button>\n    </Modal>\n  );\n};\n","import { Localized } from '@fluent/react';\nimport * as React from 'react';\nimport {useEffect, useLayoutEffect, useState} from 'react';\nimport { Redirect, Route, Switch } from 'react-router';\nimport { useAccount, useAPI, useAction } from '../../../hooks/store-hooks';\nimport { useRouter } from '../../../hooks/use-router';\nimport URLS from '../../../urls';\nimport { ALL_LOCALES } from '../../language-select/language-select';\nimport {\n  isContributable,\n  LocaleNavLink,\n  useLocale,\n} from '../../locale-helpers';\nimport { Notifications } from '../../../stores/notifications';\nimport StatsPage from './stats/stats';\nimport GoalsPage from './goals/goals';\nimport AwardsPage from './awards/awards';\nimport ChallengePage from './challenge/challenge';\nimport { Button } from '../../ui/ui';\nimport InviteModal from '../../invite-modal/invite-modal';\nimport { isChallengeLive, pilotDates, isEnrolled } from './challenge/constants';\nimport './dashboard.css';\nimport { NATIVE_NAMES } from '../../../services/localization';\n\nconst TITLE_BAR_LOCALE_COUNT = 3;\n\nconst TopBar = ({\n  dashboardLocale,\n  setShowInviteModal,\n}: {\n  dashboardLocale: string;\n  setShowInviteModal(arg: any): void;\n}) => {\n  const { history, location } = useRouter();\n  const [, toLocaleRoute] = useLocale();\n  const account = useAccount();\n  const [isAboveMdWidth, setIsAboveMdWidth] = useState(true);\n  const isChallengeEnrolled = isEnrolled(account);\n  const isChallengeTabSelected =\n    location.pathname.endsWith('/challenge') && isChallengeEnrolled;\n\n  function setLocale(value: string) {\n    const pathParts = location.pathname.split('/');\n    history.push(\n      [toLocaleRoute(URLS.DASHBOARD), value, pathParts[pathParts.length - 1]]\n        .filter(Boolean)\n        .join('/')\n    );\n  }\n\n  const unseenAwards = account\n    ? account.awards.filter(a => !a.seen_at).length\n    : 0;\n\n  const locales = [''].concat(\n    (account ? account.locales : [])\n      .map(({ locale }) => locale)\n      .filter(l => isContributable(l))\n  );\n  const titleBarLocales = isAboveMdWidth\n    ? locales.slice(0, TITLE_BAR_LOCALE_COUNT)\n    : [];\n  const dropdownLocales = isAboveMdWidth\n    ? locales.slice(TITLE_BAR_LOCALE_COUNT)\n    : locales;\n\n  useEffect(() => {\n    const checkSize = () => {\n      const { innerWidth } = window;\n      setIsAboveMdWidth(innerWidth >= 768);\n    };\n    checkSize();\n    window.addEventListener('resize', checkSize);\n\n    return () => {\n      window.removeEventListener('resize', checkSize);\n    };\n  }, [isChallengeTabSelected]);\n\n  return (\n    <div className={`top-bar${isChallengeEnrolled ? ' with-challenge' : ''}`}>\n      <div className=\"underlined\">\n        <nav>\n          {isChallengeEnrolled && (\n            <LocaleNavLink\n              key={URLS.CHALLENGE}\n              to={\n                URLS.DASHBOARD +\n                (dashboardLocale ? '/' + dashboardLocale : '') +\n                URLS.CHALLENGE\n              }>\n              <h2>Challenge</h2>\n            </LocaleNavLink>\n          )}\n          {[\n            ['stats', URLS.STATS],\n            ['goals', URLS.GOALS],\n          ].map(([label, path]) => (\n            <LocaleNavLink\n              key={path}\n              to={\n                URLS.DASHBOARD +\n                (dashboardLocale ? '/' + dashboardLocale : '') +\n                path\n              }>\n              <Localized id={label}>\n                <h2 />\n              </Localized>\n            </LocaleNavLink>\n          ))}\n          <LocaleNavLink\n            to={\n              URLS.DASHBOARD +\n              (dashboardLocale ? '/' + dashboardLocale : '') +\n              URLS.AWARDS\n            }>\n            <h2>\n              <Localized id=\"awards\">\n                <span />\n              </Localized>{' '}\n              {unseenAwards > 0 && (\n                <span className=\"badge\">\n                  {unseenAwards > 9 ? '9+' : unseenAwards}\n                </span>\n              )}\n            </h2>\n          </LocaleNavLink>\n        </nav>\n        {isChallengeTabSelected ? (\n          <div className=\"language challenge-language\">\n            <span>Language:</span>\n            <span className=\"language-text\">English</span>\n          </div>\n        ) : (\n          <div className=\"languages\">\n            <span>\n              <Localized id=\"your-languages\">\n                <span />\n              </Localized>\n              :\n            </span>\n            {titleBarLocales.map(l => (\n              <label key={l}>\n                <input\n                  type=\"radio\"\n                  name=\"language\"\n                  checked={l == dashboardLocale}\n                  onChange={() => setLocale(l)}\n                />\n                {l ? (\n                  <span>{NATIVE_NAMES[l]}</span>\n                ) : (\n                  <Localized id={ALL_LOCALES}>\n                    <span />\n                  </Localized>\n                )}\n              </label>\n            ))}\n            {dropdownLocales.length > 0 && (\n              <select\n                className={\n                  dropdownLocales.includes(dashboardLocale) ? 'selected' : ''\n                }\n                name=\"language\"\n                value={dashboardLocale}\n                onChange={({ target: { value } }) => {\n                  if (value) {\n                    setLocale(value);\n                  }\n                }}>\n                {titleBarLocales.length > 0 && <option value=\"\" />}\n                {dropdownLocales.map(l =>\n                  l ? (\n                    <option key={l} value={l}>\n                      {NATIVE_NAMES[l]}\n                    </option>\n                  ) : (\n                    <Localized key={ALL_LOCALES} id={l ? l : ALL_LOCALES}>\n                      <option value={l ? l : ALL_LOCALES} />\n                    </Localized>\n                  )\n                )}\n              </select>\n            )}\n          </div>\n        )}\n      </div>\n      {isChallengeTabSelected && (\n        <ChallengeBar setShowInviteModal={setShowInviteModal} />\n      )}\n    </div>\n  );\n};\n\nfunction DashboardContent({\n  Page,\n  dashboardLocale,\n}: {\n  Page:\n    | typeof ChallengePage\n    | typeof StatsPage\n    | typeof GoalsPage\n    | typeof AwardsPage;\n  dashboardLocale: string;\n}) {\n  const api = useAPI();\n  const [allGoals, setAllGoals] = useState(null);\n\n  useEffect(() => {\n    api.fetchGoals(dashboardLocale || null).then(setAllGoals);\n  }, [dashboardLocale]);\n\n  return <Page {...{ allGoals, dashboardLocale }} />;\n}\n\ninterface ChallengeBarProps {\n  setShowInviteModal(arg: any): void;\n}\nconst ChallengeBar = ({ setShowInviteModal }: ChallengeBarProps) => {\n  const api = useAPI();\n  const [points, setAllPoints] = useState({ user: 0, team: 0 });\n\n  useEffect(() => {\n    api.fetchChallengePoints().then(value => value && setAllPoints(value));\n    // TODO: investigate how this interacts with asynchronous user loading\n  }, []);\n  return (\n    <div className=\"challenge-bar\">\n      {isChallengeLive(pilotDates) && (\n        <div className=\"points\">\n          <img src={require('./awards/star.svg')} alt=\"score\" />\n          <span className=\"score\">{points.user}</span>\n          <span className=\"label label-my\">My points</span>\n        </div>\n      )}\n\n      <Button\n        rounded\n        className=\"invite-btn\"\n        onClick={() => setShowInviteModal(true)}>\n        <span className=\"content\">Invite</span>\n        <span className=\"plus-icon\"></span>\n      </Button>\n    </div>\n  );\n};\n\nexport default function Dashboard() {\n  const { match } = useRouter();\n  const account = useAccount();\n  const api = useAPI();\n  const [, toLocaleRoute] = useLocale();\n  const [showInviteModal, setShowInviteModal] = useState<boolean>(false);\n  const addAchievement = useAction(Notifications.actions.addAchievement);\n  const isChallengeEnrolled = isEnrolled(account);\n  const pages = [\n    { subPath: URLS.STATS, Page: StatsPage },\n    { subPath: URLS.GOALS, Page: GoalsPage },\n    { subPath: URLS.AWARDS, Page: AwardsPage },\n  ];\n  let defaultPage = URLS.STATS;\n  if (isChallengeEnrolled) {\n    // @ts-ignore\n    pages.unshift({ subPath: URLS.CHALLENGE, Page: ChallengePage });\n    if (isChallengeLive(pilotDates)) {\n      defaultPage = URLS.CHALLENGE;\n    }\n  }\n\n  useLayoutEffect(() => {\n    if (!account) {\n      sessionStorage.setItem('redirectURL', location.pathname);\n      window.location.href = '/login';\n    }\n  }, []);\n\n  return (\n    <div\n      className={\n        'dashboard' + isChallengeEnrolled\n          ? ' ' + isChallengeLive(pilotDates)\n            ? 'challenge-online'\n            : 'challenge-offline'\n          : ''\n      }>\n      {showInviteModal && (\n        <InviteModal\n          enrollment={account.enrollment}\n          onRequestClose={() => {\n            setShowInviteModal(false);\n            if (JSON.parse(sessionStorage.getItem('showInviteSendToast'))) {\n              addAchievement(50, 'You sent your first invite!');\n              sessionStorage.removeItem('showInviteSendToast');\n            }\n            if (\n              !JSON.parse(sessionStorage.getItem('challengeEnded')) &&\n              !JSON.parse(sessionStorage.getItem('hasEarnedSessionToast')) &&\n              JSON.parse(sessionStorage.getItem('hasContributed'))\n            ) {\n              addAchievement(\n                50,\n                \"You're on a roll! You sent an invite and contributed in the same session.\"\n              );\n              sessionStorage.removeItem('hasEarnedSessionToast');\n              sessionStorage.removeItem('hasContributed');\n              // Tell back-end user get unexpected achievement: invite + contribute in the same session\n              // Each user can only get once.\n              api.setInviteContributeAchievement();\n            }\n          }}\n        />\n      )}\n      <div className=\"inner\">\n        <Switch>\n          {pages.map(({ subPath, Page }) => (\n            <Route\n              key={subPath}\n              exact\n              path={match.path + subPath}\n              render={() => (\n                <>\n                  <TopBar\n                    dashboardLocale=\"\"\n                    setShowInviteModal={setShowInviteModal}\n                  />\n                  <DashboardContent dashboardLocale=\"\" {...{ Page }} />\n                </>\n              )}\n            />\n          ))}\n          <Route\n            path={match.path + '/:dashboardLocale'}\n            render={({\n              match: {\n                params: { dashboardLocale },\n              },\n            }) => (\n              <>\n                <TopBar\n                  {...{ dashboardLocale }}\n                  setShowInviteModal={setShowInviteModal}\n                />\n                <Switch>\n                  {pages.map(({ subPath, Page }) => (\n                    <Route\n                      key={subPath}\n                      exact\n                      path={match.path + '/' + dashboardLocale + subPath}\n                      render={() => (\n                        <DashboardContent {...{ dashboardLocale, Page }} />\n                      )}\n                    />\n                  ))}\n                  <Route\n                    render={() => (\n                      <Redirect\n                        to={toLocaleRoute(URLS.DASHBOARD + defaultPage)}\n                      />\n                    )}\n                  />\n                </Switch>\n              </>\n            )}\n          />\n          <Route\n            render={() => (\n              <Redirect to={toLocaleRoute(URLS.DASHBOARD + defaultPage)} />\n            )}\n          />\n        </Switch>\n      </div>\n    </div>\n  );\n}\n"],"sourceRoot":""}