From ff7fc88e36bb66a47327fa2c7e8513b222e539ef Mon Sep 17 00:00:00 2001 From: Wes Bos Date: Wed, 27 Jun 2018 13:02:25 -0400 Subject: Video 21 --- .../20/backend/src/resolvers/Mutation.js | 36 +++++++ .../20/backend/src/resolvers/Query.js | 13 +++ stepped-solutions/20/backend/src/schema.graphql | 11 ++ .../20/frontend/components/UpdateItem.js | 117 +++++++++++++++++++++ stepped-solutions/20/frontend/pages/update.js | 9 ++ 5 files changed, 186 insertions(+) create mode 100755 stepped-solutions/20/backend/src/resolvers/Mutation.js create mode 100755 stepped-solutions/20/backend/src/resolvers/Query.js create mode 100755 stepped-solutions/20/backend/src/schema.graphql create mode 100755 stepped-solutions/20/frontend/components/UpdateItem.js create mode 100755 stepped-solutions/20/frontend/pages/update.js (limited to 'stepped-solutions/20') diff --git a/stepped-solutions/20/backend/src/resolvers/Mutation.js b/stepped-solutions/20/backend/src/resolvers/Mutation.js new file mode 100755 index 0000000..de47a4e --- /dev/null +++ b/stepped-solutions/20/backend/src/resolvers/Mutation.js @@ -0,0 +1,36 @@ +const Mutations = { + async createItem(parent, args, ctx, info) { + // TODO: Check if they are logged in + + const item = await ctx.db.mutation.createItem( + { + data: { + ...args, + }, + }, + info + ); + + console.log(item); + + return item; + }, + updateItem(parent, args, ctx, info) { + // first take a copy of the updates + const updates = { ...args }; + // remove the ID from the updates + delete updates.id; + // run the update method + return ctx.db.mutation.updateItem( + { + data: updates, + where: { + id: args.id, + }, + }, + info + ); + }, +}; + +module.exports = Mutations; diff --git a/stepped-solutions/20/backend/src/resolvers/Query.js b/stepped-solutions/20/backend/src/resolvers/Query.js new file mode 100755 index 0000000..eef01ec --- /dev/null +++ b/stepped-solutions/20/backend/src/resolvers/Query.js @@ -0,0 +1,13 @@ +const { forwardTo } = require('prisma-binding'); + +const Query = { + items: forwardTo('db'), + item: forwardTo('db'), + // async items(parent, args, ctx, info) { + // console.log('Getting Items!!'); + // const items = await ctx.db.query.items(); + // return items; + // }, +}; + +module.exports = Query; diff --git a/stepped-solutions/20/backend/src/schema.graphql b/stepped-solutions/20/backend/src/schema.graphql new file mode 100755 index 0000000..bdc131f --- /dev/null +++ b/stepped-solutions/20/backend/src/schema.graphql @@ -0,0 +1,11 @@ +# import * from './generated/prisma.graphql' + +type Mutation { + createItem(title: String, description: String, price: Int, image: String, largeImage: String): Item! + updateItem(id: ID!, title: String, description: String, price: Int): Item! +} + +type Query { + items: [Item]! + item(where: ItemWhereUniqueInput!): Item +} diff --git a/stepped-solutions/20/frontend/components/UpdateItem.js b/stepped-solutions/20/frontend/components/UpdateItem.js new file mode 100755 index 0000000..11aef32 --- /dev/null +++ b/stepped-solutions/20/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 ( + + {({ data, loading }) => { + if (loading) return

Loading...

; + if (!data.item) return

No Item Found for ID {this.props.id}

; + return ( + + {(updateItem, { loading, error }) => ( +
this.updateItem(e, updateItem)}> + +
+ + + + +