summaryrefslogtreecommitdiffstats
path: root/frontend/components
diff options
context:
space:
mode:
authorWes Bos <wesbos@gmail.com>2018-05-24 15:19:21 -0400
committerWes Bos <wesbos@gmail.com>2018-05-24 15:19:21 -0400
commit072eca0e5038a7755ca9b2c94dfe1a0c3f110968 (patch)
treea6c54e1503baf665ad0eeaeaad6d2a2b7ba3ba39 /frontend/components
parentb294a6fa500b165aae86afbad5fce49a02314b0d (diff)
colocate queries and components
Diffstat (limited to 'frontend/components')
-rw-r--r--frontend/components/AddToCart.js52
-rw-r--r--frontend/components/Cart.js43
-rw-r--r--frontend/components/CreateItem.js23
-rw-r--r--frontend/components/DeleteItem.js19
-rw-r--r--frontend/components/EditUser.js17
-rw-r--r--frontend/components/Items.js17
-rw-r--r--frontend/components/Nav.js12
-rw-r--r--frontend/components/Order.js22
-rw-r--r--frontend/components/OrderList.js22
-rw-r--r--frontend/components/Pagination.js15
-rw-r--r--frontend/components/Permissions.js25
-rw-r--r--frontend/components/PleaseSignIn.js2
-rw-r--r--frontend/components/RemoveFromCart.js21
-rw-r--r--frontend/components/Reset.js14
-rw-r--r--frontend/components/ResetRequest.js11
-rw-r--r--frontend/components/Search.js12
-rw-r--r--frontend/components/Signin.js21
-rw-r--r--frontend/components/Signout.js14
-rw-r--r--frontend/components/Signup.js20
-rw-r--r--frontend/components/SingleItem.js15
-rw-r--r--frontend/components/TakeMyMoney.js21
-rw-r--r--frontend/components/UpdateItem.js13
-rw-r--r--frontend/components/User.js45
23 files changed, 386 insertions, 90 deletions
diff --git a/frontend/components/AddToCart.js b/frontend/components/AddToCart.js
index 7cb0856..03242a4 100644
--- a/frontend/components/AddToCart.js
+++ b/frontend/components/AddToCart.js
@@ -1,10 +1,24 @@
import { Component } from 'react';
import { Mutation } from 'react-apollo';
import PropTypes from 'prop-types';
-import {
- ADD_TO_CART_MUTATION,
- CURRENT_USER_QUERY,
-} from '../queries/queries.graphql';
+import gql from 'graphql-tag';
+import User, { CURRENT_USER_QUERY } from './User';
+
+const ADD_TO_CART_MUTATION = gql`
+ mutation addToCart($id: ID!) {
+ addToCart(id: $id) {
+ id
+ quantity
+ item {
+ id
+ price
+ description
+ image
+ title
+ }
+ }
+ }
+`;
class AddToCart extends Component {
static propTypes = {
@@ -15,9 +29,7 @@ class AddToCart extends Component {
const newCartItem = payload.data.addToCart;
const data = cache.readQuery({ query: CURRENT_USER_QUERY });
- const existingIndex = data.me.cart.findIndex(
- cartItem => cartItem.id === newCartItem.id,
- );
+ const existingIndex = data.me.cart.findIndex(cartItem => cartItem.id === newCartItem.id);
if (existingIndex >= 0) {
// already in cache, just replace it
data.me.cart = [
@@ -34,19 +46,23 @@ class AddToCart extends Component {
render() {
const { id } = this.props;
return (
- <Mutation
- mutation={ADD_TO_CART_MUTATION}
- variables={{ id }}
- update={this.update}
- >
- {(addToCart, { loading }) => (
- <button disabled={loading} onClick={addToCart}>
- 🛒 Add{loading && 'ing'} To Cart
- </button>
- )}
- </Mutation>
+ <User>
+ {({ data: { me }, loading }) => {
+ if (!me || loading) return null;
+ return (
+ <Mutation mutation={ADD_TO_CART_MUTATION} variables={{ id }} update={this.update}>
+ {(addToCart, { loading }) => (
+ <button disabled={loading} onClick={addToCart}>
+ 🛒 Add{loading && 'ing'} To Cart
+ </button>
+ )}
+ </Mutation>
+ );
+ }}
+ </User>
);
}
}
export default AddToCart;
+export { ADD_TO_CART_MUTATION };
diff --git a/frontend/components/Cart.js b/frontend/components/Cart.js
index a815b78..7e8a9c5 100644
--- a/frontend/components/Cart.js
+++ b/frontend/components/Cart.js
@@ -1,14 +1,11 @@
import React from 'react';
import { Mutation, Query } from 'react-apollo';
import { adopt } from 'react-adopt';
+import gql from 'graphql-tag';
import TakeMyMoney from './TakeMyMoney';
import formatMoney from '../lib/formatMoney';
import CartItem from './CartItem';
-import {
- CURRENT_USER_QUERY,
- LOCAL_STATE_QUERY,
- TOGGLE_CART_MUTATION,
-} from '../queries/queries.graphql';
+import { CURRENT_USER_QUERY } from './User';
import calcTotalPrice from '../lib/calcTotalPrice';
import Error from './ErrorMessage';
import CartStyles from './styles/CartStyles';
@@ -16,46 +13,51 @@ import Supreme from './styles/Supreme';
import CloseButton from './styles/CloseButton';
import SickButton from './styles/SickButton';
+const LOCAL_STATE_QUERY = gql`
+ query {
+ cartOpen @client
+ }
+`;
+
+const TOGGLE_CART_MUTATION = gql`
+ mutation {
+ toggleCart @client
+ }
+`;
+
const Composed = adopt({
toggleCart: ({ render }) => (
<Mutation mutation={TOGGLE_CART_MUTATION}>
{(mutate, result) => render({ mutate, result })}
</Mutation>
),
- localState: <Query query={LOCAL_STATE_QUERY} />,
- currentUser: <Query query={CURRENT_USER_QUERY} data-test="cart" />,
+ localState: ({ render }) => <Query query={LOCAL_STATE_QUERY} children={render} />,
+ currentUser: ({ render }) => (
+ <Query children={render} query={CURRENT_USER_QUERY} data-test="cart" />
+ ),
});
const Cart = () => (
<Composed>
{({ toggleCart, localState, currentUser }) => {
- const {
- data: { me },
- error,
- loading,
- } = currentUser;
+ const { data: { me }, error, loading } = currentUser;
if (loading) return <p>Loading...</p>;
if (error) return <Error error={error} />;
if (!me) return null;
return (
<CartStyles open={localState.data.cartOpen}>
<header>
- <CloseButton title="close" onClick={toggleCart}>
+ <CloseButton title="close" onClick={toggleCart.mutate}>
&times;
</CloseButton>
<Supreme>{me.name}'s Cart.</Supreme>
<p>
- You have {me.cart.length} item{me.cart.length === 1 ? '' : 's'} in
- your cart.
+ You have {me.cart.length} item{me.cart.length === 1 ? '' : 's'} in your cart.
</p>
</header>
- <ul>
- {me.cart.map(cartItem => (
- <CartItem key={cartItem.id} cartItem={cartItem} />
- ))}
- </ul>
+ <ul>{me.cart.map(cartItem => <CartItem key={cartItem.id} cartItem={cartItem} />)}</ul>
<footer>
<p>{formatMoney(calcTotalPrice(me.cart))}</p>
<TakeMyMoney>
@@ -69,3 +71,4 @@ const Cart = () => (
);
export default Cart;
+export { LOCAL_STATE_QUERY, TOGGLE_CART_MUTATION };
diff --git a/frontend/components/CreateItem.js b/frontend/components/CreateItem.js
index 06e2da3..fc3dcb2 100644
--- a/frontend/components/CreateItem.js
+++ b/frontend/components/CreateItem.js
@@ -1,11 +1,31 @@
import React, { Component } from 'react';
import { Mutation } from 'react-apollo';
import Router from 'next/router';
-import { CREATE_ITEM_MUTATION } from '../queries/queries.graphql';
+import gql from 'graphql-tag';
import Error from './ErrorMessage';
import Form from './styles/Form';
import formatMoney from '../lib/formatMoney';
+const CREATE_ITEM_MUTATION = gql`
+ mutation CREATE_ITEM_MUTATION(
+ $description: String!
+ $title: String!
+ $price: Int!
+ $image: String
+ $largeImage: String
+ ) {
+ createItem(
+ description: $description
+ title: $title
+ price: $price
+ image: $image
+ largeImage: $largeImage
+ ) {
+ id
+ }
+ }
+`;
+
class CreateItem extends Component {
state = {
title: '',
@@ -116,3 +136,4 @@ class CreateItem extends Component {
}
export default CreateItem;
+export { CREATE_ITEM_MUTATION };
diff --git a/frontend/components/DeleteItem.js b/frontend/components/DeleteItem.js
index 53fc04d..9b09378 100644
--- a/frontend/components/DeleteItem.js
+++ b/frontend/components/DeleteItem.js
@@ -1,10 +1,18 @@
import React from 'react';
import { Mutation } from 'react-apollo';
import PropTypes from 'prop-types';
-import {
- REMOVE_ITEM_MUTATION,
- ALL_ITEMS_QUERY,
-} from '../queries/queries.graphql';
+import gql from 'graphql-tag';
+import { ALL_ITEMS_QUERY } from './Items';
+
+const DELETE_ITEM_MUTATION = gql`
+ mutation deleteItem($id: ID!) {
+ deleteItem(id: $id) {
+ id
+ title
+ description
+ }
+ }
+`;
class DeleteItem extends React.Component {
static propTypes = {
@@ -23,7 +31,7 @@ class DeleteItem extends React.Component {
render() {
return (
<Mutation
- mutation={REMOVE_ITEM_MUTATION}
+ mutation={DELETE_ITEM_MUTATION}
variables={{ id: this.props.id }}
update={this.update}
>
@@ -44,3 +52,4 @@ class DeleteItem extends React.Component {
}
export default DeleteItem;
+export { DELETE_ITEM_MUTATION };
diff --git a/frontend/components/EditUser.js b/frontend/components/EditUser.js
index ce56e11..1bb8e5b 100644
--- a/frontend/components/EditUser.js
+++ b/frontend/components/EditUser.js
@@ -1,8 +1,18 @@
import React from 'react';
import { Query, Mutation } from 'react-apollo';
+import gql from 'graphql-tag';
import Form from './styles/Form';
-import { CURRENT_USER_QUERY, UPDATE_USER_MUTATION } from '../queries/queries.graphql';
+import { CURRENT_USER_QUERY } from './User';
import Error from './ErrorMessage';
+import User from './User';
+
+const UPDATE_USER_MUTATION = gql`
+ mutation updateUser($name: String!) {
+ updateUser(name: $name) {
+ name
+ }
+ }
+`;
class EditUser extends React.Component {
state = {
@@ -28,7 +38,7 @@ class EditUser extends React.Component {
render() {
return (
- <Query query={CURRENT_USER_QUERY}>
+ <User>
{({ data: { me }, loading }) => {
if (loading) return <p>Loading...</p>;
return (
@@ -62,9 +72,10 @@ class EditUser extends React.Component {
</Mutation>
);
}}
- </Query>
+ </User>
);
}
}
export default EditUser;
+export { UPDATE_USER_MUTATION };
diff --git a/frontend/components/Items.js b/frontend/components/Items.js
index 618cc84..394f16d 100644
--- a/frontend/components/Items.js
+++ b/frontend/components/Items.js
@@ -2,11 +2,25 @@ import React from 'react';
import { Query } from 'react-apollo';
import styled from 'styled-components';
import PropTypes from 'prop-types';
+import gql from 'graphql-tag';
import Pagination from './Pagination';
import Item from './Item';
import LoadingItem from './LoadingItem';
import { perPage } from '../config';
-import { ALL_ITEMS_QUERY } from '../queries/queries.graphql';
+
+const ALL_ITEMS_QUERY = gql`
+ query ALL_ITEMS_QUERY($skip: Int = 0, $first: Int = 4) {
+ items(orderBy: createdAt_DESC, first: $first, skip: $skip) {
+ __typename
+ id
+ title
+ price
+ description
+ image
+ largeImage
+ }
+ }
+`;
const Items = styled.div`
display: grid;
@@ -57,3 +71,4 @@ class ItemList extends React.Component {
}
export default ItemList;
+export { ALL_ITEMS_QUERY };
diff --git a/frontend/components/Nav.js b/frontend/components/Nav.js
index 4bbce2d..826335f 100644
--- a/frontend/components/Nav.js
+++ b/frontend/components/Nav.js
@@ -1,21 +1,17 @@
import React, { Fragment } from 'react';
import Link from 'next/link';
import { Query, ApolloConsumer } from 'react-apollo';
-import { CURRENT_USER_QUERY } from '../queries/queries.graphql';
+import User from './User';
import CartCount from './CartCount';
import Signout from './Signout';
-import Dump from './Dump';
import NavStyles from './styles/NavStyles';
class Nav extends React.Component {
render() {
// below we set the fetchPolicy to network only so it forces re-fetch on the server
return (
- <Query
- query={CURRENT_USER_QUERY}
- fetchPolicy={process.browser ? 'cache-first' : 'network-only'}
- >
- {({ data: { me }, loading, error }) => (
+ <User>
+ {({ data: { me }, error }) => (
<NavStyles data-test="nav">
<Link href="/items">
<a>Shop</a>
@@ -54,7 +50,7 @@ class Nav extends React.Component {
)}
</NavStyles>
)}
- </Query>
+ </User>
);
}
}
diff --git a/frontend/components/Order.js b/frontend/components/Order.js
index a224c1b..6411abe 100644
--- a/frontend/components/Order.js
+++ b/frontend/components/Order.js
@@ -3,11 +3,30 @@ import { Query } from 'react-apollo';
import { format } from 'date-fns';
import Head from 'next/head';
import PropTypes from 'prop-types';
-import { SINGLE_ORDER_QUERY } from '../queries/queries.graphql';
+import gql from 'graphql-tag';
import formatMoney from '../lib/formatMoney';
import Error from './ErrorMessage';
import OrderStyles from './styles/OrderStyles';
+const SINGLE_ORDER_QUERY = gql`
+ query SINGLE_ORDER_QUERY($id: ID!) {
+ order(id: $id) {
+ id
+ charge
+ total
+ createdAt
+ items {
+ id
+ title
+ price
+ description
+ image
+ quantity
+ }
+ }
+ }
+`;
+
class Order extends Component {
static propTypes = {
id: PropTypes.string.isRequired,
@@ -73,3 +92,4 @@ class Order extends Component {
}
export default Order;
+export { SINGLE_ORDER_QUERY };
diff --git a/frontend/components/OrderList.js b/frontend/components/OrderList.js
index eef69ca..5886ad7 100644
--- a/frontend/components/OrderList.js
+++ b/frontend/components/OrderList.js
@@ -3,10 +3,29 @@ import { Query } from 'react-apollo';
import { formatDistance } from 'date-fns';
import Link from 'next/link';
import styled from 'styled-components';
-import { USER_ORDERS_QUERY } from '../queries/queries.graphql';
+import gql from 'graphql-tag';
import formatMoney from '../lib/formatMoney';
import OrderItemStyles from './styles/OrderItemStyles';
+const USER_ORDERS_QUERY = gql`
+ query orders {
+ orders(orderBy: createdAt_DESC) {
+ id
+ total
+ createdAt
+ updatedAt
+ items {
+ id
+ title
+ price
+ description
+ quantity
+ image
+ }
+ }
+ }
+`;
+
const OrderUl = styled.ul`
display: grid;
grid-gap: 4rem;
@@ -71,3 +90,4 @@ class OrderList extends React.Component {
}
export default OrderList;
+export { USER_ORDERS_QUERY };
diff --git a/frontend/components/Pagination.js b/frontend/components/Pagination.js
index 380026d..8b25e06 100644
--- a/frontend/components/Pagination.js
+++ b/frontend/components/Pagination.js
@@ -3,8 +3,18 @@ import { Query } from 'react-apollo';
import styled from 'styled-components';
import Link from 'next/link';
import PropTypes from 'prop-types';
+import gql from 'graphql-tag';
import { perPage } from '../config';
-import { ALL_ITEMS_QUERY } from '../queries/queries.graphql';
+
+const PAGINATION_QUERY = gql`
+ query itemsConnection($skip: Int = 0, $first: Int = 4) {
+ itemsConnection(orderBy: createdAt_DESC, first: $first, skip: $skip) {
+ aggregate {
+ count
+ }
+ }
+ }
+`;
const PaginationStyles = styled.div`
text-align: center;
@@ -31,7 +41,7 @@ const PaginationStyles = styled.div`
`;
const Pagination = props => (
- <Query query={ALL_ITEMS_QUERY}>
+ <Query query={PAGINATION_QUERY}>
{({ data, loading, error }) => {
if (loading || error) return null;
const { aggregate } = data.itemsConnection;
@@ -78,3 +88,4 @@ Pagination.propTypes = {
};
export default Pagination;
+export { PAGINATION_QUERY };
diff --git a/frontend/components/Permissions.js b/frontend/components/Permissions.js
index 1807366..52a6acf 100644
--- a/frontend/components/Permissions.js
+++ b/frontend/components/Permissions.js
@@ -1,11 +1,33 @@
import React from 'react';
import { Query, Mutation } from 'react-apollo';
import PropTypes from 'prop-types';
-import { ALL_USERS_QUERY, UPDATE_PERMISSIONS_MUTATION } from '../queries/queries.graphql';
+import gql from 'graphql-tag';
import Error from './ErrorMessage';
import SickButton from './styles/SickButton';
import Table from './styles/Table';
+const ALL_USERS_QUERY = gql`
+ query {
+ users {
+ id
+ name
+ email
+ permissions
+ }
+ }
+`;
+
+const UPDATE_PERMISSIONS_MUTATION = gql`
+ mutation updatePermissions($permissions: [Permission], $userId: ID!) {
+ updatePermissions(permissions: $permissions, userId: $userId) {
+ id
+ permissions
+ name
+ email
+ }
+ }
+`;
+
const possiblePermissions = [
'ADMIN',
'USER',
@@ -108,3 +130,4 @@ const Permissions = () => (
);
export default Permissions;
+export { ALL_USERS_QUERY, UPDATE_PERMISSIONS_MUTATION };
diff --git a/frontend/components/PleaseSignIn.js b/frontend/components/PleaseSignIn.js
index 7e5e726..5646749 100644
--- a/frontend/components/PleaseSignIn.js
+++ b/frontend/components/PleaseSignIn.js
@@ -1,6 +1,6 @@
import { Query } from 'react-apollo';
import PropTypes from 'prop-types';
-import { CURRENT_USER_QUERY } from '../queries/queries.graphql';
+import { CURRENT_USER_QUERY } from './User';
import Signin from './Signin';
const PleaseSignIn = props => (
diff --git a/frontend/components/RemoveFromCart.js b/frontend/components/RemoveFromCart.js
index 7ec2313..cf5b6fd 100644
--- a/frontend/components/RemoveFromCart.js
+++ b/frontend/components/RemoveFromCart.js
@@ -2,10 +2,16 @@ import { Component } from 'react';
import { Mutation } from 'react-apollo';
import styled from 'styled-components';
import PropTypes from 'prop-types';
-import {
- REMOVE_FROM_CART_MUTATION,
- CURRENT_USER_QUERY,
-} from '../queries/queries.graphql';
+import gql from 'graphql-tag';
+import { CURRENT_USER_QUERY } from './User';
+
+const REMOVE_FROM_CART_MUTATION = gql`
+ mutation removeFromCart($id: ID!) {
+ removeFromCart(id: $id) {
+ id
+ }
+ }
+`;
const BigButton = styled.button`
font-size: 3rem;
@@ -38,11 +44,7 @@ class RemoveFromCart extends Component {
update={this.update}
>
{(removeFromCart, { loading }) => (
- <BigButton
- disabled={loading}
- title="Remove From Cart"
- onClick={removeFromCart}
- >
+ <BigButton disabled={loading} title="Remove From Cart" onClick={removeFromCart}>
×
</BigButton>
)}
@@ -52,3 +54,4 @@ class RemoveFromCart extends Component {
}
export default RemoveFromCart;
+export { REMOVE_FROM_CART_MUTATION };
diff --git a/frontend/components/Reset.js b/frontend/components/Reset.js
index c4d791c..bb2ece0 100644
--- a/frontend/components/Reset.js
+++ b/frontend/components/Reset.js
@@ -1,9 +1,20 @@
import React from 'react';
import { Mutation } from 'react-apollo';
import PropTypes from 'prop-types';
+import gql from 'graphql-tag';
import Form from './styles/Form';
import Error from './ErrorMessage';
-import { RESET_MUTATION, CURRENT_USER_QUERY } from '../queries/queries.graphql';
+import { CURRENT_USER_QUERY } from './User';
+
+const RESET_MUTATION = gql`
+ mutation RESET_MUTATION($resetToken: String!, $password: String!, $confirmPassword: String!) {
+ resetPassword(resetToken: $resetToken, password: $password, confirmPassword: $confirmPassword) {
+ id
+ email
+ name
+ }
+ }
+`;
class Reset extends React.Component {
static propTypes = {
@@ -71,3 +82,4 @@ class Reset extends React.Component {
}
export default Reset;
+export { RESET_MUTATION };
diff --git a/frontend/components/ResetRequest.js b/frontend/components/ResetRequest.js
index 1762aa3..6aedcc1 100644
--- a/frontend/components/ResetRequest.js
+++ b/frontend/components/ResetRequest.js
@@ -1,9 +1,17 @@
import React from 'react';
import { Mutation } from 'react-apollo';
-import { REQUEST_RESET_MUTATION } from '../queries/queries.graphql';
+import gql from 'graphql-tag';
import Form from './styles/Form';
import Error from './ErrorMessage';
+const REQUEST_RESET_MUTATION = gql`
+ mutation requestReset($email: String!) {
+ requestReset(email: $email) {
+ id
+ }
+ }
+`;
+
class ResetRequest extends React.Component {
state = {
email: '',
@@ -44,3 +52,4 @@ class ResetRequest extends React.Component {
}
export default ResetRequest;
+export { REQUEST_RESET_MUTATION };
diff --git a/frontend/components/Search.js b/frontend/components/Search.js
index 9f43d36..a972db2 100644
--- a/frontend/components/Search.js
+++ b/frontend/components/Search.js
@@ -2,10 +2,19 @@ import React from 'react';
import Downshift from 'downshift';
import Router from 'next/router';
import { ApolloConsumer } from 'react-apollo';
+import gql from 'graphql-tag';
import styled, { keyframes } from 'styled-components';
import debounce from 'lodash.debounce';
-import { SEARCH_ITEMS_QUERY } from '../queries/queries.graphql';
+const SEARCH_ITEMS_QUERY = gql`
+ query SEARCH_ITEMS_QUERY($searchTerm: String!) {
+ items(where: { OR: [{ title_contains: $searchTerm }, { description_contains: $searchTerm }] }) {
+ id
+ image
+ title
+ }
+ }
+`;
function routeToItem(item) {
Router.push({
pathname: '/item',
@@ -131,3 +140,4 @@ class AutoComplete extends React.Component {
}
export default AutoComplete;
+export { SEARCH_ITEMS_QUERY };
diff --git a/frontend/components/Signin.js b/frontend/components/Signin.js
index 23a5835..53cdb76 100644
--- a/frontend/components/Signin.js
+++ b/frontend/components/Signin.js
@@ -1,14 +1,26 @@
import React, { Component } from 'react';
-import { Mutation, ApolloConsumer } from 'react-apollo';
-import { SIGNIN_MUTATION, CURRENT_USER_QUERY } from '../queries/queries.graphql';
+import { Mutation } from 'react-apollo';
+import gql from 'graphql-tag';
+import { CURRENT_USER_QUERY } from './User';
import Error from './ErrorMessage';
import Form from './styles/Form';
+const SIGNIN_MUTATION = gql`
+ mutation SIGNIN_MUTATION($email: String!, $password: String!) {
+ signin(email: $email, password: $password) {
+ id
+ email
+ name
+ }
+ }
+`;
+
class Signin extends Component {
state = {
- email: `wesbos@gmail.com`,
- password: 'abc123',
+ email: '',
+ password: '',
};
+
saveToState = e => {
const { name, value } = e.target;
this.setState({ [name]: value });
@@ -64,3 +76,4 @@ class Signin extends Component {
}
export default Signin;
+export { SIGNIN_MUTATION };
diff --git a/frontend/components/Signout.js b/frontend/components/Signout.js
index fbd7fd9..ae87631 100644
--- a/frontend/components/Signout.js
+++ b/frontend/components/Signout.js
@@ -1,6 +1,15 @@
import React, { Component } from 'react';
-import { Query, Mutation } from 'react-apollo';
-import { CURRENT_USER_QUERY, SIGN_OUT_MUTATION } from '../queries/queries.graphql';
+import { Mutation } from 'react-apollo';
+import gql from 'graphql-tag';
+import { CURRENT_USER_QUERY } from './User';
+
+const SIGN_OUT_MUTATION = gql`
+ mutation SIGN_OUT_MUTATION {
+ signout {
+ message
+ }
+ }
+`;
class Signout extends Component {
render() {
@@ -13,3 +22,4 @@ class Signout extends Component {
}
export default Signout;
+export { SIGN_OUT_MUTATION };
diff --git a/frontend/components/Signup.js b/frontend/components/Signup.js
index 624bc10..9164e67 100644
--- a/frontend/components/Signup.js
+++ b/frontend/components/Signup.js
@@ -1,14 +1,25 @@
import React, { Component } from 'react';
import { Mutation } from 'react-apollo';
-import { SIGNUP_MUTATION, CURRENT_USER_QUERY } from '../queries/queries.graphql';
+import gql from 'graphql-tag';
+import { CURRENT_USER_QUERY } from './User';
import Form from './styles/Form';
import Error from './ErrorMessage';
+const SIGNUP_MUTATION = gql`
+ mutation SIGNUP_MUTATION($email: String!, $name: String!, $password: String!) {
+ signup(email: $email, name: $name, password: $password) {
+ id
+ email
+ name
+ }
+ }
+`;
+
class Signup extends Component {
state = {
- email: `wesbos@gmail.com`,
- name: 'Wes Bos',
- password: 'wes',
+ email: '',
+ name: '',
+ password: '',
};
saveToState = e => {
@@ -79,3 +90,4 @@ class Signup extends Component {
}
export default Signup;
+export { SIGNUP_MUTATION };
diff --git a/frontend/components/SingleItem.js b/frontend/components/SingleItem.js
index f71e0fe..d543ad1 100644
--- a/frontend/components/SingleItem.js
+++ b/frontend/components/SingleItem.js
@@ -2,10 +2,22 @@ import { Query } from 'react-apollo';
import PropTypes from 'prop-types';
import styled from 'styled-components';
import Link from 'next/link';
-import { SINGLE_ITEM_QUERY } from '../queries/queries.graphql';
+import gql from 'graphql-tag';
import Error from './ErrorMessage';
import AddToCart from './AddToCart';
+const SINGLE_ITEM_QUERY = gql`
+ query SINGLE_ITEM_QUERY($id: ID!) {
+ items(where: { id: $id }) {
+ id
+ title
+ description
+ largeImage
+ image
+ }
+ }
+`;
+
const SingleItemStyles = styled.div`
max-width: 1200px;
margin: 2rem auto;
@@ -58,3 +70,4 @@ SingleItem.propTypes = {
};
export default SingleItem;
+export { SINGLE_ITEM_QUERY };
diff --git a/frontend/components/TakeMyMoney.js b/frontend/components/TakeMyMoney.js
index 5823d00..b9e42ea 100644
--- a/frontend/components/TakeMyMoney.js
+++ b/frontend/components/TakeMyMoney.js
@@ -4,9 +4,24 @@ import { Mutation, Query } from 'react-apollo';
import Router from 'next/router';
import NProgress from 'nprogress';
import PropTypes from 'prop-types';
-import { CREATE_ORDER_MUTATION, CURRENT_USER_QUERY } from '../queries/queries.graphql';
+import gql from 'graphql-tag';
import calcTotalPrice from '../lib/calcTotalPrice';
import Error from './ErrorMessage';
+import User, { CURRENT_USER_QUERY } from './User';
+
+const CREATE_ORDER_MUTATION = gql`
+ mutation createOrder($token: String!) {
+ createOrder(token: $token) {
+ id
+ charge
+ total
+ items {
+ id
+ title
+ }
+ }
+ }
+`;
function totalItems(cart) {
return cart.reduce((tally, cartItem) => tally + cartItem.quantity, 0);
@@ -30,7 +45,7 @@ class TakeMyMoney extends Component {
};
render() {
return (
- <Query query={CURRENT_USER_QUERY}>
+ <User>
{({ data: { me }, error }) => {
if (!me || !me.cart.length) return null;
if (error) return <Error error={error} />;
@@ -56,7 +71,7 @@ class TakeMyMoney extends Component {
</Mutation>
);
}}
- </Query>
+ </User>
);
}
}
diff --git a/frontend/components/UpdateItem.js b/frontend/components/UpdateItem.js
index ecaac75..08ba254 100644
--- a/frontend/components/UpdateItem.js
+++ b/frontend/components/UpdateItem.js
@@ -1,10 +1,19 @@
import React, { Component } from 'react';
import { Query, Mutation } from 'react-apollo';
import PropTypes from 'prop-types';
-import { SINGLE_ITEM_QUERY, UPDATE_ITEM_MUTATION } from '../queries/queries.graphql';
+import gql from 'graphql-tag';
+import { SINGLE_ITEM_QUERY } from './SingleItem';
import Form from './styles/Form';
import Error from './ErrorMessage';
+const UPDATE_ITEM_MUTATION = gql`
+ mutation updateItem($id: ID!, $title: String, $description: String, $price: Int) {
+ updateItem(id: $id, description: $description, title: $title, price: $price) {
+ id
+ }
+ }
+`;
+
class UpdateItem extends Component {
static propTypes = {
id: PropTypes.string.isRequired,
@@ -18,7 +27,6 @@ class UpdateItem extends Component {
if (type === 'number') {
value = parseInt(value);
}
- console.log('Saving to state');
const item = { ...this.state.item };
item[name] = value;
this.setState({ item });
@@ -94,3 +102,4 @@ class UpdateItem extends Component {
}
export default UpdateItem;
+export { UPDATE_ITEM_MUTATION };
diff --git a/frontend/components/User.js b/frontend/components/User.js
new file mode 100644
index 0000000..19c568d
--- /dev/null
+++ b/frontend/components/User.js
@@ -0,0 +1,45 @@
+import { Query } from 'react-apollo';
+import gql from 'graphql-tag';
+import PropTypes from 'prop-types';
+
+const CURRENT_USER_QUERY = gql`
+ query {
+ me {
+ id
+ email
+ name
+ permissions
+ orders {
+ id
+ charge
+ total
+ }
+ cart {
+ id
+ quantity
+ item {
+ __typename
+ id
+ title
+ price
+ description
+ image
+ largeImage
+ }
+ }
+ }
+ }
+`;
+
+const User = props => (
+ <Query {...props} query={CURRENT_USER_QUERY}>
+ {result => props.children(result)}
+ </Query>
+);
+
+User.propTypes = {
+ children: PropTypes.func.isRequired,
+};
+
+export default User;
+export { CURRENT_USER_QUERY };