From 3d65cb04707cf3af11885995fd1110a5971d8b00 Mon Sep 17 00:00:00 2001 From: Ruben Beltran del Rio Date: Sun, 24 Dec 2023 12:31:07 +0100 Subject: Don't remember what this WIP was about --- src/lib/stores/apollo.ts | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/lib/stores/apollo.ts (limited to 'src/lib/stores/apollo.ts') diff --git a/src/lib/stores/apollo.ts b/src/lib/stores/apollo.ts new file mode 100644 index 0000000..4ef1986 --- /dev/null +++ b/src/lib/stores/apollo.ts @@ -0,0 +1,62 @@ +import { ApolloError } from '@apollo/client/core'; +import { readable } from 'svelte/store'; +import { client } from '$lib/config/apollo'; +import type { DocumentNode, ApolloQueryResult } from '@apollo/client/core'; + +import type { Readable } from 'svelte/store'; + +/* + * This is a generic store for use with apollo + */ + +type ApolloStoreConfiguration = { + key: string; + query: DocumentNode; + initialValue?: Type | void; + variables?: object; +}; + +type ApolloStoreState = { + loading: boolean; + data: Type | void; + error: Error | void; +}; + +export const store = function store({ + key, + query, + initialValue = null, + variables = {} +}: ApolloStoreConfiguration): Readable> { + const initialState: ApolloStoreState = { + loading: true, + data: initialValue, + error: undefined + }; + + return readable(initialState, (set) => { + const handleError = function (error: Error) { + return set({ + loading: false, + data: initialValue, + error + }); + }; + + client.watchQuery({ query, variables }).subscribe( + (result: ApolloQueryResult) => { + if (result.errors) { + const error = new ApolloError({ graphQLErrors: result.errors }); + return handleError(error); + } + + set({ + loading: false, + data: result.data[key], + error: undefined + }); + }, + (error: Error) => handleError(error) + ); + }); +}; -- cgit