Skip to content

Commit

Permalink
feat: use a debounceKey and call dispose() on debounced mutations
Browse files Browse the repository at this point in the history
+ fix/remove outdated @types dependencies
  • Loading branch information
matthieu-foucault committed Aug 21, 2020
1 parent f50dc6a commit 32fef24
Show file tree
Hide file tree
Showing 34 changed files with 92 additions and 63 deletions.
2 changes: 1 addition & 1 deletion app/components/PageRedirectHandler.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, {useState, useEffect} from 'react';
import {useRouter} from 'next/router';
import {fetchQuery, graphql} from 'relay-runtime';
import LoadingSpinner from 'components/LoadingSpinner';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {CiipPageComponent} from 'next-env';
import {getUserGroupLandingRoute} from 'lib/user-groups';
import {PageRedirectHandlerQuery} from '__generated__/PageRedirectHandlerQuery.graphql';
Expand Down
2 changes: 1 addition & 1 deletion app/containers/Organisations/Organisations.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
Card
} from 'react-bootstrap';
import {Organisations_query} from 'Organisations_query.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import LoadingSpinner from 'components/LoadingSpinner';
import Organisation from './Organisation';
import UserOrganisation from './UserOrganisation';
Expand Down
15 changes: 8 additions & 7 deletions app/lib/relay-environment/debounce-mutations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,32 @@ import {
RelayNetworkLayerRequest,
RelayNetworkLayerResponse
} from 'react-relay-network-modern/node8';
import {CacheConfigWithDebounce} from 'next-env';

const debouncedMutationNameTimeoutIds = new Map<string, number>();
const debouncedMutationsTimeoutIds = new Map<string, number>();

