Skip to content

Commit

Permalink
feat: add paused for subscriptions init closes #142
Browse files Browse the repository at this point in the history
  • Loading branch information
logaretm committed Oct 18, 2021
1 parent 1aec7e7 commit c6da68d
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 5 deletions.
1 change: 1 addition & 0 deletions packages/villus/src/Subscription.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ const SubscriptionImpl = defineComponent({
{
query: props.query as string,
variables: props.variables as Record<string, any> | undefined,
paused: props.paused,
},
(props.reduce as Reducer) || defaultReducer
);
Expand Down
17 changes: 12 additions & 5 deletions packages/villus/src/useSubscription.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@ import { Operation } from '../../shared/src';
interface SubscriptionCompositeOptions<TData, TVars> {
query: MaybeRef<Operation<TData, TVars>['query']>;
variables?: MaybeRef<TVars>;
paused?: boolean;
}

export type Reducer<TData = any, TResult = TData> = (prev: TResult | null, value: OperationResult<TData>) => TResult;

export const defaultReducer: Reducer = (_, val) => val.data;

export function useSubscription<TData = any, TResult = TData, TVars = QueryVariables>(
{ query, variables }: SubscriptionCompositeOptions<TData, TVars>,
{ query, variables, paused }: SubscriptionCompositeOptions<TData, TVars>,
reduce: Reducer<TData, TResult> = defaultReducer
) {
const client = injectWithSelf(VILLUS_CLIENT, () => {
Expand All @@ -23,7 +24,7 @@ export function useSubscription<TData = any, TResult = TData, TVars = QueryVaria

const data = ref<TResult | null>(reduce(null, { data: null, error: null }));
const error: Ref<CombinedError | null> = ref(null);
const isPaused = ref(false);
const isPaused = ref(paused || false);

function handleResponse(result: OperationResult<TData>) {
data.value = reduce(data.value as TResult, result) as any;
Expand Down Expand Up @@ -63,9 +64,11 @@ export function useSubscription<TData = any, TResult = TData, TVars = QueryVaria
}

let observer: Unsubscribable;
onMounted(async () => {
observer = await initObserver();
});
if (!paused) {
onMounted(async () => {
observer = await initObserver();
});
}

onBeforeUnmount(() => {
if (observer) {
Expand All @@ -78,6 +81,10 @@ export function useSubscription<TData = any, TResult = TData, TVars = QueryVaria
}

async function resume() {
if (!observer) {
reInit();
}

isPaused.value = false;
}

Expand Down
48 changes: 48 additions & 0 deletions packages/villus/test/useSubscription.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,54 @@ test('Pauses and resumes subscriptions', async () => {
expect(document.querySelector('#status')?.textContent).toBe('false');
});

test('Can pause subscriptions initially', async () => {
mount({
setup() {
useClient({
url: 'https://test.com/graphql',
use: [handleSubscriptions(() => makeObservable()), ...defaultPlugins()],
});

function reduce(oldMessages: string[] | null, response: any) {
if (!response.data || !oldMessages) {
return oldMessages || [];
}

return [...oldMessages, response.data.message];
}

const { data, resume, isPaused } = useSubscription(
{ query: `subscription { newMessages }`, paused: true },
reduce
);

return { messages: data, resume, isPaused };
},
template: `
<div>
<ul v-for="message in messages">
<li>{{ message.id }}</li>
</ul>
<button @click="resume"></button>
<span id="status">{{ isPaused }}</span>
</div>
`,
});

await flushPromises();
jest.advanceTimersByTime(201);
// pauses subscription
expect(document.querySelector('#status')?.textContent).toBe('true');
jest.advanceTimersByTime(201);
expect(document.querySelectorAll('li')).toHaveLength(0);
document.querySelector('button')?.dispatchEvent(new Event('click'));
await flushPromises();
expect(document.querySelector('#status')?.textContent).toBe('false');
jest.advanceTimersByTime(201);
await flushPromises();
expect(document.querySelectorAll('li')).toHaveLength(2);
});

test('Fails if provider was not resolved', () => {
try {
mount({
Expand Down

0 comments on commit c6da68d

Please sign in to comment.