{"version":3,"sources":["components/api-address-form/ApiAddressForm.js","components/address/Address.js","icons/GlyphAttention.js","components/is-not-connected/IsNotConnected.js","status/StatusConnected.js","status/BandwidthStatsDisabled.js","components/version-link/VersionLink.js","components/definition/Definition.js","status/NodeInfo.js","components/provider-link/ProviderLink.js","status/NodeInfoAdvanced.js","status/Commons.js","status/NodeBandwidthChart.js","status/Speedometer.js","status/NetworkTraffic.js","components/ask/AskToEnable.js","status/StatusPage.js","components/tour/withTour.js","components/shell/Shell.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","Address","buffer","ma","Multiaddr","protos","protoNames","concat","parts","toString","split","map","chunk","i","includes","length","GlyphAttention","props","viewBox","d","TABS","sameOrigin","apiUrl","connected","activeTab","setActiveTab","defaultDomains","origin","window","location","addOrigin","indexOf","Box","style","role","Trans","i18nKey","href","rel","Shell","title","onClick","classNames","join","ApiAddressForm","defaultValue","updateAddress","TranslatedStatusConnected","peersCount","repoSize","humanRepoSize","humanSize","providers","url","ReleaseLink","agent","version","releaseUrl","VersionLink","agentVersion","filter","str","name","provider","findUrl","Definition","term","desc","advanced","termWidth","width","Term","children","Description","DefinitionList","NodeInfo","obj","field","fn","identity","raw","this","getField","process","React","Component","ProviderLink","info","findInfo","isMultiaddr","addr","multiaddr","_","ipfsProvider","gatewayUrl","isNodeInfoOpen","doSetIsNodeInfoOpen","publicKey","addresses","Set","sort","Details","summaryText","open","ev","Title","bwUnits","standard","base","bits","chartsize","filesize","partial","round","exponent","tootltipSize","output","defaultSettings","defaultFontFamily","responsive","tooltips","mode","position","enabled","hover","scales","xAxes","time","minUnit","yAxes","stacked","ticks","callback","v","suggestedMax","maxTicksLimit","legend","reverse","display","Tooltip","bw","show","pos","top","scrollY","left","transform","bottom","borderTop","borderRight","toLowerCase","in","out","NodeBandwidthChart","getTooltip","tooltip","document","getElementById","createElement","body","appendChild","ReactDOM","render","data","nodeBandwidthChartData","canvas","ctx","getContext","gradientIn","createLinearGradient","addColorStop","gradientOut","datasets","label","borderColor","backgroundColor","pointRadius","cubicInterpolationMode","animatedPoints","options","custom","model","opacity","Math","abs","dataPoints","yLabel","rect","_chart","getBoundingClientRect","caretX","caretY","animation","duration","defaultProps","circumference","n","PI","Speedometer","total","filled","noSpeed","color","doughnut","maintainAspectRatio","cutoutPercentage","rotation","labels","hoverBackgroundColor","borderWidth","marginTop","NetworkTraffic","state","downSpeed","upSpeed","prevState","nodeBandwidth","down","parseInt","rateIn","toFixed","up","rateOut","setState","max","maxWidth","AskToEnable","yesLabel","noLabel","onYes","onNo","detailsLabel","detailsLink","Button","bg","withTour","ipfsConnected","analyticsAskToEnable","doEnableAnalytics","doDisableAnalytics","toursEnabled","handleJoyrideCallback","nodeBandwidthEnabled","data-id","Helmet","minHeight","IsNotConnected","BandwidthStatsDisabled","run","steps","statusTour","getSteps","styles","continuous","scrollToFirstStep","locale","getJoyrideLocales","showProgress","WrappedComponent","WithTour","doDisableTours","action","status","STATUS","FINISHED"],"mappings":"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","file":"static/js/15.3d0e38aa.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'\nimport Multiaddr from 'multiaddr'\n\nconst Address = ({ value }) => {\n  if (!value) return null\n\n  // future-proofing interop for multiaddr > 8.x\n  value = value.buffer || value\n\n  const ma = Multiaddr(value)\n  const protos = ma.protoNames().concat(['ipfs', 'p2p'])\n  const parts = ma.toString().split('/')\n\n  return (\n    <div className='charcoal-muted monospace'>\n      {parts.map((chunk, i) => (\n        <span key={i}>\n          <span className={protos.includes(chunk) ? 'force-select' : 'force-select charcoal'}>{chunk}</span>\n          {i < parts.length - 1 ? '/' : ''}\n        </span>\n      ))}\n    </div>\n  )\n}\n\nexport default Address\n","import React from 'react'\n\nconst GlyphAttention = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M82.84 71.14L55.06 23a5.84 5.84 0 0 0-10.12 0L17.16 71.14a5.85 5.85 0 0 0 5.06 8.77h55.56a5.85 5.85 0 0 0 5.06-8.77zm-30.1-.66h-5.48V65h5.48zm0-10.26h-5.48V38.46h5.48z' />\n  </svg>\n)\n\nexport default GlyphAttention\n","import React, { useState } from 'react'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation, Trans } from 'react-i18next'\nimport classNames from 'classnames'\nimport ApiAddressForm from '../api-address-form/ApiAddressForm'\nimport Box from '../box/Box'\nimport Shell from '../shell/Shell.js'\nimport GlyphAttention from '../../icons/GlyphAttention'\n\nconst TABS = {\n  UNIX: 'unix',\n  POWERSHELL: 'windowsPS',\n  WINDOWS: 'windowsCMD'\n}\n\nconst IsNotConnected = ({ t, apiUrl, connected, sameOrigin, ipfsApiAddress, doUpdateIpfsApiAddress }) => {\n  const [activeTab, setActiveTab] = useState(TABS.UNIX)\n  const defaultDomains = ['http://localhost:3000', 'http://127.0.0.1:5001', 'https://webui.ipfs.io']\n  const origin = window.location.origin\n  const addOrigin = defaultDomains.indexOf(origin) === -1\n  return (\n    <Box className='pv3 ph4 lh-copy charcoal'>\n      <div className='flex flex-wrap items-center'>\n        <GlyphAttention style={{ height: 76 }} className='fill-red mr' role='presentation' />\n        <h1 className='montserrat fw4 charcoal ma0 f3 red'>{t('app:status.couldNotConnect')}</h1>\n      </div>\n      <Trans i18nKey='notConnected.paragraph1' t={t}>\n        <p className='fw6 mb3'>Check out the installation guide in the <a className='link blue' href='https://docs.ipfs.io/install/command-line-quick-start/' target='_blank' rel='noopener noreferrer'>IPFS Docs</a>, or try these common fixes:</p>\n      </Trans>\n      <ol className='pl3 pt2'>\n        <Trans i18nKey='notConnected.paragraph2' t={t}>\n          <li className='mb3'>Is your IPFS daemon running? Try starting or restarting it from your terminal:</li>\n        </Trans>\n        <Shell title='Any Shell'>\n          <code className='db'><b className='no-select'>$ </b>ipfs daemon</code>\n          <code className='db'>Initializing daemon...</code>\n          <code className='db'>API server listening on /ip4/127.0.0.1/tcp/5001</code>\n        </Shell>\n        { !sameOrigin && (\n          <div>\n            <Trans i18nKey='notConnected.paragraph3' t={t}>\n              <li className='mb3 mt4'>Is your IPFS API configured to allow <a className='link blue' href='https://github.com/ipfs-shipyard/ipfs-webui#configure-ipfs-api-cors-headers'>cross-origin (CORS) requests</a>? If not, run these commands and then start your daemon from the terminal:</li>\n            </Trans>\n            <div className='br1 overflow-hidden'>\n              <div className='f7 mb0 sans-serif charcoal pv1 pl2 bg-black-20 flex items-center overflow-x-auto'>\n                <button onClick={() => setActiveTab(TABS.UNIX)} className={classNames('pointer mr3 ttu tracked', activeTab === TABS.UNIX && 'fw7')}>\n                Unix & MacOS\n                </button>\n                <button onClick={() => setActiveTab(TABS.POWERSHELL)} className={classNames('pointer mr3 ttu tracked', activeTab === TABS.POWERSHELL && 'fw7')}>\n                  Windows Powershell\n                </button>\n                <button onClick={() => setActiveTab(TABS.WINDOWS)} className={classNames('pointer ttu tracked', activeTab === TABS.WINDOWS && 'fw7')}>\n                  Windows CMD\n                </button>\n              </div>\n              <div className='bg-black-70 snow pa2 f7 lh-copy monospace nowrap overflow-x-auto'>\n                { activeTab === TABS.UNIX && (\n                  <div>\n                    <code className='db'><b className='no-select'>$ </b>ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '[{addOrigin && `\"${origin}\", `}\"{defaultDomains.join('\", \"')}\"]'</code>\n                    <code className='db'><b className='no-select'>$ </b>ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '[\"PUT\", \"POST\"]'</code>\n                  </div>\n                )}\n                { activeTab === TABS.POWERSHELL && (\n                  <div>\n                    <code className='db'><b className='no-select'>$ </b>ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '[{addOrigin && `\\\\\"${origin}\\\\\", `}\\\"{defaultDomains.join('\\\\\", \\\\\"')}\\\"]'</code>\n                    <code className='db'><b className='no-select'>$ </b>ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '[\\\"PUT\\\", \\\"POST\\\"]'</code>\n                  </div>\n                )}\n                { activeTab === TABS.WINDOWS && (\n                  <div>\n                    <code className='db'><b className='no-select'>$ </b>ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin \"[{addOrigin && `\"\"\"${origin}\"\"\", `}\"\"\"{defaultDomains.join('\"\"\", \"\"\"')}\"\"\"]\"</code>\n                    <code className='db'><b className='no-select'>$ </b>ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods \"[\"\"\"PUT\"\"\", \"\"\"POST\"\"\"]\"</code>\n                  </div>\n                )}\n              </div>\n            </div>\n          </div>\n        )}\n        <Trans i18nKey='notConnected.paragraph4' t={t}>\n          <li className='mt4 mb3'>Is your IPFS API on a port other than 5001? 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>, enter it here.</li>\n        </Trans>\n        <ApiAddressForm\n          t={t}\n          defaultValue={ipfsApiAddress || ''}\n          updateAddress={doUpdateIpfsApiAddress} />\n      </ol>\n    </Box>\n  )\n}\n\nexport default connect(\n  'selectIpfsConnected',\n  'selectApiUrl',\n  withTranslation('welcome')(IsNotConnected)\n)\n","import React from 'react'\nimport { withTranslation, Trans } from 'react-i18next'\nimport { connect } from 'redux-bundler-react'\nimport { humanSize } from '../lib/files'\n\nexport const StatusConnected = ({ t, peersCount, repoSize }) => {\n  const humanRepoSize = humanSize(repoSize || 0)\n  return (\n    <header>\n      <h1 className='montserrat fw2 f3 charcoal ma0 pt0 pb2'>\n        <Trans i18nKey='app:status.connectedToIpfs' t={t}>Connected to IPFS</Trans>\n      </h1>\n      <p className='montserrat fw4 f5 ma0 pb3 lh-copy'>\n        <span className='db dib-ns'>\n          <a className='link blue' href='#/files'>\n            {t('StatusConnected.repoSize', { repoSize: humanRepoSize })}\n          </a>\n        </span>\n        <span className='dn di-ns gray'> — </span>\n        <span className='db mt1 mt0-ns dib-ns'>\n          <a className='link blue' href='#/peers'>\n            {t('StatusConnected.peersCount', { peersCount: peersCount.toString() })}\n          </a>\n        </span>\n      </p>\n    </header>\n  )\n}\n\nexport const TranslatedStatusConnected = withTranslation('status')(StatusConnected)\n\nexport default connect(\n  'selectPeersCount',\n  'selectRepoSize',\n  TranslatedStatusConnected\n)\n","import React from 'react'\nimport { withTranslation, Trans } from 'react-i18next'\nimport Shell from '../components/shell/Shell'\nimport Box from '../components/box/Box'\n\nconst StatusNotConnected = ({ t }) => {\n  return (\n    <Box className='mt3 pa3' >\n      <h2 className='ttu yellow tracked f6 fw4 aqua mt0 mb4'>{t('bandwidthStats')}</h2>\n\n      <p className='mw6 mr2 lh-copy charcoal f6'>\n        <Trans i18nKey='bandwidthStatsDisabled' t={t}>\n          You have the bandwidth metrics disabled. You can enable them by typing the command bellow\n          or changing the key <code>Swarm.DisableBandwidthMetrics</code> to <code>false</code> on\n          <a className='link blue' href='#/settings'>Settings</a>. Then, you need to restart the IPFS\n          daemon to apply the changes.\n        </Trans>\n      </p>\n\n      <Shell className='mw6'>\n        <code className='db'><b className='no-select'>$ </b>ipfs config --json Swarm.DisableBandwidthMetrics false</code>\n      </Shell>\n    </Box>\n  )\n}\n\nexport default withTranslation('status')(StatusNotConnected)\n","import React from 'react'\n\nconst providers = {\n  'go-ipfs': {\n    url: 'https://github.com/ipfs/go-ipfs'\n  },\n  'js-ipfs': {\n    url: 'https://github.com/ipfs/js-ipfs'\n  }\n}\n\nconst findUrl = name => {\n  const provider = providers[name]\n  if (!provider) return null\n  return provider.url\n}\n\n// formats an ipfs agentVersion string from /go-ipfs/0.32.29 to go-ipfs@0.32.29\nconst VersionLink = ({ agentVersion }) => {\n  if (!agentVersion) return <span>Unknown</span>\n  const parts = agentVersion.split('/').filter(str => !!str)\n  const name = parts[0]\n  const url = findUrl(name)\n  const version = parts[1]\n  if (!url) {\n    return (\n      <span>\n        {name}\n        <ReleaseLink agent={name} version={version} />\n      </span>\n    )\n  }\n  return (\n    <span>\n      <a href={url} className='link blue' target='_blank' rel='noopener noreferrer'>\n        {name}\n      </a>\n      <ReleaseLink agent={name} version={version} />\n    </span>\n  )\n}\n\nconst ReleaseLink = ({ agent, version }) => {\n  if (!version) return ''\n  if (agent === 'js-ipfs') {\n    const releaseUrl = `${providers['js-ipfs'].url}/releases/tag/v${version}`\n    return (\n      <a href={releaseUrl} className='link blue ml2' target='_blank' rel='noopener noreferrer'>\n        v{version}\n      </a>\n    )\n  }\n  return ` v${version}`\n}\n\nexport default VersionLink\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nexport const Definition = ({ term, desc, advanced, termWidth }) => (\n  <div className='dt dt--fixed pt1 mw9 lh-copy'>\n    <Term width={termWidth}>\n      {term}\n    </Term>\n    <Description advanced={advanced}>\n      {desc}\n    </Description>\n  </div>\n)\n\nDefinition.propTypes = {\n  term: PropTypes.node.isRequired,\n  desc: PropTypes.node,\n  advanced: PropTypes.bool,\n  termWidth: PropTypes.number\n}\n\nexport const Term = ({ children, width = 100 }) => {\n  return (\n    <dt className='db ma0 pb1 pb0-ns dtc-ns silver tracked ttu f7' style={{ width }}>\n      {children}\n    </dt>\n  )\n}\n\nexport const Description = ({ children, advanced }) => {\n  return (\n    <dd className={`db dtc-ns ma0 charcoal monospace ${advanced ? 'word-wrap pa2 f7 bg-white-80' : 'truncate f7 f6-ns'}`}>\n      {children}\n    </dd>\n  )\n}\n\n// This is here as a reminder that you have to wrap you Definitions\n// in a `<dl>`, and as a placeholder in case we want to style the dl element\n// in the future?\nexport const DefinitionList = ({ children, className = 'ma0', ...props }) => {\n  return (\n    <dl className={className} {...props}>\n      {children}\n    </dl>\n  )\n}\n\nexport default Definition\n","import React from 'react'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'redux-bundler-react'\nimport VersionLink from '../components/version-link/VersionLink'\nimport { Definition, DefinitionList } from '../components/definition/Definition.js'\n\nclass NodeInfo extends React.Component {\n  getField (obj, field, fn) {\n    if (obj && obj[field]) {\n      if (fn) {\n        return fn(obj[field])\n      }\n\n      return obj[field]\n    }\n\n    return ''\n  }\n\n  getVersion (identity) {\n    const raw = this.getField(identity, 'agentVersion')\n    return raw ? raw.split('/').join(' ') : ''\n  }\n\n  render () {\n    const { t, identity } = this.props\n\n    return (\n      <DefinitionList>\n        <Definition term={t('terms.peerId')} desc={this.getField(identity, 'id')} />\n        <Definition term={t('terms.agent')} desc={<VersionLink agentVersion={this.getField(identity, 'agentVersion')} />} />\n        <Definition term={t('terms.ui')} desc={<a href={'https://github.com/ipfs-shipyard/ipfs-webui/releases/tag/v' + process.env.REACT_APP_VERSION} className='link blue' target='_blank' rel='noopener noreferrer'>v{process.env.REACT_APP_VERSION}</a>} />\n      </DefinitionList>\n    )\n  }\n}\n\nexport default connect(\n  'selectIdentity',\n  withTranslation('app')(NodeInfo)\n)\n","import React from 'react'\n\nconst providers = {\n  'js-ipfs-api': {\n    url: 'https://github.com/ipfs/js-ipfs-api'\n  },\n  'js-ipfs': {\n    url: 'https://github.com/ipfs/js-ipfs'\n  },\n  'window.ipfs': {\n    url: 'https://github.com/ipfs-shipyard/ipfs-companion'\n  },\n  'ipfs-companion': {\n    url: 'https://github.com/ipfs-shipyard/ipfs-companion'\n  }\n}\n\nconst findInfo = name => {\n  const provider = providers[name]\n  return provider || { name }\n}\n\nconst ProviderLink = ({ name }) => {\n  const info = findInfo(name)\n  if (!info.url) {\n    return <span>{info.name || name}</span>\n  }\n  return (\n    <a href={info.url} className='link blue' target='_blank' rel='noopener noreferrer'>{info.name || name}</a>\n  )\n}\n\nexport default ProviderLink\n","import React from 'react'\nimport multiaddr from 'multiaddr'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation } from 'react-i18next'\nimport Address from '../components/address/Address'\nimport Details from '../components/details/Details'\nimport ProviderLink from '../components/provider-link/ProviderLink'\nimport { Definition, DefinitionList } from '../components/definition/Definition.js'\n\nfunction isMultiaddr (addr) {\n  try {\n    multiaddr(addr)\n    return true\n  } catch (_) {\n    return false\n  }\n}\nconst getField = (obj, field, fn) => {\n  if (obj && obj[field]) {\n    if (fn) {\n      return fn(obj[field])\n    }\n\n    return obj[field]\n  }\n\n  return ''\n}\n\nconst NodeInfoAdvanced = ({ t, identity, ipfsProvider, ipfsApiAddress, gatewayUrl, isNodeInfoOpen, doSetIsNodeInfoOpen }) => {\n  let publicKey = null\n  let addresses = null\n  if (identity) {\n    publicKey = getField(identity, 'publicKey')\n    addresses = [...new Set(identity.addresses)].sort().map(addr => <Address key={addr} value={addr} />)\n  }\n\n  const handleSummaryClick = (ev) => {\n    doSetIsNodeInfoOpen(!isNodeInfoOpen)\n    ev.preventDefault()\n  }\n\n  const asAPIString = (value) => {\n    // hide raw JSON if advanced config is present in the string\n    return typeof value !== 'string'\n      ? t('customApiConfig')\n      : value\n  }\n\n  return (\n    <Details className='mt3 f6' summaryText={t('app:terms.advanced')} open={isNodeInfoOpen} onClick={handleSummaryClick}>\n      <DefinitionList className='mt3'>\n        <Definition advanced term={t('app:terms.gateway')} desc={gatewayUrl} />\n        {ipfsProvider === 'httpClient'\n          ? <Definition advanced term={t('app:terms.api')} desc={\n            (<div id=\"http-api-address\" className=\"flex items-center\">\n              {isMultiaddr(ipfsApiAddress)\n                ? (<Address value={ipfsApiAddress} />)\n                : asAPIString(ipfsApiAddress)\n              }\n              <a className='ml2 link blue sans-serif fw6' href=\"#/settings\">{t('app:actions.edit')}</a>\n            </div>)\n          } />\n          : <Definition advanced term={t('app:terms.api')} desc={<ProviderLink name={ipfsProvider} />} />\n        }\n        <Definition advanced term={t('app:terms.addresses')} desc={addresses} />\n        <Definition advanced term={t('app:terms.publicKey')} desc={publicKey} />\n      </DefinitionList>\n    </Details>\n  )\n}\n\nexport default connect(\n  'selectIdentity',\n  'selectIpfsProvider',\n  'selectIpfsApiAddress',\n  'selectGatewayUrl',\n  'selectIsNodeInfoOpen',\n  'doSetIsNodeInfoOpen',\n  withTranslation('status')(NodeInfoAdvanced)\n)\n","import React from 'react'\n\nexport const Title = ({ children, ...props }) => (\n  <h2 className='ttu tracked f6 fw4 teal mt0 mb4' {...props}>{ children }</h2>\n)\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Line } from 'react-chartjs-2'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'redux-bundler-react'\nimport PropTypes from 'prop-types'\nimport filesize from 'filesize'\nimport { Title } from './Commons'\n\n// matching units returned by 'ipfs stats bw' in CLI\nconst bwUnits = {\n  standard: 'iec',\n  base: 2,\n  bits: false\n}\n\nconst chartsize = filesize.partial({ round: 1, exponent: 2, ...bwUnits })\nconst tootltipSize = filesize.partial({ round: 0, output: 'array', ...bwUnits })\n\nconst defaultSettings = {\n  defaultFontFamily: \"'Inter UI', system-ui, sans-serif\",\n  responsive: true,\n  tooltips: {\n    mode: 'x',\n    position: 'nearest',\n    enabled: false\n  },\n  hover: { mode: 'index' },\n  scales: {\n    xAxes: [{\n      type: 'time',\n      time: {\n        minUnit: 'second'\n      }\n    }],\n    yAxes: [{\n      stacked: true,\n      ticks: {\n        callback: v => chartsize(v) + '/s',\n        suggestedMax: 200000,\n        maxTicksLimit: 5\n      }\n    }]\n  },\n  legend: {\n    reverse: true,\n    display: true,\n    position: 'bottom'\n  }\n}\n\nconst Tooltip = ({ t, bw, show, pos }) => {\n  if (!show) {\n    return null\n  }\n\n  return (\n    <div className='sans-serif absolute bg-white pa2 br3' style={{\n      top: `${pos.top + window.scrollY}px`,\n      left: `${pos.left}px`,\n      transform: 'translateY(calc(-100% - 20px))',\n      filter: 'drop-shadow(2px 2px 8px rgba(0, 0, 0, 0.2))'\n    }}>\n      <div className='absolute' style={{\n        bottom: '-14px',\n        left: '0',\n        width: '0',\n        height: '0',\n        borderTop: '20px solid white',\n        borderRight: '20px solid transparent'\n      }} />\n      <div className='dt'>\n        <div className='dt-row'>\n          <span className='dtc f7 charcoal tr'>{t('app:terms.in').toLowerCase()}:</span>\n          <span className='f4 ml1 charcoal-muted'>{bw.in[0]}</span>\n          <span className='f7 charcoal-muted'>{bw.in[1]}/s</span>\n        </div>\n        <div className='dt-row'>\n          <span className='dtc f7 charcoal tr'>{t('app:terms.out').toLowerCase()}:</span>\n          <span className='f4 ml1 charcoal-muted'>{bw.out[0]}</span>\n          <span className='f7 charcoal-muted'>{bw.out[1]}/s</span>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nclass NodeBandwidthChart extends React.Component {\n  static propTypes = {\n    nodeBandwidthChartData: PropTypes.object.isRequired,\n    animatedPoints: PropTypes.number\n  }\n\n  static defaultProps = {\n    animatedPoints: 500 // Only animate for the first 500 points\n  }\n\n  // getTooltip adds the tooltip element to the DOM if it doesn't\n  // exist yet and returns the element.\n  getTooltip = (t) => {\n    let tooltip = document.getElementById('node_bw_chart')\n\n    if (!tooltip) {\n      tooltip = document.createElement('div')\n      tooltip.id = 'node_bw_chart'\n      document.body.appendChild(tooltip)\n    }\n\n    ReactDOM.render(<Tooltip t={t} show={false} />, tooltip)\n    return tooltip\n  }\n\n  // generates tooltip data.\n  data = () => {\n    const { t, nodeBandwidthChartData } = this.props\n\n    return function (canvas) {\n      const ctx = canvas.getContext('2d')\n\n      const gradientIn = ctx.createLinearGradient(canvas.width / 2, 0, canvas.width / 2, canvas.height)\n      gradientIn.addColorStop(0, '#70c5cd')\n      gradientIn.addColorStop(1, '#c6f1f3')\n\n      const gradientOut = ctx.createLinearGradient(canvas.width / 2, 0, canvas.width / 2, canvas.height / 2)\n      gradientOut.addColorStop(0, '#f19237')\n      gradientOut.addColorStop(1, '#f9d1a6')\n\n      return {\n        datasets: [\n          {\n            label: t('app:terms.out'),\n            data: nodeBandwidthChartData.out,\n            borderColor: gradientOut,\n            backgroundColor: gradientOut,\n            pointRadius: 2,\n            cubicInterpolationMode: 'monotone'\n          },\n          {\n            label: t('app:terms.in'),\n            data: nodeBandwidthChartData.in,\n            borderColor: gradientIn,\n            backgroundColor: gradientIn,\n            pointRadius: 2,\n            cubicInterpolationMode: 'monotone'\n          }\n        ]\n      }\n    }\n  }\n\n  componentDidMount () {\n    // Setup tooltip\n    this.tooltip = document.createElement('div')\n    this.tooltip.id = 'node_bw_chart'\n    document.body.appendChild(this.tooltip)\n  }\n\n  componentDidUpdate () {\n    ReactDOM.render(<Tooltip show={false} />, this.tooltip)\n  }\n\n  render () {\n    const { t, animatedPoints, nodeBandwidthChartData } = this.props\n\n    if (nodeBandwidthChartData.in.length === 0) {\n      return null\n    }\n\n    const tooltip = this.tooltip\n\n    const options = {\n      ...defaultSettings,\n      tooltips: {\n        ...defaultSettings.tooltips,\n        custom: function (model) {\n          const data = { show: true }\n\n          if (model.opacity === 0) {\n            data.show = false\n          } else {\n            data.bw = {\n              out: tootltipSize(Math.abs(model.dataPoints[0].yLabel)),\n              in: tootltipSize(Math.abs(model.dataPoints[1].yLabel))\n            }\n\n            const rect = this._chart.canvas.getBoundingClientRect()\n            data.pos = {\n              left: rect.left + model.caretX,\n              top: rect.top + model.caretY\n            }\n          }\n\n          // I know this isn't a very React-y way of doing this, but there was a simple issue:\n          // re-rendering the tooltip was also re-rendering the chart which then lost its focus\n          // state causing the Tooltip to stick and not disappear.\n          ReactDOM.render(<Tooltip t={t} {...data} />, tooltip)\n        }\n      },\n      animation: {\n        // Only animate the 500 points\n        duration: nodeBandwidthChartData.in.length <= animatedPoints ? 1000 : 0\n      }\n    }\n\n    return (\n      <div>\n        <Title>{t('bandwidthOverTime')}</Title>\n        <Line data={this.data()} options={options} />\n      </div>\n    )\n  }\n}\n\nexport default connect('selectNodeBandwidthChartData', withTranslation('status')(NodeBandwidthChart))\n","import React from 'react'\nimport { Doughnut } from 'react-chartjs-2'\nimport filesize from 'filesize'\n\nconst rotation = (n) => (0.5 + (1 - n)) * Math.PI\nconst circumference = (n) => n * 2 * Math.PI\n\nfunction Speedometer ({ total = 100, title, filled = 0, noSpeed = false, color = '#FF6384' }) {\n  const doughnut = {\n    options: {\n      legend: {\n        display: false\n      },\n      tooltips: {\n        enabled: false\n      },\n      maintainAspectRatio: false,\n      cutoutPercentage: 80,\n      rotation: rotation(0.7),\n      circumference: circumference(0.7)\n    },\n    data: {\n      labels: ['Speed', 'Nothing'],\n      datasets: [{\n        data: [filled, filled > total ? 0 : total - filled],\n        backgroundColor: [color, '#DEDEDE'],\n        hoverBackgroundColor: [color, '#DEDEDE'],\n        borderWidth: [0, 0]\n      }]\n    }\n  }\n\n  // network bandwidth units matchin 'ipfs stats bw'\n  // to align with what ISP usually shows on invoice\n  const data = filesize(filled, {\n    standard: 'iec',\n    base: 2,\n    output: 'array',\n    round: 0,\n    bits: false\n  })\n\n  return (\n    <div className='relative tc center overflow-hidden' style={{ width: '11em', height: '9em' }} >\n      <div style={{ width: '11em', height: '11em', marginTop: '-1em' }}>\n        <Doughnut {...doughnut} />\n      </div>\n\n      <div className='absolute' style={{ top: '60%', left: '50%', transform: 'translate(-50%, -50%)' }} >\n        <span className='f3'>{data[0]}</span><span className='ml1 f7'>{data[1]}{ noSpeed ? '' : '/s' }</span>\n        <span className='db f7 fw5'>{title}</span>\n      </div>\n    </div>\n  )\n}\nexport default Speedometer\n","import React from 'react'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation } from 'react-i18next'\nimport Speedometer from './Speedometer'\nimport { Title } from './Commons'\n\nclass NetworkTraffic extends React.Component {\n  state = {\n    downSpeed: {\n      filled: 0,\n      total: 125000 // Starts with 1 Mb/s max\n    },\n    upSpeed: {\n      filled: 0,\n      total: 125000 // Starts with 1 Mb/s max\n    }\n  }\n\n  componentDidUpdate (_, prevState) {\n    const { nodeBandwidth } = this.props\n\n    const down = nodeBandwidth ? parseInt(nodeBandwidth.rateIn.toFixed(0), 10) : 0\n    const up = nodeBandwidth ? parseInt(nodeBandwidth.rateOut.toFixed(0), 10) : 0\n\n    if (down !== prevState.downSpeed.filled || up !== prevState.upSpeed.filled) {\n      this.setState({\n        downSpeed: {\n          filled: down,\n          total: Math.max(down, prevState.downSpeed.total)\n        },\n        upSpeed: {\n          filled: up,\n          total: Math.max(up, prevState.upSpeed.total)\n        }\n      })\n    }\n  }\n\n  render () {\n    const { t } = this.props\n    const { downSpeed, upSpeed } = this.state\n\n    return (\n      <div>\n        <Title>{t('networkTraffic')}</Title>\n        <div className='flex flex-column justify-between' style={{ maxWidth: 400 }}>\n          <div className='mh2 mv3 mt0-l'>\n            <Speedometer\n              title={t('app:terms.downSpeed')}\n              color='#69c4cd'\n              {...downSpeed} />\n          </div>\n          <div className='mh2 mt3 mt0-l'>\n            <Speedometer\n              title={t('app:terms.upSpeed')}\n              color='#f39021'\n              {...upSpeed} />\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport default connect(\n  'selectNodeBandwidth',\n  withTranslation('status')(NetworkTraffic)\n)\n","import React from 'react'\nimport Button from '../button/Button'\n\nconst AskToEnable = ({ className, label, yesLabel, noLabel, onYes, onNo, detailsLabel = 'More info...', detailsLink }) => {\n  return (\n    <div className={`f6 pv3 pv2-ns ph3 tc bg-snow charcoal ${className}`}>\n      <span className='fw4 lh-copy dib mb2'>\n        {label}\n        {detailsLink && (\n          <a href={detailsLink} className='dib focus-outline link blue ml2'>\n            {detailsLabel}\n          </a>\n        )}\n      </span>\n      <span className='dib'>\n        <Button className='ml3 mv1 tc' bg={'bg-green'} onClick={onYes}>{yesLabel}</Button>\n        <Button className='ml3 mv1 tc' color='charcoal' bg={'bg-snow-muted'} onClick={onNo}>{noLabel}</Button>\n      </span>\n    </div>\n  )\n}\n\nexport default AskToEnable\n","import React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { withTranslation, Trans } from 'react-i18next'\nimport { connect } from 'redux-bundler-react'\nimport ReactJoyride from 'react-joyride'\nimport StatusConnected from './StatusConnected'\nimport BandwidthStatsDisabled from './BandwidthStatsDisabled'\nimport IsNotConnected from '../components/is-not-connected/IsNotConnected'\nimport NodeInfo from './NodeInfo'\nimport NodeInfoAdvanced from './NodeInfoAdvanced'\nimport NodeBandwidthChart from './NodeBandwidthChart'\nimport NetworkTraffic from './NetworkTraffic'\nimport Box from '../components/box/Box'\nimport AskToEnable from '../components/ask/AskToEnable'\nimport { statusTour } from '../lib/tours'\nimport { getJoyrideLocales } from '../helpers/i8n'\nimport withTour from '../components/tour/withTour'\n\nconst StatusPage = ({\n  t,\n  ipfsConnected,\n  analyticsAskToEnable,\n  doEnableAnalytics,\n  doDisableAnalytics,\n  toursEnabled,\n  handleJoyrideCallback,\n  nodeBandwidthEnabled\n}) => {\n  return (\n    <div data-id='StatusPage' className='mw9 center'>\n      <Helmet>\n        <title>{t('title')} | IPFS</title>\n      </Helmet>\n      <Box className='pa3 joyride-status-node' style={{ minHeight: 0 }}>\n        <div className='flex'>\n          <div className='flex-auto'>\n            { ipfsConnected ? (\n              <div>\n                <StatusConnected />\n                <NodeInfo />\n                <div className='pt2'>\n                  <NodeInfoAdvanced />\n                </div>\n              </div>\n            ) : (\n              <div>\n                <IsNotConnected />\n              </div>\n            )}\n          </div>\n        </div>\n      </Box>\n      { ipfsConnected && analyticsAskToEnable &&\n        <AskToEnable\n          className='mt3'\n          label={t('AskToEnable.label')}\n          yesLabel={t('app:actions.ok')}\n          noLabel={t('app:actions.noThanks')}\n          detailsLabel={t('app:actions.moreInfo')}\n          detailsLink='#/settings/analytics'\n          onYes={doEnableAnalytics}\n          onNo={doDisableAnalytics} />\n      }\n      <div style={{ opacity: ipfsConnected ? 1 : 0.4 }}>\n        { nodeBandwidthEnabled\n          ? <Box className='mt3 pa3'>\n            <div className='flex flex-column flex-row-l joyride-status-charts'>\n              <div className='pr0 pr2-l flex-auto'>\n                <NodeBandwidthChart />\n              </div>\n              <div className='dn db-l pl3 pr5'>\n                <NetworkTraffic />\n              </div>\n            </div>\n          </Box>\n          : <BandwidthStatsDisabled />\n        }\n        <ReactJoyride\n          run={toursEnabled}\n          steps={statusTour.getSteps({ t, Trans })}\n          styles={statusTour.styles}\n          callback={handleJoyrideCallback}\n          continuous\n          scrollToFirstStep\n          locale={getJoyrideLocales(t)}\n          showProgress />\n      </div>\n    </div>\n  )\n}\n\nexport default connect(\n  'selectIpfsConnected',\n  'selectNodeBandwidthEnabled',\n  'selectAnalyticsAskToEnable',\n  'selectToursEnabled',\n  'doEnableAnalytics',\n  'doDisableAnalytics',\n  withTour(withTranslation('status')(StatusPage))\n)\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"],"sourceRoot":""}