commons/src/routes/Publish/Step.tsx

139 lines
4.4 KiB
TypeScript
Raw Normal View History

2019-02-19 17:26:15 +01:00
import React, { PureComponent, FormEvent } from 'react'
import Input from '../../components/atoms/Form/Input'
import Label from '../../components/atoms/Form/Label'
import Row from '../../components/atoms/Form/Row'
import Button from '../../components/atoms/Button'
import { User } from '../../context/User'
import Files from './Files/'
import styles from './Step.module.scss'
interface StepProps {
currentStep: number
index: number
inputChange: any
inputToArrayChange: any
fields?: any[]
files?: any
state: any
title: string
2019-02-20 11:12:10 +01:00
description: string
next: any
prev: any
2019-02-19 17:26:15 +01:00
totalSteps: number
}
export default class Step extends PureComponent<StepProps, {}> {
public previousButton() {
let { currentStep, prev } = this.props
if (currentStep !== 1) {
2019-02-20 11:12:10 +01:00
return (
<Button link onClick={prev}>
Previous
</Button>
)
}
return null
}
public nextButton() {
2019-02-19 17:26:15 +01:00
let { currentStep, next, totalSteps } = this.props
if (currentStep < totalSteps) {
2019-02-20 11:12:10 +01:00
return <Button onClick={next}>Next </Button>
}
return null
}
public render() {
const {
currentStep,
index,
title,
2019-02-20 11:12:10 +01:00
description,
fields,
inputChange,
inputToArrayChange,
files,
2019-02-19 17:26:15 +01:00
state,
totalSteps
} = this.props
if (currentStep !== index + 1) {
return null
}
return (
<>
2019-02-20 11:12:10 +01:00
<header className={styles.header}>
<h2 className={styles.title}>{title}</h2>
<p className={styles.description}>{description}</p>
</header>
{fields &&
Object.entries(fields).map(([key, value]) => {
let onChange = inputChange
if (key === 'files' || key === 'categories') {
onChange = inputToArrayChange
}
if (key === 'files') {
return (
<Row key={key}>
<Label htmlFor={key} required>
{value.label}
</Label>
<Files
placeholder={value.placeholder}
name={value.name}
help={value.help}
files={files}
onChange={onChange}
/>
</Row>
)
}
return (
<Input
key={key}
name={key}
label={value.label}
placeholder={value.placeholder}
required={value.required}
type={value.type}
help={value.help}
options={value.options}
onChange={onChange}
rows={value.rows}
value={(state as any)[key]}
/>
)
})}
2019-02-20 11:12:10 +01:00
<div className={styles.actions}>
{this.previousButton()}
{this.nextButton()}
2019-02-20 11:12:10 +01:00
{currentStep === totalSteps && (
<User.Consumer>
{states =>
states.isLogged ? (
<Button primary>Register asset</Button>
) : (
<Button onClick={states.startLogin}>
Register asset (login first)
</Button>
)
}
</User.Consumer>
)}
</div>
</>
)
}
}
Step.contextType = User