feat: gql codegen + caching + optimistic

This commit is contained in:
Andrew Bastin
2021-10-08 23:44:23 +05:30
parent a5fd39adf8
commit 337a60c8a4
24 changed files with 1202 additions and 418 deletions

View File

@@ -6,7 +6,6 @@ import {
reactive,
Ref,
} from "@nuxtjs/composition-api"
import { DocumentNode } from "graphql/language"
import {
createClient,
TypedDocumentNode,
@@ -28,6 +27,8 @@ import clone from "lodash/clone"
import { keyDefs } from "./caching/keys"
import { optimisticDefs } from "./caching/optimistic"
import { updatesDef } from "./caching/updates"
import { resolversDef } from "./caching/resolvers"
import schema from "./backend-schema.json"
import {
getAuthIDToken,
probableUser$,
@@ -49,11 +50,12 @@ const client = createClient({
exchanges: [
devtoolsExchange,
dedupExchange,
// TODO: Extract this outttttttt
offlineExchange({
schema: schema as any,
keys: keyDefs,
optimistic: optimisticDefs,
updates: updatesDef,
resolvers: resolversDef,
storage,
}),
authExchange({
@@ -142,10 +144,10 @@ export function isLoadedGQLQuery<QueryFailType extends string, QueryReturnType>(
export function useGQLQuery<
QueryReturnType = any,
QueryFailType extends string = "",
QueryVariables extends object = {}
QueryVariables extends object = {},
QueryFailType extends string = ""
>(
query: string | DocumentNode | TypedDocumentNode<any, QueryVariables>,
query: TypedDocumentNode<QueryReturnType, QueryVariables>,
variables?: QueryVariables,
options: Partial<GQL_QUERY_OPTIONS> = DEFAULT_QUERY_OPTIONS
):
@@ -223,19 +225,19 @@ export function useGQLQuery<
}
export const runMutation = <
MutationReturnType = any,
MutationFailType extends string = "",
MutationVariables extends {} = {}
DocType,
DocVariables extends object | undefined,
DocErrors extends string
>(
mutation: string | DocumentNode | TypedDocumentNode<any, MutationVariables>,
variables?: MutationVariables,
mutation: TypedDocumentNode<DocType, DocVariables>,
variables?: DocVariables,
additionalConfig?: Partial<OperationContext>
): TE.TaskEither<GQLError<MutationFailType>, NonNullable<MutationReturnType>> =>
): TE.TaskEither<GQLError<DocErrors>, DocType> =>
pipe(
TE.tryCatch(
() =>
client
.mutation<MutationReturnType>(mutation, variables, {
.mutation(mutation, variables, {
requestPolicy: "cache-and-network",
...additionalConfig,
})
@@ -244,7 +246,7 @@ export const runMutation = <
),
TE.chainEitherK((result) =>
pipe(
result.data as MutationReturnType,
result.data,
E.fromNullable(
// Result is null
pipe(
@@ -253,13 +255,13 @@ export const runMutation = <
E.match(
// The left case (network error was null)
(gqlErr) =>
<GQLError<MutationFailType>>{
<GQLError<DocErrors>>{
type: "gql_error",
error: gqlErr as MutationFailType,
error: gqlErr,
},
// The right case (it was a GraphQL Error)
(networkErr) =>
<GQLError<MutationFailType>>{
<GQLError<DocErrors>>{
type: "network_error",
error: networkErr,
}