npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

use-redux-graphql-apollo

v0.0.1

Published

Connect to Redux state with React Hook for client-side GraphQL query via Apollo.

Downloads

8

Readme

use-redux-graphql-apollo

Connect to your Redux state with a React Hook that does a client-side GraphQL query via Apollo.

⚛️:sunglasses:⚛️

Don't use Apollo? See use-redux-graphql.

This can help as you migrate an existing application from storing API response data in Redux and accessing through selectors toward fetching it from a GraphQL server via React Hooks.

Queries will automatically re-execute whenever state changes to get the latest data.

Table of Contents

Usage in Components

Here's how you use the React Hook it in a component:

import * as React from "react";
import gql from "graphql-tag";
import { useReduxGraphQuery } from "use-redux-graphql-apollo";
import { ReduxGQLQuery } from "./__generated__/reduxGQL";

const COMP_QUERY = gql`
  query CompQuery {
    redux @client {
      name
      nested {
        flag
      }
    }
  }
`;

export const Comp = () => {
  const { data, error, loading } = useReduxGraphQuery<ReduxGQLQuery>(COMP_QUERY);

  if (loading) return <div>loading</div>;
  if (error) return <div>error</div>

  return <h1>name: {data?.redux?.name}</h1>;
};

Configure Apollo Client

Here's how you configure the resolver with Apollo client:

import { makeResolver } from "use-redux-graphql-apollo";

const typeDefs = gql`
  type Place {
    kind: String
  }
  
  type Nested {
    flag: Boolean
    place: Place
  }
  
  type Redux {
    name: String
    nested: Nested
  }
  
  type Query {
    redux: Redux
  }
`;

const resolvers = {
  Query: {
    redux: makeResolver({ store })
  }
};

export const client = new ApolloClient({
  resolvers,
  typeDefs,
  // ...
});

If you are also using a remote GraphQL server and you want your client schema to extend, you should use extend type Query instead of type Query.

TypeScript

If you want to generate TypeScript types from your Redux GraphQL schema, you can move your schema to an external file, e.g., src/graphql/redux.graphql:

type Place {
  kind: String
}

type Nested {
  flag: Boolean
  place: Place
}

type Redux {
  name: String
  nested: Nested
}

type Query {
  redux: Redux
}

Then you can configure webpack raw-loader to load in the schema:

import REDUX_GRAPHQL from './graphql/redux.graphql';

const typeDefs = gql`${REDUX_GRAPHQL}`;

const client = new ApolloClient({
  typeDefs,
  // ...
});

And again, if you want to extend a remote GraphQL schema, we'll have to replace type Query with extend type Query, but here we want to keepA the external schema file pure for the TypeScript tooling, so we'll replace at runtime:

import REDUX_GRAPHQL from './graphql/redux.graphql';

const typeDefs = gql`${REDUX_GRAPHQL.replace('type Query', 'extend type Query')}`;

const client = new ApolloClient({
  typeDefs,
  // ...
});

And here's how you can build the types:

mkdir -p src/__generated__
npm install --save-dev graphql-schema-typescript
npx graphql-schema-typescript generate-ts src/graphql --typePrefix ReduxGQL --output src/__generated__/reduxGQL.d.ts

You can add that last command to a build:types:graphql script in your package.json.

apollo-link-rest

This can pair nicely with apollo-link-rest, which lets you call your REST APIs client-side from within your GraphQL queries - or perhaps as a first step toward it. Unfortunately, apollo-link-rest can't easily support data that is not a pure transform of an API response, e.g., data in Redux state that is derivative of an API response, but is transformed with inputs from other pieces of state, or represents the merged state of multiple API calls.