{"version":3,"sources":["webpack:///./src/components/primary-buttons/primary-buttons.tsx","webpack:///./src/components/pages/dashboard/challenge/constants.ts","webpack:///./src/components/terms-modal.tsx","webpack:///./src/components/pages/contribution/speak/audio-web.ts","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:///../node_modules/lodash.pick/index.js","webpack:///./src/components/pages/profile/settings/submission-screenshot-lg.jpg","webpack:///./src/components/pages/profile/settings/submission-screenshot-xs.jpg","webpack:///./src/components/pages/profile/avatar-setup/avatar-setup.tsx","webpack:///./src/components/pages/profile/delete/delete.tsx","webpack:///./src/stores/demographics.ts","webpack:///./src/components/pages/profile/info/info.tsx","webpack:///./src/components/pages/profile/settings/settings.tsx","webpack:///./src/components/pages/profile/layout.tsx"],"names":["PrimaryButton","_a","className","to","trackClass","props","__rest","React","disabled","getTrackClass","join","LocaleLink","Object","assign","type","RecordButton","status","MicIcon","StopIcon","RecordLink","URLS","SPEAK","Voice","PlayButton","isPlaying","OldPlayIcon","PlayLink","LISTEN","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","enrollment","weeklyChallengeCopy","title","subtitle","explanation","FINAL_CHALLENGE_WEEK","length","withLocalization","TermsModal","getString","onAgree","onDisagree","Localized","id","elems","termsLink","TERMS","blank","privacyLink","PRIVACY","Modal","buttons","AudioError","AudioWeb","constructor","this","recorderListeners","dataavailable","stop","analyze","bind","isReady","microphone","getMicrophone","Promise","res","rej","deny","error","NotAllowedError","NOT_ALLOWED","NotFoundError","NO_MIC","name","resolve","stream","navigator","mediaDevices","getUserMedia","audio","then","webkitGetUserMedia","mozGetUserMedia","NO_SUPPORT","isMicrophoneSupported","isAudioRecordingSupported","window","MediaRecorder","notSupported","analyzerNode","getByteFrequencyData","frequencyBins","volumeCallback","Math","max","setVolumeCallback","cb","init","audioContext","AudioContext","webkitAudioContext","sourceNode","createMediaStreamSource","volumeNode","createGain","createAnalyser","outputNode","createMediaStreamDestination","channelCount","connect","recorder","fftSize","smoothingTimeConstant","Uint8Array","frequencyBinCount","jsNode","createScriptProcessor","destination","chunks","removeEventListener","e","push","data","addEventListener","onaudioprocess","console","undefined","blob","Blob","getAudioFormat","URL","createObjectURL","reject","release","track","getTracks","module","exports","freeGlobal","global","freeSelf","self","root","Function","apply","func","thisArg","args","call","arrayPush","array","values","index","offset","objectProto","prototype","hasOwnProperty","objectToString","toString","Symbol","propertyIsEnumerable","spreadableSymbol","isConcatSpreadable","nativeMax","isFlattenable","value","isArray","isObjectLike","isLength","tag","isObject","isFunction","isArrayLike","isArrayLikeObject","isArguments","toKey","isSymbol","result","Array","pick","object","predicate","key","basePickBy","basePick","iteratee","arrayMap","baseFlatten","depth","isStrict","arguments","otherArgs","Lottie","lazy","animationData","resizeImage","file","maxSize","reader","FileReader","image","Image","canvas","document","createElement","resize","width","height","getContext","drawImage","dataURI","bytes","split","indexOf","atob","unescape","mime","ia","i","charCodeAt","dataURItoBlob","toDataURL","ok","no","onload","readerEvent","src","target","readAsDataURL","Error","AvatarSetup","state","isSaving","isRecording","counter","clipStatus","blobUrl","avatarClipUrl","isUnsupportedPlatform","maxVolume","recordingStartTime","recordingStopTime","avatarRecordedBlobUrl","audioRef","updateVolume","volume","playAvatarClip","__awaiter","locale","trackVoiceAvatar","current","pause","currentTime","setState","play","playRecordedAvatarClip","log","handleRecordClick","saveRecording","startRecording","setTimeout","err","info","downloadTimer","setInterval","tl","clearInterval","updateAvatarClip","cancelRecording","clip","api","fetchAvatarClip","componentDidMount","user","avatar_clip_url","componentWillUnmount","saveFileAvatar","files","addNotification","refreshUser","item","saveAvatar","includes","trackProfile","uploadAvatarClip","addUpload","saveAvatarClip","confirm","CheckIcon","deleteAvatarClip","render","avatarType","avatar_url","startsWith","defaultOptions","loop","autoplay","rendererSettings","preserveAspectRatio","hasClip","isProduction","preload","ref","onEnded","onError","onClick","Suspense","fallback","options","eventListeners","Button","outline","rounded","TrashIcon","CrossIcon","ShareIcon","onDragOver","event","preventDefault","onDrop","dataTransfer","browseWrap","accept","onChange","LinkIcon","Notifications","actions","addPill","User","refresh","Uploads","add","DeleteProfile","keep","textareaRef","Toggle","onText","offText","defaultChecked","checked","InfoIcon","Hr","open","encodeURIComponent","email","ACCENTS","br","gwenedeg","kerneveg","leoneg","tregerieg","ca","balearic","central","northwestern","northern","valencian","cy","united_kingdom","de","germany","netherlands","austria","poland","switzerland","france","denmark","belgium","hungary","brazil","czechia","united_states","slovakia","russia","kazakhstan","italy","finland","slovenia","canada","bulgaria","greece","lithuania","luxembourg","paraguay","romania","liechtenstein","namibia","turkey","en","us","australia","england","philippines","hongkong","indian","ireland","malaysia","newzealand","scotland","singapore","southatlandtic","african","wales","bermuda","eo","internacia","es","nortepeninsular","centrosurpeninsular","surpeninsular","canario","mexicano","americacentral","caribe","andino","rioplatense","chileno","filipinas","eu","mendebalekoa","erdialdekoa_nafarra","nafarlapurtarra_zuberoatarra","fr","madagascar","cameroon","cote_d_ivoire","tunisia","mali","algeria","morocco","burundi","senegal","niger","togo","burkina_faso","congo_brazzaville","congo_kinshasa","benin","guinea","chad","central_african_republic","portugal","gabon","syria","reunion","mauritania","haiti","comoros","martinique","guadeloupe","new_caledonia","french_polynesia","french_guiana","vanuatu","mayotte","cyprus","equatorial_guinea","seychelles","malta","mauritius","st_martin","monaco","lebanon","djibouti","wallis_et_futuna","st_barthelemy","andorra","st_pierre_et_miquelon","rwanda","nl","suriname","curacao","aruba","sint_maarten","south_africa","indonesia","mumhain","connachta","ulaidh","keelung_city","taipei_city","new_taipei_city","taoyuan_city","hsinchu_county","hsinchu_city","miaoli_county","taichung_city","changhua_county","nantou_county","yunlin_county","chiayi_county","chiayi_city","tainan_city","kaohsiung_city","pingtung_county","yilan_county","hualien_county","taitung_county","penghu_county","kinmen_county","lienchiang_county","hong_kong","AGES","teens","twenties","thirties","fourties","fifties","sixties","seventies","eighties","nineties","SEXES","male","female","other","Tooltip","Options","children","entries","map","withRouter","history","useAPI","toLocaleRoute","useLocale","useTypedSelector","userClients","useAction","addUploads","saveAccount","userFields","setUserFields","useState","username","visible","age","gender","sendEmails","privacyAgreed","locales","setLocales","isInitialized","setIsInitialized","setIsSaving","isSubmitted","setIsSubmitted","showDemographicInfo","setShowDemographicInfo","termsStatus","setTermsStatus","isEnrolledInChallenge","useEffect","isFetchingAccount","basket_token","reduce","u","Boolean","concat","filter","l1","findIndex","l2","handleChangeFor","field","submit","useCallback","l","JSON","parse","client_id","userId","team","invite","subscribeToNewsletter","Redirect","pathname","DASHBOARD","CHALLENGE","showOnboardingModal","earlyEnroll","DownIcon","attrs","label","LabeledInput","LabeledSelect","accent","newLocales","slice","splice","i2","NATIVE_NAMES","_b","arrow","html","theme","LabeledCheckbox","CHALLENGE_TERMS","Section","titleAction","isSubscribed","useIsSubscribed","replaceState","LinkButton","href","origin","PenIcon","getManageSubscriptionURL","rel","SettingsIcon","skip_submission_feedback","alt","localeConnector","Layout","infoRoute","avatarRoute","prefRoute","deleteRoute","PROFILE_INFO","PROFILE_AVATAR","PROFILE_SETTINGS","PROFILE_DELETE","r","route","icon","UserIcon","UserPlusIcon","CameraIcon","CogIcon","Infinity","NavLink","text","all","localeLabel","element","setAttribute","style","display","body","appendChild","click","removeChild","downloadData","CloudIcon","Switch","Route","exact","path","component","InfoPage","Component","Settings"],"mappings":"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","file":"8.js?id=2d300eea66abffdf782e","sourcesContent":["import * as React from 'react';\nimport URLS from '../../urls';\nimport { LocaleLink } from '../locale-helpers';\nimport { getTrackClass } from '../../services/tracker';\nimport { MicIcon, OldPlayIcon, StopIcon } from '../ui/icons';\n\nimport './primary-buttons.css';\n\nexport const PrimaryButton = ({\n  className,\n  to,\n  trackClass,\n  ...props\n}: { to?: string; trackClass?: string } & React.ButtonHTMLAttributes<any>) => (\n  <div\n    className={[\n      'primary-button',\n      className,\n      props.disabled ? 'disabled' : '',\n      trackClass ? getTrackClass('fs', trackClass) : '',\n    ].join(' ')}>\n    {to ? (\n      <LocaleLink to={to} {...props} />\n    ) : (\n      <button type=\"button\" {...props} />\n    )}\n    <div className=\"background\" />\n  </div>\n);\n\nexport type RecordingStatus = null | 'waiting' | 'recording';\n\nexport const RecordButton = ({\n  status,\n  trackClass,\n  ...props\n}: {\n  status: RecordingStatus;\n  trackClass?: string;\n} & React.ButtonHTMLAttributes<any>) => (\n  <PrimaryButton\n    className={status === null ? 'stop' : 'record'}\n    {...props}\n    trackClass={trackClass}\n    disabled={status === 'waiting'}>\n    {status === null && <MicIcon />}\n    {status === 'recording' && <StopIcon />}\n  </PrimaryButton>\n);\n\nexport const RecordLink = (props: any) => (\n  <PrimaryButton className=\"stop\" to={URLS.SPEAK} {...props}>\n    <MicIcon />\n  </PrimaryButton>\n);\n\nexport const Voice = (props: any) => (\n  <PrimaryButton className=\"stop\" {...props} />\n);\n\nexport const PlayButton = ({\n  isPlaying,\n  trackClass,\n  ...props\n}: { isPlaying: boolean; trackClass?: string } & React.ButtonHTMLAttributes<\n  any\n>) => (\n  <PrimaryButton\n    className={isPlaying ? 'stop' : 'play'}\n    trackClass={trackClass}\n    {...props}>\n    {isPlaying ? <StopIcon /> : <OldPlayIcon />}\n  </PrimaryButton>\n);\n\nexport const PlayLink = (props: any) => (\n  <PrimaryButton className=\"play\" to={URLS.LISTEN} {...props}>\n    <OldPlayIcon />\n  </PrimaryButton>\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 * as React from 'react';\nimport {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport URLS from '../urls';\nimport { LocaleLink } from './locale-helpers';\nimport Modal from './modal/modal';\n\nconst TermsModal = ({\n  getString,\n  onAgree,\n  onDisagree,\n}: { onAgree: () => any; onDisagree: () => any } & WithLocalizationProps) => (\n  <Localized\n    id=\"review-terms\"\n    elems={{\n      termsLink: <LocaleLink to={URLS.TERMS} blank />,\n      privacyLink: <LocaleLink to={URLS.PRIVACY} blank />,\n    }}>\n    <Modal\n      buttons={{\n        [getString('terms-agree')]: onAgree,\n        [getString('terms-disagree')]: onDisagree,\n      }}\n    />\n  </Localized>\n);\nexport default withLocalization(TermsModal);\n","import { getAudioFormat } from '../../../../utility';\n\ninterface BlobEvent extends Event {\n  data: Blob;\n}\n\nexport enum AudioError {\n  NOT_ALLOWED = 'NOT_ALLOWED',\n  NO_MIC = 'NO_MIC',\n  NO_SUPPORT = 'NO_SUPPORT',\n}\n\nexport interface AudioInfo {\n  url: string;\n  blob: Blob;\n}\n\nexport default class AudioWeb {\n  microphone: MediaStream;\n  analyzerNode: AnalyserNode;\n  audioContext: AudioContext;\n  recorder: any;\n  chunks: any[];\n  frequencyBins: Uint8Array;\n  volumeCallback: Function;\n  jsNode: any;\n  recorderListeners: {\n    start: Function | null;\n    dataavailable: Function | null;\n    stop: Function | null;\n  };\n\n  constructor() {\n    this.recorderListeners = {\n      start: null,\n      dataavailable: null,\n      stop: null,\n    };\n    this.analyze = this.analyze.bind(this);\n  }\n\n  private isReady(): boolean {\n    return !!this.microphone;\n  }\n\n  private getMicrophone(): Promise<MediaStream> {\n    return new Promise(function (res: Function, rej: Function) {\n      function deny(error: MediaStreamError) {\n        rej(\n          ({\n            NotAllowedError: AudioError.NOT_ALLOWED,\n            NotFoundError: AudioError.NO_MIC,\n          } as { [errorName: string]: AudioError })[error.name] || error\n        );\n      }\n      function resolve(stream: MediaStream) {\n        res(stream);\n      }\n\n      if (navigator.mediaDevices?.getUserMedia) {\n        navigator.mediaDevices\n          .getUserMedia({ audio: true })\n          .then(resolve, deny);\n      } else if (navigator.getUserMedia) {\n        navigator.getUserMedia({ audio: true }, resolve, deny);\n      } else if (navigator.webkitGetUserMedia) {\n        navigator.webkitGetUserMedia({ audio: true }, resolve, deny);\n      } else if (navigator.mozGetUserMedia) {\n        navigator.mozGetUserMedia({ audio: true }, resolve, deny);\n      } else {\n        // Browser does not support getUserMedia\n        rej(AudioError.NO_SUPPORT);\n      }\n    });\n  }\n\n  // Check all the browser prefixes for microhpone support.\n  isMicrophoneSupported() {\n    return (\n      navigator.mediaDevices?.getUserMedia ||\n      navigator.getUserMedia ||\n      navigator.webkitGetUserMedia ||\n      navigator.mozGetUserMedia\n    );\n  }\n\n  // Check if audio recording is supported\n  isAudioRecordingSupported() {\n    return (\n      typeof window.MediaRecorder !== 'undefined' &&\n      !window.MediaRecorder.notSupported\n    );\n  }\n\n  private analyze() {\n    this.analyzerNode.getByteFrequencyData(this.frequencyBins);\n\n    if (this.volumeCallback) {\n      this.volumeCallback(Math.max(...this.frequencyBins));\n    }\n  }\n\n  setVolumeCallback(cb: Function) {\n    this.volumeCallback = cb;\n  }\n\n  /**\n   * Initialize the recorder, opening the microphone media stream.\n   *\n   * If microphone access is currently denied, the user is asked to grant\n   * access. Since these permission changes take effect only after a reload,\n   * the page is reloaded if the user decides to do so.\n   *\n   */\n  async init() {\n    if (this.isReady()) {\n      return;\n    }\n\n    const microphone = await this.getMicrophone();\n\n    this.microphone = microphone;\n    const audioContext = new (window.AudioContext ||\n      window.webkitAudioContext)();\n    const sourceNode = audioContext.createMediaStreamSource(microphone);\n    const volumeNode = audioContext.createGain();\n    const analyzerNode = audioContext.createAnalyser();\n    const outputNode = audioContext.createMediaStreamDestination();\n\n    // Make sure we're doing mono everywhere.\n    sourceNode.channelCount = 1;\n    volumeNode.channelCount = 1;\n    analyzerNode.channelCount = 1;\n    outputNode.channelCount = 1;\n\n    // Connect the nodes together\n    sourceNode.connect(volumeNode);\n    volumeNode.connect(analyzerNode);\n    analyzerNode.connect(outputNode);\n\n    // and set up the recorder.\n    this.recorder = new window.MediaRecorder(outputNode.stream);\n\n    // Set up the analyzer node, and allocate an array for its data\n    // FFT size 64 gives us 32 bins. But those bins hold frequencies up to\n    // 22kHz or more, and we only care about lower frequencies which is where\n    // most human voice lies, so we use fewer bins.\n    analyzerNode.fftSize = 128;\n    analyzerNode.smoothingTimeConstant = 0.96;\n    this.frequencyBins = new Uint8Array(analyzerNode.frequencyBinCount);\n\n    // Setup jsNode for audio analysis callbacks.\n    // TODO: `createScriptProcessor` is deprecated, and is a heavy solution for\n    //       what it’s doing (checking recording volume). It should be replaced\n    //       with something lighter, or AudioWorklets once they become more\n    //       widely adopted.\n    this.jsNode = audioContext.createScriptProcessor(256, 1, 1);\n    this.jsNode.connect(audioContext.destination);\n\n    this.analyzerNode = analyzerNode;\n    this.audioContext = audioContext;\n  }\n\n  start(): Promise<void> {\n    if (!this.isReady()) {\n      console.error('Cannot record audio before microhphone is ready.');\n      return Promise.resolve();\n    }\n\n    return new Promise<void>((res: Function, rej: Function) => {\n      this.chunks = [];\n      // Remove the old listeners.\n      this.recorder.removeEventListener('start', this.recorderListeners.start);\n      this.recorder.removeEventListener(\n        'dataavailable',\n        this.recorderListeners.dataavailable\n      );\n\n      // Update the stored listeners.\n      this.recorderListeners.start = (e: Event) => res();\n      this.recorderListeners.dataavailable = (e: BlobEvent) => {\n        this.chunks.push(e.data);\n      };\n\n      // Add the new listeners.\n      this.recorder.addEventListener('start', this.recorderListeners.start);\n      this.recorder.addEventListener(\n        'dataavailable',\n        this.recorderListeners.dataavailable\n      );\n\n      // Finally, start it up.\n      // We want to be able to record up to 60s of audio in a single blob.\n      // Without this argument to start(), Chrome will call dataavailable\n      // very frequently.\n      this.jsNode.onaudioprocess = this.analyze;\n      this.recorder.start(20000);\n    });\n  }\n\n  stop(): Promise<AudioInfo> {\n    if (!this.isReady()) {\n      console.error('Cannot stop audio before microphone is ready.');\n      return Promise.reject();\n    }\n\n    return new Promise((res: Function, rej: Function) => {\n      this.jsNode.onaudioprocess = undefined;\n      this.recorder.removeEventListener('stop', this.recorderListeners.stop);\n      this.recorderListeners.stop = (e: Event) => {\n        let blob = new Blob(this.chunks, { type: getAudioFormat() });\n        res({\n          url: URL.createObjectURL(blob),\n          blob: blob,\n        });\n      };\n      this.recorder.addEventListener('stop', this.recorderListeners.stop);\n      this.recorder.stop();\n    });\n  }\n\n  release() {\n    if (this.microphone) {\n      for (const track of this.microphone.getTracks()) {\n        track.stop();\n      }\n    }\n    this.microphone = null;\n  }\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\";","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n    MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    symbolTag = '[object Symbol]';\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array ? array.length : 0,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable,\n    spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} props The property identifiers to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, props) {\n  object = Object(object);\n  return basePickBy(object, props, function(value, key) {\n    return key in object;\n  });\n}\n\n/**\n * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} props The property identifiers to pick from.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, props, predicate) {\n  var index = -1,\n      length = props.length,\n      result = {};\n\n  while (++index < length) {\n    var key = props[index],\n        value = object[key];\n\n    if (predicate(value, key)) {\n      result[key] = value;\n    }\n  }\n  return result;\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = array;\n    return apply(func, this, otherArgs);\n  };\n}\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 8-9 which returns 'object' for typed array and other constructors.\n  var tag = isObject(value) ? objectToString.call(value) : '';\n  return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [props] The property identifiers to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = baseRest(function(object, props) {\n  return object == null ? {} : basePick(object, arrayMap(baseFlatten(props, 1), toKey));\n});\n\nmodule.exports = pick;\n","module.exports = __webpack_public_path__ + \"064114c4b4bc50c7a2d9cebbcd2a8aaf.jpg\";","module.exports = __webpack_public_path__ + \"c465307a0dc1fc8585e0eb128e64806e.jpg\";","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport API from '../../../../services/api';\nimport { trackProfile, trackVoiceAvatar } from '../../../../services/tracker';\nimport { Locale } from '../../../../stores/locale';\nimport { Notifications } from '../../../../stores/notifications';\nimport StateTree from '../../../../stores/tree';\nimport { User } from '../../../../stores/user';\nimport { Uploads } from '../../../../stores/uploads';\nimport {\n  CheckIcon,\n  LinkIcon,\n  MicIcon,\n  StopIcon,\n  ShareIcon,\n  RedoIcon,\n  CrossIcon,\n  TrashIcon,\n} from '../../../ui/icons';\nimport { Button } from '../../../ui/ui';\nimport { Voice, PlayButton } from '../../../primary-buttons/primary-buttons';\nimport AudioWeb, { AudioError } from '../../contribution/speak/audio-web';\nimport { isProduction } from '../../../../utility';\nimport { Suspense, lazy } from 'react';\nconst Lottie = lazy(() => import('react-lottie'));\nconst animationData = require('../../../layout/data.json');\n\nimport './avatar-setup.css';\n\nfunction resizeImage(file: File, maxSize: number): Promise<Blob> {\n  const reader = new FileReader();\n  const image = new Image();\n  const canvas = document.createElement('canvas');\n  const dataURItoBlob = (dataURI: string) => {\n    const bytes =\n      dataURI.split(',')[0].indexOf('base64') >= 0\n        ? atob(dataURI.split(',')[1])\n        : unescape(dataURI.split(',')[1]);\n    const mime = dataURI.split(',')[0].split(':')[1].split(';')[0];\n    const max = bytes.length;\n    const ia = new Uint8Array(max);\n    for (var i = 0; i < max; i++) ia[i] = bytes.charCodeAt(i);\n    return new Blob([ia], { type: mime });\n  };\n  const resize = () => {\n    let width = image.width;\n    let height = image.height;\n\n    if (width > height) {\n      if (width > maxSize) {\n        height *= maxSize / width;\n        width = maxSize;\n      }\n    } else {\n      if (height > maxSize) {\n        width *= maxSize / height;\n        height = maxSize;\n      }\n    }\n\n    canvas.width = width;\n    canvas.height = height;\n    canvas.getContext('2d').drawImage(image, 0, 0, width, height);\n    let dataUrl = canvas.toDataURL('image/jpeg');\n    return dataURItoBlob(dataUrl);\n  };\n\n  return new Promise((ok, no) => {\n    if (!file || !file.type.match(/image.*/)) {\n      no(new Error('Not an image'));\n      return;\n    }\n\n    reader.onload = (readerEvent: any) => {\n      image.onload = () => ok(resize());\n      image.src = readerEvent.target.result;\n    };\n    reader.readAsDataURL(file);\n  });\n}\n\ninterface PropsFromState {\n  api: API;\n  locale: Locale.State;\n  user: User.State;\n}\n\ninterface PropsFromDispatch {\n  addNotification: typeof Notifications.actions.addPill;\n  refreshUser: typeof User.actions.refresh;\n  addUpload: typeof Uploads.actions.add;\n}\n\ninterface Props\n  extends WithLocalizationProps,\n    PropsFromState,\n    PropsFromDispatch {}\n\ninterface State {\n  isSaving: boolean;\n  isRecording: boolean;\n  isPlaying: boolean;\n  counter: number;\n  clipStatus: 'fetching' | 'notStarted' | 'started' | 'starting' | 'recorded';\n  blobUrl: Blob;\n  avatarClipUrl: string | null;\n}\n\nclass AvatarSetup extends React.Component<Props, State> {\n  state: State = {\n    isSaving: false,\n    isRecording: false,\n    isPlaying: false,\n    counter: 3,\n    clipStatus: 'fetching',\n    blobUrl: new Blob(),\n    avatarClipUrl: null,\n  };\n\n  audio: AudioWeb;\n  isUnsupportedPlatform = false;\n  maxVolume = 0;\n  recordingStartTime = 0;\n  recordingStopTime = 0;\n  avatarRecordedBlobUrl: any = null;\n  audioRef = React.createRef<HTMLAudioElement>();\n\n  async componentDidMount() {\n    this.audio = new AudioWeb();\n    this.audio.setVolumeCallback(this.updateVolume.bind(this));\n\n    if (\n      !this.audio.isMicrophoneSupported() ||\n      !this.audio.isAudioRecordingSupported()\n    ) {\n      this.isUnsupportedPlatform = true;\n    }\n    let clip;\n    if (this.props.user.account.avatar_clip_url) {\n      clip = await this.props.api.fetchAvatarClip();\n    }\n    if (clip) this.setState({ avatarClipUrl: clip });\n    this.setState({ clipStatus: 'notStarted' });\n  }\n\n  async componentWillUnmount() {\n    if (!this.state.isRecording) return;\n    await this.audio.stop();\n  }\n\n  async saveFileAvatar(files: FileList) {\n    const { addNotification, api, getString, locale, refreshUser } = this.props;\n    this.setState({ isSaving: true });\n    const image = await resizeImage(files.item(0), 200);\n    const { error } = await api.saveAvatar('file', image);\n    if (['too_large'].includes(error)) {\n      addNotification(getString('file' + error));\n    }\n    trackProfile('give-avatar', locale);\n\n    refreshUser();\n    this.setState({ isSaving: false });\n  }\n\n  private updateVolume = (volume: number) => {\n    if (volume !== 100 && volume > this.maxVolume) {\n      this.maxVolume = volume;\n    }\n  };\n\n  private playAvatarClip = async () => {\n    const { locale } = this.props;\n    trackVoiceAvatar('self-listen', locale);\n    if (!this.state.isPlaying) {\n      this.audioRef.current.src = this.state.avatarClipUrl;\n      this.audioRef.current.play();\n      this.setState({ isPlaying: true });\n    } else {\n      this.audioRef.current.pause();\n      this.audioRef.current.currentTime = 0;\n      this.setState({ isPlaying: false });\n    }\n  };\n\n  private playRecordedAvatarClip = async () => {\n    console.log(this.avatarRecordedBlobUrl);\n    if (!this.state.isPlaying) {\n      this.audioRef.current.src = this.avatarRecordedBlobUrl;\n      this.audioRef.current.play();\n      this.setState({ isPlaying: true });\n    } else {\n      this.audioRef.current.pause();\n      this.audioRef.current.currentTime = 0;\n      this.setState({ isPlaying: false });\n    }\n  };\n\n  private handleRecordClick = async () => {\n    if (this.state.isRecording) {\n      this.saveRecording();\n      return;\n    }\n\n    try {\n      await this.startRecording();\n\n      const clipTime = 5000;\n      setTimeout(async () => {\n        this.saveRecording();\n      }, clipTime);\n    } catch (err) {\n      if (!(err in AudioError)) {\n        throw err;\n      }\n    }\n  };\n\n  private startRecording = async () => {\n    await this.audio.start();\n    this.maxVolume = 0;\n    this.recordingStartTime = Date.now();\n    this.recordingStopTime = 0;\n    this.setState({\n      isRecording: true,\n    });\n  };\n\n  private saveRecording = () => {\n    if (this.state.clipStatus === 'started') {\n      const RECORD_STOP_DELAY = 500;\n      setTimeout(async () => {\n        const info = await this.audio.stop();\n        this.avatarRecordedBlobUrl = info.url;\n        this.setState({ blobUrl: info.blob, clipStatus: 'recorded' });\n      }, RECORD_STOP_DELAY);\n      this.recordingStopTime = Date.now();\n      this.setState({\n        isRecording: false,\n      });\n    }\n  };\n\n  private async uploadAvatarClip() {\n    const { api, refreshUser, addNotification, addUpload } = this.props;\n    addUpload([\n      async () => {\n        try {\n          await api.saveAvatarClip(this.state.blobUrl);\n          this.setState({ clipStatus: 'notStarted' });\n          let clip = await this.props.api.fetchAvatarClip();\n          if (clip) this.setState({ avatarClipUrl: clip });\n        } catch (error) {\n          confirm('Upload of this avatar clip keeps failing, keep retrying?');\n        }\n      },\n      async () => {\n        addNotification(\n          <React.Fragment>\n            <CheckIcon />{' '}\n            <Localized id=\"clips-uploaded\">\n              <span />\n            </Localized>\n          </React.Fragment>\n        );\n      },\n    ]);\n    refreshUser();\n  }\n\n  private async deleteAvatarClip() {\n    const { api, refreshUser, addNotification, addUpload } = this.props;\n\n    try {\n      await api.deleteAvatarClip();\n      console.log('done');\n      this.setState({ clipStatus: 'notStarted' });\n      let clip = await this.props.api.fetchAvatarClip();\n      this.setState({ avatarClipUrl: clip || null });\n    } catch (error) {\n      console.error(error);\n    }\n\n    refreshUser();\n  }\n\n  private counter = async () => {\n    if (this.state.clipStatus !== 'notStarted') return;\n    this.audio.release();\n    await this.audio.init();\n    this.setState({ clipStatus: 'starting', counter: 3 });\n    const downloadTimer = setInterval(() => {\n      let tl = this.state.counter - 1;\n      this.setState({ counter: tl });\n      if (this.state.counter <= 0 && this.state.clipStatus === 'starting') {\n        this.setState({ clipStatus: 'started' });\n        const { locale } = this.props;\n        trackVoiceAvatar('create-voice-avatar', locale);\n        this.handleRecordClick();\n        clearInterval(downloadTimer);\n      }\n    }, 1000);\n  };\n\n  private updateAvatarClip = () => {\n    this.setState({\n      avatarClipUrl: null,\n      counter: 3,\n      clipStatus: 'notStarted',\n    });\n  };\n\n  private cancelRecording = async () => {\n    let clip = await this.props.api.fetchAvatarClip();\n    clip\n      ? this.setState({\n          avatarClipUrl: clip,\n          clipStatus: 'notStarted',\n          isRecording: false,\n        })\n      : this.setState({ clipStatus: 'notStarted', isRecording: false });\n  };\n\n  render() {\n    const {\n      addNotification,\n      api,\n      getString,\n      refreshUser,\n      user: { account },\n    } = this.props;\n    const { isPlaying, counter, clipStatus, avatarClipUrl } = this.state;\n    const avatarType =\n      account.avatar_url &&\n      account.avatar_url.startsWith('https://gravatar.com')\n        ? 'gravatar'\n        : null;\n\n    const defaultOptions = {\n      loop: true,\n      autoplay: true,\n      animationData: animationData,\n      rendererSettings: {\n        preserveAspectRatio: 'xMidYMid slice',\n      },\n    };\n\n    const hasClip = avatarClipUrl !== null;\n\n    return (\n      <div className=\"full-avatar-setup\">\n        {!isProduction() && (\n          <div className=\"clip\">\n            <audio\n              preload=\"auto\"\n              ref={this.audioRef}\n              onEnded={() => this.setState({ isPlaying: false })}\n              onError={() => this.setState({ isPlaying: false })}\n            />\n            {/*heading */}\n\n            {clipStatus === 'notStarted' && hasClip && (\n              <Localized id=\"change-your-avatar-clip\">\n                <h2 className=\"clip-title\" />\n              </Localized>\n            )}\n            {clipStatus === 'notStarted' && !hasClip && (\n              <Localized id=\"avatar-clip-title\">\n                <h2 className=\"clip-title\" />\n              </Localized>\n            )}\n            {clipStatus === 'starting' && (\n              <Localized id=\"avatar-clip-title\">\n                <h2 className=\"clip-title\" />\n              </Localized>\n            )}\n            {clipStatus === 'started' && (\n              <Localized id=\"recording-in-progress\">\n                <h2 className=\"clip-title\" />\n              </Localized>\n            )}\n            {clipStatus === 'recorded' && (\n              <Localized id=\"avatar-clip-recorded\">\n                <h2 className=\"clip-title\" />\n              </Localized>\n            )}\n            {/* Below fix div is for middle content of avatar setup like wave image, lottie animation */}\n            <div className=\"fix\">\n              {(clipStatus === 'notStarted' || clipStatus === 'starting') &&\n                (hasClip ? (\n                  <div className=\"group-1\">\n                    <div className=\"counter\">\n                      <PlayButton\n                        isPlaying={isPlaying}\n                        onClick={this.playAvatarClip}\n                      />\n                    </div>\n                  </div>\n                ) : (\n                  <div className=\"group-1\">\n                    {clipStatus === 'starting' && (\n                      <div className=\"counter\">\n                        <Voice>\n                          <div\n                            className={\n                              'counter-animation ' +\n                              (counter === 2 ? 'counter-2 ' : '') +\n                              (counter === 1 ? 'counter-1 ' : '') +\n                              (counter <= 0 ? 'counter-0 ' : '')\n                            }>\n                            <div>\n                              <span className=\"start-in\">\n                                Start in{' '}\n                                <p className=\"counter-digit\">{counter}</p>\n                              </span>\n                            </div>\n                          </div>\n                        </Voice>\n                      </div>\n                    )}\n                  </div>\n                ))}\n              {clipStatus === 'started' && (\n                <Suspense fallback={<div />}>\n                  <div className=\"lottie\">\n                    <Lottie options={defaultOptions} eventListeners={[]} />\n                    <div className=\"recording-stop\">\n                      <PlayButton\n                        isPlaying={true}\n                        onClick={this.handleRecordClick}\n                      />\n                    </div>\n                  </div>\n                </Suspense>\n              )}\n              {clipStatus === 'recorded' && (\n                <div className=\"lottiebg\">\n                  <div className=\"recorded-play\">\n                    <PlayButton\n                      isPlaying={isPlaying}\n                      onClick={this.playRecordedAvatarClip}\n                    />\n                  </div>\n                </div>\n              )}\n            </div>\n            {/* ALL buttons, first page delete and re-record buttons */}\n            {clipStatus === 'notStarted' && hasClip && (\n              <div>\n                <div className=\"but\">\n                  <div>\n                    <Button\n                      outline\n                      rounded\n                      className=\"primary-3 rerecord-but\"\n                      onClick={this.updateAvatarClip}>\n                      <MicIcon />\n                      <Localized id=\"re-record\">\n                        <span />\n                      </Localized>\n                    </Button>\n                  </div>\n                  <div>\n                    <Button\n                      outline\n                      rounded\n                      className=\"primary-2 delete-but\"\n                      onClick={this.deleteAvatarClip.bind(this)}>\n                      <TrashIcon />\n                      <Localized id=\"delete-voice\">\n                        <span />\n                      </Localized>\n                    </Button>\n                  </div>\n                </div>\n              </div>\n            )}\n\n            {clipStatus === 'notStarted' && !hasClip && (\n              <Button\n                outline\n                rounded\n                className=\"primary rerecord-but\"\n                onClick={this.counter}>\n                <MicIcon />\n                <Localized id=\"record-voice-wave\">\n                  <span />\n                </Localized>\n              </Button>\n            )}\n            {clipStatus === 'starting' && !hasClip && (\n              <Button\n                outline\n                rounded\n                className=\"primary cancel-but\"\n                onClick={this.cancelRecording}>\n                <CrossIcon />\n                <Localized id=\"cancel-avatar-clip-recording\">\n                  <span />\n                </Localized>\n              </Button>\n            )}\n            {clipStatus === 'started' && (\n              <Button\n                outline\n                rounded\n                className=\"primary cancel-but\"\n                onClick={this.cancelRecording}>\n                <CrossIcon />\n                <Localized id=\"cancel-avatar-clip-recording\">\n                  <span />\n                </Localized>\n              </Button>\n            )}\n            {clipStatus === 'recorded' && (\n              <div>\n                <div className=\"but\">\n                  <div>\n                    <Button\n                      outline\n                      rounded\n                      className=\"primary-3 \"\n                      onClick={this.cancelRecording}>\n                      <MicIcon />\n                      <Localized id=\"retry-voice-wave-recording\">\n                        <span />\n                      </Localized>\n                    </Button>\n                  </div>\n                  <div>\n                    <Button\n                      outline\n                      rounded\n                      className=\"primary-2 \"\n                      onClick={this.uploadAvatarClip.bind(this)}>\n                      <ShareIcon />\n                      <Localized id=\"ready-to-upload\">\n                        <span />\n                      </Localized>\n                    </Button>\n                  </div>\n                </div>\n                <div className=\"delete-voice\">\n                  <Localized id=\"delete-voice-clip\">\n                    <p\n                      className=\"delete-voice\"\n                      onClick={this.deleteAvatarClip.bind(this)}\n                    />\n                  </Localized>\n                </div>\n              </div>\n            )}\n            {hasClip ? (\n              <>\n                <Localized id=\"avatar-clip-fact\">\n                  <p className=\"create-a-custom-voice\" />\n                </Localized>\n              </>\n            ) : (\n              <Localized id=\"about-avatar-clip-recording\">\n                <p className=\"create-a-custom-voice voice-paragraph-2\" />\n              </Localized>\n            )}\n          </div>\n        )}\n        <div className=\"photo-avatar\">\n          <fieldset className=\"avatar-setup\" disabled={this.state.isSaving}>\n            <div className=\"file-upload\">\n              <label\n                onDragOver={event => {\n                  event.preventDefault();\n                }}\n                onDrop={event => {\n                  this.saveFileAvatar(event.dataTransfer.files);\n                  event.preventDefault();\n                }}>\n                <Localized id=\"browse-file-title\">\n                  <span className=\"title\" />\n                </Localized>\n                <Localized\n                  id=\"browse-file\"\n                  elems={{ browseWrap: <span className=\"browse\" /> }}>\n                  <span className=\"upload-label\" />\n                </Localized>\n                <input\n                  className=\"hide-input\"\n                  type=\"file\"\n                  accept=\"image/*\"\n                  onChange={event => {\n                    this.saveFileAvatar(event.target.files);\n                  }}\n                />\n              </label>\n            </div>\n\n            <button\n              className=\"connect\"\n              type=\"button\"\n              onClick={async () => {\n                this.setState({ isSaving: true });\n                const { error } = await api.saveAvatar(\n                  avatarType == 'gravatar' ? 'default' : 'gravatar'\n                );\n\n                if (['not_found'].includes(error)) {\n                  addNotification(getString('gravatar_' + error));\n                }\n\n                if (!error) {\n                  refreshUser();\n                }\n                this.setState({ isSaving: false });\n              }}>\n              <Localized id=\"connect-gravatar\">\n                <span />\n              </Localized>{' '}\n              {avatarType == 'gravatar' ? (\n                <CheckIcon className=\"check\" />\n              ) : (\n                <LinkIcon className=\"link\" />\n              )}\n            </button>\n          </fieldset>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default connect<PropsFromState, any>(\n  ({ api, locale, user }: StateTree) => ({ api, locale, user }),\n  {\n    addNotification: Notifications.actions.addPill,\n    refreshUser: User.actions.refresh,\n    addUpload: Uploads.actions.add,\n  }\n)(withLocalization(AvatarSetup));\n","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { User } from '../../../../stores/user';\nimport StateTree from '../../../../stores/tree';\nimport { InfoIcon } from '../../../ui/icons';\nimport { Toggle, Hr, Button } from '../../../ui/ui';\n\nimport './delete.css';\n\ninterface PropsFromState {\n  user: User.State;\n}\n\ninterface Props extends WithLocalizationProps, PropsFromState {}\n\nclass DeleteProfile extends React.Component<Props, { keep: boolean }> {\n  state = { keep: true };\n\n  textareaRef = React.createRef<HTMLTextAreaElement>();\n\n  render() {\n    const { keep } = this.state;\n    return (\n      <div className=\"profile-delete\">\n        <div className=\"top\">\n          <h2>\n            <Localized id=\"delete-q\">\n              <span />\n            </Localized>\n            *\n          </h2>\n          <Localized id=\"indicates-required\">\n            <div className=\"required\" />\n          </Localized>\n        </div>\n        <div className=\"toggle-with-info\">\n          <div className=\"toggle-container\">\n            <Toggle\n              onText=\"keep\"\n              offText=\"remove\"\n              defaultChecked={keep}\n              onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n                this.setState({ keep: event.target.checked });\n              }}\n            />\n          </div>\n          <div className=\"info\">\n            <InfoIcon />\n            <Localized id={keep ? 'keep-info' : 'remove-info'}>\n              <div />\n            </Localized>\n          </div>\n        </div>\n        {/* We're disabling this field for now */}\n        {false && !keep && (\n          <textarea\n            placeholder={this.props.getString('why-delete-recordings')}\n            ref={this.textareaRef}\n          />\n        )}\n        <Hr />\n        <Localized id=\"profile-form-delete\">\n          <Button\n            rounded\n            onClick={() => {\n              window.open(\n                'mailto:commonvoice@mozilla.com?subject=' +\n                  encodeURIComponent('Delete Profile') +\n                  '&body=' +\n                  encodeURIComponent(\n                    (keep\n                      ? 'keep my recordings'\n                      : 'remove my recordings, because: ' + '\\n') +\n                      /*+ this.textareaRef.current.value*/ '\\n' +\n                      'email:' +\n                      this.props.user.account.email\n                  )\n              );\n            }}\n          />\n        </Localized>\n      </div>\n    );\n  }\n}\n\nexport default connect<PropsFromState>(({ user }: StateTree) => ({ user }))(\n  withLocalization(DeleteProfile)\n);\n","export const ACCENTS: any = {\n  br: {\n    gwenedeg: 'Gwenedeg',\n    kerneveg: 'Kerneveg',\n    leoneg: 'Leoneg',\n    tregerieg: 'Tregerieg',\n  },\n  ca: {\n    balearic: 'balear',\n    central: 'central',\n    northwestern: 'nord-occidental',\n    northern: 'septentrional',\n    valencian: 'valencià',\n  },\n  cy: {\n    united_kingdom: 'Y Deyrnas Unedig Cymraeg',\n  },\n  de: {\n    germany: 'Deutschland Deutsch',\n    netherlands: 'Niederländisch Deutsch',\n    austria: 'Österreichisches Deutsch',\n    poland: 'Polnisch Deutsch',\n    switzerland: 'Schweizerdeutsch',\n    united_kingdom: 'Britisches Deutsch',\n    france: 'Französisch Deutsch',\n    denmark: 'Dänisch Deutsch',\n    belgium: 'Belgisches Deutsch',\n    hungary: 'Ungarisch Deutsch',\n    brazil: 'Brasilianisches Deutsch',\n    czechia: 'Tschechisch Deutsch',\n    united_states: 'Amerikanisches Deutsch',\n    slovakia: 'Slowakisch Deutsch',\n    russia: 'Russisch Deutsch',\n    kazakhstan: 'Kasachisch Deutsch',\n    italy: 'Italienisch Deutsch',\n    finland: 'Finnisch Deutsch',\n    slovenia: 'Slowenisch Deutsch',\n    canada: 'Kanadisches Deutsch',\n    bulgaria: 'Bulgarisch Deutsch',\n    greece: 'Griechisch Deutsch',\n    lithuania: 'Litauisch Deutsch',\n    luxembourg: 'Luxemburgisches Deutsch',\n    paraguay: 'Paraguayisch Deutsch',\n    romania: 'Rumänisch Deutsch',\n    liechtenstein: 'liechtensteinisches Deutscher',\n    namibia: 'Namibisch Deutsch',\n    turkey: 'Türkisch Deutsch',\n  },\n  en: {\n    us: 'United States English',\n    australia: 'Australian English',\n    england: 'England English',\n    canada: 'Canadian English',\n    philippines: 'Filipino',\n    hongkong: 'Hong Kong English',\n    indian: 'India and South Asia (India, Pakistan, Sri Lanka)',\n    ireland: 'Irish English',\n    malaysia: 'Malaysian English',\n    newzealand: 'New Zealand English',\n    scotland: 'Scottish English',\n    singapore: 'Singaporean English',\n    southatlandtic: 'South Atlantic (Falkland Islands, Saint Helena)',\n    african: 'Southern African (South Africa, Zimbabwe, Namibia)',\n    wales: 'Welsh English',\n    bermuda: 'West Indies and Bermuda (Bahamas, Bermuda, Jamaica, Trinidad)',\n  },\n  eo: {\n    internacia: 'Internacia',\n  },\n  es: {\n    nortepeninsular:\n      'España: Norte peninsular (Asturias, Castilla y León, Cantabria, País Vasco, Navarra, Aragón, La Rioja, Guadalajara, Cuenca)',\n    centrosurpeninsular:\n      'España: Centro-Sur peninsular (Madrid, Toledo, Castilla-La Mancha)',\n    surpeninsular: 'España: Sur peninsular (Andalucia, Extremadura, Murcia)',\n    canario: 'España: Islas Canarias',\n    mexicano: 'México',\n    americacentral: 'América central',\n    caribe:\n      'Caribe: Cuba, Venezuela, Puerto Rico, República Dominicana, Panamá, Colombia caribeña, México caribeño, Costa del golfo de México',\n    andino:\n      'Andino-Pacífico: Colombia, Perú, Ecuador, oeste de Bolivia y Venezuela andina',\n    rioplatense: 'Rioplatense: Argentina, Uruguay, este de Bolivia, Paraguay',\n    chileno: 'Chileno: Chile, Cuyo',\n    filipinas: 'Español de Filipinas',\n  },\n  eu: {\n    mendebalekoa:\n      'Mendebalekoa (Araka, Bizkaia, Gipuzkoako mendebaleko herri batzuk)',\n    erdialdekoa_nafarra: 'Erdialdekoa edo Nafarra (Gipuzkoa, Nafarroa)',\n    nafarlapurtarra_zuberoatarra:\n      'Nafar-lapurtarra edo Zuberotarra (Lapurdi, Nafarroa Beherea, Zuberoa)',\n  },\n  fr: {\n    france: 'Français de France',\n    madagascar: 'Français de Madagascar',\n    cameroon: 'Français du Cameroun',\n    germany: 'Français d’Allemagne',\n    united_kingdom: 'Français du Royaume-Uni',\n    cote_d_ivoire: 'Français de Côte d’Ivoire',\n    tunisia: 'Français de Tunisie',\n    mali: 'Français du Mali',\n    algeria: 'Français d’Algérie',\n    canada: 'Français du Canada',\n    morocco: 'Français du Maroc',\n    burundi: 'Français du Burundi',\n    senegal: 'Français du Sénégal',\n    niger: 'Français du Niger',\n    netherlands: 'Français des Pays-Bas',\n    togo: 'Français de la République du Togo',\n    burkina_faso: 'Français du Burkina-Faso',\n    belgium: 'Français de Belgique',\n    congo_brazzaville: 'Français du Congo (Brazzaville)',\n    congo_kinshasa: 'Français du Congo (Kinshasa)',\n    italy: 'Français d’Italie',\n    benin: 'Français du Bénin',\n    romania: 'Français de Roumanie',\n    guinea: 'Français de Guinée',\n    chad: 'Français du Tchad',\n    central_african_republic: 'Français de République centrafricaine',\n    united_states: 'Français des États-Unis',\n    switzerland: 'Français de Suisse',\n    portugal: 'Français du Portugal',\n    gabon: 'Français du Gabon',\n    syria: 'Français de Syrie',\n    greece: 'Français de Grèce',\n    austria: 'Français d’Autriche',\n    ireland: 'Français d’Irlande',\n    reunion: 'Français de La Réunion',\n    mauritania: 'Français de Mauritanie',\n    luxembourg: 'Français du Luxembourg',\n    haiti: 'Français d’Haïti',\n    comoros: 'Français des Comores',\n    martinique: 'Français de Martinique',\n    guadeloupe: 'Français de Guadeloupe',\n    hungary: 'Français d’Hongrie',\n    new_caledonia: 'Français de Nouvelle-Calédonie',\n    french_polynesia: 'Français de Polynésie française',\n    french_guiana: 'Français de Guyane',\n    vanuatu: 'Français du Vanuatu',\n    mayotte: 'Français de Mayotte',\n    cyprus: 'Français de Chypre',\n    equatorial_guinea: 'Français de Guinée équatoriale',\n    seychelles: 'Français des Seychelles',\n    malta: 'Français de Malte',\n    mauritius: 'Français de l’Île Maurice',\n    st_martin: 'Français de Saint-Martin',\n    monaco: 'Français de Monaco',\n    lebanon: 'Français du Liban',\n    djibouti: 'Français de Djibouti',\n    wallis_et_futuna: 'Français de Wallis et Futuna',\n    st_barthelemy: 'Français de Saint-Barthélemy',\n    andorra: 'Français d’Andorre',\n    st_pierre_et_miquelon: 'Français de Saint-Pierre-et-Miquelon',\n    rwanda: 'Français du Rwanda',\n  },\n  nl: {\n    netherlands: 'Nederlands Nederlands',\n    belgium: 'Belgisch Nederlands',\n    suriname: 'Surinaams Nederlands',\n    france: 'Frans Nederlands',\n    germany: 'Duits Nederlands',\n    curacao: 'Nederlands van Curaçao',\n    aruba: 'Nederlands van Aruba',\n    sint_maarten: 'Nederlands van Sint-Maarten',\n    south_africa: 'Zuid-Afrikaans Nederlands',\n    namibia: 'Namibisch Nederlands',\n    indonesia: 'Indonesisch Nederlands',\n  },\n  'ga-IE': {\n    mumhain: 'Gaeilge na Mumhan',\n    connachta: 'Gaeilge Chonnacht',\n    ulaidh: 'Gaeilge Uladh',\n  },\n  'zh-TW': {\n    keelung_city: '出生地：基隆市',\n    taipei_city: '出生地：臺北市',\n    new_taipei_city: '出生地：新北市',\n    taoyuan_city: '出生地：桃園市',\n    hsinchu_county: '出生地：新竹縣',\n    hsinchu_city: '出生地：新竹市',\n    miaoli_county: '出生地：苗栗縣',\n    taichung_city: '出生地：臺中市',\n    changhua_county: '出生地：彰化縣',\n    nantou_county: '出生地：南投縣',\n    yunlin_county: '出生地：雲林縣',\n    chiayi_county: '出生地：嘉義縣',\n    chiayi_city: '出生地：嘉義市',\n    tainan_city: '出生地：臺南市',\n    kaohsiung_city: '出生地：高雄市',\n    pingtung_county: '出生地：屏東縣',\n    yilan_county: '出生地：宜蘭縣',\n    hualien_county: '出生地：花蓮縣',\n    taitung_county: '出生地：臺東縣',\n    penghu_county: '出生地：澎湖縣',\n    kinmen_county: '出生地：金門縣',\n    lienchiang_county: '出生地：連江縣',\n    hong_kong: '香港',\n  },\n  'zh-CN': {\n    '110000': '出生地：11 北京市',\n    '120000': '出生地：12 天津市',\n    '130000': '出生地：13 河北省',\n    '140000': '出生地：14 山西省',\n    '150000': '出生地：15 内蒙古自治区',\n    '210000': '出生地：21 辽宁省',\n    '220000': '出生地：22 吉林省',\n    '230000': '出生地：23 黑龙江省',\n    '310000': '出生地：31 上海市',\n    '320000': '出生地：32 江苏省',\n    '330000': '出生地：33 浙江省',\n    '340000': '出生地：34 安徽省',\n    '350000': '出生地：35 福建省',\n    '360000': '出生地：36 江西省',\n    '370000': '出生地：37 山东省',\n    '410000': '出生地：41 河南省',\n    '420000': '出生地：42 湖北省',\n    '430000': '出生地：43 湖南省',\n    '440000': '出生地：44 广东省',\n    '450000': '出生地：45 广西壮族自治区',\n    '460000': '出生地：46 海南省',\n    '500000': '出生地：50 重庆市',\n    '510000': '出生地：51 四川省',\n    '520000': '出生地：52 贵州省',\n    '530000': '出生地：53 云南省',\n    '540000': '出生地：54 西藏自治区',\n    '610000': '出生地：61 陕西省',\n    '620000': '出生地：62 甘肃省',\n    '630000': '出生地：63 青海省',\n    '640000': '出生地：64 宁夏回族自治区',\n    '650000': '出生地：65 新疆维吾尔自治区',\n    '710000': '出生地：71 台湾省',\n    '810000': '出生地：81 香港特别行政区',\n    '820000': '出生地：82 澳门特别行政区',\n  },\n};\n\nexport const AGES = {\n  '': '',\n  teens: '< 19',\n  twenties: '19 - 29',\n  thirties: '30 - 39',\n  fourties: '40 - 49',\n  fifties: '50 - 59',\n  sixties: '60 - 69',\n  seventies: '70 - 79',\n  eighties: '80 - 89',\n  nineties: '> 89',\n};\n\nexport const SEXES = {\n  '': '',\n  male: 'Male',\n  female: 'Female',\n  other: 'Other',\n};\n","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { Redirect, RouteComponentProps, withRouter } from 'react-router';\nimport { useAction, useAPI } from '../../../../hooks/store-hooks';\nimport { NATIVE_NAMES } from '../../../../services/localization';\nimport { trackProfile } from '../../../../services/tracker';\nimport { ACCENTS, AGES, SEXES } from '../../../../stores/demographics';\nimport { Notifications } from '../../../../stores/notifications';\nimport { useTypedSelector } from '../../../../stores/tree';\nimport { Uploads } from '../../../../stores/uploads';\nimport { User } from '../../../../stores/user';\nimport URLS from '../../../../urls';\nimport { LocaleLink, useLocale } from '../../../locale-helpers';\nimport TermsModal from '../../../terms-modal';\nimport { DownIcon } from '../../../ui/icons';\nimport {\n  Button,\n  Hr,\n  LabeledCheckbox,\n  LabeledInput,\n  LabeledSelect,\n} from '../../../ui/ui';\nimport { isEnrolled } from '../../dashboard/challenge/constants';\n\nimport './info.css';\n\nconst pick = require('lodash.pick');\nconst { Tooltip } = require('react-tippy');\n\nconst Options = withLocalization(\n  ({\n    children,\n    getString,\n  }: {\n    children: { [key: string]: string };\n  } & WithLocalizationProps) => (\n    <>\n      {Object.entries(children).map(([key, value]) => (\n        <option key={key} value={key}>\n          {getString(key, null, value)}\n        </option>\n      ))}\n    </>\n  )\n);\n\ntype Locales = { locale: string; accent: string }[];\n\nfunction ProfilePage({\n  getString,\n  history,\n}: WithLocalizationProps & RouteComponentProps<any, any, any>) {\n  const api = useAPI();\n  const [locale, toLocaleRoute] = useLocale();\n  const user = useTypedSelector(({ user }) => user);\n  const { account, userClients } = user;\n\n  const addNotification = useAction(Notifications.actions.addPill);\n  const addUploads = useAction(Uploads.actions.add);\n  const saveAccount = useAction(User.actions.saveAccount);\n\n  const [userFields, setUserFields] = useState<{\n    username: string;\n    visible: number | string;\n    age: string;\n    gender: string;\n    sendEmails: boolean;\n    privacyAgreed: boolean;\n  }>({\n    username: '',\n    visible: 0,\n    age: '',\n    gender: '',\n    sendEmails: false,\n    privacyAgreed: false,\n  });\n  const {\n    username,\n    visible,\n    age,\n    gender,\n    sendEmails,\n    privacyAgreed,\n  } = userFields;\n  const [locales, setLocales] = useState<Locales>([]);\n  const [isInitialized, setIsInitialized] = useState(false);\n  const [isSaving, setIsSaving] = useState(false);\n  const [isSubmitted, setIsSubmitted] = useState(false);\n  const [showDemographicInfo, setShowDemographicInfo] = useState(false);\n  const [termsStatus, setTermsStatus] = useState<null | 'show' | 'agreed'>(\n    null\n  );\n  const isEnrolledInChallenge =\n    user?.userClients[0]?.enrollment || isEnrolled(account);\n\n  useEffect(() => {\n    if (user.isFetchingAccount || isInitialized) {\n      return;\n    }\n    setIsInitialized(true);\n\n    if (!account && userClients.length == 0) {\n      history.push('/');\n    }\n\n    setUserFields({\n      ...userFields,\n      sendEmails: !!account?.basket_token,\n      visible: 0,\n      ...pick(user, 'age', 'username', 'gender'),\n      ...(account\n        ? pick(account, 'age', 'username', 'gender', 'visible')\n        : {\n            age: userClients.reduce((init, u) => u.age || init, ''),\n            gender: userClients.reduce((init, u) => u.gender || init, ''),\n          }),\n      privacyAgreed: Boolean(account) || user.privacyAgreed,\n    });\n\n    let locales: Locales = [];\n    if (!account) {\n      locales = userClients.reduce(\n        (locales, u) => locales.concat(u.locales || []),\n        []\n      );\n      locales = locales.filter(\n        (l1, i) => i == locales.findIndex(l2 => l2.locale == l1.locale)\n      );\n    }\n    setLocales(account ? account.locales : locales);\n  }, [user]);\n\n  const handleChangeFor = (field: string) => ({\n    target,\n  }: React.ChangeEvent<any>) => {\n    setUserFields({\n      ...userFields,\n      [field]: target.type == 'checkbox' ? target.checked : target.value,\n    });\n  };\n\n  const submit = useCallback(() => {\n    if (!user.account) {\n      trackProfile('create', locale);\n\n      if (termsStatus == null) {\n        setTermsStatus('show');\n        return;\n      }\n    }\n\n    setIsSaving(true);\n    setIsSubmitted(true);\n    setTermsStatus('agreed');\n\n    const data = {\n      ...pick(userFields, 'username', 'age', 'gender'),\n      locales: locales.filter(l => l.locale),\n      visible: JSON.parse(visible.toString()),\n      client_id: user.userId,\n      enrollment: user.userClients[0].enrollment || {\n        team: null,\n        challenge: null,\n        invite: null,\n      },\n    };\n\n    addUploads([\n      async () => {\n        await saveAccount(data);\n        if (!user.account?.basket_token && sendEmails) {\n          await api.subscribeToNewsletter(user.userClients[0].email);\n        }\n\n        addNotification(getString('profile-form-submit-saved'));\n        setIsSaving(false);\n      },\n    ]);\n  }, [api, getString, locale, locales, termsStatus, user, userFields]);\n\n  if (!isInitialized) {\n    return null;\n  }\n\n  if (!isSaving && isSubmitted && isEnrolledInChallenge) {\n    return (\n      <Redirect\n        to={{\n          pathname: toLocaleRoute(URLS.DASHBOARD + URLS.CHALLENGE),\n          state: {\n            showOnboardingModal: true,\n            earlyEnroll: window.location.search.includes('achievement=1'),\n          },\n        }}\n      />\n    );\n  }\n\n  return (\n    <div className=\"profile-info\">\n      {termsStatus == 'show' && (\n        <TermsModal onAgree={submit} onDisagree={() => setTermsStatus(null)} />\n      )}\n      {!user.account && (\n        <Localized id=\"thanks-for-account\">\n          <h2 />\n        </Localized>\n      )}\n      <Localized id=\"why-profile-text\">\n        <p />\n      </Localized>\n\n      <div\n        className={\n          'demographic-info ' + (showDemographicInfo ? 'expanded' : '')\n        }>\n        <button\n          type=\"button\"\n          onClick={() => setShowDemographicInfo(!showDemographicInfo)}>\n          <Localized id=\"why-demographic\">\n            <span />\n          </Localized>\n\n          <DownIcon />\n        </button>\n        <Localized id=\"why-demographic-explanation\">\n          <div className=\"explanation\" />\n        </Localized>\n      </div>\n\n      <div className=\"form-fields\">\n        <Localized id=\"profile-form-username\" attrs={{ label: true }}>\n          <LabeledInput\n            value={username}\n            onChange={handleChangeFor('username')}\n          />\n        </Localized>\n\n        <Localized id=\"leaderboard-visibility\" attrs={{ label: true }}>\n          <LabeledSelect\n            value={visible.toString()}\n            onChange={handleChangeFor('visible')}>\n            <Localized id=\"hidden\">\n              <option value={0} />\n            </Localized>\n            <Localized id=\"visible\">\n              <option value={1} />\n            </Localized>\n            {isEnrolledInChallenge && (\n              <option value={2}>Visible within challenge team</option>\n            )}\n          </LabeledSelect>\n        </Localized>\n\n        <Localized id=\"profile-form-age\" attrs={{ label: true }}>\n          <LabeledSelect value={age} onChange={handleChangeFor('age')}>\n            <Options>{AGES}</Options>\n          </LabeledSelect>\n        </Localized>\n\n        <Localized id=\"profile-form-gender\" attrs={{ label: true }}>\n          <LabeledSelect value={gender} onChange={handleChangeFor('gender')}>\n            <Options>{SEXES}</Options>\n          </LabeledSelect>\n        </Localized>\n\n        {locales.map(({ locale, accent }, i) => (\n          <React.Fragment key={i}>\n            <Localized\n              id={\n                i == 0\n                  ? 'profile-form-native-language'\n                  : 'profile-form-additional-language'\n              }\n              attrs={{ label: true }}>\n              <LabeledSelect\n                value={locale}\n                onChange={({\n                  target: { value },\n                }: React.ChangeEvent<HTMLSelectElement>) => {\n                  const newLocales = locales.slice();\n                  newLocales[i] = { locale: value, accent: '' };\n                  if (!value) {\n                    newLocales.splice(i, 1);\n                  }\n                  setLocales(\n                    newLocales.filter(\n                      ({ locale }, i2) => i2 === i || locale !== value\n                    )\n                  );\n                }}>\n                <option value=\"\" />\n                {Object.entries(NATIVE_NAMES).map(([locale, name]) => (\n                  <option key={locale} value={locale}>\n                    {name}\n                  </option>\n                ))}\n              </LabeledSelect>\n            </Localized>\n            <Localized id=\"profile-form-accent\" attrs={{ label: true }}>\n              <LabeledSelect\n                value={accent}\n                onChange={({\n                  target: { value },\n                }: React.ChangeEvent<HTMLSelectElement>) => {\n                  const newLocales = locales.slice();\n                  newLocales[i].accent = value;\n                  setLocales(newLocales);\n                }}>\n                <option value=\"\" />\n                {ACCENTS[locale] && <Options>{ACCENTS[locale]}</Options>}\n              </LabeledSelect>\n            </Localized>\n          </React.Fragment>\n        ))}\n      </div>\n\n      <Button\n        className=\"add-language\"\n        outline\n        onClick={() => {\n          if (locales.length && !locales[locales.length - 1].locale) {\n            return;\n          }\n          setLocales(locales.concat({ locale: '', accent: '' }));\n        }}>\n        <Localized id=\"add-language\">\n          <span />\n        </Localized>\n        <span>+</span>\n      </Button>\n\n      <Hr />\n\n      {!user.account?.basket_token && (\n        <>\n          <div className=\"signup-section\">\n            <Tooltip\n              arrow\n              html={getString('change-email-setings')}\n              theme=\"grey-tooltip\">\n              <Localized id=\"email-input\" attrs={{ label: true }}>\n                <LabeledInput value={user.userClients[0].email} disabled />\n              </Localized>\n            </Tooltip>\n\n            <div className=\"checkboxes\">\n              <LabeledCheckbox\n                label={\n                  <>\n                    <Localized id=\"email-opt-in-info-title\">\n                      <strong />\n                    </Localized>\n                    <Localized id=\"email-opt-in-info-sub-with-challenge\">\n                      <span />\n                    </Localized>\n                  </>\n                }\n                onChange={handleChangeFor('sendEmails')}\n                checked={sendEmails}\n              />\n\n              {!user.account && !isSubmitted && (\n                <>\n                  <LabeledCheckbox\n                    label={\n                      <>\n                        <Localized id=\"accept-privacy-title\">\n                          <strong />\n                        </Localized>\n                        <Localized\n                          id=\"accept-privacy\"\n                          elems={{\n                            privacyLink: <LocaleLink to={URLS.PRIVACY} blank />,\n                          }}>\n                          <span />\n                        </Localized>\n                      </>\n                    }\n                    checked={privacyAgreed}\n                    onChange={handleChangeFor('privacyAgreed')}\n                  />\n\n                  <Localized id=\"read-terms-q\">\n                    <LocaleLink\n                      to={\n                        isEnrolledInChallenge\n                          ? URLS.CHALLENGE_TERMS\n                          : URLS.TERMS\n                      }\n                      className=\"terms\"\n                      blank\n                    />\n                  </Localized>\n                </>\n              )}\n            </div>\n          </div>\n\n          <Hr />\n        </>\n      )}\n\n      <Localized id=\"profile-form-submit-save\">\n        <Button\n          className=\"save\"\n          rounded\n          disabled={isSaving || !privacyAgreed}\n          onClick={submit}\n        />\n      </Localized>\n    </div>\n  );\n}\n\nexport default withLocalization(withRouter(ProfilePage));\n","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { useEffect } from 'react';\nimport { connect } from 'react-redux';\nimport { UserClient } from 'common';\nimport { Notifications } from '../../../../stores/notifications';\nimport StateTree from '../../../../stores/tree';\nimport { User } from '../../../../stores/user';\nimport URLS from '../../../../urls';\nimport { getManageSubscriptionURL } from '../../../../utility';\nimport { LocaleLink } from '../../../locale-helpers';\nimport { InfoIcon, PenIcon, SettingsIcon } from '../../../ui/icons';\nimport {\n  LabeledCheckbox,\n  LabeledInput,\n  LinkButton,\n  Toggle,\n} from '../../../ui/ui';\n\nimport './settings.css';\nimport { useIsSubscribed } from '../../../../hooks/store-hooks';\n\nconst Section = ({\n  title,\n  titleAction,\n  className = '',\n  children,\n  ...props\n}: {\n  title: string;\n  titleAction?: React.ReactNode;\n  className?: string;\n  children?: React.ReactNode;\n}) => (\n  <section className={'user-setting ' + className} {...props}>\n    <div className=\"section-title\">\n      <h2>{title}</h2>\n      {titleAction}\n    </div>\n    {children && <div className=\"section-body\">{children}</div>}\n  </section>\n);\n\ninterface PropsFromState {\n  account: UserClient;\n  locale: string;\n}\n\ninterface PropsFromDispatch {\n  addNotification: typeof Notifications.actions.addPill;\n  saveAccount: any;\n}\n\ninterface Props\n  extends WithLocalizationProps,\n    PropsFromState,\n    PropsFromDispatch {}\n\nfunction Settings(props: Props) {\n  const { account, addNotification, getString, saveAccount } = props;\n  const isSubscribed = useIsSubscribed();\n\n  useEffect(() => {\n    const { pathname, search } = location;\n    if (search.includes('success=false')) {\n      addNotification(\n        <Localized id=\"email-already-used\">\n          <span />\n        </Localized>,\n        'error'\n      );\n      history.replaceState({}, null, pathname);\n    } else if (search.includes('success=true')) {\n      addNotification(\n        <Localized id=\"profile-form-submit-saved\">\n          <span />\n        </Localized>\n      );\n      history.replaceState({}, null, pathname);\n    }\n  }, []);\n\n  return (\n    <div>\n      <Section title={getString('login-identity')} className=\"two-columns\">\n        <Localized id=\"email-input\" attrs={{ label: true }}>\n          <LabeledInput value={account.email} disabled />\n        </Localized>\n\n        <LinkButton\n          outline\n          className=\"edit-button\"\n          href={location.origin + '/login?change_email'}>\n          <PenIcon />\n          <Localized id=\"edit\">\n            <span />\n          </Localized>\n        </LinkButton>\n      </Section>\n\n      {account.basket_token && (\n        <Section\n          title={getString('email-subscriptions')}\n          titleAction={\n            <a\n              className=\"manage-subscriptions\"\n              href={getManageSubscriptionURL(account)}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\">\n              <Localized id=\"manage-subscriptions\">\n                <span />\n              </Localized>\n              <SettingsIcon />\n            </a>\n          }>\n          <div className=\"email-section\">\n            {isSubscribed == null ? (\n              <div />\n            ) : (\n              <LabeledCheckbox\n                disabled={true}\n                checked={isSubscribed}\n                label={\n                  <Localized id=\"email-opt-in-info\">\n                    <span />\n                  </Localized>\n                }\n              />\n            )}\n            <div className=\"privacy-and-terms\">\n              <InfoIcon />\n              <div>\n                <Localized\n                  id=\"email-opt-in-privacy\"\n                  elems={{\n                    privacyLink: <LocaleLink to={URLS.PRIVACY} blank />,\n                  }}>\n                  <div />\n                </Localized>\n                <br />\n                <Localized id=\"read-terms-q\">\n                  <LocaleLink to={URLS.TERMS} className=\"terms\" blank />\n                </Localized>\n              </div>\n            </div>\n          </div>\n        </Section>\n      )}\n\n      <Section title={getString('contribution-experience')} className=\"box\">\n        <div>\n          <Localized id=\"skip-submission-feedback\">\n            <h3 className=\"feedback-toggle-title\" />\n          </Localized>\n          <Toggle\n            offText=\"off\"\n            onText=\"on\"\n            defaultChecked={account.skip_submission_feedback}\n            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>\n              saveAccount({\n                skip_submission_feedback: event.target.checked,\n              })\n            }\n          />\n          <Localized id=\"skip-submission-description\">\n            <p className=\"skip-submission-description\" />\n          </Localized>\n          <Localized id=\"skip-submission-note\">\n            <p className=\"skip-submission-note\" />\n          </Localized>\n        </div>\n\n        <div className=\"images\">\n          <img\n            className=\"hidden-sm-down\"\n            src={require('./submission-screenshot-lg.jpg')}\n            alt=\"Submission Success Screenshot\"\n          />\n          <img\n            className=\"hidden-md-up\"\n            src={require('./submission-screenshot-xs.jpg')}\n            alt=\"Submission Success Screenshot\"\n          />\n        </div>\n      </Section>\n    </div>\n  );\n}\n\nexport default connect<PropsFromState, PropsFromDispatch>(\n  ({ locale, user }: StateTree) => ({\n    account: user.account,\n    locale,\n  }),\n  {\n    addNotification: Notifications.actions.addPill,\n    saveAccount: User.actions.saveAccount,\n  }\n)(withLocalization(Settings));\n","import { Localized } from '@fluent/react';\nconst pick = require('lodash.pick');\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Redirect, Route, Switch } from 'react-router';\nimport { NavLink } from 'react-router-dom';\nimport { UserClient } from 'common';\nimport { User } from '../../../stores/user';\nimport StateTree from '../../../stores/tree';\nimport URLS from '../../../urls';\nimport { localeConnector, LocalePropsFromState } from '../../locale-helpers';\nimport {\n  BarChartIcon,\n  CameraIcon,\n  CloudIcon,\n  CogIcon,\n  TrashIcon,\n  UserIcon,\n  UserPlusIcon,\n} from '../../ui/icons';\nimport AvatarSetup from './avatar-setup/avatar-setup';\nimport DeleteProfile from './delete/delete';\nimport InfoPage from './info/info';\nimport Settings from './settings/settings';\n\nimport './layout.css';\n\nfunction downloadData(account: UserClient) {\n  const text = [\n    ...Object.entries(pick(account, 'email', 'username', 'age', 'gender')),\n    ...account.locales.reduce((all, l, i) => {\n      const localeLabel = 'language ' + (i + 1);\n      return [\n        ...all,\n        [localeLabel, l.locale],\n        [localeLabel + ' accent', l.accent],\n      ];\n    }, []),\n  ]\n    .map(([key, value]) => key + ': ' + value)\n    .join('\\n');\n\n  const element = document.createElement('a');\n  element.setAttribute(\n    'href',\n    'data:text/plain;charset=utf-8,' + encodeURIComponent(text)\n  );\n  element.setAttribute('download', 'profile.txt');\n\n  element.style.display = 'none';\n  document.body.appendChild(element);\n\n  element.click();\n\n  document.body.removeChild(element);\n}\n\ninterface PropsFromState {\n  user: User.State;\n}\n\ninterface Props extends LocalePropsFromState, PropsFromState {}\n\nconst Layout = ({ toLocaleRoute, user }: Props) => {\n  const [infoRoute, avatarRoute, prefRoute, deleteRoute] = [\n    URLS.PROFILE_INFO,\n    URLS.PROFILE_AVATAR,\n    URLS.PROFILE_SETTINGS,\n    URLS.PROFILE_DELETE,\n  ].map(r => toLocaleRoute(r));\n  return (\n    <div className=\"profile-layout\">\n      <div className=\"profile-nav\">\n        <div className=\"links\">\n          {[\n            {\n              route: infoRoute,\n              ...(user.account\n                ? { icon: <UserIcon />, id: 'profile' }\n                : { icon: <UserPlusIcon />, id: 'build-profile' }),\n            },\n            { route: avatarRoute, icon: <CameraIcon />, id: 'avatar' },\n            { route: prefRoute, icon: <CogIcon />, id: 'settings' },\n            {\n              route: deleteRoute,\n              icon: <TrashIcon />,\n              id: 'profile-form-delete',\n            },\n          ]\n            .slice(0, user.account ? Infinity : 1)\n            .map(({ route, icon, id }) => (\n              <NavLink key={route} to={route}>\n                {icon}\n                <Localized id={id}>\n                  <span className=\"text\" />\n                </Localized>\n              </NavLink>\n            ))}\n          {user.account && (\n            <a onClick={() => downloadData(user.account)} href=\"#\">\n              <CloudIcon />\n              <Localized id=\"download-profile\">\n                <span className=\"text\" />\n              </Localized>\n            </a>\n          )}\n        </div>\n      </div>\n      <div className=\"content\">\n        <Switch>\n          <Route exact path={infoRoute} component={InfoPage} />\n          {[\n            { route: avatarRoute, Component: AvatarSetup },\n            { route: prefRoute, Component: Settings },\n            { route: deleteRoute, Component: DeleteProfile },\n          ].map(({ route, Component }) => (\n            <Route\n              key={route}\n              exact\n              path={route}\n              render={props =>\n                user.account ? <Component /> : <Redirect to={infoRoute} />\n              }\n            />\n          ))}\n          <Route\n            render={() => <Redirect to={toLocaleRoute(URLS.PROFILE_INFO)} />}\n          />\n        </Switch>\n      </div>\n    </div>\n  );\n};\n\nexport default connect<PropsFromState>(({ user }: StateTree) => ({ user }))(\n  localeConnector(Layout)\n);\n"],"sourceRoot":""}