import React from 'react'
import ReactDOM from 'react-dom'
import { createRecord, deleteRecord, getRecords, patchRecord } from './api'
import { Contact, ContactForm, ContactList } from './Contacts'
class App extends React.Component {
constructor() {
super()
this.state = {
contacts: [],
contactsError: null,
contactForm: {
name: '',
email: '',
},
}
this.addContact = this.addContact.bind(this)
this.changeContactForm = this.changeContactForm.bind(this)
this.refresh = this.refresh.bind(this)
}
componentDidMount() {
this.refresh()
}
render() {
let content
if (this.state.contactsError) {
content = (
<p>
{this.state.contactsError}
</p>
)
}
else {
content = this.state.contacts.map((contact, i) =>
React.createElement(Contact, { ...contact, key: i })
)
}
return (
<ContactList onClickRefresh={this.refresh}>
{content}
<ContactForm
errors={this.state.contactFormErrors}
value={this.state.contactForm}
onChange={this.changeContactForm}
onSubmit={this.addContact}
/>
</ContactList>
)
}
changeContactForm(value) {
this.setState({
contactForm: value,
contactFormErrors:
silenceRectifiedErrors(this.state.contactFormErrors, validateContact(value))
})
}
addContact() {
let errors = validateContact(this.state.contactForm)
if (!errors) {
this.setState({
contacts: this.state.contacts.concat(this.state.contactForm),
contactForm: {},
})
}
else {
this.setState({
contactFormErrors: errors,
})
}
}
refresh() {
getRecords().then(
(response) => {
this.setState({
contacts: response.data,
contactsError: null,
})
},
(error) => {
this.setState({
contactsError: "Your contacts couldn't be loaded :-("
})
}
)
}
}
function validateContact(contact) {
let errors = {}
if (!contact.name) {
errors.name = "You must enter a name."
}
if (!contact.email) {
errors.email = "You must enter an email."
}
else if (!isEmailValid(contact.email)) {
errors.email = "That doesn't look like a valid e-mail."
}
if (Object.keys(errors).length) {
return errors
}
}
function isEmailValid(value) {
return value.indexOf('@') !== -1
}
function silenceRectifiedErrors(oldErrors, newErrors) {
if (newErrors && oldErrors) {
let errors = {}
for (let key of Object.keys(newErrors)) {
if (oldErrors[key]) {
errors[key] = oldErrors[key]
}
}
return Object.keys(errors).length ? errors : null
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
)