From 67e170a847568b12dbc8383e330e65ab9c8099e7 Mon Sep 17 00:00:00 2001 From: apanizo Date: Mon, 11 Jun 2018 17:28:04 +0200 Subject: [PATCH] WA-234 RemoveOwner component --- .../RemoveOwner/RemoveOwnerForm/index.jsx | 35 +++++++ .../component/RemoveOwner/Review/index.jsx | 44 +++++++++ .../safe/component/RemoveOwner/actions.js | 12 +++ .../safe/component/RemoveOwner/index.jsx | 93 +++++++++++++++++++ .../safe/component/RemoveOwner/selector.js | 11 +++ 5 files changed, 195 insertions(+) create mode 100644 src/routes/safe/component/RemoveOwner/RemoveOwnerForm/index.jsx create mode 100644 src/routes/safe/component/RemoveOwner/Review/index.jsx create mode 100644 src/routes/safe/component/RemoveOwner/actions.js create mode 100644 src/routes/safe/component/RemoveOwner/index.jsx create mode 100644 src/routes/safe/component/RemoveOwner/selector.js diff --git a/src/routes/safe/component/RemoveOwner/RemoveOwnerForm/index.jsx b/src/routes/safe/component/RemoveOwner/RemoveOwnerForm/index.jsx new file mode 100644 index 00000000..21230926 --- /dev/null +++ b/src/routes/safe/component/RemoveOwner/RemoveOwnerForm/index.jsx @@ -0,0 +1,35 @@ +// @flow +import * as React from 'react' +import Field from '~/components/forms/Field' +import Checkbox from '~/components/forms/Checkbox' +import Block from '~/components/layout/Block' +import Heading from '~/components/layout/Heading' + +export const DECREASE_PARAM = 'decrease' + +type Props = { + numOwners: number, + threshold: number, + name: string, +} + +const RemoveOwnerForm = ({ numOwners, threshold, name }: Props) => () => ( + + + Remove Owner { !!name && name } + + + {`Actual number of owners: ${numOwners}, threhsold of safe: ${threshold}`} + + + + Decrease threshold? + + +) + +export default RemoveOwnerForm diff --git a/src/routes/safe/component/RemoveOwner/Review/index.jsx b/src/routes/safe/component/RemoveOwner/Review/index.jsx new file mode 100644 index 00000000..3bf6f296 --- /dev/null +++ b/src/routes/safe/component/RemoveOwner/Review/index.jsx @@ -0,0 +1,44 @@ +// @flow +import * as React from 'react' +import CircularProgress from '@material-ui/core/CircularProgress' +import Block from '~/components/layout/Block' +import Bold from '~/components/layout/Bold' +import Heading from '~/components/layout/Heading' +import Paragraph from '~/components/layout/Paragraph' +import { DECREASE_PARAM } from '~/routes/safe/component/RemoveOwner/RemoveOwnerForm' + +type Props = { + name: string, +} + +type FormProps = { + values: Object, + submitting: boolean, +} + +const spinnerStyle = { + minHeight: '50px', +} + +const Review = ({ name }: Props) => ({ values, submitting }: FormProps) => { + const text = values[DECREASE_PARAM] + ? 'This operation will decrease the threshold of the safe' + : 'This operation will not modify the threshold of the safe' + + return ( + + Review the Add Owner operation + + Owner Name: {name} + + + {text} + + + { submitting && } + + + ) +} + +export default Review diff --git a/src/routes/safe/component/RemoveOwner/actions.js b/src/routes/safe/component/RemoveOwner/actions.js new file mode 100644 index 00000000..32f51f38 --- /dev/null +++ b/src/routes/safe/component/RemoveOwner/actions.js @@ -0,0 +1,12 @@ +// @flow +import fetchTransactions from '~/routes/safe/store/actions/fetchTransactions' + +type FetchTransactions = typeof fetchTransactions + +export type Actions = { + fetchTransactions: FetchTransactions, +} + +export default { + fetchTransactions, +} diff --git a/src/routes/safe/component/RemoveOwner/index.jsx b/src/routes/safe/component/RemoveOwner/index.jsx new file mode 100644 index 00000000..3369ddb0 --- /dev/null +++ b/src/routes/safe/component/RemoveOwner/index.jsx @@ -0,0 +1,93 @@ +// @flow +import * as React from 'react' +import Stepper from '~/components/Stepper' +import { connect } from 'react-redux' +import { type Safe } from '~/routes/safe/store/model/safe' +import { getSafeEthereumInstance, createTransaction } from '~/routes/safe/component/AddTransaction/createTransactions' +import RemoveOwnerForm, { DECREASE_PARAM } from './RemoveOwnerForm' +import Review from './Review' +import selector, { type SelectorProps } from './selector' +import actions, { type Actions } from './actions' + +const getSteps = () => [ + 'Fill Owner Form', 'Review Add order operation', +] + +type Props = SelectorProps & Actions & { + safe: Safe, + threshold: number, + name: string, + userToRemove: string, +} + +type State = { + done: boolean, +} + +const SENTINEL_ADDRESS = '0x0000000000000000000000000000000000000001' +export const REMOVE_OWNER_RESET_BUTTON_TEXT = 'RESET' + +class RemoveOwner extends React.Component { + state = { + done: false, + } + + onRemoveOwner = async (values: Object) => { + try { + const { + safe, threshold, executor, fetchTransactions, userToRemove, name, + } = this.props + const nonce = Date.now() + const newThreshold = values[DECREASE_PARAM] ? threshold - 1 : threshold + const safeAddress = safe.get('address') + const gnosisSafe = await getSafeEthereumInstance(safeAddress) + + const storedOwners = await gnosisSafe.getOwners() + const index = storedOwners.findIndex(ownerAddress => ownerAddress === userToRemove) + const prevAddress = index === 0 ? SENTINEL_ADDRESS : storedOwners[index - 1] + const data = gnosisSafe.contract.removeOwner.getData(prevAddress, userToRemove, newThreshold) + + const text = name || userToRemove + await createTransaction(safe, `Remove Owner ${text}`, safeAddress, 0, nonce, executor, data) + + fetchTransactions() + this.setState({ done: true }) + } catch (error) { + this.setState({ done: false }) + // eslint-disable-next-line + console.log('Error while adding owner ' + error) + } + } + + onReset = () => { + this.setState({ done: false }) + } + + render() { + const { safe, name } = this.props + const { done } = this.state + const steps = getSteps() + const finishedButton = + + return ( + + + + { RemoveOwnerForm } + + + { Review } + + + + ) + } +} + +export default connect(selector, actions)(RemoveOwner) diff --git a/src/routes/safe/component/RemoveOwner/selector.js b/src/routes/safe/component/RemoveOwner/selector.js new file mode 100644 index 00000000..5dd370d2 --- /dev/null +++ b/src/routes/safe/component/RemoveOwner/selector.js @@ -0,0 +1,11 @@ +// @flow +import { createStructuredSelector } from 'reselect' +import { userAccountSelector } from '~/wallets/store/selectors/index' + +export type SelectorProps = { + executor: userAccountSelector, +} + +export default createStructuredSelector({ + executor: userAccountSelector, +})