summaryrefslogtreecommitdiffstats
path: root/finished-application/frontend/components/UpdateItem.js
diff options
context:
space:
mode:
Diffstat (limited to 'finished-application/frontend/components/UpdateItem.js')
-rw-r--r--finished-application/frontend/components/UpdateItem.js117
1 files changed, 117 insertions, 0 deletions
diff --git a/finished-application/frontend/components/UpdateItem.js b/finished-application/frontend/components/UpdateItem.js
new file mode 100644
index 0000000..11aef32
--- /dev/null
+++ b/finished-application/frontend/components/UpdateItem.js
@@ -0,0 +1,117 @@
+import React, { Component } from 'react';
+import { Mutation, Query } 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 SINGLE_ITEM_QUERY = gql`
+ query SINGLE_ITEM_QUERY($id: ID!) {
+ item(where: { id: $id }) {
+ id
+ title
+ description
+ price
+ }
+ }
+`;
+const UPDATE_ITEM_MUTATION = gql`
+ mutation UPDATE_ITEM_MUTATION($id: ID!, $title: String, $description: String, $price: Int) {
+ updateItem(id: $id, title: $title, description: $description, price: $price) {
+ id
+ title
+ description
+ price
+ }
+ }
+`;
+
+class UpdateItem extends Component {
+ state = {};
+ handleChange = e => {
+ const { name, type, value } = e.target;
+ const val = type === 'number' ? parseFloat(value) : value;
+ this.setState({ [name]: val });
+ };
+ updateItem = async (e, updateItemMutation) => {
+ e.preventDefault();
+ console.log('Updating Item!!');
+ console.log(this.state);
+ const res = await updateItemMutation({
+ variables: {
+ id: this.props.id,
+ ...this.state,
+ },
+ });
+ console.log('Updated!!');
+ };
+
+ render() {
+ return (
+ <Query
+ query={SINGLE_ITEM_QUERY}
+ variables={{
+ id: this.props.id,
+ }}
+ >
+ {({ data, loading }) => {
+ if (loading) return <p>Loading...</p>;
+ if (!data.item) return <p>No Item Found for ID {this.props.id}</p>;
+ return (
+ <Mutation mutation={UPDATE_ITEM_MUTATION} variables={this.state}>
+ {(updateItem, { loading, error }) => (
+ <Form onSubmit={e => this.updateItem(e, updateItem)}>
+ <Error error={error} />
+ <fieldset disabled={loading} aria-busy={loading}>
+ <label htmlFor="title">
+ Title
+ <input
+ type="text"
+ id="title"
+ name="title"
+ placeholder="Title"
+ required
+ defaultValue={data.item.title}
+ onChange={this.handleChange}
+ />
+ </label>
+
+ <label htmlFor="price">
+ Price
+ <input
+ type="number"
+ id="price"
+ name="price"
+ placeholder="Price"
+ required
+ defaultValue={data.item.price}
+ onChange={this.handleChange}
+ />
+ </label>
+
+ <label htmlFor="description">
+ Description
+ <textarea
+ id="description"
+ name="description"
+ placeholder="Enter A Description"
+ required
+ defaultValue={data.item.description}
+ onChange={this.handleChange}
+ />
+ </label>
+ <button type="submit">Sav{loading ? 'ing' : 'e'} Changes</button>
+ </fieldset>
+ </Form>
+ )}
+ </Mutation>
+ );
+ }}
+ </Query>
+ );
+ }
+}
+
+export default UpdateItem;
+export { UPDATE_ITEM_MUTATION };