diff options
| author | Wes Bos <wesbos@gmail.com> | 2018-06-27 13:02:25 -0400 |
|---|---|---|
| committer | Wes Bos <wesbos@gmail.com> | 2018-06-27 13:02:25 -0400 |
| commit | ff7fc88e36bb66a47327fa2c7e8513b222e539ef (patch) | |
| tree | ecfc2901b53d8e068252b058a07d1a4e63d42816 /stepped-solutions/19/frontend/components | |
| parent | 4e52a98a0f78d2bedfdd31a1955639143cd26fc6 (diff) | |
Video 21
Diffstat (limited to 'stepped-solutions/19/frontend/components')
| -rwxr-xr-x | stepped-solutions/19/frontend/components/CreateItem.js | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/stepped-solutions/19/frontend/components/CreateItem.js b/stepped-solutions/19/frontend/components/CreateItem.js new file mode 100755 index 0000000..105c7f8 --- /dev/null +++ b/stepped-solutions/19/frontend/components/CreateItem.js @@ -0,0 +1,143 @@ +import React, { Component } from 'react'; +import { Mutation } from 'react-apollo'; +import gql from 'graphql-tag'; +import Router from 'next/router'; +import Form from './styles/Form'; +import formatMoney from '../lib/formatMoney'; +import Error from './ErrorMessage'; + +const CREATE_ITEM_MUTATION = gql` + mutation CREATE_ITEM_MUTATION( + $title: String! + $description: String! + $price: Int! + $image: String + $largeImage: String + ) { + createItem( + title: $title + description: $description + price: $price + image: $image + largeImage: $largeImage + ) { + id + } + } +`; + +class CreateItem extends Component { + state = { + title: 'Cool Shoes', + description: 'I love those shoes', + image: 'dog.jpg', + largeImage: 'large-dog.jpg', + price: 1000, + }; + handleChange = e => { + const { name, type, value } = e.target; + const val = type === 'number' ? parseFloat(value) : value; + this.setState({ [name]: val }); + }; + + uploadFile = async e => { + console.log('uploading file...'); + const files = e.target.files; + const data = new FormData(); + data.append('file', files[0]); + data.append('upload_preset', 'sickfits'); + + const res = await fetch('https://api.cloudinary.com/v1_1/wesbostutorial/image/upload', { + method: 'POST', + body: data, + }); + const file = await res.json(); + console.log(file); + this.setState({ + image: file.secure_url, + largeImage: file.eager[0].secure_url, + }); + }; + render() { + return ( + <Mutation mutation={CREATE_ITEM_MUTATION} variables={this.state}> + {(createItem, { loading, error }) => ( + <Form + onSubmit={async e => { + // Stop the form from submitting + e.preventDefault(); + // call the mutation + const res = await createItem(); + // change them to the single item page + console.log(res); + Router.push({ + pathname: '/item', + query: { id: res.data.createItem.id }, + }); + }} + > + <Error error={error} /> + <fieldset disabled={loading} aria-busy={loading}> + <label htmlFor="file"> + Image + <input + type="file" + id="file" + name="file" + placeholder="Upload an image" + required + onChange={this.uploadFile} + /> + {this.state.image && ( + <img width="200" src={this.state.image} alt="Upload Preview" /> + )} + </label> + + <label htmlFor="title"> + Title + <input + type="text" + id="title" + name="title" + placeholder="Title" + required + value={this.state.title} + onChange={this.handleChange} + /> + </label> + + <label htmlFor="price"> + Price + <input + type="number" + id="price" + name="price" + placeholder="Price" + required + value={this.state.price} + onChange={this.handleChange} + /> + </label> + + <label htmlFor="description"> + Description + <textarea + id="description" + name="description" + placeholder="Enter A Description" + required + value={this.state.description} + onChange={this.handleChange} + /> + </label> + <button type="submit">Submit</button> + </fieldset> + </Form> + )} + </Mutation> + ); + } +} + +export default CreateItem; +export { CREATE_ITEM_MUTATION }; |
