Files
FictionArchive/fictionarchive-web-astro/src/lib/graphql/urqlStore.ts

50 lines
1.3 KiB
TypeScript

import { writable } from 'svelte/store';
import type { OperationResult, TypedDocumentNode } from '@urql/core';
import { client } from './client';
export function queryStore<Data, Variables extends object>(
query: TypedDocumentNode<Data, Variables>,
variables: Variables
) {
const result = writable<OperationResult<Data> | null>(null);
const fetching = writable(true);
async function execute(vars: Variables = variables) {
fetching.set(true);
const res = await client.query(query, vars).toPromise();
result.set(res);
fetching.set(false);
return res;
}
// Initial fetch
execute();
return {
subscribe: result.subscribe,
fetching: { subscribe: fetching.subscribe },
refetch: execute,
};
}
export function mutationStore<Data, Variables extends object>(
mutation: TypedDocumentNode<Data, Variables>
) {
const result = writable<OperationResult<Data> | null>(null);
const fetching = writable(false);
async function execute(variables: Variables) {
fetching.set(true);
const res = await client.mutation(mutation, variables).toPromise();
result.set(res);
fetching.set(false);
return res;
}
return {
subscribe: result.subscribe,
fetching: { subscribe: fetching.subscribe },
execute,
};
}