diff --git a/README.md b/README.md index 48d702d9..064a6368 100644 --- a/README.md +++ b/README.md @@ -125,17 +125,60 @@ Add `src/config/env.json` with the following information "API_URL": "https://kovan.api.kickback.events", "NUM_CONFIRMATIONS": 1, "ENV": "kovan", - "DAI_CONTRACT_ADDRESS": "0x7d669a64deb8a4a51eea755bb0e19fd39ce25ae9" + "DAI_CONTRACT_ADDRESS": "0x7d669a64deb8a4a51eea755bb0e19fd39ce25ae9", + "LOCKS": { + "1": { + "0xa5bA2f45aFc9864bFA97CBb7D92BF8390744d529": { + "name": "Kickback Bronze Supporter" + } + }, + "4": { + "0xb452A1BfE64036718aCeFC8B5F718E0c9d233cB8": { + "name": "Kickback Gold Supporter" + }, + "0x70456ebD53E19eaE05932C482FeF1b24251ABb18": { + "name": "Kickback Bronze Supporter" + } + } + } } ``` +The format for "LOCKS" is the following: + +``` +"LOCKS": { + "": { + "": { + "name": "" + } + } +} +``` + +Run the app. + + ``` yarn start ``` **Test creating a event locally** +Event creation is has a paywall by Unlock. Unlock currently only supports Rinkeby and Mainnet. Using Kovan with your wallet will cause an error. + +Rinkeby or Mainnet for Unlock is chosen with `package.json` scripts. Using `yarn build:release:` will select either Rinkeby or Mainnet depending on the script you use. These scripts are found in `package.json`. + +Using `yarn build` will select Mainnet for Unlock. Using `yarn start` will select Rinkeby for unlock. These can be overwritten by entering a network with your start script. `REACT_APP_ENV=live yarn start` will have Unlock use Mainnet, and `REACT_APP_ENV=rinkeby yarn build` will have Unlock use Rinkeby. + +If `env.json` sets `ENV` to `local`, no paywall will be shown. + +Lock addresses are placed in `env.json` under the `LOCKS` field as shown in Setup. New locks can be created for [Mainnet](https://app.unlock-protocol.com/dashboard/) or [Rinkeby](https://staging-app.unlock-protocol.com/dashboard/). + +After the app starts with an envirnoment chosen for unlock: + - Go to http://localhost:3000/create +- Display form by paying for a membership tier (must be Rinkeby or Mainnet) - Fill in event detail (leave password as blank) - Fill in event detail and press "Submit" diff --git a/package.json b/package.json index 747a9c1c..8b33a1f4 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,8 @@ "react-emotion": "^9.2.6", "react-markdown": "^4.3.1", "react-qr-reader": "2.2.1", - "react-router": "^4.3.1", - "react-router-dom": "^4.3.1", + "react-router": "^5.1.2", + "react-router-dom": "^5.1.2", "react-router-hash-link": "^1.2.0", "react-scripts": "2.1.5", "react-select": "^2.1.0", @@ -57,13 +57,13 @@ "scripts": { "setup": "scripts/setup.js", "seedParty": "node scripts/seedParty.js", - "start": "react-scripts --max_old_space_size=2048 start", - "build": "react-scripts --max_old_space_size=2048 build", - "build:release:kovan": "yarn setup --kovan && yarn build", - "build:release:ropsten": "yarn setup --ropsten && yarn build", - "build:release:rinkeby": "yarn setup --rinkeby && yarn build", - "build:release:alpha": "yarn setup --alpha && yarn build", - "build:release:live": "yarn setup --live && yarn build", + "start": "react-scripts --max_old_space_size=2048 start", + "build": "react-scripts --max_old_space_size=2048 build", + "build:release:kovan": "yarn setup --kovan && cross-env REACT_APP_ENV=kovan yarn build", + "build:release:ropsten": "yarn setup --ropsten && cross-env REACT_APP_ENV=ropsten yarn build", + "build:release:rinkeby": "yarn setup --rinkeby && cross-env REACT_APP_ENV=rinkeby yarn build", + "build:release:alpha": "yarn setup --alpha && cross-env REACT_APP_ENV=alpha yarn build", + "build:release:live": "yarn setup --live && cross-env REACT_APP_ENV=live yarn build", "deploy:ropsten": "yarn build:release:ropsten && yarn now -f --local-config .deploy/now.ropsten.json --public && yarn now alias --local-config .deploy/now.ropsten.json && yarn now rm kickback-app-ropsten --safe --yes", "deploy:rinkeby": "yarn build:release:rinkeby && yarn now -f --local-config .deploy/now.rinkeby.json --public && yarn now alias --local-config .deploy/now.rinkeby.json && yarn now rm kickback-app-rinkeby --safe --yes", "deploy:kovan": "yarn build:release:kovan && yarn now -f --local-config .deploy/now.kovan.json --public && yarn now alias --local-config .deploy/now.kovan.json && yarn now rm kickback-app-kovan --safe --yes", @@ -87,6 +87,7 @@ "@storybook/addon-links": "^3.4.11", "@storybook/react": "^3.4.11", "babel-plugin-macros": "^2.4.2", + "cross-env": "^6.0.3", "cypress": "^3.1.2", "cypress-testing-library": "^2.3.3", "ganache-cli": "^6.1.8", @@ -119,4 +120,4 @@ "engines": { "node": "10.x" } -} \ No newline at end of file +} diff --git a/public/index.html b/public/index.html index 7d2ac936..de26bfd4 100644 --- a/public/index.html +++ b/public/index.html @@ -59,13 +59,37 @@ To create a production bundle, use `npm run build` or `yarn build`. --> - - + + + + + diff --git a/scripts/setup.js b/scripts/setup.js index da0ff7e7..0ef0ed9c 100755 --- a/scripts/setup.js +++ b/scripts/setup.js @@ -43,6 +43,16 @@ if (argv.ropsten) { appConfig.GIT_COMMIT = getGitCommit() appConfig.ROLLBAR_TOKEN = 'e676d64e462b48d098a12db8a173598a' appConfig.BLOCKNATIVE_DAPPID = '27b3eac2-e46c-428a-9a0c-56cce2725d42' + appConfig.LOCKS = { + 4: { + '0xb452A1BfE64036718aCeFC8B5F718E0c9d233cB8': { + name: 'Kickback Gold Supporter' + }, + '0x70456ebD53E19eaE05932C482FeF1b24251ABb18': { + name: 'Kickback Bronze Supporter' + } + } + } } else if (argv.kovan) { appConfig.ENV = 'kovan' appConfig.API_URL = 'https://kovan.api.kickback.events' diff --git a/src/components/Header/HamburgerMenu.js b/src/components/Header/HamburgerMenu.js index 3c675615..f77664ec 100644 --- a/src/components/Header/HamburgerMenu.js +++ b/src/components/Header/HamburgerMenu.js @@ -31,9 +31,13 @@ function HamburgerMenu({ isMenuOpen }) { Pricing {links.map(l => isExternal(l.url) ? ( - {l.label} + + {l.label} + ) : ( - {l.label} + + {l.label} + ) )} diff --git a/src/components/Profile/ProfileForm.js b/src/components/Profile/ProfileForm.js index 0643c10a..a16975ea 100644 --- a/src/components/Profile/ProfileForm.js +++ b/src/components/Profile/ProfileForm.js @@ -60,7 +60,10 @@ export default class ProfileForm extends Component { '' const realName = _.get(existingProfile, 'realName') || '' const twitter = - _.get(social.find(({ type }) => type === 'twitter'), 'value') || '' + _.get( + social.find(({ type }) => type === 'twitter'), + 'value' + ) || '' const terms = _.get( getUserAcceptedLegalAgreement(legal, latestLegal, TERMS_AND_CONDITIONS), 'id' diff --git a/src/index.js b/src/index.js index 7837b495..0abee6c6 100644 --- a/src/index.js +++ b/src/index.js @@ -11,6 +11,19 @@ import { clientInstance } from './graphql' import setupWeb3 from './api/web3' import { GlobalProvider } from './GlobalState' import './globalStyles' +import { ENV, LOCKS } from './config' + +// assumes mainnet or rinkeby Unlock for now +const networkId = ENV === 'live' ? 1 : 4 +const locks = LOCKS[networkId] + +window.unlockProtocolConfig = { + locks, + icon: 'https://kickback.events/card.png', + callToAction: { + default: 'Select a membership to access page.' + } +} window.addEventListener('load', async () => { setupRollbar() diff --git a/src/mediaQuery.js b/src/mediaQuery.js index e3f12ce7..1f4190ad 100644 --- a/src/mediaQuery.js +++ b/src/mediaQuery.js @@ -28,25 +28,22 @@ const mq = Object.keys(breakpoints).reduce((accumulator, label) => { const useMedia = (query, defaultState) => { const [state, setState] = useState(defaultState) - useEffect( - () => { - let mounted = true - const mql = window.matchMedia(query) - const onChange = () => { - if (!mounted) return - setState(!!mql.matches) - } - - mql.addListener(onChange) - setState(mql.matches) - - return () => { - mounted = false - mql.removeListener(onChange) - } - }, - [query] - ) + useEffect(() => { + let mounted = true + const mql = window.matchMedia(query) + const onChange = () => { + if (!mounted) return + setState(!!mql.matches) + } + + mql.addListener(onChange) + setState(mql.matches) + + return () => { + mounted = false + mql.removeListener(onChange) + } + }, [query]) return state } diff --git a/src/routes/CreateEvent.js b/src/routes/CreateEvent.js index 11f88f10..37332a29 100644 --- a/src/routes/CreateEvent.js +++ b/src/routes/CreateEvent.js @@ -1,9 +1,11 @@ -import React, { Component } from 'react' +import React, { useState, useEffect } from 'react' import styled from 'react-emotion' -import { withRouter } from 'react-router-dom' +import { useHistory } from 'react-router-dom' import DefaultTextInput from '../components/Forms/TextInput' import Label from '../components/Forms/Label' - +import DefaultButton from '../components/Forms/Button' +import Loader from '../components/Loader' +import { ENV } from '../config' import PartyForm from '../components/SingleEvent/Admin/PartyForm' import { CREATE_PENDING_PARTY } from '../graphql/mutations' @@ -13,42 +15,191 @@ const CreateContainer = styled('div')` flex-direction: column; ` +const LockedContainer = styled('div')` + display: flex; + flex-direction: column; +` + const TextInput = styled(DefaultTextInput)` margin-bottom: 20px; ` -class Create extends Component { - state = { - password: '' - } +const Button = styled(DefaultButton)` + margin: 60px auto 0px auto; +` + +const UnlockCredit = styled('div')` + margin: 40px auto 140px auto; + font-size: 14px; +` + +const UnlockedLogo = styled('a')` + color: #ff6771; + font-weight: 800; +` + +const AddrDisplay = styled('span')` + background-color: #6e76ff; + color: #fff; + border-radius: 2px; + padding: 5px; + font-size: 10px; + margin-right: 10px; +` + +const UnlockUserDetails = styled('div')` + display: flex; + flex-direction: row; + margin-bottom: 30px; + transition: transform 300ms ease-in-out; +` + +export default function Create() { + const [password, setPassword] = useState('') + const [locked, setLocked] = useState('pending') + const [membership, setMembership] = useState('') + const [membershipAddr, setMembershipAddr] = useState('') + let history = useHistory() - render() { - const { password } = this.state - - return ( - - - - this.setState({ password: val })} - type="password" - /> - - + const _onCreated = ({ id }, deposit, limitOfParticipants, coolingPeriod) => { + history.push( + `/deploy?id=${id}&deposit=${deposit}&limitOfParticipants=${limitOfParticipants}&coolingPeriod=${coolingPeriod}` ) } - _onCreated = ({ id }, deposit, limitOfParticipants, coolingPeriod) => { - this.props.history.push( - `/deploy?id=${id}&deposit=${deposit}&limitOfParticipants=${limitOfParticipants}&coolingPeriod=${coolingPeriod}` + const updateUnlockUser = () => { + /* + get available locks by tier + get all purchases for user, select latest purchase, isolate key address + search for owned keys, if a pair matches highest lock tier, set label and address + if not search for next tier, set label and address + */ + + const data = window.unlockProtocol.blockchainData() + const locks = Object.keys(data.locks).map(i => data.locks[i]) + const bronzeLock = locks.find(o => o.name.includes('Kickback Bronze')) + const goldLock = locks.find(o => o.name.includes('Kickback Gold')) + const purchases = Object.keys(data.transactions).map( + i => data.transactions[i] + ) + const latestPurchaseBlock = Math.max.apply( + Math, + purchases.map(function(o) { + return o.blockNumber + }) ) + const latestPurchase = purchases.find( + o => o.blockNumber === latestPurchaseBlock + ) + const key = latestPurchase.lock + + if (Object.values(goldLock).includes(key)) { + setMembership(goldLock.name) + setMembershipAddr(goldLock.address) + } else if (Object.values(bronzeLock).includes(key)) { + setMembership(bronzeLock.name) + setMembershipAddr(bronzeLock.address) + } } -} -export default withRouter(Create) + const unlockHandler = async e => { + /* + Status can either be 'unlocked' or 'locked'... + If state is 'unlocked': implement code here which will be triggered when + the current visitor has a valid lock key + If state is 'locked': implement code here which will be + triggered when the current visitor does not have a valid lock key + */ + + setLocked(e.detail) + + // run this loop only if unlocked + // if keys previously purchased and expired, will be locked, updateUnlockUser() won't run + if (e.detail === 'unlocked') { + // blockchainData() will load empty first, check if loaded before updating state, checks every 100 ms + let checkExist = setInterval(function() { + if (window.unlockProtocol.blockchainData()) { + // once loaded, update hooks with lock info, and exit timer loop + updateUnlockUser() + clearInterval(checkExist) + } + }, 100) + } + } + + const checkout = () => { + window.ethereum.enable() + window.unlockProtocol && window.unlockProtocol.loadCheckoutModal() + } + + useEffect(() => { + // don't load paywall if testing with ganache + if (ENV !== 'local') { + window.addEventListener('unlockProtocol', unlockHandler) + } else { + setLocked('unlocked') + } + + // remove unlock in component unmount + return () => { + ENV !== 'local' && + window.removeEventListener('unlockProtocol', unlockHandler) + } + }, []) + + return ( + + { + { + unlocked: ( +
+ {membershipAddr !== '' && ( + + {membership} + {membershipAddr} + + )} + + + setPassword(val)} + type="password" + /> + +
+ ), + locked: ( + +

Deploy your Kickback contract with us

+

+ Kickback offers paid benefits for event organizers publishing + their own kickback contract. Membership comes in two tiers. +

+ + + Powered by{' '} + + Unlock + + +
+ ), + pending: , + default:
Please enable Javascript
+ }[locked || locked['default']] + } +
+ ) +} diff --git a/yarn.lock b/yarn.lock index 8679e6d7..92c9654f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -987,7 +987,7 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.4.3", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.3", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== @@ -1470,9 +1470,9 @@ integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== "@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" @@ -1520,9 +1520,9 @@ integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== "@types/yargs@^13.0.0": - version "13.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.5.tgz#18121bfd39dc12f280cee58f92c5b21d32041908" - integrity sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q== + version "13.0.6" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.6.tgz#6aed913a92c262c13b94d4bca8043237de202124" + integrity sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA== dependencies: "@types/yargs-parser" "*" @@ -3835,13 +3835,13 @@ browserslist@^3.2.6: electron-to-chromium "^1.3.47" browserslist@^4.0.0, browserslist@^4.3.4, browserslist@^4.3.5, browserslist@^4.8.2, browserslist@^4.8.3: - version "4.8.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44" - integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg== + version "4.8.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.5.tgz#691af4e327ac877b25e7a3f7ee869c4ef36cdea3" + integrity sha512-4LMHuicxkabIB+n9874jZX/az1IaZ5a+EUuvD7KFOu9x/Bd5YHyO0DIz2ls/Kl8g0ItS4X/ilEgf4T1Br0lgSg== dependencies: - caniuse-lite "^1.0.30001017" - electron-to-chromium "^1.3.322" - node-releases "^1.1.44" + caniuse-lite "^1.0.30001022" + electron-to-chromium "^1.3.338" + node-releases "^1.1.46" bser@2.1.1: version "2.1.1" @@ -4085,14 +4085,14 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30001021" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001021.tgz#ee4ad516fb2530abd90d2b32e986b172808672e5" - integrity sha512-FNfovmJx9ssO2hpvdN7D9daRAZHZ80gDV2KQRC0+icpm7QjyWm6Ea2TUEAk0rpNrRQYMeRbVOVsWwq9CE7V2zw== + version "1.0.30001022" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001022.tgz#a7721c26a4af4d8420680079dcd27754be84daf6" + integrity sha512-2RQQgO+yDEaqF4ltwrCja7oZst+FVnXHQLSJgZ678tausEljBq3/U20Fedvze+Hxqm8XLV+9OgGbtdgS7ksnRw== -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000918, caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30001017, caniuse-lite@^1.0.30001020: - version "1.0.30001021" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz#e75ed1ef6dbadd580ac7e7720bb16f07b083f254" - integrity sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000918, caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001022: + version "1.0.30001022" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001022.tgz#9eeffe580c3a8f110b7b1742dcf06a395885e4c6" + integrity sha512-FjwPPtt/I07KyLPkBQ0g7/XuZg6oUkYBVnPHNj3VHJbOjmmJ/GdSo/GUY6MwINEQvjhP6WZVbX8Tvms8xh0D5A== capture-exit@^1.2.0: version "1.2.0" @@ -4782,6 +4782,13 @@ create-react-class@^15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" +cross-env@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" + integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== + dependencies: + cross-spawn "^7.0.0" + cross-fetch@2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.2.tgz#a47ff4f7fc712daba8f6a695a11c948440d45723" @@ -4810,6 +4817,15 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-browserify@3.12.0, crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -5659,9 +5675,9 @@ dot-prop@^4.1.1: is-obj "^1.0.0" dotenv-defaults@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dotenv-defaults/-/dotenv-defaults-1.0.3.tgz#434a78209f2cab07f9ec9b86b79ae7e9ca5d818b" - integrity sha512-EHeXF8VZA/XhkGJCtRpJCTHC8GkoisPXjdvJMzxgFrlN6lTEW/eksRNsVKnW0BxR1pGZH8IEBO/D0mDkIrC6fA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/dotenv-defaults/-/dotenv-defaults-1.1.1.tgz#032c024f4b5906d9990eb06d722dc74cc60ec1bd" + integrity sha512-6fPRo9o/3MxKvmRZBD3oNFdxODdhJtIy1zcJeUSCs6HCy4tarUpd+G67UTU9tF6OWXeSPqsm4fPAB+2eY9Rt9Q== dependencies: dotenv "^6.2.0" @@ -5741,10 +5757,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.322, electron-to-chromium@^1.3.47: - version "1.3.337" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.337.tgz#b2c093cdb66121a946d333b454adcdc5666ceaed" - integrity sha512-uJ+wLjslYQ/2rAusDg+6FlK8DLhHWTLCe7gkofBehTifW7KCkPVTn5rhKSCncWYNq34Iy/o4OfswuEkAO2RBaw== +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.338, electron-to-chromium@^1.3.47: + version "1.3.339" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.339.tgz#ff7b56c4bc58159f0d6623591116e4414e7a618b" + integrity sha512-C1i/vH6/kQx9YV8RddMkmW216GwW4pTrnYIlKmDFIqXA4fPwqDxIdGyHsuG+fgurHoljRz7/oaD+tztcryW/9g== elegant-spinner@^1.0.1: version "1.0.1" @@ -5860,9 +5876,9 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.16.3, es-abstract@^1.17.0, es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: - version "1.17.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.2.tgz#965b10af56597b631da15872c17a405e86c1fd46" - integrity sha512-YoKuru3Lyoy7yVTBSH2j7UxTqe/je3dWAruC0sHvZX1GNd5zX8SSLvQqEgO9b3Ex8IW+goFI9arEEsFIbulhOw== + version "1.17.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" + integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" @@ -7208,9 +7224,9 @@ functional-red-black-tree@^1.0.1: integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= functions-have-names@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.0.tgz#83da7583e4ea0c9ac5ff530f73394b033e0bf77d" - integrity sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.1.tgz#a981ac397fa0c9964551402cdc5533d7a4d52f91" + integrity sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA== fuse.js@^3.0.1, fuse.js@^3.2.0: version "3.4.6" @@ -7565,6 +7581,11 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + gzip-size@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" @@ -7735,7 +7756,7 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== -history@^4.7.2: +history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== @@ -7766,12 +7787,7 @@ hoist-non-react-statics@1.x.x, hoist-non-react-statics@^1.2.0: resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb" integrity sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs= -hoist-non-react-statics@^2.5.0: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" - integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== - -hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#101685d3aff3b23ea213163f6e8e12f4f111e19f" integrity sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw== @@ -10395,6 +10411,15 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +mini-create-react-context@^0.3.0: + version "0.3.2" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189" + integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw== + dependencies: + "@babel/runtime" "^7.4.0" + gud "^1.0.0" + tiny-warning "^1.0.2" + mini-css-extract-plugin@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0" @@ -10818,10 +10843,10 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.3, node-releases@^1.1.44: - version "1.1.46" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.46.tgz#6b262afef1bdc9a950a96df2e77e0d2290f484bf" - integrity sha512-YOjdx+Uoh9FbRO7yVYbnbt1puRWPQMemR3SutLeyv2XfxKs1ihpe0OLAUwBPEP2ImNH/PZC7SEiC6j32dwRZ7g== +node-releases@^1.1.3, node-releases@^1.1.46: + version "1.1.47" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.47.tgz#c59ef739a1fd7ecbd9f0b7cf5b7871e8a8b591e4" + integrity sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA== dependencies: semver "^6.3.0" @@ -11470,6 +11495,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.5, path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -12937,9 +12967,9 @@ rc-trigger@^2.2.0: react-lifecycles-compat "^3.0.4" rc-util@^4.0.4, rc-util@^4.15.3, rc-util@^4.4.0: - version "4.18.1" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.18.1.tgz#5a6312503cd5366ef0bede021dce42d373f404a8" - integrity sha512-3aRHG32ZvqBymtJUGoQnbZS+XANzO6XTiFEFAYI3BfuxESEazopAy0kBwcAI6BlLHsW1oLiy3ysE9uYwylh2ag== + version "4.19.0" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.19.0.tgz#f3b5e3a02cc0a667d127784068e1236c095dbcbf" + integrity sha512-mptALlLwpeczS3nrv83DbwJNeupolbuvlIEjcvimSiWI8NUBjpF0HgG3kWp1RymiuiRCNm9yhaXqDz0a99dpgQ== dependencies: add-dom-event-listener "^1.1.0" babel-runtime "6.x" @@ -13150,7 +13180,7 @@ react-inspector@^2.2.2: is-dom "^1.0.9" prop-types "^15.6.1" -react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: version "16.12.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== @@ -13193,17 +13223,18 @@ react-qr-reader@2.2.1: prop-types "^15.7.2" webrtc-adapter "^7.2.1" -react-router-dom@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" - integrity sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA== +react-router-dom@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18" + integrity sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew== dependencies: - history "^4.7.2" - invariant "^2.2.4" + "@babel/runtime" "^7.1.2" + history "^4.9.0" loose-envify "^1.3.1" - prop-types "^15.6.1" - react-router "^4.3.1" - warning "^4.0.1" + prop-types "^15.6.2" + react-router "5.1.2" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" react-router-hash-link@^1.2.0: version "1.2.2" @@ -13212,18 +13243,21 @@ react-router-hash-link@^1.2.0: dependencies: prop-types "^15.6.0" -react-router@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" - integrity sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg== +react-router@5.1.2, react-router@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" + integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== dependencies: - history "^4.7.2" - hoist-non-react-statics "^2.5.0" - invariant "^2.2.4" + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" loose-envify "^1.3.1" + mini-create-react-context "^0.3.0" path-to-regexp "^1.7.0" - prop-types "^15.6.1" - warning "^4.0.1" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" react-scripts@2.1.5: version "2.1.5" @@ -13823,9 +13857,9 @@ resolve@1.10.0: path-parse "^1.0.6" resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1, resolve@^1.9.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.2.tgz#dbf31d0fa98b1f29aa5169783b9c290cb865fea2" - integrity sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ== + version "1.15.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" + integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== dependencies: path-parse "^1.0.6" @@ -14313,11 +14347,23 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + shell-quote@1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" @@ -14370,9 +14416,9 @@ simple-get@^2.7.0: simple-concat "^1.0.0" simple-git@^1.85.0: - version "1.129.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.129.0.tgz#eddd2611d2bf41c77e1d08cd70c0b7f3af785040" - integrity sha512-XbzNmugMTeV2crZnPl+b1ZJn+nqXCUNyrZxDXpLM0kHL3B85sbPlpd8q9I4qtAHI9D2FxTB6w4BuiAGKYtyzKw== + version "1.130.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.130.0.tgz#b689c4163bc021df563a81f256de54482005195d" + integrity sha512-gQsPA1uuAkGUa6S+yG4NRknKHVEV+Vnp437w8dJpDpzjtEH566WRSz5z6DoIxlBFaLC7Xwypznsuf1S/J0gtFg== dependencies: debug "^4.0.1" @@ -15315,7 +15361,7 @@ tiny-invariant@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.6.tgz#b3f9b38835e36a41c843a3b0907a5a7b3755de73" integrity sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA== -tiny-warning@^1.0.0: +tiny-warning@^1.0.0, tiny-warning@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -15580,9 +15626,9 @@ uglify-js@^2.8.29: uglify-to-browserify "~1.0.0" uglify-js@^3.1.4: - version "3.7.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.5.tgz#278c7c24927ac5a32d3336fc68fd4ae1177a486a" - integrity sha512-GFZ3EXRptKGvb/C1Sq6nO1iI7AGcjyqmIyOw0DrD0675e+NNbGO72xmMM2iEBdFbxaTLo70NbjM/Wy54uZIlsg== + version "3.7.6" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.6.tgz#0783daa867d4bc962a37cc92f67f6e3238c47485" + integrity sha512-yYqjArOYSxvqeeiYH2VGjZOqq6SVmhxzaPjJC1W2F9e+bqvFL9QXQ2osQuKUFjM2hGjKG2YclQnRKWQSt/nOTQ== dependencies: commander "~2.20.3" source-map "~0.6.1" @@ -16039,7 +16085,7 @@ walker@~1.0.5: dependencies: makeerror "1.0.x" -warning@^4.0.1, warning@^4.0.3: +warning@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== @@ -16586,6 +16632,13 @@ which@^1.2.10, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^ dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"