Fork and clone this repo.
Before you begin anything, run npm install.
Every component has a test suite associated with it. There are 18 tests in total, grouped into 5 suites.
To run the tests in the terminal, run npm test. The tests will rerun every
time you save a file. When running npm test in the root of the repo there is
an prompt to run all of the tests by entering a.
When you start, all of the tests will be failing; your goal is to make as many pass as you can in the hour provided.
HINT: read the output of the failing tests.
Don't write anything in the
.test.jsfiles.
You're going to build a simple contact list manager using React and React
Router. An initial set of contacts has been provided in contacts.json and some
CSS has been provided in src/styles/index.css.
See a demo of the final app at http://quickest-beam.surge.sh/
Add Tweety as a contact in contacts.json:
{
name: "Tweety",
email: "tweety@gmail.com",
profile_picture: "https://upload.wikimedia.org/wikipedia/en/0/02/Tweety.svg"
}
Inside index.js, import React Router and pass it to ReactDOM.render() as the
root component with <App> as a child component. We've imported the starter
contacts for you, pass these in to your <App> component as a prop, contacts.
Your <App> component should accept contacts as a prop and use them to set
the initial state for your component. Setting props as initial state looks like
this:
constructor(props) {
super(props)
this.state = {
contacts: props.contacts
}
}Your <App> component should also render:
- A div with a class name of
'App' - Your
<Header>component - Two
<Route />components - If the route is
"/"then render the<ContactList>component; if the route is"/new-contact"then render the<NewContact>component;
Your <Header> component should render:
- A
<header>element with an<h1> - A
<nav>containing two React Router<Link>s, one to the homepage ("/") and the other to create a new contact ("/new-contact").
<ContactList> should take contacts as a prop
It should render:
- A
<Contact>component for each contact object inside of thecontactsprop. - A
<div>with a class ofcontact-list.
Your <Contact> component will render a single contact.
It should render:
- An outer
<div>with a class ofcontact - An include an
<img>for theprofile_picture, <h3>for thename<h4>for theemail.
Your <NewContact> component should render:
- An
<h1>with a text ofNew Contact - A form with inputs for the
name,emailandprofile_picture.
When submitted, you should save the new contact by updating your state inside of
<App> and redirect the user back to the homepage/list of contacts.
- App component is defined and exported
- App component accepts the
contactsjson objects as a prop and thecontactsjson object is properly passed - Router is defined and setup using the browser History API
- Router includes a route for the homepage (
"/") and for the new contact page ("/new-contact") - Header component is defined and exported
- Header component contains a title and two
<Link>s, one to the homepage and the other to the new contact page - ContactList component is defined and exported
- ContactList component iterates through the contacts, rendering a Contact component for each
- Contact component is defined and exported
- Contact component is rendering the image, name and email address of a contact
- NewContact is defined and exported
- NewContact contains a form that adds a new contact to the parent App component state