All files / src index.ts

42.11% Statements 8/19
0% Branches 0/6
40% Functions 2/5
44.44% Lines 8/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82  2x               2x 2x             2x                 8x 8x                                                                                     2x               4x      
import { BaseMutationOptionsWithState, MutationTupleWithState } from './types'
import {
  CoreEvents,
  CoreState,
  EventTypeMap,
  MutationStates,
  MutationStatesSubject,
} from '@graphprotocol/mutations'
 
import { useEffect, useState } from 'react'
import {
  useMutation as apolloUseMutation,
  MutationHookOptions,
} from '@apollo/react-hooks'
import { OperationVariables } from '@apollo/react-common'
import { DocumentNode } from 'graphql'
 
export const useMutation = <
  TState = CoreState,
  TEventMap extends EventTypeMap = CoreEvents,
  TData = any,
  TVariables = OperationVariables
>(
  mutation: DocumentNode,
  options?: MutationHookOptions<TData, TVariables>,
): MutationTupleWithState<TState, TEventMap, TData, TVariables> => {
  const [state, setState] = useState({} as MutationStates<TState, TEventMap>)
  const [observable] = useState(new MutationStatesSubject<TState, TEventMap>({}))
 
  const graphContext = {
    _rootSub: observable,
  }
 
  const updatedOptions = options
    ? {
        ...options,
        context: {
          ...options.context,
          client: options.client,
          ...graphContext,
        },
      }
    : {
        context: {
          ...graphContext,
        },
      }
 
  const [execute, result] = apolloUseMutation(mutation, updatedOptions)
 
  useEffect(() => {
    let subscription = observable.subscribe(
      (result: MutationStates<TState, TEventMap>) => {
        if (result) {
          setState(result)
        }
      },
    )
    return () => subscription.unsubscribe()
  }, [observable, setState])
 
  return [
    execute,
    {
      ...result,
      state,
    },
  ]
}
 
export const Mutation = <
  TState = CoreState,
  TEventMap extends EventTypeMap = CoreEvents,
  TData = any,
  TVariables = OperationVariables
>(
  props: BaseMutationOptionsWithState<TState, TEventMap, TData, TVariables>,
) => {
  const [runMutation, result] = useMutation<TState, TEventMap>(props.mutation, props)
  return props.children ? props.children(runMutation, result) : null
}