From d3ab3ec6583d4476153d2c3b1b45bc4adb8ee068 Mon Sep 17 00:00:00 2001 From: apanizo Date: Fri, 27 Apr 2018 15:06:13 +0200 Subject: [PATCH] WA-238 Adding Daily Limit when showing safe route --- src/routes/open/container/Open.jsx | 5 ++-- src/routes/open/utils/safeDataExtractor.js | 2 ++ src/routes/safe/component/Safe/DailyLimit.jsx | 21 ++++++++++++++ src/routes/safe/component/Safe/index.jsx | 2 ++ src/routes/safe/store/actions/addSafe.js | 5 ++-- src/routes/safe/store/model/safe.js | 2 ++ .../safe/store/test/builder/safe.builder.js | 6 ++++ src/routes/safe/store/test/safe.reducer.js | 28 ++++++++----------- 8 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 src/routes/safe/component/Safe/DailyLimit.jsx diff --git a/src/routes/open/container/Open.jsx b/src/routes/open/container/Open.jsx index c80aadf4..e3897ef7 100644 --- a/src/routes/open/container/Open.jsx +++ b/src/routes/open/container/Open.jsx @@ -3,7 +3,7 @@ import * as React from 'react' import { connect } from 'react-redux' import contract from 'truffle-contract' import Page from '~/components/layout/Page' -import { getAccountsFrom, getThresholdFrom, getNamesFrom, getSafeNameFrom } from '~/routes/open/utils/safeDataExtractor' +import { getAccountsFrom, getThresholdFrom, getNamesFrom, getSafeNameFrom, getDailyLimitFrom } from '~/routes/open/utils/safeDataExtractor' import { getWeb3 } from '~/wallets/getWeb3' import { promisify } from '~/utils/promisify' import Safe from '#/GnosisSafe.json' @@ -26,12 +26,13 @@ const createSafe = async (safeContract, values, userAccount, addSafe) => { const numConfirmations = getThresholdFrom(values) const name = getSafeNameFrom(values) const owners = getNamesFrom(values) + const dailyLimit = getDailyLimitFrom(values) const web3 = getWeb3() safeContract.setProvider(web3.currentProvider) const safe = await safeContract.new(accounts, numConfirmations, 0, 0, { from: userAccount, gas: '5000000' }) - addSafe(name, safe.address, numConfirmations, owners, accounts) + addSafe(name, safe.address, numConfirmations, dailyLimit, owners, accounts) return safe } diff --git a/src/routes/open/utils/safeDataExtractor.js b/src/routes/open/utils/safeDataExtractor.js index e0d84130..25a91fc5 100644 --- a/src/routes/open/utils/safeDataExtractor.js +++ b/src/routes/open/utils/safeDataExtractor.js @@ -1,4 +1,6 @@ // @flow +export const getDailyLimitFrom = (values: Object): number => Number(values.limit) + export const getAccountsFrom = (values: Object): string[] => { const accounts = Object.keys(values).sort().filter(key => /^owner\d+Address$/.test(key)) diff --git a/src/routes/safe/component/Safe/DailyLimit.jsx b/src/routes/safe/component/Safe/DailyLimit.jsx new file mode 100644 index 00000000..20bd47c7 --- /dev/null +++ b/src/routes/safe/component/Safe/DailyLimit.jsx @@ -0,0 +1,21 @@ +// @flow +import * as React from 'react' +import { ListItem } from 'material-ui/List' +import Avatar from 'material-ui/Avatar' +import NotificationsPaused from 'material-ui-icons/NotificationsPaused' +import ListItemText from '~/components/List/ListItemText' + +type Props = { + limit: number, +} + +const DailyLimit = ({ limit }: Props) => ( + + + + + + +) + +export default DailyLimit diff --git a/src/routes/safe/component/Safe/index.jsx b/src/routes/safe/component/Safe/index.jsx index 40a1c9c6..dab8c26e 100644 --- a/src/routes/safe/component/Safe/index.jsx +++ b/src/routes/safe/component/Safe/index.jsx @@ -12,6 +12,7 @@ import Address from './Address' import Balance from './Balance' import Owners from './Owners' import Confirmations from './Confirmations' +import DailyLimit from './DailyLimit' type SafeProps = { safe: Safe, @@ -34,6 +35,7 @@ class GnoSafe extends React.PureComponent {
+ diff --git a/src/routes/safe/store/actions/addSafe.js b/src/routes/safe/store/actions/addSafe.js index 8a7a924f..e4a1801e 100644 --- a/src/routes/safe/store/actions/addSafe.js +++ b/src/routes/safe/store/actions/addSafe.js @@ -15,13 +15,14 @@ export const buildOwnersFrom = (names: string[], addresses: string[]) => { const addSafe = createAction( ADD_SAFE, ( - name: string, address: string, confirmations: number, + name: string, address: string, + confirmations: number, dailyLimit: number, ownersName: string[], ownersAddress: string[], ): SafeProps => { const owners: List = buildOwnersFrom(ownersName, ownersAddress) return ({ - address, name, confirmations, owners, + address, name, confirmations, owners, dailyLimit, }) }, ) diff --git a/src/routes/safe/store/model/safe.js b/src/routes/safe/store/model/safe.js index 146085a0..28e25209 100644 --- a/src/routes/safe/store/model/safe.js +++ b/src/routes/safe/store/model/safe.js @@ -8,6 +8,7 @@ export type SafeProps = { address: string, confirmations: number, owners: List, + dailyLimit: number, } export const makeSafe: RecordFactory = Record({ @@ -15,6 +16,7 @@ export const makeSafe: RecordFactory = Record({ address: '', confirmations: 0, owners: List([]), + dailyLimit: 0, }) export type Safe = RecordOf diff --git a/src/routes/safe/store/test/builder/safe.builder.js b/src/routes/safe/store/test/builder/safe.builder.js index d7ad86bd..0bde9e05 100644 --- a/src/routes/safe/store/test/builder/safe.builder.js +++ b/src/routes/safe/store/test/builder/safe.builder.js @@ -24,6 +24,11 @@ class SafeBuilder { return this } + withDailyLimit(limit: number) { + this.safe = this.safe.set('dailyLimit', limit) + return this + } + withOwner(names: string[], adresses: string[]) { const owners = buildOwnersFrom(names, adresses) this.safe = this.safe.set('owners', owners) @@ -42,6 +47,7 @@ export class SafeFactory { .withAddress('0x03db1a8b26d08df23337e9276a36b474510f0025') .withName('Adol ICO Safe') .withConfirmations(1) + .withDailyLimit(10) .withOwner(['Adol Metamask'], ['0x03db1a8b26d08df23337e9276a36b474510f0023']) .get() diff --git a/src/routes/safe/store/test/safe.reducer.js b/src/routes/safe/store/test/safe.reducer.js index c9c241df..dea0bfbd 100644 --- a/src/routes/safe/store/test/safe.reducer.js +++ b/src/routes/safe/store/test/safe.reducer.js @@ -23,27 +23,31 @@ const aStore = (initState) => { const providerReducerTests = () => { describe('Safe Actions[addSafe]', () => { let store + let address + let formValues beforeEach(() => { store = aStore() - }) - - it('reducer should return SafeRecord from form values', () => { - // GIVEN - const address = '0x03db1a8b26d08df23337e9276a36b474510f0025' - const formValues = { + address = '0x03db1a8b26d08df23337e9276a36b474510f0025' + formValues = { [SafeFields.FIELD_NAME]: 'Adol ICO Safe', [SafeFields.FIELD_CONFIRMATIONS]: 1, [SafeFields.FIELD_OWNERS]: 1, + [SafeFields.FIELD_DAILY_LIMIT]: 10, [SafeFields.getOwnerAddressBy(0)]: '0x03db1a8b26d08df23337e9276a36b474510f0023', [SafeFields.getOwnerNameBy(0)]: 'Adol Metamask', address, } + }) + + it('reducer should return SafeRecord from form values', () => { + // GIVEN in beforeEach method // WHEN store.dispatch(addSafe( formValues[SafeFields.FIELD_NAME], formValues.address, formValues[SafeFields.FIELD_CONFIRMATIONS], + formValues[SafeFields.FIELD_DAILY_LIMIT], getNamesFrom(formValues), getAccountsFrom(formValues), )) @@ -54,22 +58,14 @@ const providerReducerTests = () => { }) it('reducer loads information from localStorage', async () => { - // GIVEN - const address = '0x03db1a8b26d08df23337e9276a36b474510f0025' - const formValues = { - [SafeFields.FIELD_NAME]: 'Adol ICO Safe', - [SafeFields.FIELD_CONFIRMATIONS]: 1, - [SafeFields.FIELD_OWNERS]: 1, - [SafeFields.getOwnerAddressBy(0)]: '0x03db1a8b26d08df23337e9276a36b474510f0023', - [SafeFields.getOwnerNameBy(0)]: 'Adol Metamask', - address, - } + // GIVEN in beforeEach method // WHEN store.dispatch(addSafe( formValues[SafeFields.FIELD_NAME], formValues.address, formValues[SafeFields.FIELD_CONFIRMATIONS], + formValues[SafeFields.FIELD_DAILY_LIMIT], getNamesFrom(formValues), getAccountsFrom(formValues), ))