{"version":3,"sources":["components/api-address-form/ApiAddressForm.js","icons/GlyphDots.js","components/cli-tutor-mode/CliTutorMode.js","icons/GlyphPin.js","settings/editor/theme/ipfs_dark.js","lib/i18n.js","icons/StrokeSpeaker.js","components/language-selector/language-modal/LanguageModal.js","components/language-selector/LanguageSelector.js","components/pinning-manager/pinning-manager-service-modal/PinningManagerServiceModal.js","components/pinning-manager/pinning-manager-modal/PinningManagerModal.js","components/pinning-manager/auto-upload-modal/AutoUploadModal.js","helpers/Portal.js","components/context-menu/ContextMenu.js","components/context-menu/ContextMenuItem.js","icons/StrokeCancel.js","icons/StrokeExternalLink.js","icons/StrokeCloud.js","components/pinning-manager/PinningManager.js","components/public-gateway-form/PublicGatewayForm.js","settings/editor/JsonEditor.js","components/experiments/ExperimentsPanel.js","settings/SettingsPage.js","components/modal/Modal.js","components/tour/withTour.js","components/shell/Shell.js","components/overlay/Overlay.js","icons/StrokeCode.js","icons/StrokeDownload.js"],"names":["asAPIString","value","JSON","stringify","connect","withTranslation","t","doUpdateIpfsApiAddress","ipfsApiAddress","ipfsInitFailed","useState","setValue","initialIsValidApiAddress","checkValidAPIAddress","showFailState","setShowFailState","isValidApiAddress","setIsValidApiAddress","useEffect","isValid","onSubmit","event","a","preventDefault","id","aria-label","placeholder","type","className","onChange","target","onKeyPress","key","minWidth","height","disabled","GlyphDots","props","viewBox","d","CliTutorialModal","command","onLeave","downloadConfig","onCancel","style","maxWidth","Icon","StrokeCode","lineHeight","cliCommandList","cliCmdKeys","UPDATE_IPFS_CONFIG","startsWith","cliCmdPrefixes","PIN_OBJECT","title","bg","onClick","cmd","navigator","clipboard","writeText","then","defaultProps","filesPage","isCliTutorModeEnabled","isCliTutorModalOpen","config","showIcon","doOpenCliTutorModal","show","url","window","URL","createObjectURL","Blob","link","document","createElement","display","href","download","body","appendChild","click","revokeObjectURL","GlyphPin","ace","define","acequire","exports","module","isDark","cssClass","cssText","importCssString","getLanguage","localeCode","info","languages","lang","split","nativeName","en","englishName","StrokeSpeaker","LanguageModal","tReady","isIpfsDesktop","doDesktopUpdateLanguage","Modal","SpeakerIcon","localesList","map","i18n","changeLanguage","handleClick","locale","rel","justify","Button","LanguageSelector","state","isLanguageModalOpen","onLanguageEditOpen","setState","onLanguageEditClose","this","language","Overlay","Component","PinningManagerServiceModal","onSuccess","service","doAddPinningService","nickname","apiEndpoint","visitServiceUrl","secretApiKey","useForm","defaultValues","register","errors","clearErrors","setError","handleSubmit","inputClass","data","console","error","message","icon","name","src","alt","objectFit","htmlFor","ref","required","classNames","text","pattern","autoComplete","apiValidation","Trans","i18nKey","ErrorMsg","top","left","PinningManagerModal","remoteServiceTemplates","pinningServicesDefaults","selectedService","setSelectedService","onModalClose","selectedServiceInfo","width","hidden","AutoUploadModal","doSetAutoUploadForService","autoUpload","Portal","children","zIndex","el","useRef","getElementById","current","parentElement","dynamic","removeChild","createPortal","memo","ContextMenu","visible","arrowAlign","arrowMarginRight","onDismiss","containerRef","coordinates","setCoordinates","useLayoutEffect","calculateCoordinates","getBoundingClientRect","addEventListener","requestAnimationFrame","removeEventListener","firstButton","querySelector","focus","offsetLeft","getOffsetLeftByArrowAlignment","open","boxShadow","translateX","role","ContextMenuItem","StrokeCancel","StrokeExternalLink","StrokeCloud","PinningManager","pinningServices","ipfsReady","arePinningServicesSupported","doFetchPinningServices","doPinsStatsGet","doRemovePinningService","pinsSize","numberOfPins","isModalOpen","setModalOpen","isToggleModalOpen","setToggleModalOpen","onToggleModalOpen","onToggleModalClose","sortBy","sortDirection","SortDirection","ASC","sortSettings","setSortSettings","localPinning","useMemo","totalSize","sortedServices","sort","sortByProperty","sortedList","disableHeight","headerClassName","length","headerHeight","rowHeight","rowCount","rowGetter","index","rowClassName","label","dataKey","flexShrink","flexGrow","cellRenderer","ServiceCell","rowData","find","s","colors","iconClass","rowIndex","online","NumberOfPinsCell","AutoUploadCell","OptionsCell","buttonRef","isContextVisible","setContextVisibility","showAutoUpload","includes","doUpdatePublicGateway","publicGateway","initialIsValidGatewayUrl","checkValidHttpUrl","isValidGatewayUrl","setIsValidGatewayUrl","checkViaImgSrc","onReset","DEFAULT_GATEWAY","JsonEditor","readOnly","Math","max","mode","theme","fontSize","showPrintMargin","showGutter","editorProps","$blockScrolling","Infinity","setOptions","showLineNumbers","tabSize","React","doExpToggleAction","experiments","tkey","selector","Box","Title","actionUrls","enabled","blocked","Checkbox","checked","action","i","SettingsPage","isIpfsConnected","ipfsPendingFirstConnection","isConfigBlocked","isLoading","isSaving","hasSaveFailed","hasSaveSucceded","hasErrors","hasLocalChanges","hasExternalChanges","onSave","editorKey","analyticsEnabled","doToggleAnalytics","toursEnabled","handleJoyrideCallback","doToggleCliTutorMode","data-id","Helmet","background","ComponentLoader","ApiAddressForm","AnalyticsToggle","CliTutorMode","run","steps","settingsTour","getSteps","styles","callback","continuous","scrollToFirstStep","getJoyrideLocales","showProgress","SaveButton","danger","transform","SettingsInfo","SettingsPageContainer","editableConfig","Date","now","isValidJson","doSaveConfig","str","parse","err","msSinceEpoch","prevProps","configSaveLastSuccess","setTimeout","isRecent","ipfsConnected","configIsLoading","configLastError","configIsSaving","configSaveLastError","TranslatedSettingsPage","withTour","ModalActions","backgroundColor","ModalBody","WrappedComponent","WithTour","doDisableTours","status","STATUS","FINISHED","Shell","renderBackdrop","onKeyDown","e","stopPropagation","nativeEvent","stopImmediatePropagation","onBackdropClick","cx","cy","r","StrokeDownload"],"mappings":"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","file":"static/js/10.7339f08d.chunk.js","sourcesContent":["import React, { useState, useEffect } from 'react'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation } from 'react-i18next'\nimport Button from '../button/Button'\nimport { checkValidAPIAddress } from '../../bundles/ipfs-provider'\n\nconst ApiAddressForm = ({ t, doUpdateIpfsApiAddress, ipfsApiAddress, ipfsInitFailed }) => {\n  const [value, setValue] = useState(asAPIString(ipfsApiAddress))\n  const initialIsValidApiAddress = !checkValidAPIAddress(value)\n  const [showFailState, setShowFailState] = useState(initialIsValidApiAddress || ipfsInitFailed)\n  const [isValidApiAddress, setIsValidApiAddress] = useState(initialIsValidApiAddress)\n\n  // Updates the border of the input to indicate validity\n  useEffect(() => {\n    setShowFailState(ipfsInitFailed)\n  }, [isValidApiAddress, ipfsInitFailed])\n\n  // Updates the border of the input to indicate validity\n  useEffect(() => {\n    const isValid = checkValidAPIAddress(value)\n    setIsValidApiAddress(isValid)\n    setShowFailState(!isValid)\n  }, [value])\n\n  const onChange = (event) => setValue(event.target.value)\n\n  const onSubmit = async (event) => {\n    event.preventDefault()\n    doUpdateIpfsApiAddress(value)\n  }\n\n  const onKeyPress = (event) => {\n    if (event.key === 'Enter') {\n      onSubmit(event)\n    }\n  }\n\n  return (\n    <form onSubmit={onSubmit}>\n      <input\n        id='api-address'\n        aria-label={t('terms.apiAddress')}\n        placeholder={t('apiAddressForm.placeholder')}\n        type='text'\n        className={`w-100 lh-copy monospace f5 pl1 pv1 mb2 charcoal input-reset ba b--black-20 br1 ${showFailState ? 'focus-outline-red b--red-muted' : 'focus-outline-green b--green-muted'}`}\n        onChange={onChange}\n        onKeyPress={onKeyPress}\n        value={value}\n      />\n      <div className='tr'>\n        <Button\n          minWidth={100}\n          height={40}\n          className='mt2 mt0-l ml2-l tc'\n          disabled={!isValidApiAddress || value === ipfsApiAddress}>\n          {t('actions.submit')}\n        </Button>\n      </div>\n    </form>\n  )\n}\n\n/**\n * @returns {string}\n */\nconst asAPIString = (value) => {\n  if (value == null) return ''\n  if (typeof value === 'string') return value\n  return JSON.stringify(value)\n}\n\nexport default connect(\n  'doUpdateIpfsApiAddress',\n  'selectIpfsApiAddress',\n  'selectIpfsInitFailed',\n  withTranslation('app')(ApiAddressForm)\n)\n","import React from 'react'\n\nconst GlyphDots = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M75 50c0-3.75 1.25-6.25 3.75-8.75s5.625-3.75 8.75-3.75c3.75 0 6.25 1.25 8.75 3.75S100 46.875 100 50s-1.25 6.25-3.75 8.75-5.625 3.75-8.75 3.75-6.25-1.25-8.75-3.75S75 53.125 75 50zm-37.5 0c0-3.75 1.25-6.25 3.75-8.75S46.875 37.5 50 37.5c3.75 0 6.25 1.25 8.75 3.75S62.5 46.875 62.5 50s-1.25 6.25-3.75 8.75S53.125 62.5 50 62.5s-6.25-1.25-8.75-3.75S37.5 53.125 37.5 50zM0 50c0-3.75 1.25-6.25 3.75-8.75s5.625-3.75 8.75-3.75c3.75 0 6.25 1.25 8.75 3.75S25 46.875 25 50s-1.25 6.25-3.75 8.75-5.625 3.75-8.75 3.75-6.25-1.25-8.75-3.75S0 53.125 0 50z' />\n  </svg>\n)\n\nexport default GlyphDots\n","import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect } from 'redux-bundler-react'\n\n// Components\nimport { Modal, ModalBody, ModalActions } from '../modal/Modal'\nimport StrokeCode from '../../icons/StrokeCode'\nimport Button from '../button/Button'\nimport Overlay from '../overlay/Overlay'\nimport Shell from '../shell/Shell'\nimport StrokeDownload from '../../icons/StrokeDownload'\nimport { cliCmdKeys, cliCommandList, cliCmdPrefixes } from '../../bundles/files/consts'\n\nexport const CliTutorialModal = ({ command, t, onLeave, className, downloadConfig, ...props }) => {\n  const onClickCopyToClipboard = (cmd) => {\n    navigator.clipboard.writeText(cmd).then(() => {\n      onLeave()\n    })\n  }\n\n  return (\n    <Modal {...props} className={className} onCancel={onLeave} style={{ maxWidth: '40em' }}>\n      <ModalBody Icon={StrokeCode}>\n        <p className='charcoal w-80 center' style={{ lineHeight: '1.3' }}>\n          {t('app:cliModal.description')}\n        </p>\n        <p className='charcoal-muted w-90 center'>\n          { command && command === cliCommandList[cliCmdKeys.UPDATE_IPFS_CONFIG]() ? t('settings:cliModal.extraNotesJsonConfig') : ''}\n          { command && command.startsWith(cliCmdPrefixes.PIN_OBJECT) ? t('files:cliModal.extraNotesPinning') : ''}\n        </p>\n        <div>\n          <Shell className='tl' title=\"Shell\">\n            <code className='db'><b className='no-select'>$ </b>{command}</code>\n          </Shell>\n        </div>\n      </ModalBody>\n\n      <ModalActions>\n        <div>\n          <Button className='ma2 tc' bg='bg-gray' onClick={onLeave}>{t('app:actions.close')}</Button>\n        </div>\n        <div className='flex items-center'>\n          {\n            command && command === cliCommandList[cliCmdKeys.UPDATE_IPFS_CONFIG]()\n              ? <StrokeDownload onClick={downloadConfig} className='dib fill-link pointer' style={{ height: 38 }}\n              /> : <div />\n          }\n          <Button className='ma2 tc' onClick={() => onClickCopyToClipboard(command)}>\n            {t('app:actions.copy')}\n          </Button>\n        </div>\n      </ModalActions>\n    </Modal>\n  )\n}\n\nconst CliTutorMode = ({\n  t, filesPage, isCliTutorModeEnabled, onLeave, isCliTutorModalOpen, command, config, showIcon, doOpenCliTutorModal\n}) => {\n  const downloadConfig = (config) => {\n    const url = window.URL.createObjectURL(new Blob([config]))\n    const link = document.createElement('a')\n    link.style.display = 'none'\n    link.href = url\n    link.download = 'settings.json'\n    document.body.appendChild(link)\n    link.click()\n    window.URL.revokeObjectURL(url)\n  }\n\n  if (isCliTutorModeEnabled) {\n    if (filesPage) {\n      return <CliTutorialModal className='outline-0' onLeave={onLeave} t={t} command={command}/>\n    }\n    return (\n      <Fragment>\n        {\n          showIcon\n            ? <StrokeCode onClick={() => doOpenCliTutorModal(true)} className='dib fill-link pointer mh2' style={{ height: 44 }}/>\n            : <div/>\n        }\n        <Overlay show={isCliTutorModalOpen} onLeave={() => doOpenCliTutorModal(false)}>\n          <CliTutorialModal className='outline-0' onLeave={() => doOpenCliTutorModal(false)} t={t} command={command}\n            downloadConfig={() => downloadConfig(config)}/>\n        </Overlay>\n      </Fragment>\n    )\n  }\n\n  return null\n}\n\nCliTutorialModal.propTypes = {\n  onLeave: PropTypes.func.isRequired,\n  t: PropTypes.func.isRequired,\n  command: PropTypes.string.isRequired\n}\n\nCliTutorialModal.defaultProps = {\n  className: ''\n}\n\nexport default connect(\n  'doOpenCliTutorModal',\n  'selectIsCliTutorModalOpen',\n  'selectIsCliTutorModeEnabled',\n  CliTutorMode\n)\n","import React from 'react'\n\nconst GlyphPin = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M41.72 58.28l-2.05-2.04-4.08 4.09-8.18 8.17-4.09 4.09-2.04 6.13 6.13-2.04 4.09-4.09 8.17-8.17 4.09-4.09-2.04-2.05z' />\n    <path d='M78 43.51a1 1 0 0 0 .45-1.64L68.28 31.72l-2-2-8.11-8.1a1 1 0 0 0-1.64.45 22.66 22.66 0 0 0-.88 5.64.89.89 0 0 1-.27.65L39.6 44.05a.93.93 0 0 1-.81.26 23.39 23.39 0 0 0-8.52.45 1 1 0 0 0-.44 1.64l11.89 11.88L53.6 70.17a1 1 0 0 0 1.64-.44 23.39 23.39 0 0 0 .45-8.52.93.93 0 0 1 .31-.81l15.69-15.74a.89.89 0 0 1 .65-.27 22.66 22.66 0 0 0 5.66-.88z' />\n  </svg>\n)\n\nexport default GlyphPin\n","/* global ace */\n// modified from https://github.com/thlorenz/brace/blob/master/theme/solarized_dark.js\nace.define('ace/theme/ipfs_dark', ['require', 'exports', 'module', 'ace/lib/dom'], function (acequire, exports, module) {\n  exports.isDark = true\n  exports.cssClass = 'ace-ipfs-dark'\n  exports.cssText = `\n  .ace-ipfs-dark .ace_gutter {\n  background: #0b3a53;\n  color: #9ad4db;\n  }\n  .ace-ipfs-dark .ace_print-margin {\n  width: 1px;\n  background: #69c4cd;\n  }\n  .ace-ipfs-dark {\n  background-color: #0b3a53;\n  color: #9ad4db;\n  }\n  .ace-ipfs-dark .ace_entity.ace_other.ace_attribute-name,\n  .ace-ipfs-dark .ace_storage {\n  color: #f7f8fa;\n  }\n  .ace-ipfs-dark .ace_rparen,\n  .ace-ipfs-dark .ace_lparen {\n    color: #9ad4db;\n  }\n  .ace-ipfs-dark .ace_cursor,\n  .ace-ipfs-dark .ace_string.ace_regexp {\n  color: #ea5037\n  }\n  .ace-ipfs-dark .ace_marker-layer .ace_active-line,\n  .ace-ipfs-dark .ace_marker-layer .ace_selection {\n  background: rgba(255, 255, 255, 0.1)\n  }\n  .ace-ipfs-dark.ace_multiselect .ace_selection.ace_start {\n  box-shadow: 0 0 3px 0px #244e66;\n  }\n  .ace-ipfs-dark .ace_marker-layer .ace_step {\n  background: rgb(102, 82, 0)\n  }\n  .ace-ipfs-dark .ace_marker-layer .ace_bracket {\n  margin: -1px 0 0 -1px;\n  border: 1px solid rgba(147, 161, 161, 0.50)\n  }\n  .ace-ipfs-dark .ace_gutter-active-line {\n  background-color: #244e66\n  }\n  .ace-ipfs-dark .ace_marker-layer .ace_selected-word {\n  border: 1px solid #244e66\n  }\n  .ace-ipfs-dark .ace_invisible {\n  color: rgba(147, 161, 161, 0.50)\n  }\n  .ace-ipfs-dark .ace_keyword,\n  .ace-ipfs-dark .ace_meta,\n  .ace-ipfs-dark .ace_support.ace_class,\n  .ace-ipfs-dark .ace_support.ace_type {\n  color: #0aca9f\n  }\n  .ace-ipfs-dark .ace_constant.ace_character,\n  .ace-ipfs-dark .ace_constant.ace_other {\n  color: #f36149\n  }\n  .ace-ipfs-dark .ace_constant.ace_language {\n  color: #f9a13e\n  }\n  .ace-ipfs-dark .ace_constant.ace_numeric {\n  color: #f39021\n  }\n  .ace-ipfs-dark .ace_fold {\n  background-color: #69c4cd;\n  border-color: #93A1A1\n  }\n  .ace-ipfs-dark .ace_entity.ace_name.ace_function,\n  .ace-ipfs-dark .ace_entity.ace_name.ace_tag,\n  .ace-ipfs-dark .ace_support.ace_function,\n  .ace-ipfs-dark .ace_variable,\n  .ace-ipfs-dark .ace_variable.ace_language {\n  color: #edf0f4\n  }\n  .ace-ipfs-dark .ace_string {\n  color: #0aca9f\n  }\n  .ace-ipfs-dark .ace_comment {\n  font-style: italic;\n  color: #657B83\n  }\n  .ace-ipfs-dark .ace_indent-guide {\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\n  }`\n\n  var dom = acequire('../lib/dom')\n  dom.importCssString(exports.cssText, exports.cssClass)\n})\n","import i18n from '../i18n'\n// languages.json generated from our locale dir via https://github.com/olizilla/lol\nimport languages from './languages.json'\n\nexport const getCurrentLanguage = () => {\n  return getLanguage(i18n.language)\n}\n\nexport const getLanguage = (localeCode) => {\n  if (!localeCode) return 'Unknown'\n\n  const info = languages[localeCode]\n\n  if (!info) {\n    // if we haven't got the info in the `languages.json` we split it to get the language\n    const lang = languages[localeCode.split('-')[0]]\n    // if we have the language we add it, else we fallback to english (Web UI default lang)\n    return (lang && lang.nativeName) || languages.en.englishName\n  }\n\n  return info.nativeName\n}\n","import React from 'react'\n\nconst StrokeSpeaker = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M76.1 16.42c-.81 0-23.86 4.63-43.07 8.52a13.27 13.27 0 0 1-1.48.16c-4.6.39-15.38 1.3-15.38 16.56 0 9.6 4.68 14.68 9.42 16.42l.06 17.67a7.78 7.78 0 0 0 7.5 7.83c2.93 0 9.79 0 9.79-5.08v-.14L40.93 58h5.2c.65.15 3.4.84 6.55 1.62 20.32 5.05 22.75 5.6 23.26 5.6 7.37 0 12.72-10.19 12.72-24.28 0-14.22-5.28-24.52-12.56-24.52zM46 55a30.82 30.82 0 0 1-3.85-14.81 30.46 30.46 0 0 1 3.75-14.67l-.16-.08c8.34-1.68 16.93-3.4 22.86-4.57-3.17 3.82-5.32 10.3-5.65 17.91 0 .68-.05 1.37-.05 2.07v2c.31 7.34 2.31 13.63 5.29 17.51-4.8-1.18-10.77-2.66-14.84-3.68C46.53 55 46.53 55 46.3 55zm30.17-35.58c5.33.09 9.49 9.49 9.49 21.48v.1c0 11.85-4.22 21.15-9.64 21.24-.5-.08-2.5-.55-5.2-1.21-2.48-2.29-4.46-6.39-5.54-11.46 3.08-.09 5.48-3.92 5.48-8.8s-2.38-8.68-5.44-8.77c1.14-5.22 3.25-9.4 5.86-11.6 2.73-.57 4.55-.92 4.99-.98zm-11.12 14h.12c2.22 0 4.09 3.34 4.09 7.3s-1.87 7.31-4.09 7.31H65a41.13 41.13 0 0 1-.58-5.34v-3.77a43.13 43.13 0 0 1 .63-5.46zm-31.9 47.16a4.8 4.8 0 0 1-4.5-4.83l-.06-17.84 9.29-.37 2.06 21c-.08 1.81-3.66 2.04-6.79 2.04zM39.28 55a1.51 1.51 0 0 0-1.11.49v.05l-10 .4a1.4 1.4 0 0 0-.67-.41c-1.39-.36-8.29-2.7-8.29-13.86 0-12.5 8.22-13.19 12.63-13.57a15.6 15.6 0 0 0 1.83-.21l10.43-2.12a31.71 31.71 0 0 0-3.46 14.41A32.29 32.29 0 0 0 44.28 55z' />\n  </svg>\n)\n\nexport default StrokeSpeaker\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { connect } from 'redux-bundler-react'\nimport i18n, { localesList } from '../../../i18n'\n\n// Components\nimport { Modal, ModalBody, ModalActions } from '../../modal/Modal'\nimport SpeakerIcon from '../../../icons/StrokeSpeaker'\nimport Button from '../../button/Button'\n\nconst LanguageModal = ({ t, tReady, onLeave, link, className, isIpfsDesktop, doDesktopUpdateLanguage, ...props }) => {\n  const handleClick = (lang) => {\n    i18n.changeLanguage(lang)\n    if (isIpfsDesktop) {\n      doDesktopUpdateLanguage(lang)\n    }\n    onLeave()\n  }\n\n  return (\n    <Modal {...props} className={className} onCancel={onLeave} style={{ maxWidth: '40em' }}>\n      <ModalBody Icon={SpeakerIcon}>\n        <p className='charcoal w-80 center'>{t('languageModal.description')}</p>\n        <div className='pa2 flex flex-wrap'>\n          { localesList.map((lang) =>\n            <button\n              key={`lang-${lang.locale}`}\n              className='pa2 w-33 flex nowrap bg-transparent bn outline-0 blue justify-center'\n              onClick={() => handleClick(lang.locale)}>\n              { lang.nativeName }\n            </button>\n          )}\n        </div>\n        <p className='lh-copy charcoal f6'>\n          {t('languageModal.translationProjectIntro')}<br/>\n          <a href=\"https://www.transifex.com/ipfs/public/\" rel=\"noopener noreferrer\" target=\"_blank\" className=\"link blue\">{t('languageModal.translationProjectLink')}</a>\n        </p>\n      </ModalBody>\n\n      <ModalActions justify=\"center\">\n        <Button className='ma2 tc' bg='bg-gray' onClick={onLeave}>{t('app:actions.close')}</Button>\n      </ModalActions>\n    </Modal>\n  )\n}\n\nLanguageModal.propTypes = {\n  onLeave: PropTypes.func.isRequired,\n  t: PropTypes.func.isRequired,\n  tReady: PropTypes.bool\n}\n\nLanguageModal.defaultProps = {\n  className: ''\n}\n\nexport default connect(\n  'selectIsIpfsDesktop',\n  'doDesktopUpdateLanguage',\n  LanguageModal\n)\n","import React, { Component, Fragment } from 'react'\nimport { getCurrentLanguage } from '../../lib/i18n'\n\n// Components\nimport Button from '../button/Button'\nimport Overlay from '../overlay/Overlay'\nimport LanguageModal from './language-modal/LanguageModal'\n\nclass LanguageSelector extends Component {\n  state = { isLanguageModalOpen: false }\n\n  onLanguageEditOpen = () => this.setState({ isLanguageModalOpen: true })\n\n  onLanguageEditClose = () => this.setState({ isLanguageModalOpen: false })\n\n  render () {\n    const { t } = this.props\n\n    return (\n      <Fragment>\n        <div className='flex'>\n          <div className='pr4 flex items-center lh-copy charcoal f5 fw5' style={{ height: 40 }}>\n            {getCurrentLanguage()}\n          </div>\n          <Button className=\"tc\" bg='bg-teal' minWidth={100} onClick={this.onLanguageEditOpen}>\n            {t('app:actions.change')}\n          </Button>\n        </div>\n\n        <Overlay show={this.state.isLanguageModalOpen} onLeave={this.onLanguageEditClose} >\n          <LanguageModal className='outline-0' onLeave={this.onLanguageEditClose} t={t} />\n        </Overlay>\n      </Fragment>\n    )\n  }\n}\n\nexport default LanguageSelector\n","import React from 'react'\nimport classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation, Trans } from 'react-i18next'\nimport { useForm } from 'react-hook-form'\n\n// Components\nimport { Modal, ModalBody, ModalActions } from '../../modal/Modal'\nimport Button from '../../button/Button'\nimport './PinningManagerServiceModal.css'\n\nconst PinningManagerServiceModal = ({ t, onLeave, onSuccess, className, service, tReady, doAddPinningService, nickname, apiEndpoint, visitServiceUrl, secretApiKey, ...props }) => {\n  const { register, errors, clearErrors, setError, handleSubmit } = useForm({\n    defaultValues: {\n      nickname,\n      apiEndpoint,\n      secretApiKey: null\n    }\n  })\n  const inputClass = 'w-100 lh-copy f5 ph2 pv1 input-reset ba b--black-20 br1 focus-outline'\n  const onSubmit = async data => {\n    try {\n      await doAddPinningService(data)\n      onSuccess()\n    } catch (error) {\n      console.error(error)\n      setError('apiValidation', {\n        type: 'manual',\n        message: error.message\n      })\n    }\n  }\n  const cleanErrors = () => {\n    clearErrors('apiValidation')\n  }\n\n  return (\n    <Modal {...props} className={className} onCancel={onLeave} style={{ maxWidth: '34em' }}>\n      <form onSubmit={handleSubmit(onSubmit)} onChange={cleanErrors}>\n        <ModalBody>\n          <p>{ t('pinningServiceModal.title') }</p>\n\n          <div className='pa2 pinningManagerServiceModalContainer'>\n            { service.icon && service.name && (\n              <>\n                <label>\n                  { t('pinningServiceModal.service') }\n                </label>\n                <div className=\"flex w-100 items-center\">\n                  <img className=\"mr3\" src={service.icon} alt={service.name} height={42} style={{ objectFit: 'contain' }} />\n                  <span>{ service.name }</span>\n                </div>\n              </>\n            )}\n\n            <label htmlFor=\"cm-nickname\">\n              { t('pinningServiceModal.nickname') }\n            </label>\n            <div className='relative'>\n              <input id='cm-nickname'\n                name='nickname'\n                ref={ register({ required: true }) }\n                type='text'\n                className={ classNames(inputClass, errors.nickname ? 'bg-red white' : 'charcoal') }\n                placeholder={ t('pinningServiceModal.nicknamePlaceholder') }\n              />\n              {errors.nickname && (<ErrorMsg text={ t('errors.nickname') }/>)}\n            </div>\n\n            <label htmlFor=\"cm-apiEndpoint\">\n              { t('pinningServiceModal.apiEndpoint') }\n            </label>\n            <div className='relative'>\n              <input id='cm-apiEndpoint'\n                name='apiEndpoint'\n                ref={ register({ required: true, pattern: 'http(s){0,1}://.*' }) }\n                type='url'\n                className={ classNames(inputClass, errors.apiEndpoint ? 'bg-red white' : 'charcoal') }\n                placeholder={ t('pinningServiceModal.apiEndpointPlaceholder') }\n              />\n              {errors.apiEndpoint && (<ErrorMsg text={`${t('errors.apiError')}: ${t('errors.apiEndpoint')}`}/>)}\n            </div>\n\n            <label htmlFor=\"cm-secretApiKey\">\n              { t('pinningServiceModal.secretApiKey') }\n              { service.icon && service.name && visitServiceUrl && (\n                <a className='f7 link pv0 lh-copy dib' href={ visitServiceUrl } rel='noopener noreferrer' target=\"_blank\"> { t('pinningServiceModal.secretApiKeyHowToLink') }</a>\n              )}\n            </label>\n            <div className='relative'>\n              <input id='cm-secretApiKey'\n                ref={ register({ required: true }) }\n                name='secretApiKey'\n                type='password'\n                autoComplete='off'\n                className={ classNames(inputClass, errors.secretApiKey ? 'bg-red white' : 'charcoal') }\n                placeholder=\"••••••••••••••••••••\"\n              />\n              {errors.secretApiKey && (<ErrorMsg text={ t('errors.secretApiKey') }/>)}\n            </div>\n          </div>\n          <div>\n            { errors.apiValidation && <p className='red f5 ttc'>{ errors.apiValidation.message}</p> }\n          </div>\n          <p className='f6'>\n            <Trans i18nKey=\"pinningServiceModal.description\" t={t}>\n              Want to make your custom pinning service available to others?\n              <a href='https://docs.ipfs.io/how-to/work-with-pinning-services/' rel='noopener noreferrer' target=\"_blank\" className='pv0 dib link' type='link'>Learn how.</a>\n            </Trans>\n          </p>\n        </ModalBody>\n\n        <ModalActions justify=\"center\" className='flex flex-row-reverse'>\n          {/* Button that actually submits the form needs to be first in HTML, that's why we reverse the order with css */}\n          <Button className='ma2 tc' type=\"submit\">{t('actions.save')}</Button>\n          <Button className='ma2 tc' bg='bg-gray' onClick={onLeave}>{t('actions.cancel')}</Button>\n        </ModalActions>\n      </form>\n    </Modal>\n  )\n}\n\nPinningManagerServiceModal.propTypes = {\n  className: PropTypes.string,\n  nickname: PropTypes.string,\n  apiEndpoint: PropTypes.string,\n  t: PropTypes.func.isRequired,\n  onLeave: PropTypes.func.isRequired,\n  onSuccess: PropTypes.func.isRequired\n}\n\nPinningManagerServiceModal.defaultProps = {\n  className: '',\n  nickname: null,\n  apiEndpoint: null\n}\n\nconst ErrorMsg = ({ text }) => (<p className='red absolute f7' style={{ top: 26, left: 2 }}>{text}</p>)\n\nexport default connect(\n  'doAddPinningService',\n  withTranslation('settings')(PinningManagerServiceModal)\n)\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation, Trans } from 'react-i18next'\nimport PinningServiceModal from '../pinning-manager-service-modal/PinningManagerServiceModal'\nimport './PinningManagerModal.css'\n\n// Components\nimport { Modal, ModalBody, ModalActions } from '../../modal/Modal'\nimport Button from '../../button/Button'\nimport Overlay from '../../overlay/Overlay'\n\nconst PinningManagerModal = ({ t, tReady, onLeave, className, remoteServiceTemplates, pinningServicesDefaults, ...props }) => {\n  const [selectedService, setSelectedService] = useState(false)\n\n  const onCustomModalOpen = () => setSelectedService({ type: 'CUSTOM' })\n  const onModalClose = () => setSelectedService(false)\n  const onSuccess = () => {\n    setSelectedService(false)\n    onLeave()\n  }\n\n  const selectedServiceInfo = pinningServicesDefaults[selectedService.name] || {}\n\n  return (\n    <Modal {...props} className={className} onCancel={onLeave} style={{ maxWidth: '34em' }}>\n      <ModalBody>\n        <p>{ t('pinningModal.title') }</p>\n        <div className='pa2 pinningManagerModalContainer'>\n          { remoteServiceTemplates.map(({ icon, name }) => (\n            <button className=\"flex items-center pinningManagerModalItem pa1 hoverable-button\" key={name} onClick={() => setSelectedService({ name, icon })}>\n              <img className=\"mr3\" src={icon} alt={name} width={42} height={42} style={{ objectFit: 'contain' }} />\n              <p>{ name }</p>\n            </button>\n          ))}\n        </div>\n        <p className='flex items-center justify-center'>\n          <Trans i18nKey=\"pinningModal.description\" t={t}>\n          Don’t see your pinning service provider? <Button className='pv0' type='link' onClick={onCustomModalOpen}>Add a custom one.</Button>\n          </Trans>\n        </p>\n      </ModalBody>\n\n      <ModalActions justify=\"center\">\n        <Button className='ma2 tc' bg='bg-gray' onClick={onLeave}>{t('actions.cancel')}</Button>\n      </ModalActions>\n\n      <Overlay show={!!selectedService} onLeave={onModalClose} hidden>\n        <PinningServiceModal className='outline-0' service={selectedService} onSuccess={onSuccess} onLeave={onModalClose} nickname={selectedServiceInfo.nickname} apiEndpoint={selectedServiceInfo.apiEndpoint} visitServiceUrl={selectedServiceInfo.visitServiceUrl} t={t} />\n      </Overlay>\n    </Modal>\n  )\n}\n\nPinningManagerModal.propTypes = {\n  t: PropTypes.func.isRequired,\n  onLeave: PropTypes.func.isRequired\n}\n\nPinningManagerModal.defaultProps = {\n  className: ''\n}\n\nexport default connect(\n  'selectRemoteServiceTemplates',\n  'selectPinningServicesDefaults',\n  withTranslation('settings')(PinningManagerModal)\n)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation } from 'react-i18next'\n\n// Components\nimport { Modal, ModalBody, ModalActions } from '../../modal/Modal'\nimport Button from '../../button/Button'\n\nconst AutoUploadModal = ({ name, service, t, onLeave, doSetAutoUploadForService, className, ...props }) => {\n  const onToggle = () => {\n    doSetAutoUploadForService(name)\n    onLeave()\n  }\n\n  return (\n    <Modal {...props} className={className} onCancel={onLeave} style={{ maxWidth: '34em' }}>\n      <ModalBody>\n        <p>{ t('autoUploadModal.title', { name }) }</p>\n        <div className='pa2 AutoUploadModalContainer'>{t('autoUploadModal.description')}</div>\n      </ModalBody>\n\n      <ModalActions justify=\"center\">\n        <Button className='ma2 tc' bg='bg-teal' onClick={onToggle}>{service.autoUpload ? t('actions.disable') : t('actions.enable') }</Button>\n        <Button className='ma2 tc' bg='bg-gray' onClick={onLeave}>{t('actions.cancel')}</Button>\n      </ModalActions>\n    </Modal>\n  )\n}\n\nAutoUploadModal.propTypes = {\n  t: PropTypes.func.isRequired,\n  onLeave: PropTypes.func.isRequired\n}\n\nAutoUploadModal.defaultProps = {\n  className: ''\n}\n\nexport default connect(\n  'doSetAutoUploadForService',\n  withTranslation('settings')(AutoUploadModal)\n)\n","import { memo, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nconst Portal = ({ id, children, zIndex }) => {\n  const el = useRef(document.getElementById(id) || document.createElement('div'))\n  const [dynamic] = useState(!el.current.parentElement)\n\n  useEffect(() => {\n    if (dynamic) {\n      el.current.id = id\n      zIndex && (el.current.style.zIndex = zIndex)\n      document.body.appendChild(el.current)\n    }\n    return () => {\n      if (dynamic && el.current.parentElement) {\n        // eslint-disable-next-line react-hooks/exhaustive-deps\n        el.current.parentElement.removeChild(el.current)\n      }\n    }\n  }, [dynamic, id, zIndex])\n  return createPortal(children, el.current)\n}\nexport default memo(Portal)\n","import React, { useRef, useState, useLayoutEffect, useEffect } from 'react'\nimport classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport { DropdownMenu } from '@tableflip/react-dropdown'\nimport Portal from '../../helpers/Portal'\n\n/**\n * Shows a context menu with specified children elements relative to a target element\n *\n * Important: Child elements should contain role=\"listitem\" to allow for better acessibiity\n * @component\n * @example\n * <ContextMenu>\n *  <button role=\"listitem\">1</button>\n *  <button role=\"listitem\" onClick={stuff}>2</button>\n * </ContextMenu>\n */\nconst ContextMenu = ({ className, children, target, visible, arrowAlign, arrowMarginRight, onDismiss }) => {\n  const containerRef = useRef()\n  const [coordinates, setCoordinates] = useState({})\n\n  useLayoutEffect(() => {\n    const calculateCoordinates = () => {\n      if (!target?.current) return\n      const { top, left, width, height } = target.current.getBoundingClientRect()\n      setCoordinates({ top, left, width, height })\n    }\n\n    calculateCoordinates()\n\n    const event = window.addEventListener('scroll', () => {\n      requestAnimationFrame(() => calculateCoordinates())\n    })\n\n    return () => window.removeEventListener('scroll', event)\n  }, [target, visible])\n\n  useEffect(() => {\n    if (!target?.current) return\n\n    const firstButton = target.current.querySelector('[role=\"menuitem\"]')\n    firstButton && firstButton.focus()\n  }, [target, visible])\n\n  if (!visible || !target || !target.current) return null\n\n  const offsetLeft = getOffsetLeftByArrowAlignment(arrowAlign, { ...coordinates, arrowMarginRight })\n\n  return (\n    <Portal id=\"portal-dropdown\">\n      <div className={ classNames('absolute', className) } style={{\n        top: coordinates.top,\n        left: coordinates.left\n      }}>\n        <DropdownMenu\n          open={ visible }\n          className='sans-serif br2 charcoal'\n          boxShadow='rgba(105, 196, 205, 0.5) 0px 1px 10px 0px'\n          width='auto'\n          arrowAlign={arrowAlign || 'center'}\n          arrowMarginRight={`${arrowMarginRight}px`}\n          top={coordinates.height}\n          left={-coordinates.width - offsetLeft}\n          translateX={-coordinates.width}\n          onDismiss={ onDismiss }>\n          <div className='flex flex-column pa2' ref={containerRef} role=\"menu\">\n            {children}\n          </div>\n        </DropdownMenu>\n      </div>\n    </Portal>\n  )\n}\n\nContextMenu.propTypes = {\n  arrowAlign: PropTypes.string,\n  children: PropTypes.arrayOf(PropTypes.element).isRequired,\n  visible: PropTypes.bool,\n  target: PropTypes.shape({ current: PropTypes.instanceOf(Element) }),\n  onDismiss: PropTypes.func,\n  arrowMarginRight: PropTypes.number\n}\n\nContextMenu.defaultProps = {\n  arrowMarginRight: 13\n}\n\nconst getOffsetLeftByArrowAlignment = (arrowAlign, { width, arrowMarginRight }) => {\n  switch (arrowAlign) {\n    case 'right':\n      return width + (arrowMarginRight * 2)\n    default:\n      return 0\n  }\n}\n\nexport default ContextMenu\n","import React from 'react'\nimport classNames from 'classnames'\n\nconst ContextMenuItem = ({ className, children, ...props }) => (\n  <button className={ classNames(className, 'flex items-center nowrap') } role=\"menuitem\" {...props}>\n    { children }\n  </button>\n)\n\nexport default ContextMenuItem\n","import React from 'react'\n\nconst StrokeCancel = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M52 18.81A31.19 31.19 0 1 0 83.19 50 31.22 31.22 0 0 0 52 18.81zm0 59.78A28.59 28.59 0 1 1 80.59 50 28.63 28.63 0 0 1 52 78.59z' />\n    <path d='M66.33 40.3a.75.75 0 0 0-.22-.53l-3.88-3.88a.74.74 0 0 0-1.06 0L52 45.06l-9.17-9.17a.74.74 0 0 0-1.06 0l-3.88 3.88a.75.75 0 0 0 0 1.06L47.06 50l-9.17 9.17a.75.75 0 0 0 0 1.06l3.88 3.88a.74.74 0 0 0 1.06 0L52 54.94l9.17 9.17a.74.74 0 0 0 .53.22.73.73 0 0 0 .53-.22l3.88-3.88a.75.75 0 0 0 0-1.06L56.94 50l9.17-9.17a.75.75 0 0 0 .22-.53zm-11 9.17a.75.75 0 0 0 0 1.06l9.17 9.17-2.8 2.82-9.17-9.17a.75.75 0 0 0-1.06 0l-9.17 9.17-2.82-2.82 9.17-9.17a.75.75 0 0 0 0-1.06l-9.17-9.17 2.82-2.82 9.17 9.17a.75.75 0 0 0 1.06 0l9.17-9.17 2.82 2.82z' />\n  </svg>\n)\n\nexport default StrokeCancel\n","import React from 'react'\n\nconst StrokeExternalLink = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d=\"M75.4 49.9c-.9 0-1.6.7-1.6 1.6v21.8c0 1.5-.6 2.9-1.7 4s-2.5 1.7-4 1.7h-40c-1.5 0-2.9-.6-4-1.7s-1.7-2.5-1.7-4v-40c0-1.5.6-2.9 1.7-4s2.5-1.7 4-1.7h21.8c.9 0 1.6-.7 1.6-1.6s-.7-1.6-1.6-1.6H28.1c-2.4 0-4.6.9-6.3 2.6-1.7 1.7-2.6 3.9-2.6 6.3v40c0 2.4.9 4.6 2.6 6.3 1.7 1.7 3.9 2.6 6.3 2.6h40c2.4 0 4.6-.9 6.3-2.6 1.7-1.7 2.6-3.9 2.6-6.3V51.5c0-.9-.7-1.6-1.6-1.6z\"/><path d=\"M83.8 19.3V19v-.2-.2c0-.1-.1-.1-.1-.2 0 0 0-.1-.1-.1-.1-.1-.1-.2-.2-.2l-.2-.2s-.1 0-.1-.1l-.1-.1c-.1 0-.1 0-.2-.1H60.3c-.9 0-1.6.7-1.6 1.6s.7 1.6 1.6 1.6h17.9l-25.8 26c-.6.6-.6 1.7 0 2.3.3.3.7.5 1.1.5s.8-.2 1.1-.5l25.8-25.8v17.9c0 .9.7 1.6 1.6 1.6s1.6-.7 1.6-1.6l.2-21.9z\"/>\n  </svg>\n)\n\nexport default StrokeExternalLink\n","import React from 'react'\n\nconst StrokeCloud = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d=\"M76.53 44.5a12.83 12.83 0 00-3.81.57 14.07 14.07 0 00-13.88-13.3 13.7 13.7 0 00-9.12 3.49 17 17 0 00-14.78-8.67A17.25 17.25 0 0018 42 14.84 14.84 0 006.33 56.6c0 13.89 11.56 16.81 13.84 16.81h56.2c5.21 0 12.47-7.37 12.47-14.62 0-7.03-4.61-14.29-12.31-14.29zm-.16 25.91H20.22c-.11 0-10.89-1.26-10.89-13.81a11.89 11.89 0 018-11.32C19.046 44.687 21 45 21 45v-2.25a14 14 0 0127-4.29l1 2.32 1.58-1.94a10.8 10.8 0 018.36-4 11.09 11.09 0 017.686 3.37c2.021 2.088 2.497 4.573 3.124 7.79.265 1.362.25 2 .4 3.53l1.73-.91a9.86 9.86 0 014.65-1.16c5.83 0 9.31 5.74 9.31 11.29 0 6.04-6.51 11.66-9.47 11.66z\"/>\n  </svg>\n)\n\nexport default StrokeCloud\n","import React, { Fragment, useEffect, useState, useMemo, useRef } from 'react'\nimport { connect } from 'redux-bundler-react'\nimport { AutoSizer, Table, Column, SortDirection } from 'react-virtualized'\nimport { sortByProperty } from '../../lib/sort'\n\n// Components\nimport Button from '../button/Button'\nimport Overlay from '../overlay/Overlay'\nimport PinningModal from './pinning-manager-modal/PinningManagerModal'\nimport AutoUploadModal from './auto-upload-modal/AutoUploadModal'\nimport GlyphPin from '../../icons/GlyphPin'\nimport ContextMenu from '../context-menu/ContextMenu'\nimport ContextMenuItem from '../context-menu/ContextMenuItem'\nimport GlyphDots from '../../icons/GlyphDots'\nimport StrokeCancel from '../../icons/StrokeCancel'\nimport StrokeExternalLink from '../../icons/StrokeExternalLink'\nimport StrokeCloud from '../../icons/StrokeCloud'\n\nimport './PinningManager.css'\n\nconst ROW_HEIGHT = 50\nconst HEADER_HEIGHT = 32\n\nexport const PinningManager = ({ pinningServices, ipfsReady, arePinningServicesSupported, doFetchPinningServices, doPinsStatsGet, doRemovePinningService, pinsSize, numberOfPins, t }) => {\n  const [isModalOpen, setModalOpen] = useState(false)\n  const [isToggleModalOpen, setToggleModalOpen] = useState(false)\n  const onModalOpen = () => setModalOpen(true)\n  const onModalClose = () => setModalOpen(false)\n  const onToggleModalOpen = (name) => setToggleModalOpen(name)\n  const onToggleModalClose = () => setToggleModalOpen(false)\n\n  const [sortSettings, setSortSettings] = useState({\n    sortBy: 'addedAt',\n    sortDirection: SortDirection.ASC\n  })\n  useEffect(() => {\n    (async () => {\n      try {\n        ipfsReady && await doPinsStatsGet()\n      } catch (e) {\n        console.error('doPinsStatsGet error', e)\n      }\n    })()\n  }, [doPinsStatsGet, ipfsReady])\n\n  useEffect(() => {\n    ipfsReady && doFetchPinningServices()\n  }, [ipfsReady, doFetchPinningServices])\n\n  const localPinning = useMemo(() =>\n    ({ name: t('localPinning'), type: 'LOCAL', totalSize: pinsSize, numberOfPins }),\n  [numberOfPins, pinsSize, t])\n\n  const sortedServices = useMemo(() =>\n    (pinningServices || []).sort(sortByProperty(sortSettings.sortBy, sortSettings.sortDirection === SortDirection.ASC ? 1 : -1)),\n  [pinningServices, sortSettings.sortBy, sortSettings.sortDirection])\n\n  const sortedList = useMemo(() => [localPinning, ...sortedServices], [localPinning, sortedServices])\n  return (\n    <Fragment>\n      <div className=\"mv4 pinningManager\">\n        <div className='ph1 ph3-l flex items-center bg-white lh-copy charcoal f6 fw5'>\n          <AutoSizer disableHeight>\n            {({ width }) => (\n              <Table\n                className='tl fw4 w-100 f6'\n                headerClassName='gray ttc fw4 f6 ph2'\n                width={width}\n                height={(sortedList.length + 1) * ROW_HEIGHT}\n                headerHeight={HEADER_HEIGHT}\n                rowHeight={ROW_HEIGHT}\n                rowCount={sortedList.length}\n                rowGetter={({ index }) => sortedList[index]}\n                rowClassName='bb b--light-gray mt2'\n                sort={(...sortArgs) => setSortSettings(...sortArgs)}\n                sortBy={sortSettings.sortBy}\n                sortDirection={sortSettings.sortDirection}>\n                <Column label={t('service')} title={t('service')} dataKey='name' width={width * 0.4} flexShrink={0} flexGrow={1} cellRenderer={ServiceCell} className='charcoal truncate f6' />\n                {/* <Column label={t('size')} title={t('size')} dataKey='totalSize' width={width * 0.2} flexShrink={0} cellRenderer={({ rowData }) => <SizeCell rowData={rowData} t={t}/>} className='charcoal truncate f6 pl2' /> */}\n                <Column label={t('pins')} title={t('pins')} dataKey='numberOfPins' width={width * 0.2} flexShrink={1} cellRenderer={({ rowData }) => <NumberOfPinsCell rowData={rowData} t={t}/>} className='charcoal truncate f6 pl2' />\n                <Column label={t('autoUpload')} title={t('autoUpload')} dataKey='autoUpload' width={width * 0.2} flexShrink={1} cellRenderer={({ rowData }) => <AutoUploadCell autoUpload={rowData.autoUpload} type={rowData.type} name={rowData.name} visitServiceUrl={rowData.visitServiceUrl} doRemovePinningService={doRemovePinningService} t={t} onToggleModalOpen={onToggleModalOpen} />} className='pinningManagerColumn charcoal truncate f6 pl2' />\n              </Table>\n            )}\n          </AutoSizer>\n        </div>\n        { arePinningServicesSupported &&\n        (<div className='flex justify-end w-100 mt2'>\n          <Button className=\"tc mt2\" bg='bg-navy' onClick={onModalOpen}>\n            <span><span className=\"aqua\">+</span> {t('actions.addService')}</span>\n          </Button>\n        </div>\n        )}\n      </div>\n\n      <Overlay show={isToggleModalOpen} onLeave={onToggleModalClose}>\n        <AutoUploadModal className='outline-0' onLeave={() => {\n          onToggleModalClose()\n          doFetchPinningServices()\n        }} t={t} name={isToggleModalOpen} service={sortedServices.find(s => s.name === isToggleModalOpen)} />\n      </Overlay>\n\n      <Overlay show={isModalOpen} onLeave={onModalClose}>\n        <PinningModal className='outline-0' onLeave={() => {\n          onModalClose()\n          doFetchPinningServices()\n        }} t={t} />\n      </Overlay>\n    </Fragment>\n  )\n}\n\nPinningManager.defaultProps = {\n  pinningServices: []\n}\n\nconst serviceOnline = (s) => (s.type === 'LOCAL' || s.online)\n\nconst Icon = ({ rowData, index }) => {\n  const colors = ['aqua', 'link', 'yellow', 'teal', 'red', 'green', 'navy', 'gray', 'charcoal']\n  const color = colors[index % colors.length]\n  const iconClass = `mr2 pr1 fill-${color} flex-shrink-0`\n\n  if (rowData.icon) {\n    return <img src={rowData.icon} alt={rowData.name} width=\"28\" height=\"28\" className={iconClass} style={{ objectFit: 'contain' }} />\n  }\n  return <GlyphPin width=\"28\" height=\"28\" className={iconClass} />\n}\n\nconst ServiceCell = ({ rowData, rowIndex }) => (\n  <div className='flex items-center' title={rowData.name}>\n    <Icon rowData={rowData} index={rowIndex}/>\n    <span className={serviceOnline(rowData) ? 'truncate' : 'truncate red'}>{ rowData.name }</span>\n  </div>\n)\n\n// const SizeCell = ({ rowData, t }) => (\n//   <p className={ !rowData.totalSize ? 'gray nowrap' : 'nowrap'}>{ !rowData.totalSize\n//     ? `${(t('app:terms:loading'))}...`\n//     : humanSize(rowData.totalSize || 0, {\n//       round: rowData.totalSize >= 1073741824 ? 1 : 0, spacer: ''\n//     })}</p>\n// )\nconst NumberOfPinsCell = ({ rowData, t }) => {\n  if (rowData.numberOfPins < 0) {\n    return <div className='red help' title={t('errors.failedToFetchTitle')}>{t('errors.failedToFetch')}</div>\n  }\n  return <div className={rowData.numberOfPins >= 0 ? '' : 'gray'}>{rowData.numberOfPins >= 0 ? rowData.numberOfPins : `${(t('app:terms:loading'))}...`}</div>\n}\nconst AutoUploadCell = ({ autoUpload, visitServiceUrl, name, doRemovePinningService, t, type, onToggleModalOpen }) => (\n  <div className=\"flex justify-between items-center\">\n    <div className={!autoUpload ? 'gray' : ''}>{ typeof autoUpload !== 'undefined' ? t('autoUploadPolicy.' + autoUpload) : '-' }</div>\n    { type !== 'LOCAL' && <OptionsCell doRemovePinningService={doRemovePinningService} name={name} t={t} onToggleModalOpen={onToggleModalOpen} autoUpload={autoUpload} visitServiceUrl={visitServiceUrl} /> }\n  </div>\n)\n\nconst OptionsCell = ({ doRemovePinningService, name, visitServiceUrl, autoUpload, t, onToggleModalOpen }) => {\n  const buttonRef = useRef()\n  const [isContextVisible, setContextVisibility] = useState(false)\n\n  const handleRemove = () => {\n    doRemovePinningService(name)\n    setContextVisibility(false)\n  }\n\n  const showAutoUpload = !name.includes('.') // temporary mitigation for https://github.com/ipfs/ipfs-webui/issues/1770\n\n  return (\n    <div>\n      <button className=\"button-inside-focus\" onClick={() => setContextVisibility(true)} ref={buttonRef} aria-label={t('showOptions')}>\n        <GlyphDots width={24} className='fill-gray-muted hover-fill-gray transition-all'/>\n      </button>\n      <ContextMenu className=\"pv2 ph1\" style={{ zIndex: 1001 }} visible={isContextVisible}\n        target={buttonRef} onDismiss={() => setContextVisibility(false)} arrowAlign=\"right\">\n        { showAutoUpload && (\n          <ContextMenuItem className='pv2 ph1' onClick={ () => onToggleModalOpen(name) }>\n            <StrokeCloud width=\"28\" className='fill-aqua'/> <span className=\"ph1\">{autoUpload ? t('pinningServices.removeAutoUpload') : t('pinningServices.addAutoUpload')}</span>\n          </ContextMenuItem>)\n        }\n        { visitServiceUrl && (\n          <a className='link flex items-center' href={visitServiceUrl} target='_blank' rel='noopener noreferrer'>\n            <ContextMenuItem className='pv2 ph1' onClick={ () => setContextVisibility(false) }>\n              <StrokeExternalLink width=\"28\" className='fill-aqua'/> <span className=\"ph1 charcoal\">{t('visitService')}</span>\n            </ContextMenuItem>\n          </a>)\n        }\n        <ContextMenuItem className='pv2 ph1' onClick={ handleRemove }>\n          <StrokeCancel width=\"28\" className='fill-aqua'/> <span className=\"ph1\">{t('remove')}</span>\n        </ContextMenuItem>\n      </ContextMenu>\n    </div>\n\n  )\n}\n\nexport default connect(\n  'doPinsStatsGet',\n  'selectIpfsReady',\n  'selectPinsSize',\n  'selectNumberOfPins',\n  'selectPinningServices',\n  'selectArePinningServicesSupported',\n  'doFetchPinningServices',\n  'doRemovePinningService',\n  PinningManager\n)\n","import React, { useState, useEffect } from 'react'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation } from 'react-i18next'\nimport Button from '../button/Button'\nimport { checkValidHttpUrl, checkViaImgSrc, DEFAULT_GATEWAY } from '../../bundles/gateway'\n\nconst PublicGatewayForm = ({ t, doUpdatePublicGateway, publicGateway }) => {\n  const [value, setValue] = useState(publicGateway)\n  const initialIsValidGatewayUrl = !checkValidHttpUrl(value)\n  const [showFailState, setShowFailState] = useState(initialIsValidGatewayUrl)\n  const [isValidGatewayUrl, setIsValidGatewayUrl] = useState(initialIsValidGatewayUrl)\n\n  // Updates the border of the input to indicate validity\n  useEffect(() => {\n    setShowFailState(!isValidGatewayUrl)\n  }, [isValidGatewayUrl])\n\n  // Updates the border of the input to indicate validity\n  useEffect(() => {\n    const isValid = checkValidHttpUrl(value)\n    setIsValidGatewayUrl(isValid)\n    setShowFailState(!isValid)\n  }, [value])\n\n  const onChange = (event) => setValue(event.target.value)\n\n  const onSubmit = async (event) => {\n    event.preventDefault()\n\n    try {\n      await checkViaImgSrc(value)\n    } catch (e) {\n      setShowFailState(true)\n      return\n    }\n\n    doUpdatePublicGateway(value)\n  }\n\n  const onReset = async (event) => {\n    event.preventDefault()\n    setValue(DEFAULT_GATEWAY)\n    doUpdatePublicGateway(DEFAULT_GATEWAY)\n  }\n\n  const onKeyPress = (event) => {\n    if (event.key === 'Enter') {\n      onSubmit(event)\n    }\n  }\n\n  return (\n    <form onSubmit={onSubmit}>\n      <input\n        id='public-gateway'\n        aria-label={t('terms.publicGateway')}\n        placeholder={t('publicGatewayForm.placeholder')}\n        type='text'\n        className={`w-100 lh-copy monospace f5 pl1 pv1 mb2 charcoal input-reset ba b--black-20 br1 ${showFailState ? 'focus-outline-red b--red-muted' : 'focus-outline-green b--green-muted'}`}\n        onChange={onChange}\n        onKeyPress={onKeyPress}\n        value={value}\n      />\n      <div className='tr'>\n        <Button\n          minWidth={100}\n          height={40}\n          bg='bg-charcoal'\n          className='tc'\n          disabled={value === DEFAULT_GATEWAY}\n          onClick={onReset}>\n          {t('app:actions.reset')}\n        </Button>\n        <Button\n          minWidth={100}\n          height={40}\n          className='mt2 mt0-l ml2-l tc'\n          disabled={!isValidGatewayUrl || value === publicGateway}>\n          {t('actions.submit')}\n        </Button>\n      </div>\n    </form>\n  )\n}\n\nexport default connect(\n  'doUpdatePublicGateway',\n  'selectPublicGateway',\n  withTranslation('app')(PublicGatewayForm)\n)\n","import React from 'react'\nimport AceEditor from 'react-ace'\n\nimport 'brace/mode/json'\nimport './theme/ipfs_dark'\n\nclass JsonEditor extends React.Component {\n  render () {\n    const { value, readOnly, onChange } = this.props\n    const lineHeight = 16\n    const height = Math.max(500, value.split('\\n').length * lineHeight)\n\n    return (\n      <div className='pv3 bg-navy br2'>\n        <AceEditor\n          value={value}\n          readOnly={readOnly}\n          onChange={onChange}\n          mode='json'\n          theme='ipfs_dark'\n          width='100%'\n          height={height + 'px'}\n          fontSize={12}\n          showPrintMargin={false}\n          showGutter\n          editorProps={{ $blockScrolling: Infinity }}\n          setOptions={{ showLineNumbers: true, tabSize: 2 }} />\n      </div>\n    )\n  }\n}\n\nexport default JsonEditor\n","import React from 'react'\nimport { connect } from 'redux-bundler-react'\nimport Checkbox from '../checkbox/Checkbox'\nimport Box from '../box/Box'\nimport Title from '../../settings/Title'\n\nconst Experiments = ({ doExpToggleAction, experiments, t }) => {\n  // if there are no experiments to show don't render\n  if (experiments && experiments.length > 0) {\n    const tkey = (selector, key) =>\n      t(`Experiments.${key ? `${key}.${selector}` : `${selector}`}`)\n    return (\n      <Box className='mb3 pa4 lh-copy'>\n        <Title>{t('experiments')}</Title>\n        <p className='db mv4 f6 charcoal mw7'>{tkey('description')}</p>\n        <div className='flex flex-wrap pb3'>\n          {experiments.map(({ key, actionUrls, enabled, blocked }) => {\n            return (\n              <div\n                key={key}\n                className='pa3 mr3 mb3 mw6 br3 bg-white dib f6 ba b1 b--light-gray'\n              >\n                <h3>{tkey('title', key)}</h3>\n                <p className='charcoal'>{tkey('description', key)}</p>\n                <Checkbox\n                  className='dib'\n                  disabled={blocked}\n                  onChange={() => doExpToggleAction(key, enabled)}\n                  checked={enabled}\n                  label={<span className='fw5 f6'>{tkey('label', key)}</span>}\n                />\n                {actionUrls && (\n                  <div className='mv3'>\n                    {actionUrls.map((action, i) => (\n                      <a\n                        target='_blank'\n                        rel='noopener noreferrer'\n                        key={action.key}\n                        className={`link blue pr2 ${i > 0 &&\n                          'bl b1 pl2 b--light-gray'}`}\n                        href={action.url}\n                      >\n                        {tkey(action.key)}\n                      </a>\n                    ))}\n                  </div>\n                )}\n              </div>\n            )\n          })}\n        </div>\n      </Box>\n    )\n  } else {\n    return null\n  }\n}\n\nexport default connect(\n  'selectExperiments',\n  'doExpToggleAction',\n  Experiments\n)\n","import React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation, Trans } from 'react-i18next'\nimport ReactJoyride from 'react-joyride'\n// Tour\nimport { settingsTour } from '../lib/tours'\nimport withTour from '../components/tour/withTour'\nimport { getJoyrideLocales } from '../helpers/i8n'\n// Components\nimport Tick from '../icons/GlyphSmallTick'\nimport Box from '../components/box/Box'\nimport Button from '../components/button/Button'\nimport LanguageSelector from '../components/language-selector/LanguageSelector'\nimport PinningManager from '../components/pinning-manager/PinningManager'\nimport AnalyticsToggle from '../components/analytics-toggle/AnalyticsToggle'\nimport ApiAddressForm from '../components/api-address-form/ApiAddressForm'\nimport PublicGatewayForm from '../components/public-gateway-form/PublicGatewayForm'\nimport JsonEditor from './editor/JsonEditor'\nimport Experiments from '../components/experiments/ExperimentsPanel'\nimport Title from './Title'\nimport CliTutorMode from '../components/cli-tutor-mode/CliTutorMode'\nimport Checkbox from '../components/checkbox/Checkbox'\nimport ComponentLoader from '../loader/ComponentLoader.js'\nimport StrokeCode from '../icons/StrokeCode'\nimport { cliCmdKeys, cliCommandList } from '../bundles/files/consts'\n\nconst PAUSE_AFTER_SAVE_MS = 3000\n\nexport const SettingsPage = ({\n  t, tReady, isIpfsConnected, ipfsPendingFirstConnection, isIpfsDesktop,\n  isConfigBlocked, isLoading, isSaving, arePinningServicesSupported,\n  hasSaveFailed, hasSaveSucceded, hasErrors, hasLocalChanges, hasExternalChanges,\n  config, onChange, onReset, onSave, editorKey, analyticsEnabled, doToggleAnalytics,\n  toursEnabled, handleJoyrideCallback, isCliTutorModeEnabled, doToggleCliTutorMode, command\n}) => (\n  <div data-id='SettingsPage' className='mw9 center'>\n    <Helmet>\n      <title>{t('title')} | IPFS</title>\n    </Helmet>\n\n    {/* Enable a full screen loader after updating to a new IPFS API address.\n      * Will not show on consequent retries after a failure.\n      */}\n    { ipfsPendingFirstConnection\n      ? <div className=\"absolute flex items-center justify-center w-100 h-100\"\n        style={{ background: 'rgba(255, 255, 255, 0.5)', zIndex: '10' }}>\n        <ComponentLoader />\n      </div>\n      : null }\n\n    { isIpfsDesktop\n      ? null\n      : <Box className='mb3 pa4-l pa2 joyride-settings-customapi'>\n        <div className='lh-copy charcoal'>\n          <Title>{t('app:terms.apiAddress')}</Title>\n          <Trans i18nKey='apiDescription' t={t}>\n            <p>If your node is configured with a <a className='link blue' href='https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#addresses' target='_blank' rel='noopener noreferrer'>custom API address</a>, including a port other than the default 5001, enter it here.</p>\n          </Trans>\n          <ApiAddressForm/>\n        </div>\n      </Box> }\n\n    <Box className='mb3 pa4-l pa2'>\n      <div className='lh-copy charcoal'>\n        <Title>{t('app:terms.publicGateway')}</Title>\n        <Trans i18nKey='publicGatewayDescription' t={t}>\n          <p>Choose which <a className='link blue' href=\"http://docs.ipfs.io/concepts/ipfs-gateway/#public-gateways\" target='_blank' rel='noopener noreferrer'>public gateway</a> you want to use to open your files.</p>\n        </Trans>\n        <PublicGatewayForm/>\n      </div>\n    </Box>\n\n    <Box className='mb3 pa4-l pa2 joyride-settings-pinning'>\n      <Title>{t('pinningServices.title')}</Title>\n      <p className='ma0 mr2 lh-copy charcoal f6'>\n        { arePinningServicesSupported\n          ? t('pinningServices.description')\n          : t('pinningServices.noPinRemoteDescription')\n        }&nbsp;<a className='link blue' target='_blank' rel='noopener noreferrer' href='https://docs.ipfs.io/how-to/work-with-pinning-services/'>{t('learnMoreLink')}</a>\n      </p>\n      <PinningManager t={t} />\n    </Box>\n\n    <Box className='mb3 pa4-l pa2'>\n      <div className='mb4 joyride-settings-language'>\n        <Title>{t('language')}</Title>\n        <LanguageSelector t={t} />\n      </div>\n\n      <div className='joyride-settings-analytics'>\n        <Title>{t('analytics')}</Title>\n        <AnalyticsToggle t={t} doToggleAnalytics={doToggleAnalytics} analyticsEnabled={analyticsEnabled} />\n      </div>\n    </Box>\n\n    <Experiments t={t} />\n\n    <Box className='mb3 pa4-l pa2 joyride-settings-tutormode'>\n      <div className='charcoal'>\n        <Title>{t('cliTutorMode')}</Title>\n        <Checkbox className='dib' onChange={doToggleCliTutorMode} checked={isCliTutorModeEnabled}\n          label={<span className='f5 lh-copy'>{t('cliToggle.label')}</span>}/>\n        <Trans i18nKey='cliDescription' t={t}>\n          <p className='f6 mv2'>Enable this option to display a \"view code\" <StrokeCode className='dib v-mid icon mh1 fill-charcoal' viewBox='14 20 70 66' style={{ height: 24 }} /> icon next to common IPFS commands. Clicking it opens a modal with that command's CLI code, so you can paste it into the IPFS command-line interface in your terminal.</p>\n        </Trans>\n      </div>\n    </Box>\n\n    { isIpfsConnected &&\n    (<Box className='mb3 pa4-l pa2'>\n      <div className='joyride-settings-config'>\n        <Title>{t('config')}</Title>\n        <div className='flex pb3'>\n          <div className='flex-auto'>\n            <div className='mw7'>\n              <SettingsInfo\n                t={t}\n                tReady={tReady}\n                config={config}\n                isIpfsConnected={isIpfsConnected}\n                isConfigBlocked={isConfigBlocked}\n                isLoading={isLoading}\n                hasExternalChanges={hasExternalChanges}\n                hasSaveFailed={hasSaveFailed}\n                hasSaveSucceded={hasSaveSucceded} />\n            </div>\n          </div>\n          { config ? (\n            <div className='flex flex-column justify-center flex-row-l items-center-l'>\n              <CliTutorMode showIcon={true} config={config} t={t} command={command}/>\n              <Button\n                minWidth={100}\n                height={40}\n                bg='bg-charcoal'\n                className='tc'\n                disabled={isSaving || (!hasLocalChanges && !hasExternalChanges)}\n                onClick={onReset}>\n                {t('app:actions.reset')}\n              </Button>\n              <SaveButton\n                t={t}\n                tReady={tReady}\n                hasErrors={hasErrors}\n                hasSaveFailed={hasSaveFailed}\n                hasSaveSucceded={hasSaveSucceded}\n                hasLocalChanges={hasLocalChanges}\n                hasExternalChanges={hasExternalChanges}\n                isSaving={isSaving}\n                onClick={onSave} />\n            </div>\n          ) : null }\n        </div>\n      </div>\n      { config ? (\n        <JsonEditor\n          value={config}\n          onChange={onChange}\n          readOnly={isSaving}\n          key={editorKey} />\n      ) : null }\n    </Box>\n    )}\n\n    <ReactJoyride\n      run={toursEnabled}\n      steps={settingsTour.getSteps({ t, Trans })}\n      styles={settingsTour.styles}\n      callback={handleJoyrideCallback}\n      continuous\n      scrollToFirstStep\n      locale={getJoyrideLocales(t)}\n      showProgress />\n  </div>\n)\n\nconst SaveButton = ({ t, hasErrors, hasSaveFailed, hasSaveSucceded, isSaving, hasLocalChanges, hasExternalChanges, onClick }) => {\n  const bg = hasSaveSucceded ? 'bg-green' : 'bg-teal'\n  return (\n    <Button\n      minWidth={100}\n      height={40}\n      className='mt2 mt0-l ml2-l tc'\n      bg={bg}\n      disabled={!hasLocalChanges || hasErrors}\n      danger={hasSaveFailed || hasExternalChanges}\n      onClick={onClick}>\n      { hasSaveSucceded && !hasSaveFailed ? (\n        <Tick height={16} className='fill-snow' style={{ transform: 'scale(3)' }} />\n      ) : (\n        isSaving ? t('app:actions.saving') : t('app:actions.save')\n      )}\n    </Button>\n  )\n}\n\nconst SettingsInfo = ({ t, isIpfsConnected, isConfigBlocked, hasExternalChanges, hasSaveFailed, hasSaveSucceded, isLoading, config }) => {\n  if (isConfigBlocked) {\n    return (\n      <p className='ma0 lh-copy charcoal f5 mw7'>\n        {t('configApiNotAvailable')}\n      </p>\n    )\n  } else if (!isIpfsConnected) {\n    return (\n      <p className='ma0 lh-copy charcoal f5 mw7'>\n        {t('ipfsDaemonOffline')}\n      </p>\n    )\n  } else if (!config) {\n    return (\n      <p className='ma0 lh-copy charcoal f5 mw7'>\n        { isLoading ? t('fetchingSettings') : t('settingsUnavailable') }\n      </p>\n    )\n  } else if (hasExternalChanges) {\n    return (\n      <p className='ma0 lh-copy red f5 mw7'>\n        <Trans i18nKey='settingsHaveChanged' t={t}>\n          The settings have changed, please click <strong>Reset</strong> to update the editor contents\n        </Trans>\n      </p>\n    )\n  } else if (hasSaveFailed) {\n    return (\n      <p className='ma0 lh-copy red fw6 f5 mw7'>\n        {t('errorOccured')}\n        <span className='db fw4 f6 charcoal-muted'>{t('checkConsole')}</span>\n      </p>\n    )\n  } else if (hasSaveSucceded) {\n    return (\n      <p className='ma0 lh-copy green fw6 f5 mw7'>\n        {t('changesSaved')}\n        <span className='db fw4 f6 charcoal-muted'>{t('settingsWillBeUsedNextTime')}</span>\n      </p>\n    )\n  }\n  return (\n    <p className='ma0 mr2 lh-copy charcoal f5'>\n      {t('ipfsConfigDescription')} <a href='https://github.com/ipfs/go-ipfs/blob/master/docs/config.md' rel='noopener noreferrer' target='_blank' className='link blue'>{t('ipfsConfigHelp')}</a>\n    </p>\n  )\n}\n\nexport class SettingsPageContainer extends React.Component {\n  state = {\n    // valid json?\n    hasErrors: false,\n    // we edited it\n    hasLocalChanges: false,\n    // something else edited it\n    hasExternalChanges: false,\n    // mutable copy of the config\n    editableConfig: this.props.config,\n    // reset the editor on reset\n    editorKey: Date.now()\n  }\n\n  onChange = (value) => {\n    this.setState({\n      hasErrors: !this.isValidJson(value),\n      hasLocalChanges: this.props.config !== value,\n      editableConfig: value\n    })\n  }\n\n  onReset = () => {\n    this.setState({\n      hasErrors: false,\n      hasLocalChanges: false,\n      hasExternalChanges: false,\n      editableConfig: this.props.config,\n      editorKey: Date.now()\n    })\n  }\n\n  onSave = () => {\n    this.props.doSaveConfig(this.state.editableConfig)\n  }\n\n  isValidJson (str) {\n    try {\n      JSON.parse(str)\n      return true\n    } catch (err) {\n      return false\n    }\n  }\n\n  isRecent (msSinceEpoch) {\n    return msSinceEpoch > Date.now() - PAUSE_AFTER_SAVE_MS\n  }\n\n  componentDidUpdate (prevProps) {\n    if (this.props.configSaveLastSuccess !== prevProps.configSaveLastSuccess) {\n      setTimeout(() => this.onReset(), PAUSE_AFTER_SAVE_MS)\n    }\n    if (prevProps.config !== this.props.config) {\n      // no previous config, or we just saved.\n      if (!prevProps.config || this.isRecent(this.props.configSaveLastSuccess)) {\n        return this.setState({\n          editableConfig: this.props.config\n        })\n      }\n      // uh oh... something else edited the config while we were looking at it.\n      if (this.props.config !== this.state.editableConfig) {\n        return this.setState({\n          hasExternalChanges: true\n        })\n      }\n    }\n  }\n\n  render () {\n    const {\n      t, tReady, isConfigBlocked, ipfsConnected, configIsLoading, configLastError, configIsSaving, arePinningServicesSupported,\n      configSaveLastSuccess, configSaveLastError, isIpfsDesktop, analyticsEnabled, doToggleAnalytics, toursEnabled,\n      handleJoyrideCallback, isCliTutorModeEnabled, doToggleCliTutorMode, ipfsPendingFirstConnection\n    } = this.props\n    const { hasErrors, hasLocalChanges, hasExternalChanges, editableConfig, editorKey } = this.state\n    const hasSaveSucceded = this.isRecent(configSaveLastSuccess)\n    const hasSaveFailed = this.isRecent(configSaveLastError)\n    const isLoading = configIsLoading || (!editableConfig && !configLastError)\n\n    return (\n      <SettingsPage\n        t={t}\n        tReady={tReady}\n        isIpfsConnected={ipfsConnected}\n        ipfsPendingFirstConnection={ipfsPendingFirstConnection}\n        isConfigBlocked={isConfigBlocked}\n        isLoading={isLoading}\n        isSaving={configIsSaving}\n        arePinningServicesSupported={arePinningServicesSupported}\n        hasSaveFailed={hasSaveFailed}\n        hasSaveSucceded={hasSaveSucceded}\n        hasErrors={hasErrors}\n        hasLocalChanges={hasLocalChanges}\n        hasExternalChanges={hasExternalChanges}\n        config={editableConfig}\n        editorKey={editorKey}\n        onChange={this.onChange}\n        onReset={this.onReset}\n        onSave={this.onSave}\n        isIpfsDesktop={isIpfsDesktop}\n        analyticsEnabled={analyticsEnabled}\n        doToggleAnalytics={doToggleAnalytics}\n        toursEnabled={toursEnabled}\n        handleJoyrideCallback={handleJoyrideCallback}\n        doToggleCliTutorMode={doToggleCliTutorMode}\n        isCliTutorModeEnabled={isCliTutorModeEnabled}\n        command={cliCommandList[cliCmdKeys.UPDATE_IPFS_CONFIG]()}\n      />\n    )\n  }\n}\n\nexport const TranslatedSettingsPage = withTranslation('settings')(SettingsPageContainer)\n\nexport default connect(\n  'selectConfig',\n  'selectIpfsConnected',\n  'selectIpfsPendingFirstConnection',\n  'selectIsConfigBlocked',\n  'selectConfigLastError',\n  'selectConfigIsLoading',\n  'selectConfigIsSaving',\n  'selectConfigSaveLastSuccess',\n  'selectConfigSaveLastError',\n  'selectIsIpfsDesktop',\n  'selectToursEnabled',\n  'selectAnalyticsEnabled',\n  'selectArePinningServicesSupported',\n  'doToggleAnalytics',\n  'doSaveConfig',\n  'selectIsCliTutorModeEnabled',\n  'doToggleCliTutorMode',\n  withTour(TranslatedSettingsPage)\n)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport CancelIcon from '../../icons/GlyphSmallCancel'\n\nexport const ModalActions = ({ justify, className, children, ...props }) => (\n  <div className={`flex justify-${justify} pa2 ${className}`} style={{ backgroundColor: '#f4f6f8' }} {...props}>\n    { children }\n  </div>\n)\n\nModalActions.propTypes = {\n  justify: PropTypes.string,\n  className: PropTypes.string\n}\n\nModalActions.defaultProps = {\n  justify: 'between',\n  className: ''\n}\n\nexport const ModalBody = ({ className, Icon, title, children, ...props }) => (\n  <div className={`ph4 pv3 tc ${className}`} {...props}>\n    { Icon && (\n      <div className='center bg-snow br-100 flex justify-center items-center' style={{ width: '80px', height: '80px' }}>\n        {<Icon className='fill-gray w3'/>}\n      </div>\n    )}\n\n    <p className='charcoal fw6 truncate'>{title}</p>\n\n    {children}\n  </div>\n)\n\nModalBody.propTypes = {\n  Icon: PropTypes.func,\n  title: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.node\n  ])\n}\n\nModalBody.defaultProps = {\n  className: ''\n}\n\nexport const Modal = ({ onCancel, children, className, ...props }) => {\n  return (\n    <div className={`${className} bg-white w-80 shadow-4 sans-serif relative`} style={{ maxWidth: '34em' }} {...props}>\n      { onCancel &&\n        <CancelIcon className='absolute pointer w2 h2 top-0 right-0 fill-gray' onClick={onCancel} />\n      }\n\n      {children}\n    </div>\n  )\n}\n\nModal.propTypes = {\n  onCancel: PropTypes.func\n}\n\nModal.defaultProps = {\n  onCancel: null,\n  className: ''\n}\n\nexport default Modal\n","import React from 'react'\nimport { connect } from 'redux-bundler-react'\nimport { STATUS } from 'react-joyride'\n\nconst withTour = WrappedComponent => {\n  class WithTour extends React.Component {\n    handleJoyrideCallback = (data) => {\n      const { doDisableTours } = this.props\n      const { action, status } = data\n\n      if (action === 'close' || [STATUS.FINISHED].includes(status)) {\n        doDisableTours()\n      }\n    }\n\n    render () {\n      return <WrappedComponent handleJoyrideCallback={this.handleJoyrideCallback} {...this.props} />\n    }\n  }\n\n  return connect('doDisableTours', WithTour)\n}\n\nexport default withTour\n","import React from 'react'\nimport classNames from 'classnames'\n\nconst Shell = ({\n  title = 'Shell',\n  children,\n  className\n}) => {\n  return (\n    <div className={classNames('br1 overflow-hidden', className)}>\n      <div className='f7 mb0 sans-serif ttu tracked charcoal pv1 pl2 bg-black-20'>{ title }</div>\n      <div className='bg-black-70 snow pa2 f7 lh-copy monospace nowrap overflow-x-auto'>\n        {children}\n      </div>\n    </div>\n  )\n}\n\nexport default Shell\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Modal } from 'react-overlays'\n\nfunction Overlay ({ children, show, onLeave, className, hidden, ...props }) {\n  const handleKeyDown = (e) => {\n    if (e.key !== 'Escape') return\n\n    e.stopPropagation()\n    e.nativeEvent.stopImmediatePropagation()\n\n    onLeave()\n  }\n\n  const renderBackdrop = (props) => (\n    <div className='fixed top-0 left-0 right-0 bottom-0 bg-black o-50' hidden={hidden} {...props} />\n  )\n\n  return (\n    <Modal\n      {...props}\n      show={show}\n      className={`${className} fixed top-0 left-0 right-0 bottom-0 z-max flex items-center justify-around`}\n      renderBackdrop={renderBackdrop}\n      onKeyDown={handleKeyDown}\n      onBackdropClick={onLeave}>\n      {children}\n    </Modal>\n  )\n}\n\nOverlay.propTypes = {\n  show: PropTypes.bool.isRequired,\n  onLeave: PropTypes.func.isRequired\n}\n\nOverlay.defaultProps = {\n  className: ''\n}\n\nexport default Overlay\n","import React from 'react'\n\nconst StrokeCode = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M75 24H25.11c-4.19 0-8 4.11-8 8.61v35.26a8.29 8.29 0 0 0 8 8.13H75a8.11 8.11 0 0 0 7.87-8.13V32.61C82.91 28.55 79.54 24 75 24zm-49.89 3H75c2.74 0 4.87 3 4.87 5.61v1.32H20.09v-1.32c0-2.83 2.49-5.61 5.02-5.61zm-5 39.59V35.93h59.8v30.66zM75 73H25.11a5.28 5.28 0 0 1-4.95-4.41h59.67A5.09 5.09 0 0 1 75 73z' />\n    <circle cx={26.22} cy={30.54} r={1.33} />\n    <path d='M30.49 31.88a1.34 1.34 0 1 0-1.33-1.34 1.34 1.34 0 0 0 1.33 1.34zm4.28 0a1.34 1.34 0 1 0-1.34-1.34 1.34 1.34 0 0 0 1.34 1.34zm4.4 19.55l5-5a1.28 1.28 0 0 0-1.81-1.81l-5.87 5.88a1.3 1.3 0 0 0 0 1.84l5.87 5.88a1.28 1.28 0 0 0 1.81-1.81zm23.58-.92l-5.88-5.88a1.28 1.28 0 1 0-1.8 1.81l5 5-5 5a1.28 1.28 0 1 0 1.8 1.81l5.88-5.88a1.27 1.27 0 0 0 .38-.92 1.31 1.31 0 0 0-.38-.94zM51 42.85A1.38 1.38 0 0 0 49.44 44l-2.37 14.41a1.39 1.39 0 0 0 2.75.45l2.37-14.41a1.39 1.39 0 0 0-1.19-1.6z' />\n  </svg>\n)\n\nexport default StrokeCode\n","import React from 'react'\n\nconst StrokeDownload = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M76.3 61.6H23.7c-3.1 0-5.6 2.5-5.6 5.6v7.5c0 3.1 2.5 5.6 5.6 5.6h52.7c3.1 0 5.6-2.5 5.6-5.6v-7.5c-.1-3.1-2.6-5.6-5.7-5.6zm2.4 13.1c0 1.3-1 2.3-2.3 2.3H23.7c-1.3 0-2.3-1-2.3-2.3v-7.5c0-1.3 1-2.3 2.3-2.3h52.7c1.3 0 2.3 1 2.3 2.3v7.5z' />\n    <path d='M64.9 68.8c-1.2 0-2.2 1-2.2 2.2 0 1.2 1 2.2 2.2 2.2 1.2 0 2.2-1 2.2-2.2 0-1.2-1-2.2-2.2-2.2zm0 3.3c-.6 0-1.1-.5-1.1-1.1s.5-1.1 1.1-1.1 1.1.5 1.1 1.1-.5 1.1-1.1 1.1zm7.7-3.3c-1.2 0-2.2 1-2.2 2.2 0 1.2 1 2.2 2.2 2.2s2.2-1 2.2-2.2c0-1.2-1-2.2-2.2-2.2zm0 3.3c-.6 0-1.1-.5-1.1-1.1s.5-1.1 1.1-1.1 1.1.5 1.1 1.1-.5 1.1-1.1 1.1zM50.8 57.2l11.8-11.8c.8-.8.2-2.1-.9-2h-5.9V20.9c0-.7-.5-1.2-1.2-1.2h-9.5c-.7 0-1.2.5-1.2 1.2v22.5H38c-1.1 0-1.6 1.3-.9 2l11.8 11.8c.7.5 1.5.5 1.9 0zM41 45.8h5.4V22.1h7.1v23.7H59l-9 8.9-9-8.9z' />\n  </svg>\n)\n\nexport default StrokeDownload\n"],"sourceRoot":""}