diff --git a/src/components/App/App.js b/src/components/App/App.js new file mode 100644 index 0000000..a1bfbf0 --- /dev/null +++ b/src/components/App/App.js @@ -0,0 +1,108 @@ +import React, { Component } from 'react'; +import './App.css'; +import Step from '../Step'; +import PersonalForm from '../PersonalForm'; +import CardForm from '../CardForm'; + +class App extends Component { + state = { + step: 1, + firstName: '', + lastName: '', + email: '', + cardNumber: '', + steps: ['Personal information', 'Card information', 'Finish'] + }; + + handleTabClick = step => { + this.setState({ step: step }); + }; + + handleChangeForm = (name, value) => { + this.setState({ [name]: value }); + }; + + handleClickNextForm = () => { + const { step } = this.state; + this.setState({ step: step + 1 }); + }; + + renderForm = () => { + const { step, firstName, lastName, email, cardNumber } = this.state; + if (step === 1) { + return ( + + ); + } else if (step === 2) { + return ( + + ); + } else if (step === 3) { + return

Поздравляем!

; + } + }; + + isFormCommitable = () => { + const { step, firstName, lastName, email, cardNumber } = this.state; + if (step === 1) { + if ( + firstName !== '' && + lastName !== '' && + email !== '' && + email.includes('@') + ) { + return true; + } + } else if (step === 2) { + if (cardNumber.length === 16) { + return true; + } + } + return false; + }; + + render() { + const { step, steps } = this.state; + return ( +
+
+ {steps.map((title, key) => { + key++; + return ( + key} + onClick={this.handleTabClick} + > + {title} + + ); + })} +
+
{this.renderForm()}
+
+ +
+
+ ); + } +} + +export default App; diff --git a/src/components/CardForm/CardForm.js b/src/components/CardForm/CardForm.js new file mode 100644 index 0000000..7bc710a --- /dev/null +++ b/src/components/CardForm/CardForm.js @@ -0,0 +1,32 @@ +import React, { PureComponent } from 'react'; +import Title from '../Title'; +import './CardForm.css'; + +class CardForm extends PureComponent { + handleChangeForm = event => { + const { onChangeForm } = this.props; + const { name, value } = event.target; + onChangeForm(name, value); + }; + + componentWillUnmount = () => {}; + + render() { + const { cardNumber } = this.props; + return ( +
+ Номер карты +
+ +
+
+ ); + } +} + +export default CardForm; diff --git a/src/components/PersonalForm/PersonalForm.js b/src/components/PersonalForm/PersonalForm.js new file mode 100644 index 0000000..30e244c --- /dev/null +++ b/src/components/PersonalForm/PersonalForm.js @@ -0,0 +1,42 @@ +import React, { PureComponent } from 'react'; +import Title from '../Title'; +import './PersonalForm.css'; + +class PersonalForm extends PureComponent { + handleChangeForm = event => { + const { onChangeForm } = this.props; + const { name, value } = event.target; + onChangeForm(name, value); + }; + + render() { + const { firstName, lastName, email } = this.props; + return ( +
+ Персональная информация +
+ + + +
+
+ ); + } +} + +export default PersonalForm; diff --git a/src/components/PersonalForm/index.js b/src/components/PersonalForm/index.js new file mode 100644 index 0000000..90825d2 --- /dev/null +++ b/src/components/PersonalForm/index.js @@ -0,0 +1 @@ +export { default } from './PersonalForm'; diff --git a/src/components/Step/Step.js b/src/components/Step/Step.js new file mode 100644 index 0000000..ed3a8e3 --- /dev/null +++ b/src/components/Step/Step.js @@ -0,0 +1,28 @@ +import React, { Component } from 'react'; +import './Step.css'; + +class Step extends Component { + handleClick = event => { + const { isClickable, number } = this.props; + if (isClickable) { + this.props.onClick(number); + } + }; + + render() { + const { number, children, isSelected, isClickable } = this.props; + return ( +
+

{number}

+

{children}

+
+ ); + } +} + +export default Step; diff --git a/src/components/Title/Title.js b/src/components/Title/Title.js new file mode 100644 index 0000000..166558e --- /dev/null +++ b/src/components/Title/Title.js @@ -0,0 +1,11 @@ +import React, { Component } from 'react'; +import './Title.css'; + +class Title extends Component { + render() { + const { children } = this.props; + return

{children}

; + } +} + +export default Title;