From 2d145b026cfdf54a63bef0b9d6324b6785390307 Mon Sep 17 00:00:00 2001 From: Wes Bos Date: Fri, 14 Sep 2018 12:18:12 -0400 Subject: move finished folder --- .../frontend/components/AddToCart.js | 36 ++++++ finished-application/frontend/components/Cart.js | 66 ++++++++++ .../frontend/components/CartCount.js | 60 +++++++++ .../frontend/components/CartItem.js | 53 ++++++++ .../frontend/components/CreateItem.js | 142 +++++++++++++++++++++ .../frontend/components/DeleteItem.js | 50 ++++++++ .../frontend/components/ErrorMessage.js | 51 ++++++++ finished-application/frontend/components/Header.js | 75 +++++++++++ finished-application/frontend/components/Item.js | 50 ++++++++ finished-application/frontend/components/Items.js | 61 +++++++++ finished-application/frontend/components/Meta.js | 13 ++ finished-application/frontend/components/Nav.js | 49 +++++++ finished-application/frontend/components/Order.js | 92 +++++++++++++ .../frontend/components/OrderList.js | 80 ++++++++++++ finished-application/frontend/components/Page.js | 68 ++++++++++ .../frontend/components/Pagination.js | 67 ++++++++++ .../frontend/components/Permissions.js | 131 +++++++++++++++++++ .../frontend/components/PleaseSignIn.js | 22 ++++ .../frontend/components/RemoveFromCart.js | 71 +++++++++++ .../frontend/components/RequestReset.js | 60 +++++++++ finished-application/frontend/components/Reset.js | 84 ++++++++++++ finished-application/frontend/components/Search.js | 94 ++++++++++++++ finished-application/frontend/components/Signin.js | 76 +++++++++++ .../frontend/components/Signout.js | 19 +++ finished-application/frontend/components/Signup.js | 87 +++++++++++++ .../frontend/components/SingleItem.js | 70 ++++++++++ .../frontend/components/TakeMyMoney.js | 79 ++++++++++++ .../frontend/components/UpdateItem.js | 117 +++++++++++++++++ finished-application/frontend/components/User.js | 41 ++++++ .../frontend/components/styles/CartStyles.js | 47 +++++++ .../frontend/components/styles/CloseButton.js | 13 ++ .../frontend/components/styles/DropDown.js | 47 +++++++ .../frontend/components/styles/Form.js | 71 +++++++++++ .../frontend/components/styles/ItemStyles.js | 39 ++++++ .../frontend/components/styles/NavStyles.js | 66 ++++++++++ .../frontend/components/styles/OrderItemStyles.js | 44 +++++++ .../frontend/components/styles/OrderStyles.js | 37 ++++++ .../frontend/components/styles/PaginationStyles.js | 27 ++++ .../frontend/components/styles/PriceTag.js | 17 +++ .../frontend/components/styles/SickButton.js | 20 +++ .../frontend/components/styles/Supreme.js | 13 ++ .../frontend/components/styles/Table.js | 35 +++++ .../frontend/components/styles/Title.js | 20 +++ 43 files changed, 2460 insertions(+) create mode 100644 finished-application/frontend/components/AddToCart.js create mode 100644 finished-application/frontend/components/Cart.js create mode 100644 finished-application/frontend/components/CartCount.js create mode 100644 finished-application/frontend/components/CartItem.js create mode 100644 finished-application/frontend/components/CreateItem.js create mode 100644 finished-application/frontend/components/DeleteItem.js create mode 100644 finished-application/frontend/components/ErrorMessage.js create mode 100644 finished-application/frontend/components/Header.js create mode 100644 finished-application/frontend/components/Item.js create mode 100644 finished-application/frontend/components/Items.js create mode 100644 finished-application/frontend/components/Meta.js create mode 100644 finished-application/frontend/components/Nav.js create mode 100644 finished-application/frontend/components/Order.js create mode 100644 finished-application/frontend/components/OrderList.js create mode 100644 finished-application/frontend/components/Page.js create mode 100644 finished-application/frontend/components/Pagination.js create mode 100644 finished-application/frontend/components/Permissions.js create mode 100644 finished-application/frontend/components/PleaseSignIn.js create mode 100644 finished-application/frontend/components/RemoveFromCart.js create mode 100644 finished-application/frontend/components/RequestReset.js create mode 100644 finished-application/frontend/components/Reset.js create mode 100644 finished-application/frontend/components/Search.js create mode 100644 finished-application/frontend/components/Signin.js create mode 100644 finished-application/frontend/components/Signout.js create mode 100644 finished-application/frontend/components/Signup.js create mode 100644 finished-application/frontend/components/SingleItem.js create mode 100644 finished-application/frontend/components/TakeMyMoney.js create mode 100644 finished-application/frontend/components/UpdateItem.js create mode 100644 finished-application/frontend/components/User.js create mode 100644 finished-application/frontend/components/styles/CartStyles.js create mode 100644 finished-application/frontend/components/styles/CloseButton.js create mode 100644 finished-application/frontend/components/styles/DropDown.js create mode 100644 finished-application/frontend/components/styles/Form.js create mode 100644 finished-application/frontend/components/styles/ItemStyles.js create mode 100644 finished-application/frontend/components/styles/NavStyles.js create mode 100644 finished-application/frontend/components/styles/OrderItemStyles.js create mode 100644 finished-application/frontend/components/styles/OrderStyles.js create mode 100644 finished-application/frontend/components/styles/PaginationStyles.js create mode 100644 finished-application/frontend/components/styles/PriceTag.js create mode 100644 finished-application/frontend/components/styles/SickButton.js create mode 100644 finished-application/frontend/components/styles/Supreme.js create mode 100644 finished-application/frontend/components/styles/Table.js create mode 100644 finished-application/frontend/components/styles/Title.js (limited to 'finished-application/frontend/components') diff --git a/finished-application/frontend/components/AddToCart.js b/finished-application/frontend/components/AddToCart.js new file mode 100644 index 0000000..8a71cc3 --- /dev/null +++ b/finished-application/frontend/components/AddToCart.js @@ -0,0 +1,36 @@ +import React from 'react'; +import { Mutation } from 'react-apollo'; +import gql from 'graphql-tag'; +import { CURRENT_USER_QUERY } from './User'; + +const ADD_TO_CART_MUTATION = gql` + mutation addToCart($id: ID!) { + addToCart(id: $id) { + id + quantity + } + } +`; + +class AddToCart extends React.Component { + render() { + const { id } = this.props; + return ( + + {(addToCart, { loading }) => ( + + )} + + ); + } +} +export default AddToCart; +export { ADD_TO_CART_MUTATION }; diff --git a/finished-application/frontend/components/Cart.js b/finished-application/frontend/components/Cart.js new file mode 100644 index 0000000..2a72b38 --- /dev/null +++ b/finished-application/frontend/components/Cart.js @@ -0,0 +1,66 @@ +import React from 'react'; +import { Query, Mutation } from 'react-apollo'; +import gql from 'graphql-tag'; +import { adopt } from 'react-adopt'; +import User from './User'; +import CartStyles from './styles/CartStyles'; +import Supreme from './styles/Supreme'; +import CloseButton from './styles/CloseButton'; +import SickButton from './styles/SickButton'; +import CartItem from './CartItem'; +import calcTotalPrice from '../lib/calcTotalPrice'; +import formatMoney from '../lib/formatMoney'; +import TakeMyMoney from './TakeMyMoney'; + +const LOCAL_STATE_QUERY = gql` + query { + cartOpen @client + } +`; + +const TOGGLE_CART_MUTATION = gql` + mutation { + toggleCart @client + } +`; +/* eslint-disable */ +const Composed = adopt({ + user: ({ render }) => {render}, + toggleCart: ({ render }) => {render}, + localState: ({ render }) => {render}, +}); +/* eslint-enable */ + +const Cart = () => ( + + {({ user, toggleCart, localState }) => { + const me = user.data.me; + if (!me) return null; + return ( + +
+ + × + + {me.name}'s Cart +

+ You Have {me.cart.length} Item{me.cart.length === 1 ? '' : 's'} in your cart. +

+
+
    {me.cart.map(cartItem => )}
+
+

{formatMoney(calcTotalPrice(me.cart))}

+ {me.cart.length && ( + + Checkout + + )} +
+
+ ); + }} +
+); + +export default Cart; +export { LOCAL_STATE_QUERY, TOGGLE_CART_MUTATION }; diff --git a/finished-application/frontend/components/CartCount.js b/finished-application/frontend/components/CartCount.js new file mode 100644 index 0000000..c202d74 --- /dev/null +++ b/finished-application/frontend/components/CartCount.js @@ -0,0 +1,60 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { TransitionGroup, CSSTransition } from 'react-transition-group'; +import styled from 'styled-components'; + +const AnimationStyles = styled.span` + position: relative; + .count { + display: block; + position: relative; + transition: all 0.4s; + backface-visibility: hidden; + } + /* Intial State of the entered Dot */ + .count-enter { + transform: scale(4) rotateX(0.5turn); + } + .count-enter-active { + transform: rotateX(0); + } + .count-exit { + top: 0; + position: absolute; + transform: rotateX(0); + } + .count-exit-active { + transform: scale(4) rotateX(0.5turn); + } +`; + +const Dot = styled.div` + background: ${props => props.theme.red}; + color: white; + border-radius: 50%; + padding: 0.5rem; + line-height: 2rem; + min-width: 3rem; + margin-left: 1rem; + font-weight: 100; + font-feature-settings: 'tnum'; + font-variant-numeric: tabular-nums; +`; + +const CartCount = ({ count }) => ( + + + + {count} + + + +); + +export default CartCount; diff --git a/finished-application/frontend/components/CartItem.js b/finished-application/frontend/components/CartItem.js new file mode 100644 index 0000000..b0ce62e --- /dev/null +++ b/finished-application/frontend/components/CartItem.js @@ -0,0 +1,53 @@ +import React from 'react'; +import styled from 'styled-components'; +import PropTypes from 'prop-types'; +import formatMoney from '../lib/formatMoney'; +import RemoveFromCart from './RemoveFromCart'; + +const CartItemStyles = styled.li` + padding: 1rem 0; + border-bottom: 1px solid ${props => props.theme.lightgrey}; + display: grid; + align-items: center; + grid-template-columns: auto 1fr auto; + img { + margin-right: 10px; + } + h3, + p { + margin: 0; + } +`; + +const CartItem = ({ cartItem }) => { + // first check if that item exists + if (!cartItem.item) + return ( + +

This Item has been removed

+ +
+ ); + return ( + + {cartItem.item.title} +
+

{cartItem.item.title}

+

+ {formatMoney(cartItem.item.price * cartItem.quantity)} + {' - '} + + {cartItem.quantity} × {formatMoney(cartItem.item.price)} each + +

+
+ +
+ ); +}; + +CartItem.propTypes = { + cartItem: PropTypes.object.isRequired, +}; + +export default CartItem; diff --git a/finished-application/frontend/components/CreateItem.js b/finished-application/frontend/components/CreateItem.js new file mode 100644 index 0000000..c115eac --- /dev/null +++ b/finished-application/frontend/components/CreateItem.js @@ -0,0 +1,142 @@ +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: '', + description: '', + image: '', + largeImage: '', + price: 0, + }; + handleChange = e => { + const { name, type, value } = e.target; + const val = type === 'number' ? parseFloat(value) : value; + this.setState({ [name]: val }); + }; + + uploadFile = async e => { + 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(); + this.setState({ + image: file.secure_url, + largeImage: file.eager[0].secure_url, + }); + }; + render() { + return ( + + {(createItem, { loading, error }) => ( +
{ + // 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 }, + }); + }} + > + +
+ + + + + + +