import type { GraphQLQuery, MutationOptions, QueryOptions, QueryResponse, QueryVariables, } from '@affine/graphql'; import { gqlFetcherFactory } from '@affine/graphql'; import type { GraphQLError } from 'graphql'; import type { SWRConfiguration, SWRResponse } from 'swr'; import useSWR from 'swr'; import type { SWRMutationConfiguration, SWRMutationResponse, } from 'swr/mutation'; import useSWRMutation from 'swr/mutation'; const fetcher = gqlFetcherFactory(prefixUrl + '/graphql'); /** * A `useSWR` wrapper for sending graphql queries * * @example * * ```ts * import { someQuery, someQueryWithNoVars } from '@affine/graphql' * * const swrResponse1 = useQuery({ * query: workspaceByIdQuery, * variables: { id: '1' } * }) * * const swrResponse2 = useQuery({ * query: someQueryWithNoVars * }) * ``` */ export function useQuery( options: QueryOptions ): SWRResponse, GraphQLError | GraphQLError[]>; export function useQuery( options: QueryOptions, config: Omit< SWRConfiguration< QueryResponse, GraphQLError | GraphQLError[], typeof fetcher >, 'fetcher' > ): SWRResponse, GraphQLError | GraphQLError[]>; export function useQuery( options: QueryOptions, config?: any ) { return useSWR( () => [options.query.id, options.variables], () => fetcher(options), config ); } /** * A useSWRMutation wrapper for sending graphql mutations * * @example * * ```ts * import { someMutation } from '@affine/graphql' * * const { trigger } = useMutation({ * mutation: someMutation, * }) * * trigger({ name: 'John Doe' }) */ export function useMutation( options: Omit, 'variables'> ): SWRMutationResponse< QueryResponse, GraphQLError | GraphQLError[], QueryVariables >; export function useMutation( options: Omit, 'variables'>, config: Omit< SWRMutationConfiguration< QueryResponse, GraphQLError | GraphQLError[], QueryVariables >, 'fetcher' > ): SWRMutationResponse< QueryResponse, GraphQLError | GraphQLError[], QueryVariables >; export function useMutation( options: Omit, 'variables'>, config?: any ) { return useSWRMutation( options.mutation.id, (_: string, { arg }: { arg: any }) => fetcher({ ...options, query: options.mutation, variables: arg }), config ); } export const gql = fetcher;