gatsby-source-google-places

Source plugin for pulling data from the Google Places API.

Pre-reqs

Get a Google Places API Key.

Install

npm install --save gatsby-source-google-places
# or
yarn add gatsby-source-google-places

Using

Setup the plugin

// gatsby-config.js
module.exports = {
  plugins: [
    {
      resolve: `gatsby-source-google-places`,
      options: {
        placeIds: ["<your_place_id>", "<your_place_id2>"],
        apiKey: "<your_api_key>",
        language: "en-US", // optional, defaults to en-US
      },
    },
  ],
};

Query and display a single place

// pages/places.js
import React from "react";
import { graphql } from "gatsby";
import Layout from "../components/layout";

const PlacesPage = ({ data }) => {
  const place = data.googlePlacesPlace;
  const reviews = place.childrenGooglePlacesReview.map((r) => (
    <div>
      <img height="50" width="50" src={r.profile_photo_url} />
      <strong>
        {r.author_name} - {r.rating}
      </strong>
      <p>{`${r.text.substring(0, 250)} ...`}</p>
    </div>
  ));
  return (
    <Layout>
      <h1>{place.name}</h1>
      <p>total ratings: {place.user_ratings_total}</p>
      <p>average: {place.rating}</p>
      <h3>Recent Reviews</h3>
      {reviews}
    </Layout>
  );
};

export const query = graphql`
  query {
    googlePlacesPlace {
      name
      rating
      childrenGooglePlacesReview {
        author_name
        text
        rating
        profile_photo_url
      }
      user_ratings_total
    }
  }
`;

export default PlacesPage;

Query and display from multiple places in a page

// pages/multiple-places
import React from "react";
import { graphql } from "gatsby";
import Layout from "../components/layout";

const PlacesPage = ({ data }) => {
  const places = data.allGooglePlacesPlace.nodes.map((p) => (
    <div>
      <h2>
        Place: {p.name}{p.user_ratings_total}
      </h2>
      <h2>Reviews:</h2>
      <br />
      <br />
      <ul>
        {p.childrenGooglePlacesReview.map((r) => (
          <li>
            <img height="50" width="50" src={r.profile_photo_url} />{" "}
            {r.author_name}{r.rating}
            <p>{r.text}</p>
          </li>
        ))}
      </ul>
      <br />
      <br />
    </div>
  ));
  return <Layout>{places}</Layout>;
};

export const query = graphql`
  query {
    allGooglePlacesPlace {
      nodes {
        name
        user_ratings_total
        place_id
        childrenGooglePlacesReview {
          author_name
          rating
          profile_photo_url
          text
        }
      }
    }
  }
`;

export default PlacesPage;

Contribute

Issues, suggestions and PRs welcome!