Skip to content
This repository has been archived by the owner on Apr 15, 2019. It is now read-only.

Create priced button component - Closes #583 #585

Merged
merged 5 commits into from
Aug 9, 2017
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions src/components/pricedButton/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import React from 'react';
import Button from 'react-toolbox/lib/button';
import { fromRawLsk } from '../../utils/lsk';
import styles from './pricedButton.css';

const PricedButton = ({
balance, fee, label, customClassName, onClick, disabled,
}) => {
const hasFunds = balance >= fee;
return (
<div className='primary-button'>
{
fee &&
(<span className={`${styles.fee} ${hasFunds ? '' : styles.error}`}>
{
hasFunds ? `Fee: ${fromRawLsk(fee)} LSK` :
`Insufficient funds for ${fromRawLsk(fee)} LSK fee`
}
</span>)
}
<Button
label={label}
primary={true}
raised={true}
className={`next-button ${customClassName}`}
disabled={disabled || (fee && !hasFunds)}
onClick={onClick.bind(this)} />
</div>
);
};

export default PricedButton;
56 changes: 56 additions & 0 deletions src/components/pricedButton/index.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import React from 'react';
import chai, { expect } from 'chai';
import sinonChai from 'sinon-chai';
import sinon from 'sinon';
import { shallow } from 'enzyme';
import chaiEnzyme from 'chai-enzyme';
import Button from 'react-toolbox/lib/button';
import PricedButton from './index';

chai.use(sinonChai);
chai.use(chaiEnzyme());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you guys do this in every file?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


describe('DialogElement', () => {
let wrapper;
const props = {
fee: 5e8,
onClick: sinon.spy(),
};
const insufficientBalance = 4.9999e8;
const sufficientBalance = 6e8;

it('renders <Button /> component from react-toolbox', () => {
wrapper = shallow(<PricedButton {...props} balance={sufficientBalance} />);
expect(wrapper.find(Button)).to.have.length(1);
});

describe('Sufficient funds', () => {
beforeEach(() => {
wrapper = shallow(<PricedButton {...props} balance={sufficientBalance} />);
});

it('renders a span saying "Fee: 5 LSK"', () => {
expect(wrapper.find('span').text()).to.be.equal('Fee: 5 LSK');
});

it('allows to click on Button', () => {
wrapper.find(Button).simulate('click');
expect(props.onClick).to.have.been.calledWith();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prefer .calledWithExactly.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This component is not supposed to pass anything to it's click handler. what's the difference?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

screen shot 2017-08-09 at 11 09 25

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This component is not passing anything. this is about the difference of calling with different arguments.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

replaced with calledWithExactly.

});
});

describe('Insufficient funds', () => {
beforeEach(() => {
wrapper = shallow(<PricedButton {...props} balance={insufficientBalance} />);
});

it('renders a span saying "Insufficient funds for 5 LSK fee"', () => {
expect(wrapper.find('span').text()).to.be.equal('Insufficient funds for 5 LSK fee');
});

it('sets the disabled attribute of the button', () => {
const buttonProps = wrapper.find(Button).props();
expect(buttonProps.disabled).to.be.equal(true);
});
});
});
12 changes: 12 additions & 0 deletions src/components/pricedButton/pricedButton.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
.fee {
font-size: 12px;
line-height: 14px;
color: grey;
text-align: right;
margin: 0 16px;
transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space between selectors.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done


.error {
color: #dd2c00 !important;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way to avoid the !important?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need. Preferred is that states override modules. https://smacss.com/

}
6 changes: 6 additions & 0 deletions src/constants/fees.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export default {
setSecondPassphrase: 5e8,
send: 1e7,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prefer 0.1e8 for uniformity.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

registerDelegate: 25e8,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

vote: 1e8. is missing

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added

vote: 1e8,
};