const debounceMutationMiddleware = (timeout = 1000): Middleware => {
return (next) => async (req) => {
if (!(req instanceof RelayNetworkLayerRequest) || !req.isMutation()) {
return next(req);
}

if (!req.cacheConfig?.debounce) {
const {debounceKey} = (req.cacheConfig as CacheConfigWithDebounce) || {};
if (!debounceKey) {
return next(req);
}

const debounced = async () => {
return new Promise<RelayNetworkLayerResponse>((resolve) => {
const {name} = req.operation;
const timerId = debouncedMutationNameTimeoutIds.get(name);
const timerId = debouncedMutationsTimeoutIds.get(debounceKey);
if (timerId) {
window.clearTimeout(timerId);
}

debouncedMutationNameTimeoutIds.set(
name,
debouncedMutationsTimeoutIds.set(
debounceKey,
window.setTimeout(() => {
debouncedMutationNameTimeoutIds.delete(name);
debouncedMutationsTimeoutIds.delete(debounceKey);
resolve(next(req));
}, timeout)
);
Expand Down
43 changes: 35 additions & 8 deletions app/mutations/BaseMutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,21 @@ import {
commitMutation as commitMutationDefault,
GraphQLTaggedNode
} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import {DeclarativeMutationConfig} from 'relay-runtime';
import {
DeclarativeMutationConfig,
Disposable,
MutationParameters
} from 'relay-runtime';
import {toast} from 'react-toastify';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {MutationConfigWithDebounce} from 'next-env';

interface BaseMutationType {
response: any;
interface BaseMutationType extends MutationParameters {
variables: {input: any; messages?: {success: string; failure: string}};
}

const debouncedMutationMap = new Map<string, Disposable>();

export default class BaseMutation<T extends BaseMutationType = never> {
counter: number;
mutationName: string;
Expand All @@ -27,7 +33,7 @@ export default class BaseMutation<T extends BaseMutationType = never> {
variables: T['variables'],
optimisticResponse?: any,
updater?: (...args: any[]) => any,
shouldDebounceMutation = false
debounceKey?: string
) {
const success_message = variables.messages?.success
? variables.messages.success
Expand All @@ -47,11 +53,25 @@ export default class BaseMutation<T extends BaseMutationType = never> {
}
) {
return new Promise<T['response']>((resolve, reject) => {
commitMutationDefault<T>(environment, {
// Debounced mutations should be commited immediately to perform the optimisticUpdate
// The actual request will be cancelled in the network layer
// Here we either dispose of a debounced mutation, or remove it from the map when it errors/completes
if (debounceKey) {
const previousMutation = debouncedMutationMap.get(debounceKey);
if (previousMutation) {
previousMutation.dispose();
}
}

const disposable = commitMutationDefault<T>(environment, {
...options,
configs,
cacheConfig: {debounce: shouldDebounceMutation},
cacheConfig: {debounceKey},
onError: (error) => {
if (debounceKey) {
debouncedMutationMap.delete(debounceKey);
}

reject(error);
if (failure_message) {
toast(failure_message, {
Expand All @@ -64,6 +84,10 @@ export default class BaseMutation<T extends BaseMutationType = never> {
}
},
onCompleted: (response, errors) => {
if (debounceKey) {
debouncedMutationMap.delete(debounceKey);
}

errors ? reject(errors) : resolve(response);
if (success_message) {
toast(success_message, {
Expand All @@ -73,7 +97,10 @@ export default class BaseMutation<T extends BaseMutationType = never> {
});
}
}
});
} as MutationConfigWithDebounce<T>);
if (debounceKey) {
debouncedMutationMap.set(debounceKey, disposable);
}
});
}

Expand Down
2 changes: 1 addition & 1 deletion app/mutations/application/createApplicationMutation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
createApplicationMutationVariables,
createApplicationMutation as createApplicationMutationType
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
createApplicationRevisionMutation as createApplicationRevisionMutationType,
createApplicationRevisionMutationVariables
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
createApplicationRevisionStatusMutationVariables,
createApplicationRevisionStatusMutation as createApplicationRevisionStatusMutationType
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
createFormResultStatusMutationVariables,
createFormResultStatusMutation as createFormResultStatusMutationType
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/application/createReviewCommentMutation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql, DeclarativeMutationConfig} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
createReviewCommentMutationVariables,
createReviewCommentMutation as createReviewCommentMutationType
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/application/deleteReviewCommentMutation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
updateReviewCommentMutationVariables,
updateReviewCommentMutation as updateReviewCommentMutationType
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/application/updateApplicationMutation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
updateApplicationMutationVariables,
updateApplicationMutation as updateApplicationMutationType
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
updateApplicationRevisionMutationVariables,
updateApplicationRevisionMutation as updateApplicationRevisionMutationType
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/application/updateReviewCommentMutation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
updateReviewCommentMutationVariables,
updateReviewCommentMutation as updateReviewCommentMutationType
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/benchmark/createBenchmarkMutation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
createBenchmarkMutation as createBenchmarkMutationType,
createBenchmarkMutationVariables
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/benchmark/updateBenchmarkMutation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
updateBenchmarkMutation as updateBenchmarkMutationType,
updateBenchmarkMutationVariables
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/facility/createFacilityMutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
createFacilityMutation as createFacilityMutationType,
createFacilityMutationVariables
} from 'createFacilityMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import BaseMutation from 'mutations/BaseMutation';

const mutation = graphql`
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/form/createCertificationUrl.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
createCertificationUrlMutation as createCertificationUrlMutationType,
createCertificationUrlMutationVariables
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/form/updateCertificationUrlMutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
updateCertificationUrlMutation as updateCertificationUrlMutationType,
updateCertificationUrlMutationVariables
} from 'updateCertificationUrlMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import BaseMutation from 'mutations/BaseMutation';

const mutation = graphql`
Expand Down
6 changes: 4 additions & 2 deletions app/mutations/form/updateFormResultMutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import {
updateFormResultMutation as updateFormResultMutationType,
updateFormResultMutationVariables
} from 'updateFormResultMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import BaseMutation from 'mutations/BaseMutation';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';

const mutation = graphql`
mutation updateFormResultMutation($input: UpdateFormResultInput!) {
Expand Down Expand Up @@ -37,7 +37,9 @@ const updateFormResultMutation = async (
environment,
mutation,
variables,
optimisticResponse
optimisticResponse,
null,
`update-form-result${variables.input.id}`
);
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
createLinkedProductMutation as createLinkedProductMutationType,
createLinkedProductMutationVariables
} from 'createLinkedProductMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import BaseMutation from 'mutations/BaseMutation';

const mutation = graphql`
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
updateLinkedProductMutation as updateLinkedProductMutationType,
updateLinkedProductMutationVariables
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/organisation/createOrganisationMutation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
createOrganisationMutation as createOrganisationMutationType,
createOrganisationMutationVariables
} from 'createOrganisationMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import BaseMutation from 'mutations/BaseMutation';

const mutation = graphql`
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/product/createProductMutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
createProductMutation as createProductMutationType,
createProductMutationVariables
} from 'createProductMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import BaseMutation from 'mutations/BaseMutation';

const mutation = graphql`
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/product/updateProductMutation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
updateProductMutation as updateProductMutationType,
updateProductMutationVariables
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
createReportingYearMutation as createReportingYearMutationType,
createReportingYearMutationVariables
} from 'createReportingYearMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import BaseMutation from 'mutations/BaseMutation';

const mutation = graphql`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
updateReportingYearMutation as updateReportingYearMutationType,
updateReportingYearMutationVariables
} from '__generated__/updateReportingYearMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import BaseMutation from 'mutations/BaseMutation';

const mutation = graphql`
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/user/createUserMutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
createUserMutation as createUserMutationType,
createUserMutationVariables
} from '__generated__/createUserMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import BaseMutation from 'mutations/BaseMutation';

const mutation = graphql`
Expand Down
6 changes: 3 additions & 3 deletions app/mutations/user/updateUserMutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import {graphql} from 'react-relay';
import {
updateUserMutation as updateUserMutationType,
updateUserMutationVariables
} from '__generated__/updateUserMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
} from 'updateUserMutation.graphql';
import BaseMutation from 'mutations/BaseMutation';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';

const mutationQuery = graphql`
mutation updateUserMutation($input: UpdateCiipUserInput!) {
Expand Down Expand Up @@ -45,7 +45,7 @@ const updateUserMutation = async (
variables,
updateUserPayload,
null,
true
`update-ciip-user${variables.input.id}`
);
};

Expand Down
2 changes: 1 addition & 1 deletion app/mutations/user_organisation/createUserOrganisation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
createUserOrganisationMutation as createUserOrganisationMutationType,
createUserOrganisationMutationVariables
} from 'createUserOrganisationMutation.graphql';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import BaseMutation from 'mutations/BaseMutation';

const mutation = graphql`
Expand Down
2 changes: 1 addition & 1 deletion app/mutations/user_organisation/updateUserOrganisation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {graphql} from 'react-relay';
import {RelayModernEnvironment} from 'relay-runtime/lib/store/RelayModernEnvironment';
import RelayModernEnvironment from 'relay-runtime/lib/store/RelayModernEnvironment';
import {
updateUserOrganisationMutation as updateUserOrganisationMutationType,
updateUserOrganisationMutationVariables
Expand Down
11 changes: 10 additions & 1 deletion app/next-env.d.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import {NextComponentType, NextPageContext} from 'next';
import {GraphQLTaggedNode} from 'relay-runtime';
import {GraphQLTaggedNode, MutationConfig} from 'relay-runtime';
import {NextRouter} from 'next/router';
import {ComponentClass} from 'react';
import {
FormProps as OriginalFromProps,
ErrorSchema
} from 'react-jsonschema-form';
import {CacheConfig} from 'react-relay-network-modern/node8';

interface CiipPageInitialProps {
pageProps: {
Expand Down Expand Up @@ -62,3 +63,11 @@ declare module 'react-jsonschema-form/lib/utils' {
declare module 'react-jsonschema-form/lib/validate' {
export function toErrorList(errorSchema: ErrorSchema): any[];
}

export interface CacheConfigWithDebounce extends CacheConfig {
debounceKey?: string;
}

export interface MutationConfigWithDebounce<T> extends MutationConfig<T> {
cacheConfig?: CacheConfigWithDebounce;
}
Loading

0 comments on commit 32fef24

Please sign in to comment.