Submit.js 1.7 KB
Newer Older
1 2 3
import { graphql } from 'react-apollo'
import gql from 'graphql-tag'
import { allPosts, allPostsQueryVars } from './PostList'
4 5

function Submit ({ createPost }) {
6 7
  function handleSubmit (event) {
    event.preventDefault()
8

9
    const form = event.target
10

11 12
    const formData = new window.FormData(form)
    createPost(formData.get('title'), formData.get('url'))
13

14
    form.reset()
15 16 17 18
  }

  return (
    <form onSubmit={handleSubmit}>
19
      <h1>Apollo: Submit</h1>
20 21
      <input placeholder='title' name='title' type='text' required />
      <input placeholder='url' name='url' type='url' required />
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
      <button type='submit'>Submit</button>
      <style jsx>{`
        form {
          border-bottom: 1px solid #ececec;
          padding-bottom: 20px;
          margin-bottom: 20px;
        }
        h1 {
          font-size: 20px;
        }
        input {
          display: block;
          margin-bottom: 10px;
        }
      `}</style>
    </form>
  )
}

const createPost = gql`
  mutation createPost($title: String!, $url: String!) {
    createPost(title: $title, url: $url) {
      id
      title
      votes
      url
      createdAt
    }
  }
`

export default graphql(createPost, {
  props: ({ mutate }) => ({
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
    createPost: (title, url) =>
      mutate({
        variables: { title, url },
        update: (proxy, { data: { createPost } }) => {
          const data = proxy.readQuery({
            query: allPosts,
            variables: allPostsQueryVars
          })
          proxy.writeQuery({
            query: allPosts,
            data: {
              ...data,
              allPosts: [createPost, ...data.allPosts]
            },
            variables: allPostsQueryVars
70 71
          })
        }
72
      })
73 74
  })
})(Submit)