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;