import { fetchQuery } from 'relay-runtime'; import type { Environment, GraphQLTaggedNode, OperationType, } from 'relay-runtime'; import type { Getter, WritableAtom } from 'jotai/vanilla'; import { environmentAtom } from './environmentAtom'; import { createAtom } from './common'; type Config = Parameters[3]; type Action = { type: 'refetch'; }; export function atomWithQuery( taggedNode: GraphQLTaggedNode, getVariables: (get: Getter) => T['variables'], getConfig?: (get: Getter) => Config, getEnvironment: (get: Getter) => Environment = (get) => get(environmentAtom), ): WritableAtom { return createAtom( (get) => [taggedNode, getVariables(get), getConfig?.(get)] as const, getEnvironment, (environment, args) => fetchQuery(environment, ...args), (action, _environment, refresh) => { if (action.type === 'refetch') { refresh(); } }, ); }