Mirror: The highly customizable and versatile GraphQL client with which you add on features like normalized caching as you grow.

feat(solid): reconcile data updates (#3674)

Changed files
+59 -36
.changeset
packages
+5
.changeset/perfect-worms-deliver.md
···
+
---
+
'@urql/solid': patch
+
---
+
+
feat(solid): reconcile data updates
+11 -8
packages/solid-urql/src/createMutation.ts
···
-
import { createStore } from 'solid-js/store';
+
import { createStore, reconcile } from 'solid-js/store';
import {
type AnyVariables,
type DocumentInput,
···
} from '@urql/core';
import { useClient } from './context';
import { pipe, onPush, filter, take, toPromise } from 'wonka';
+
import { batch } from 'solid-js';
export type CreateMutationState<
Data = any,
···
return pipe(
client.executeMutation(request, context),
onPush(result => {
-
setState({
-
fetching: false,
-
stale: result.stale,
-
data: result.data,
-
error: result.error,
-
extensions: result.extensions,
-
operation: result.operation,
+
batch(() => {
+
setState('data', reconcile(result.data));
+
setState({
+
fetching: false,
+
stale: result.stale,
+
error: result.error,
+
extensions: result.extensions,
+
operation: result.operation,
+
});
});
}),
filter(result => !result.hasNext),
+14 -11
packages/solid-urql/src/createQuery.ts
···
createRequest,
} from '@urql/core';
import {
+
batch,
createComputed,
createMemo,
createResource,
createSignal,
onCleanup,
} from 'solid-js';
-
import { createStore, produce } from 'solid-js/store';
+
import { createStore, produce, reconcile } from 'solid-js/store';
import { useClient } from './context';
import { type MaybeAccessor, asAccessor } from './utils';
import type { Source, Subscription } from 'wonka';
···
);
}),
subscribe(res => {
-
setResult(
-
produce(draft => {
-
draft.data = res.data;
-
draft.stale = !!res.stale;
-
draft.fetching = false;
-
draft.error = res.error;
-
draft.operation = res.operation;
-
draft.extensions = res.extensions;
-
})
-
);
+
batch(() => {
+
setResult('data', reconcile(res.data));
+
setResult(
+
produce(draft => {
+
draft.stale = !!res.stale;
+
draft.fetching = false;
+
draft.error = res.error;
+
draft.operation = res.operation;
+
draft.extensions = res.extensions;
+
})
+
);
+
});
})
).unsubscribe
);
+29 -17
packages/solid-urql/src/createSubscription.ts
···
createRequest,
} from '@urql/core';
import { useClient } from './context';
-
import { createStore, produce } from 'solid-js/store';
-
import { createComputed, createSignal, onCleanup } from 'solid-js';
+
import { createStore, produce, reconcile } from 'solid-js/store';
+
import {
+
batch,
+
createComputed,
+
createSignal,
+
onCleanup,
+
untrack,
+
} from 'solid-js';
import { type Source, onEnd, pipe, subscribe } from 'wonka';
/** Triggers {@link createSubscription} to re-execute a GraphQL subscription operation.
···
);
}),
subscribe(res => {
-
setState(
-
produce(draft => {
-
draft.data =
-
res.data !== undefined
-
? typeof handler === 'function'
-
? handler(draft.data, res.data)
-
: res.data
-
: (draft.data as any);
-
draft.stale = !!res.stale;
-
draft.fetching = true;
-
draft.error = res.error;
-
draft.operation = res.operation;
-
draft.extensions = res.extensions;
-
})
-
);
+
batch(() => {
+
if (res.data !== undefined) {
+
const newData =
+
typeof handler === 'function'
+
? handler(
+
untrack(() => state.data),
+
res.data
+
)
+
: (res.data as Result);
+
setState('data', reconcile(newData));
+
}
+
setState(
+
produce(draft => {
+
draft.stale = !!res.stale;
+
draft.fetching = true;
+
draft.error = res.error;
+
draft.operation = res.operation;
+
draft.extensions = res.extensions;
+
})
+
);
+
});
})
).unsubscribe
);