diff --git a/web/package-lock.json b/web/package-lock.json index ab81635..17df696 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1780,6 +1780,11 @@ "@types/node": "*" } }, + "@types/history": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", + "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" + }, "@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -1897,6 +1902,15 @@ } } }, + "@types/react-router": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.8.tgz", + "integrity": "sha512-HzOyJb+wFmyEhyfp4D4NYrumi+LQgQL/68HvJO+q6XtuHSDvw6Aqov7sCAhjbNq3bUPgPqbdvjXC5HeB2oEAPg==", + "requires": { + "@types/history": "*", + "@types/react": "*" + } + }, "@types/sjcl": { "version": "1.0.29", "resolved": "https://registry.npmjs.org/@types/sjcl/-/sjcl-1.0.29.tgz", @@ -3945,6 +3959,14 @@ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" }, + "connected-react-router": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/connected-react-router/-/connected-react-router-6.8.0.tgz", + "integrity": "sha512-E64/6krdJM3Ag3MMmh2nKPtMbH15s3JQDuaYJvOVXzu6MbHbDyIvuwLOyhQIuP4Om9zqEfZYiVyflROibSsONg==", + "requires": { + "prop-types": "^15.7.2" + } + }, "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -4905,24 +4927,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -6566,6 +6570,19 @@ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -7303,18 +7320,13 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "^2.6.1", "whatwg-fetch": ">=0.10.0" }, "dependencies": { "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" } } }, @@ -8531,6 +8543,15 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" }, + "mini-create-react-context": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", + "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", + "requires": { + "@babel/runtime": "^7.5.5", + "tiny-warning": "^1.0.3" + } + }, "mini-css-extract-plugin": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", @@ -11049,6 +11070,46 @@ } } }, + "react-router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", + "requires": { + "@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.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, "react-scripts": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.3.tgz", @@ -11479,6 +11540,11 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -13101,6 +13167,16 @@ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13533,6 +13609,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/web/package.json b/web/package.json index 238d20c..bc0b8b7 100644 --- a/web/package.json +++ b/web/package.json @@ -12,14 +12,17 @@ "@types/react": "^16.9.0", "@types/react-dom": "^16.9.0", "@types/react-redux": "^7.1.9", + "@types/react-router": "^5.1.8", "@types/sjcl": "^1.0.29", "axios": "^0.20.0", + "connected-react-router": "^6.8.0", "node-fetch": "^2.6.1", "node-forge": "0.10.0", "qrcode-generator": "^1.4.4", "react": "^16.13.1", "react-dom": "^16.13.1", "react-redux": "^7.2.1", + "react-router": "^5.2.0", "react-scripts": "3.4.3", "redux": "^4.0.5", "redux-injectors": "^1.3.0", diff --git a/web/src/components/SetupWizard.tsx b/web/src/components/SetupWizard.tsx index c23073f..3d2f5d8 100644 --- a/web/src/components/SetupWizard.tsx +++ b/web/src/components/SetupWizard.tsx @@ -9,6 +9,7 @@ export interface SetupWizardProps { export interface SetupWizardState { currentStep?: number; + mnemonic?: string; } export class SetupWizard extends Component { @@ -76,7 +77,11 @@ export class SetupWizard extends Component { {this.state && this.state.currentStep === 1 && ( - this.props.onComplete()} /> + this.props.onComplete()} + onCancel={() => this.setState({ currentStep: 1 })} + walletImportMnemonic={(mnemonic) => this.setState({ mnemonic: mnemonic })} + /> )} diff --git a/web/src/components/wallet/FileRestore.tsx b/web/src/components/wallet/FileRestore.tsx index 1906656..780f0d5 100644 --- a/web/src/components/wallet/FileRestore.tsx +++ b/web/src/components/wallet/FileRestore.tsx @@ -10,12 +10,12 @@ import { H3, Text } from "../ui/Text"; import { FilePathInfo } from "../../shared/FilePathInfo"; import { WalletRestoreFilePassword } from "./RestoreFilePassword"; import { RequestConfig } from "../../api/Config"; -import { ImportMnemonicRequest } from "../../shared/Mnemonic"; import axios from "axios"; export interface WalletFileRestoreProps { onComplete: () => void; onCancel: () => void; + onRestoreMnemonic: (words: string) => void; } export interface WalletFileRestoreState { @@ -72,15 +72,8 @@ export class WalletFileRestore extends Component< wordCount === 24 || wordCount === 25 ) { - var request: ImportMnemonicRequest = { - mnemonic: wordlist - } - axios.post("/wallet/mnemonic", request, RequestConfig).then(function (response) { - console.log(JSON.stringify(response.data, null, 2)); - self.setState( { loading: true, mnemonic: wordlist }, self.waitForRescan()); - }).catch(function (error) { - console.log("onMnemonic execute wallet/mnemonic [Post] Error: " + error); - }); + self.props.onRestoreMnemonic(wordlist); + this.setState( { loading: true } ); } else { var err: DropzoneError = { title: "Incorrect Word Count", @@ -91,11 +84,6 @@ export class WalletFileRestore extends Component< } }; - // Returns a Promise that resolves after "ms" Milliseconds - private timer(ms: number) { - return new Promise(res => setTimeout(res, ms)); - } - private waitForRescan(): | undefined { //TODO: Use redux-saga for these types of actions console.log('waitForRescan'); diff --git a/web/src/components/wallet/Setup.tsx b/web/src/components/wallet/Setup.tsx index 0804581..c60b6a4 100644 --- a/web/src/components/wallet/Setup.tsx +++ b/web/src/components/wallet/Setup.tsx @@ -10,6 +10,8 @@ import { WalletRestore } from "./Restore"; import { WalletFileRestore } from "./FileRestore"; import { WalletMnemonicRestore } from "./MnemonicRestore"; import { WalletPassword } from "./WalletPassword"; +import { PickedDispatchProps } from "../../state/shared/PickedDispatchProps"; +import { ManageWalletActions } from "../../state/actions/manageWallet"; enum SetupState { Init = 1, @@ -18,36 +20,54 @@ enum SetupState { Restore, RestoreWithMnemonic, RestoreWithSecureFile, - CreatePassword + CreatePassword, + Waiting, + Complete, } export interface WalletSetupProps { onComplete: () => void; + onCancel: () => void; } +export type WalletViewDispatch = PickedDispatchProps; + +type WalletViewDispatchProps = WalletSetupProps & WalletViewDispatch; + export interface WalletSetupState { setupState: SetupState; } -export class WalletSetup extends Component { - constructor(props: WalletSetupProps) { +export class WalletSetup extends Component { + constructor(props: WalletViewDispatchProps) { super(props); // bind events this.componentDidMount = this.componentDidMount.bind(this); this.componentWillUnmount = this.componentWillUnmount.bind(this); - this.onNewWallet = this.onNewWallet.bind(this); + this.onInitWallet = this.onInitWallet.bind(this); + this.onRequestNewWallet = this.onRequestNewWallet.bind(this); + this.onRequestRestoreWallet = this.onRequestRestoreWallet.bind(this); } componentDidMount(): void { this.setState({ setupState: SetupState.Init }); + this.onInitWallet(); } componentWillUnmount(): void {} - private onNewWallet(): void { - this.props.onComplete(); + private onInitWallet(): void { + this.props.walletImportMnemonic("hello test green oil elephant"); + } + + private onRequestNewWallet(): void { + this.setState({ setupState: SetupState.New }) + } + + private onRequestRestoreWallet(): void { + this.setState({ setupState: SetupState.Restore }) } render() { @@ -63,7 +83,7 @@ export class WalletSetup extends Component { this.setState({ setupState: SetupState.New })} + onClick={() => this.onRequestNewWallet()} >

