/* globals document */ import React from 'react' import { Redirect } from 'react-router-dom' // import { LinkContainer } from 'react-router-bootstrap' // import swal from 'sweetalert' // import moment from 'moment' import swal from 'sweetalert' /* const formatter = new Intl.NumberFormat('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) */ const productObj = { name: '', address: 'Seminole, FL', email: '', cards: [] } /** * @author Eduardo Perotta de Almeida <web2solucoes@gmail.com> * @Component ProductsAdd * @description React component that creates new a Product into the database * @extends React.Component */ class ProductsAdd extends React.Component { constructor (props) { super(props) /** * Entity name which this component represents to */ this.entity = 'Product' /** * access to foundation instance */ this.foundation = props.foundation /** * default pagination to list data */ this.pagination = { offset: 0, limit: 30 } /** * component state */ this.state = { product: { ...productObj }, cards: ['VISA ⠀*** 3719'], toDashboard: false } this.form = null this.handleFormSubmit = this.handleFormSubmit.bind(this) this.handleChangeFieldValue = this.handleChangeFieldValue.bind(this) } async componentDidMount () { if (!this.state.toDashboard) { this.form = document.querySelectorAll('.needs-validation')[0] this.form.addEventListener('submit', this.handleFormSubmit, false) } } /** * @Method ProductsAdd.handleChangeFieldValue * @summary Event handler that change form field values and set it state * @param {event} event - The HTML event triggered on User interation * @example handleChangeFieldValue(e) { const newHash = { ...this.state.product } const name = e.target.id || e.target.name const value = e.target.value newHash[name] = value if (name === 'cards') { if (value !== '') { newHash[name] = [value] } else { newHash[name] = [] } } this.setState({ product: newHash }) } */ handleChangeFieldValue (e) { // e.preventDefault() const newHash = { ...this.state.product } const name = e.target.id || e.target.name const value = e.target.value newHash[name] = value if (name === 'cards') { if (value !== '') { newHash[name] = [value] } else { newHash[name] = [] } } // console.error('newHash', newHash) this.setState({ product: newHash }) } /** * @async * @Method ProductsAdd.handleFormSubmit * @summary Event handler that handles the form submission * @param {event} event - The HTML event triggered on User interation * @example async handleFormSubmit(e) { const { Product } = this.foundation.data if (!this.form.checkValidity()) { // console.log('not validated') } e.preventDefault() e.stopPropagation() this.form.classList.add('was-validated') const doc = { ...this.state.product } const { data, error } = await Product.add(doc) if (error) { swal('Database error', error.message, 'error') return } this.setState({ toDashboard: true }) } */ async handleFormSubmit (e) { e.preventDefault() e.stopPropagation() const { Product } = this.foundation.data if (!this.form.checkValidity()) { // console.log('not validated') } this.form.classList.add('was-validated') const doc = { ...this.state.product } const { /* data, */ error } = await Product.add(doc) if (error) { swal('Database error', error.message, 'error') return } this.setState({ toDashboard: true }) } /** * @async * @Method ProductsAdd.render * @summary Component render function. * @description Renders a form to create the Product data */ render () { if (this.state.toDashboard === true) { return <Redirect to='/Products' /> } return ( <main className='col-md-9 ms-sm-auto col-lg-10 px-md-4 main'> <div className='d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 bproduct-bottom'> <h1 className='h2'>Product Add</h1> </div> <div className='table-responsive'> <form className='needs-validation' noValidate> <div className='row g-3'> <div className='col-12'> <label htmlFor='name' className='form-label'>Name</label> <input type='text' className='form-control' id='name' placeholder='' value={this.state.product.name} required onChange={this.handleChangeFieldValue} /> <div className='invalid-feedback'> Valid name is required. </div> </div> <div className='col-12'> <label htmlFor='email' className='form-label'>Email </label> <input type='email' className='form-control' id='email' placeholder='you@example.com' required value={this.state.product.email} onChange={this.handleChangeFieldValue} /> <div className='invalid-feedback'> Please enter a valid email address for shipping updates. </div> </div> <div className='col-12'> <label htmlFor='address' className='form-label'>Address</label> <input type='text' className='form-control' id='address' placeholder='1234 Main St' required value={this.state.product.address} onChange={this.handleChangeFieldValue} /> <div className='invalid-feedback'> Please enter your address. </div> </div> <div className='col-md-5'> <label htmlFor='cards' className='form-label'>Credit cards</label> <select className='custom-select' id='cards' required onChange={this.handleChangeFieldValue} > <option value=''>Choose...</option> {this.state.cards.map((card) => ( <option key={card} value={card} > {card} </option> ))} </select> <div className='invalid-feedback'> Please select a valid credit card. </div> </div> </div> <hr className='my-4' /> <button className='w-100 btn btn-primary btn-lg' type='submit'>save</button> </form> </div> </main> ) } } export default ProductsAdd