Feature/extensions always use fetch mutation to get list (#440)

* Reset the cache after importing a backup

* Add option to delete cached data after ttl is reached

* Always use mutation to get extensions list
This commit is contained in:
schroda
2023-11-04 22:40:38 +01:00
committed by GitHub
parent 2c35808ee4
commit 7cb062d453
3 changed files with 35 additions and 11 deletions

View File

@@ -32,8 +32,19 @@ export class CustomCache {
return this.keyToFetchTimestampMap.get(key); return this.keyToFetchTimestampMap.get(key);
} }
public getResponseFor<Response = any>(endpoint: string, data: unknown): Response | undefined { public getResponseFor<Response = any>(endpoint: string, data: unknown, ttl?: number): Response | undefined {
const key = this.getKeyFor(endpoint, data); const key = this.getKeyFor(endpoint, data);
const isTtlReached = ttl && Date.now() - (this.getFetchTimestampFor(endpoint, data) ?? 0) >= ttl;
if (isTtlReached) {
this.keyToResponseMap.delete(key);
}
return this.keyToResponseMap.get(key) as Response; return this.keyToResponseMap.get(key) as Response;
} }
public clear(): void {
this.keyToResponseMap.clear();
this.keyToFetchTimestampMap.clear();
}
} }

View File

@@ -834,12 +834,29 @@ export class RequestManager {
public useExtensionListFetch( public useExtensionListFetch(
options?: MutationHookOptions<GetExtensionsFetchMutation, GetExtensionsFetchMutationVariables>, options?: MutationHookOptions<GetExtensionsFetchMutation, GetExtensionsFetchMutationVariables>,
): AbortableApolloUseMutationResponse<GetExtensionsFetchMutation, GetExtensionsFetchMutationVariables> { ): AbortableApolloUseMutationResponse<GetExtensionsFetchMutation, GetExtensionsFetchMutationVariables> {
return this.doRequest( const cacheKey = 'useExtensionListFetch';
const [mutate, result] = this.doRequest(
GQLMethod.USE_MUTATION, GQLMethod.USE_MUTATION,
GET_EXTENSIONS_FETCH, GET_EXTENSIONS_FETCH,
{}, {},
{ refetchQueries: [GET_EXTENSIONS], ...options }, { refetchQueries: [GET_EXTENSIONS], ...options },
); );
if (result.data?.fetchExtensions.extensions) {
this.cache.cacheResponse(cacheKey, undefined, result);
}
const cachedResult = this.cache.getResponseFor(cacheKey, undefined, 1000 * 60);
const wrappedMutate = (mutateOptions: Parameters<typeof mutate>[0]) => {
if (cachedResult) {
return cachedResult;
}
return mutate(mutateOptions);
};
return [wrappedMutate, cachedResult ?? result];
} }
public installExternalExtension( public installExternalExtension(
@@ -1583,6 +1600,7 @@ export class RequestManager {
result.response.then(() => { result.response.then(() => {
this.graphQLClient.client.cache.reset(); this.graphQLClient.client.cache.reset();
this.cache.clear();
}); });
return result; return result;

View File

@@ -100,16 +100,11 @@ export function Extensions() {
const isMobile = useMediaQuery(theme.breakpoints.down('sm')); const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
const [query] = useQueryParam('query', StringParam); const [query] = useQueryParam('query', StringParam);
const [extensionsTimestamp, setExtensionsTimestamp] = useLocalStorage('extensionsTimestamp', 0); const [fetchExtensions, { data, loading: isLoading, called }] = requestManager.useExtensionListFetch();
const [fetchExtensions, { loading: isFetching }] = requestManager.useExtensionListFetch(); const allExtensions = data?.fetchExtensions.extensions;
const { data, loading: isLoading } = requestManager.useGetExtensionList();
const allExtensions = data?.extensions.nodes;
useEffect(() => { useEffect(() => {
const updateExtensionsList = Date.now() - extensionsTimestamp >= 1000 * 60; // update list in case it's older than 1 minute fetchExtensions();
if (updateExtensionsList) {
fetchExtensions().catch(() => setExtensionsTimestamp(Date.now()));
}
}, []); }, []);
const filteredExtensions = useMemo( const filteredExtensions = useMemo(
@@ -187,7 +182,7 @@ export function Extensions() {
}; };
}, []); }, []);
if (isLoading || isFetching) { if (!allExtensions && (isLoading || !called)) {
return <LoadingPlaceholder />; return <LoadingPlaceholder />;
} }