diff --git a/packages/frontend/editor-ui/src/components/ResourceLocator/ResourceLocator.vue b/packages/frontend/editor-ui/src/components/ResourceLocator/ResourceLocator.vue index 84cfd09473..3e2a8267f7 100644 --- a/packages/frontend/editor-ui/src/components/ResourceLocator/ResourceLocator.vue +++ b/packages/frontend/editor-ui/src/components/ResourceLocator/ResourceLocator.vue @@ -656,9 +656,13 @@ function loadResourcesDebounced() { } function setResponse(paramsKey: string, response: Partial) { + // Force reactivity by creating a completely new cached responses object + const existingResponse = cachedResponses.value[paramsKey] || {}; + const newResponse = { ...existingResponse, ...response }; + cachedResponses.value = { ...cachedResponses.value, - [paramsKey]: { ...cachedResponses.value[paramsKey], ...response }, + [paramsKey]: newResponse, }; } @@ -729,19 +733,28 @@ async function loadResources() { const response = await nodeTypesStore.getResourceLocatorResults(requestParams); - setResponse(paramsKey, { + const responseData = { results: (cachedResponse?.results ?? []).concat(response.results), nextPageToken: response.paginationToken ?? null, loading: false, error: false, - }); + }; + + // Store response under the original key to prevent cache pollution + setResponse(paramsKey, responseData); + + // If the key changed during the request, also store under current key to prevent infinite loading + const currentKey = currentRequestKey.value; + if (currentKey !== paramsKey) { + setResponse(currentKey, responseData); + } if (params.filter && !hasCompletedASearch.value) { hasCompletedASearch.value = true; trackEvent('User searched resource locator list'); } } catch (e) { - setResponse(paramsKey, { + const errorData = { loading: false, error: true, errorDetails: { @@ -750,7 +763,16 @@ async function loadResources() { httpCode: e.httpCode, stackTrace: e.stacktrace, }, - }); + }; + + // Store error under the original key + setResponse(paramsKey, errorData); + + // If the key changed during the request, also store under current key to prevent infinite loading + const currentKey = currentRequestKey.value; + if (currentKey !== paramsKey) { + setResponse(currentKey, errorData); + } } }