diff --git a/package-lock.json b/package-lock.json index 8b2a53b1d..27168d2ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42503,7 +42503,7 @@ }, "packages/components": { "name": "@redhat-cloud-services/frontend-components", - "version": "4.2.3", + "version": "4.2.4", "license": "Apache-2.0", "dependencies": { "@patternfly/react-component-groups": "^5.0.0", @@ -43745,7 +43745,7 @@ }, "packages/utils": { "name": "@redhat-cloud-services/frontend-components-utilities", - "version": "4.0.5", + "version": "4.0.6", "license": "Apache-2.0", "dependencies": { "@redhat-cloud-services/rbac-client": "^1.0.100", diff --git a/packages/chrome/src/ChromeProvider/ChromeProvider.test.tsx b/packages/chrome/src/ChromeProvider/ChromeProvider.test.tsx index 26b738d14..4f9c7ebbf 100644 --- a/packages/chrome/src/ChromeProvider/ChromeProvider.test.tsx +++ b/packages/chrome/src/ChromeProvider/ChromeProvider.test.tsx @@ -86,7 +86,7 @@ describe('ChromeProvider', () => { }); }, 10000); - test('should not update state on mount if received error response', async () => { + test('should update state on mount with fallback data if received error response', async () => { const errorResponse = { errors: [{ status: 404, meta: { response_by: 'gateway' }, detail: 'Undefined Insights application' }] }; getSpy.mockRejectedValue(errorResponse); postSpy.mockRejectedValue(errorResponse); @@ -118,7 +118,8 @@ describe('ChromeProvider', () => { // There is some race condition that mismatches local runs vs travis runs. // We're going to handle the base case and use Cypress to test the component. expect(consoleSpy).toHaveBeenCalled(); - expect(getSpy).toHaveBeenCalledTimes(1); + expect(getSpy).toHaveBeenCalledTimes(2); + expect(getSpy).toHaveBeenCalledWith('/api/chrome-service/v1/last-visited'); expect(getSpy).toHaveBeenCalledWith('/api/chrome-service/v1/user'); }); }); diff --git a/packages/chrome/src/ChromeProvider/ChromeProvider.tsx b/packages/chrome/src/ChromeProvider/ChromeProvider.tsx index 4274ff9fc..2150f59a4 100644 --- a/packages/chrome/src/ChromeProvider/ChromeProvider.tsx +++ b/packages/chrome/src/ChromeProvider/ChromeProvider.tsx @@ -78,35 +78,28 @@ const useLastVisitedLocalStorage = (providerState: ReturnType { - const getInitialPages = async () => { - try { - if (!lastVisitedLocal) { - const firstPages: LastVisitedPage[] = await get(LAST_VISITED_URL); - if (firstPages) { - providerState.setLastVisited(firstPages); - try { - localStorage.setItem(LAST_VISITED_FLAG, JSON.stringify(firstPages)); - } catch (error) { - console.error('Unable to load initial last visited pages!', error); - } - } - } else { - const lastVisited: LastVisitedPage[] = JSON.parse(localStorage.getItem(LAST_VISITED_FLAG) ?? '[]'); - if (!Array.isArray(lastVisited)) { - localStorage.setItem(LAST_VISITED_FLAG, JSON.stringify([])); - providerState.setLastVisited([]); - } else { - providerState.setLastVisited(lastVisited); - } - } - } catch (error: any) { - console.error('Unable to parse last visited pages from localStorage!', error); - providerState.setLastVisited([]); - localStorage.setItem(LAST_VISITED_FLAG, JSON.stringify([])); + const getInitialPages = async () => { + let localVisited: LastVisitedPage[] = []; + try { + localVisited = JSON.parse(localStorage.getItem(LAST_VISITED_FLAG) ?? '[]'); + if (!Array.isArray(localVisited)) { + localVisited = []; } - }; + } catch (error) { + console.error('Unable to parse last visited pages from localStorage!', error); + localVisited = []; + } + try { + const firstPages: LastVisitedPage[] = [...((await get(LAST_VISITED_URL)) ?? []), ...localVisited].slice(0, 10); + providerState.setLastVisited(firstPages); + localStorage.setItem(LAST_VISITED_FLAG, JSON.stringify(firstPages)); + } catch (error: any) { + console.error('Unable to load initial last visited pages!', error); + providerState.setLastVisited(localVisited); + localStorage.setItem(LAST_VISITED_FLAG, JSON.stringify(localVisited)); + } + }; + useEffect(() => { getInitialPages(); }, []); diff --git a/packages/chrome/src/ChromeProvider/chromeState.ts b/packages/chrome/src/ChromeProvider/chromeState.ts index 1aaa9e855..ad888f292 100644 --- a/packages/chrome/src/ChromeProvider/chromeState.ts +++ b/packages/chrome/src/ChromeProvider/chromeState.ts @@ -97,8 +97,8 @@ const chromeState = () => { } // initializes state with new identity and should trigger all updates - function setIdentity(userIdentity: UserIdentity) { - state = { ...userIdentity, initialized: true }; + function setIdentity({ lastVisitedPages, ...userIdentity }: UserIdentity) { + state = { ...state, ...userIdentity, initialized: true }; Object.values(subscriptions) .flat() .forEach((event) => {