graphql-engine/community/sample-apps/gatsby-postgres-graphql
Sai Krishna Prasad Kandula d7a52b9342 readme: use cloud signup endpoint for "Deploy to Hasura" CTA
https://github.com/hasura/graphql-engine-mono/pull/2142

GitOrigin-RevId: 212d766978841d5609d726f8359586185f3cbb59
2021-08-19 07:03:05 +00:00
..
assets add github workflow to compress new images in PRs 2021-03-10 20:55:02 +00:00
hasura community: fix sample apps metadata for v3 config 2021-08-19 03:46:59 +00:00
src sample apps(update): update gatsby sample app (#2969) 2019-12-02 15:57:03 +05:30
.gitignore refactor community content and folder structure (#1353) 2019-01-17 15:57:28 +05:30
config.yaml community: update sample apps to use hasura cloud and v3 migrations/metadata 2021-03-02 08:32:37 +00:00
gatsby-browser.js sample apps(update): update gatsby sample app (#2969) 2019-12-02 15:57:03 +05:30
gatsby-config.js community(gatsby-postgres-graphql): remove createLink, update deps (close #965) (#3600) 2019-12-27 19:25:58 +05:30
gatsby-ssr.js sample apps(update): update gatsby sample app (#2969) 2019-12-02 15:57:03 +05:30
package.json community(gatsby-postgres-graphql): remove createLink, update deps (close #965) (#3600) 2019-12-27 19:25:58 +05:30
README.md readme: use cloud signup endpoint for "Deploy to Hasura" CTA 2021-08-19 07:03:05 +00:00

gatsby-postgres-graphql

Boilerplate to get started with Gatsby, Hasura GraphQL engine as CMS and postgres as database using the awesome plugin gatsby-source-graphql.

Edit gatsby-postgres-graphql

Gatsby Postgres GraphQL

Tutorial

  • Deploy GraphQL Engine on Hasura Cloud and setup PostgreSQL via Heroku:

    Deploy to Hasura Cloud

  • Get the Hasura app URL (say gatsby-graphql.hasura.app)

  • Clone this repo:

git clone https://github.com/hasura/graphql-engine
cd graphql-engine/community/sample-apps/gatsby-postgres-graphql
  • Create author table:

Open Hasura console: visit https://gatsby-graphql.hasura.app on a browser
Navigate to Data section in the top nav bar and create a table as follows:

Create author table

  • Insert sample data into author table:

Insert data into author table

Verify if the row is inserted successfully

Insert data into author table

  • Install npm modules:
npm install
  • Configure gatsby to use gatsby-source-graphql plugin and a connection GraphQL url to stitch the schema.
{
  plugins: [
    {
      resolve: "gatsby-source-graphql", // <- Configure plugin
      options: {
        typeName: "HASURA",
        fieldName: "hasura", // <- fieldName under which schema will be stitched
        url: process.env.GATSBY_HASURA_GRAPHQL_URL,
        refetchInterval: 10 // Refresh every 10 seconds for new data
      }
    }
  ];
}
  • Run the app:
GATSBY_HASURA_GRAPHQL_URL=https://gatsby-graphql.hasura.app/v1/graphql npm run develop

Demo app

Make a GraphQL query from your component using hooks

  1. Create a component named AuthorList.js:
import React from "react";
import { useQuery } from "@apollo/react-hooks";
import { gql } from "apollo-boost";

const GET_AUTHORS = gql`
  query {
    author {
      id
      name
    }
  }
`;

const AuthorList = () => {
  const { loading, error, data } = useQuery(GET_AUTHORS);

  if (loading) return "loading...";
  if (error) return `error: ${error.message}`;

  return (
    <div>
      {data.author.map((author, index) => (
        <div key={index}>
          <h2>{author.name}</h2>
        </div>
      ))}
    </div>
  );
};

export default AuthorList;
export { GET_AUTHORS };

Make a GraphQL mutation using hooks

Additional packages are needed to be added to support mutations:
npm install @apollo/react-hooks apollo-boost isomorphic-fetch

  1. Create an apollo.js util file:
import ApolloClient from "apollo-boost";
import fetch from "isomorphic-fetch";

export const client = new ApolloClient({
  uri: process.env.GATSBY_HASURA_GRAPHQL_URL,
  fetch
});
  1. Create gatsby-browser.js and gatsby-ssr.js
import React from "react";
import { ApolloProvider } from "@apollo/react-hooks";
import { client } from "./src/utils/apollo";

export const wrapRootElement = ({ element }) => (
  <ApolloProvider client={client}>{element}</ApolloProvider>
);
  1. Create an AddAuthor.js component to add mutations:
import React, { useState } from "react";
import { useMutation } from "@apollo/react-hooks";
import { gql } from "apollo-boost";
import { GET_AUTHORS } from "./AuthorList";

const ADD_AUTHOR = gql`
  mutation insert_author($name: String!) {
    insert_author(objects: { name: $name }) {
      returning {
        id
        name
      }
    }
  }
`;

const AddAuthor = () => {
  const [author, setAuthor] = useState("");
  const [insert_author, { loading, error }] = useMutation(ADD_AUTHOR, {
    update: (cache, { data }) => {
      setAuthor("");
      const existingAuthors = cache.readQuery({
        query: GET_AUTHORS
      });

      // Add the new author to the cache
      const newAuthor = data.insert_author.returning[0];
      cache.writeQuery({
        query: GET_AUTHORS,
        data: {author: [newAuthor, ...existingAuthors.author]}
      });
    }
  });

  if (loading) return "loading...";
  if (error) return `error: ${error.message}`;

  const handleSubmit = event => {
    event.preventDefault();
    insert_author({
      variables: {
        name: author
      }
    });
  };

  return (
    <form onSubmit={handleSubmit}>
      <label htmlFor="author">
        Add Author:
        <input
          name="author"
          value={author}
          onChange={event => setAuthor(event.target.value)}
        />
      </label>
      <button type="submit">ADD</button>
    </form>
  );
};

export default AddAuthor;
  1. Run the app and test mutation. New data will be added to the top via a cache update.

Contributing

Checkout the contributing guide for more details.