{"version":3,"sources":["components/api-address-form/ApiAddressForm.js","icons/GlyphTick.js","icons/GlyphAttention.js","components/is-not-connected/IsNotConnected.js","components/is-connected/IsConnected.js","components/about-ipfs/AboutIpfs.js","components/about-webui/AboutWebUI.js","welcome/WelcomePage.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","GlyphTick","props","viewBox","d","GlyphAttention","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","ConnectionStatus","IsNotConnected","withTour","ipfsConnected","ipfsReady","toursEnabled","handleJoyrideCallback","ComponentLoader","isSameOrigin","Helmet","run","steps","welcomeTour","getSteps","styles","callback","scrollToFirstStep","locale","getJoyrideLocales","WrappedComponent","WithTour","data","doDisableTours","action","status","STATUS","FINISHED","includes","this","React","Component","children"],"mappings":"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","file":"static/js/16.f797c8c2.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 GlyphTick = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M50 20.11A29.89 29.89 0 1 0 79.89 50 29.89 29.89 0 0 0 50 20.11zM44.18 63.6L32.53 52l3.92-4 7.73 7.73L63.55 36.4l3.92 3.92z' />\n  </svg>\n)\n\nexport default GlyphTick\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 } from 'react-i18next'\nimport Box from '../box/Box'\nimport GlyphTick from '../../icons/GlyphTick'\n\nexport const IsConnected = ({ t }) => {\n  return (\n    <Box className='pv3 ph4'>\n      <div>\n        <div className='flex flex-wrap items-center'>\n          <GlyphTick style={{ height: 76 }} className='fill-green' role='presentation' />\n          <h1 className='montserrat fw4 charcoal ma0 f3 green'>{t('app:status.connectedToIpfs')}</h1>\n        </div>\n        <p className='fw6 mt1 ml3-ns w-100'>{t('connected.paragraph1')}</p>\n      </div>\n    </Box>\n  )\n}\n\nexport default withTranslation('welcome')(IsConnected)\n","import React from 'react'\nimport { withTranslation, Trans } from 'react-i18next'\nimport Box from '../box/Box'\n\nexport const AboutIpfs = ({ t }) => {\n  return (\n    <Box>\n      <h2 className='mt0 mb3 montserrat fw2 f3 charcoal'>{t('aboutIpfs.header')}</h2>\n      <ul className='pl3'>\n        <Trans i18nKey='aboutIpfs.paragraph1' t={t}>\n          <li className='mb2'><strong>A hypermedia distribution protocol</strong> that incorporates ideas from Kademlia, BitTorrent, Git, and more</li>\n        </Trans>\n        <Trans i18nKey='aboutIpfs.paragraph2' t={t}>\n          <li className='mb2'><strong>A peer-to-peer file transfer network</strong> with a completely decentralized architecture and no central point of failure, censorship, or control</li>\n        </Trans>\n        <Trans i18nKey='aboutIpfs.paragraph3' t={t}>\n          <li className='mb2'><strong>An on-ramp to tomorrow's web</strong> &mdash; traditional browsers can access IPFS files through gateways like <code className='f5 bg-light-gray br2 pa1'>https://ipfs.io</code> or directly using the <a className='link blue' target='_blank' rel='noopener noreferrer' href='https://github.com/ipfs-shipyard/ipfs-companion#ipfs-companion'>IFPS Companion</a> extension</li>\n        </Trans>\n        <Trans i18nKey='aboutIpfs.paragraph4' t={t}>\n          <li className='mb2'><strong>A next-gen CDN</strong> &mdash; just add a file to your node to make it available to the world with cache-friendly content-hash addressing and BitTorrent-style bandwidth distribution</li>\n        </Trans>\n        <Trans i18nKey='aboutIpfs.paragraph5' t={t}>\n          <li className='mb2'><strong>A developer toolset</strong> for building completely <a className='link blue' target='_blank' rel='noopener noreferrer' href='https://awesome.ipfs.io/'>distributed apps and services</a>, backed by a robust open-source community</li>\n        </Trans>\n      </ul>\n    </Box>\n  )\n}\n\nexport default withTranslation('welcome')(AboutIpfs)\n","import React from 'react'\nimport { withTranslation, Trans } from 'react-i18next'\nimport Box from '../box/Box'\n\nexport const AboutWebUI = ({ t }) => {\n  return (\n    <Box>\n      <h2 className='mt0 mb3 montserrat fw2 f3 charcoal'>{t('welcomeInfo.header')}</h2>\n      <ul className='pl3'>\n        <Trans i18nKey='welcomeInfo.paragraph1' t={t}>\n          <li className='mb2'><a href='#/' className='link blue u b'>Check your node status</a>, including how many peers you're connected to, your storage and bandwidth stats, and more</li>\n        </Trans>\n        <Trans i18nKey='welcomeInfo.paragraph2' t={t}>\n          <li className='mb2'><a href='#/files' className='link blue u b'>View and manage files</a> in your IPFS repo, including drag-and-drop file import, easy pinning, and quick sharing and download options</li>\n        </Trans>\n        <Trans i18nKey='welcomeInfo.paragraph3' t={t}>\n          <li className='mb2'><a href='#/explore' className='link blue b'>Visit the \"Merkle Forest\"</a> with some sample datasets and explore IPLD, the data model that underpins how IPFS works</li>\n        </Trans>\n        <Trans i18nKey='welcomeInfo.paragraph4' t={t}>\n          <li className='mb2'><a href='#/peers' className='link blue b'>See who's connected to your node</a>, geolocated on a world map by their IP address</li>\n        </Trans>\n        <Trans i18nKey='welcomeInfo.paragraph5' t={t}>\n          <li className='mb2'><a href='#/settings' className='link blue b'>Review or edit your node settings</a> &mdash; no command line required</li>\n        </Trans>\n        <Trans i18nKey='welcomeInfo.paragraph6' t={t}>\n          <li className='f5'><a href='https://github.com/ipfs-shipyard/ipfs-webui' className='link blue b' target='_blank' rel='noopener noreferrer'>Check this app's source code</a> to <a href='https://github.com/ipfs-shipyard/ipfs-webui/issues' className='link blue' target='_blank' rel='noopener noreferrer'>report a bug</a> or make a contribution, and make IPFS better for everyone!</li>\n        </Trans>\n      </ul>\n    </Box>\n  )\n}\n\nexport default withTranslation('welcome')(AboutWebUI)\n","import React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation } from 'react-i18next'\nimport ReactJoyride from 'react-joyride'\nimport withTour from '../components/tour/withTour'\nimport { welcomeTour } from '../lib/tours'\nimport { getJoyrideLocales } from '../helpers/i8n'\n\n// Components\nimport IsConnected from '../components/is-connected/IsConnected'\nimport IsNotConnected from '../components/is-not-connected/IsNotConnected'\nimport AboutIpfs from '../components/about-ipfs/AboutIpfs'\nimport AboutWebUI from '../components/about-webui/AboutWebUI'\nimport ComponentLoader from '../loader/ComponentLoader.js'\n\nconst WelcomePage = ({ t, apiUrl, ipfsInitFailed, ipfsConnected, ipfsReady, toursEnabled, handleJoyrideCallback }) => {\n  if (!ipfsInitFailed && !ipfsReady) {\n    return <ComponentLoader />\n  }\n\n  const isSameOrigin = window.location.origin === apiUrl\n\n  return (\n    <div>\n      <Helmet>\n        <title>{t('title')}</title>\n      </Helmet>\n      <div className='lh-copy charcoal'>\n        <ConnectionStatus connected={ipfsConnected} sameOrigin={isSameOrigin} t={t} />\n      </div>\n      <ReactJoyride\n        run={toursEnabled}\n        steps={welcomeTour.getSteps({ t })}\n        styles={welcomeTour.styles}\n        callback={handleJoyrideCallback}\n        scrollToFirstStep\n        locale={getJoyrideLocales(t)} />\n    </div>\n  )\n}\n\nconst ConnectionStatus = ({ t, connected, sameOrigin }) => {\n  if (connected) {\n    return (\n      <div>\n        <IsConnected />\n        <div className='flex-ns mt3'>\n          <div className='mr3-ns lh-copy mid-gray w-50-ns'>\n            <AboutWebUI />\n          </div>\n          <div className='lh-copy mid-gray w-50-ns mt3 mt0-ns'>\n            <AboutIpfs />\n          </div>\n        </div>\n      </div>\n    )\n  }\n  return (\n    <IsNotConnected />\n  )\n}\n\nexport default connect(\n  'selectIpfsInitFailed',\n  'selectIpfsConnected',\n  'selectIpfsReady',\n  'selectApiUrl',\n  'selectToursEnabled',\n  withTour(withTranslation('welcome')(WelcomePage))\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":""}