@@ -74,10 +94,7 @@ export class WalletSetup extends Component { - this.setState({ setupState: SetupState.Restore }) - } - > + onClick={() =>this.onRequestRestoreWallet()}>

Restore Wallet @@ -136,7 +153,8 @@ export class WalletSetup extends Component { this.state.setupState === SetupState.RestoreWithSecureFile && ( this.props.onComplete()} - onCancel={() => this.setState({ setupState: SetupState.Restore })} + onCancel={() => this.props.onCancel()} + onRestoreMnemonic={(words) => this.props.walletImportMnemonic(words)} /> )} diff --git a/web/src/state/actions/manageWallet.ts b/web/src/state/actions/manageWallet.ts index 764d937..a22d85b 100644 --- a/web/src/state/actions/manageWallet.ts +++ b/web/src/state/actions/manageWallet.ts @@ -1,21 +1,23 @@ import { ActionType, createAction } from "typesafe-actions"; export enum ManageWalletTypes { - INIT = "wallet/INIT", - IMPORT_MNEMONIC = "wallet/IMPORT_MNEMONIC", - ENCRYPT = "wallet/ENCRYPT", - ADD_USER = "wallet/ADD_USER", - ADD_LINK = "wallet/ADD_LINK", - COMPLETE = "wallet/COMPLETE" + INIT = "@@wallet/INIT", + IMPORT_MNEMONIC = "@@wallet/IMPORT_MNEMONIC", + ENCRYPT = "@@wallet/ENCRYPT", + ADD_USER = "@@wallet/ADD_USER", + ADD_LINK = "@@wallet/ADD_LINK", + COMPLETE = "@@wallet/COMPLETE", + CANCEL_RESTORE = "@@wallet/CANCEL_RESTORE", } export const ManageWalletActions = { walletInit: createAction(ManageWalletTypes.INIT)(), - walletImportMnemonic: createAction(ManageWalletTypes.IMPORT_MNEMONIC)(), + walletImportMnemonic: createAction(ManageWalletTypes.IMPORT_MNEMONIC)(), walletEncrypt: createAction(ManageWalletTypes.ENCRYPT)(), walletAddUser: createAction(ManageWalletTypes.ADD_LINK)(), walletAddLink: createAction(ManageWalletTypes.ADD_LINK)(), - walletComplete: createAction(ManageWalletTypes.COMPLETE)() + walletComplete: createAction(ManageWalletTypes.COMPLETE)(), + walletRestoreCancel: createAction(ManageWalletTypes.CANCEL_RESTORE)(), }; export type ManageWalletActions = ActionType; diff --git a/web/src/state/routes/index.ts b/web/src/state/routes/index.ts new file mode 100644 index 0000000..6801e6f --- /dev/null +++ b/web/src/state/routes/index.ts @@ -0,0 +1,30 @@ +import React from "react"; +import { push } from "connected-react-router"; +import { RouteComponentProps } from "react-router"; +import mananageWallet from "../store/manageWallet"; + +export interface RouteInfo { + path: string; + component: + | React.ComponentType> + | React.ComponentType; + exact: boolean; +} + +const route = ( + path: string, + component: + | React.ComponentType> + | React.ComponentType, + exact: boolean = true +): RouteInfo => ({ path, component, exact }); + +const routingTable = { + mananageWallet: route("/mananageWallet", mananageWallet) +}; + +export const pushRoute = (route: RouteInfo) => push(route.path); + +//deepFreeze(routingTable) + +export const appRoutes = routingTable; diff --git a/web/src/state/sagas/index.ts b/web/src/state/sagas/index.ts index 001676b..8ca3c63 100644 --- a/web/src/state/sagas/index.ts +++ b/web/src/state/sagas/index.ts @@ -7,5 +7,6 @@ export const getRootSaga = () => { // single entry point to start all Sagas at once export default function* rootSagas() { + console.log("rootSagas") yield all([call(watchWalletStatusSaga)]); } diff --git a/web/src/state/sagas/manageWallet.ts b/web/src/state/sagas/manageWallet.ts index 39adf28..9f83933 100644 --- a/web/src/state/sagas/manageWallet.ts +++ b/web/src/state/sagas/manageWallet.ts @@ -6,7 +6,7 @@ function* waitForMnemonicImport() { console.log("waitForReindex -- /WalletImportMnemonic"); for (;;) { const { reindexComplete } = yield { - reindexComplete: take(getType(ManageWalletActions.walletImportMnemonic)) + reindexComplete: take(getType(ManageWalletActions.walletComplete)) }; if (reindexComplete) { console.log("waitForReindex complete"); diff --git a/web/src/state/shared/MapPropsToDispatchObj.ts b/web/src/state/shared/MapPropsToDispatchObj.ts new file mode 100644 index 0000000..eeff8aa --- /dev/null +++ b/web/src/state/shared/MapPropsToDispatchObj.ts @@ -0,0 +1,3 @@ +export type MapPropsToDispatchObj = { + [P in keyof T]:T[P] +} diff --git a/web/src/state/shared/PickedDispatchProps.ts b/web/src/state/shared/PickedDispatchProps.ts new file mode 100644 index 0000000..f46ca3b --- /dev/null +++ b/web/src/state/shared/PickedDispatchProps.ts @@ -0,0 +1,3 @@ +export type PickedDispatchProps = { + [P in K]: T[P] extends (...args: any[]) => any ? (...args: Parameters) => void : never; +}; diff --git a/web/src/state/store/manageWallet.ts b/web/src/state/store/manageWallet.ts new file mode 100644 index 0000000..e4dcf0b --- /dev/null +++ b/web/src/state/store/manageWallet.ts @@ -0,0 +1,15 @@ +import { connect } from "react-redux"; +import { MapPropsToDispatchObj } from "../shared/MapPropsToDispatchObj"; +import { ManageWalletActions } from "../actions/manageWallet"; +import { WalletFileRestore, WalletFileRestoreStateProps, WalletFileRestoreDispatchProps } from "../../components/wallet/FileRestore"; +import { RootState } from '../reducers'; + +const mapStateToProps = (state: RootState): WalletFileRestoreStateProps => { + return { + complete: true + }; +}; + +const mapDispatchToProps: MapPropsToDispatchObj = { ...ManageWalletActions }; + +export default connect(mapStateToProps, mapDispatchToProps)(WalletFileRestore); diff --git a/web/yarn.lock b/web/yarn.lock index 444430e..cde7216 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -1618,6 +1618,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/history@*": + version "4.7.8" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" + integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== + "@types/hoist-non-react-statics@^3.3.0": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" @@ -1717,6 +1722,14 @@ hoist-non-react-statics "^3.3.0" redux "^4.0.0" +"@types/react-router@^5.1.8": + version "5.1.8" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.8.tgz#4614e5ba7559657438e17766bb95ef6ed6acc3fa" + integrity sha512-HzOyJb+wFmyEhyfp4D4NYrumi+LQgQL/68HvJO+q6XtuHSDvw6Aqov7sCAhjbNq3bUPgPqbdvjXC5HeB2oEAPg== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react@*", "@types/react@^16.9.0": version "16.9.49" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.49.tgz#09db021cf8089aba0cdb12a49f8021a69cce4872" @@ -3263,6 +3276,13 @@ connect-history-api-fallback@^1.6.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== +connected-react-router@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/connected-react-router/-/connected-react-router-6.8.0.tgz#ddc687b31d498322445d235d660798489fa56cae" + integrity sha512-E64/6krdJM3Ag3MMmh2nKPtMbH15s3JQDuaYJvOVXzu6MbHbDyIvuwLOyhQIuP4Om9zqEfZYiVyflROibSsONg== + dependencies: + prop-types "^15.7.2" + console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" @@ -5219,6 +5239,18 @@ 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.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -5233,7 +5265,7 @@ 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@^3.3.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -5919,6 +5951,11 @@ is-wsl@^2.1.1: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -6822,7 +6859,7 @@ loglevel@^1.6.8: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -7010,6 +7047,14 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +mini-create-react-context@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" + integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA== + dependencies: + "@babel/runtime" "^7.5.5" + tiny-warning "^1.0.3" + mini-css-extract-plugin@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" @@ -7789,6 +7834,13 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -8921,7 +8973,7 @@ react-error-overlay@^6.0.7: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== -react-is@^16.12.0, react-is@^16.6.3, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: +react-is@^16.12.0, react-is@^16.6.0, react-is@^16.6.3, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -8955,6 +9007,22 @@ react-redux@^7.2.1: prop-types "^15.7.2" react-is "^16.9.0" +react-router@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== + dependencies: + "@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.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + react-scripts@3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.3.tgz#21de5eb93de41ee92cd0b85b0e1298d0bb2e6c51" @@ -9353,6 +9421,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + resolve-url-loader@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" @@ -10480,6 +10553,16 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tiny-invariant@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10859,6 +10942,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"