Skip to content
Snippets Groups Projects
Commit 86b4cebf authored by Guilherme Gazzo's avatar Guilherme Gazzo
Browse files

fix: Re-login same browser tab issues (#32479)

parent 5f013d8d
No related branches found
No related tags found
No related merge requests found
---
"@rocket.chat/meteor": patch
---
Executing a logout and login action in the same "tab/instance", some streams were not being recreated, causing countless types of bugs.
PS: as a workaround reloading after logout or login in also solves the problem.
......@@ -356,12 +356,6 @@ export class CachedCollection<T extends { _id: string }, U = T> extends Emitter<
this.trySync();
});
if (!this.userRelated) {
return this.setupListener();
}
CachedCollectionManager.onLogin(async () => {
await this.setupListener();
});
return this.setupListener();
}
}
......@@ -51,6 +51,7 @@ type EventMap<N extends StreamNames = StreamNames, K extends StreamKeys<N> = Str
type StreamMapValue = {
stop: () => void;
error: (cb: (...args: any[]) => void) => void;
onChange: ReturnType<ClientStream['subscribe']>['onChange'];
ready: () => Promise<void>;
isReady: boolean;
......@@ -62,6 +63,7 @@ const createNewMeteorStream = (streamName: StreamNames, key: StreamKeys<StreamNa
const meta = {
ready: false,
};
const sub = Meteor.connection.subscribe(
`stream-${streamName}`,
key,
......@@ -72,8 +74,8 @@ const createNewMeteorStream = (streamName: StreamNames, key: StreamKeys<StreamNa
ee.emit('ready', [undefined, args]);
},
onError: (err: any) => {
console.error(err);
ee.emit('ready', [err]);
ee.emit('error', err);
},
},
);
......@@ -115,6 +117,11 @@ const createNewMeteorStream = (streamName: StreamNames, key: StreamKeys<StreamNa
stop: sub.stop,
onChange,
ready,
error: (cb: (...args: any[]) => void) =>
ee.once('error', (error) => {
cb(error);
}),
get isReady() {
return meta.ready;
},
......@@ -179,6 +186,7 @@ const createStreamManager = () => {
if (!streams.has(eventLiteral)) {
streams.set(eventLiteral, stream);
}
stream.error(() => stop());
return {
id: '',
......
......@@ -12,6 +12,7 @@ import { sdk } from '../../../app/utils/client/lib/SDKClient';
import { afterLogoutCleanUpCallback } from '../../../lib/callbacks/afterLogoutCleanUpCallback';
import { useReactiveValue } from '../../hooks/useReactiveValue';
import { createReactiveSubscriptionFactory } from '../../lib/createReactiveSubscriptionFactory';
import { queryClient } from '../../lib/queryClient';
import { useCreateFontStyleElement } from '../../views/account/accessibility/hooks/useCreateFontStyleElement';
import { useClearRemovedRoomsHistory } from './hooks/useClearRemovedRoomsHistory';
import { useDeleteUser } from './hooks/useDeleteUser';
......@@ -92,6 +93,12 @@ const UserProvider = ({ children }: UserProviderProps): ReactElement => {
}
}, [preferedLanguage, setPreferedLanguage, setUserLanguage, user?.language, userLanguage, userId, setUserPreferences]);
useEffect(() => {
if (!userId) {
queryClient.clear();
}
}, [userId]);
return <UserContext.Provider children={children} value={contextValue} />;
};
......
import { Page } from '@playwright/test';
import { DEFAULT_USER_CREDENTIALS } from '../config/constants';
import injectInitialData from '../fixtures/inject-initial-data';
import { Users } from '../fixtures/userStates';
import { HomeOmnichannel } from '../page-objects';
import { createAgent, makeAgentAvailable } from '../utils/omnichannel/agents';
import { createConversation } from '../utils/omnichannel/rooms';
import { test, expect } from '../utils/test';
test.use({ storageState: Users.user1.state });
test.describe('OC - Manual Selection', () => {
let poOmnichannel: HomeOmnichannel;
let agent: Awaited<ReturnType<typeof createAgent>>;
// Change routing method to manual selection
test.beforeAll(async ({ api }) => {
const res = await api.post('/settings/Livechat_Routing_Method', { value: 'Manual_Selection' });
expect(res.status()).toBe(200);
});
// Create agent and make it available
test.beforeAll(async ({ api }) => {
agent = await createAgent(api, 'user1');
await makeAgentAvailable(api, agent.data._id);
});
// Create page object and redirect to home
test.beforeEach(async ({ page }: { page: Page }) => {
poOmnichannel = new HomeOmnichannel(page);
await page.goto('/home');
await poOmnichannel.sidenav.logout();
await poOmnichannel.page.locator('role=textbox[name=/username/i]').waitFor({ state: 'visible' });
await poOmnichannel.page.locator('role=textbox[name=/username/i]').fill('user1');
await poOmnichannel.page.locator('[name=password]').fill(DEFAULT_USER_CREDENTIALS.password);
await poOmnichannel.page.locator('role=button[name="Login"]').click();
await poOmnichannel.page.locator('.main-content').waitFor();
});
// Delete all data
test.afterAll(async ({ api }) => {
await agent.delete()
await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' });
await injectInitialData();
});
test('OC - Manual Selection - Logout & Login', async ({ api }) => {
expect(await poOmnichannel.page.locator('#omnichannel-status-toggle').getAttribute('title')).toEqual('Turn off answer chats');
const { data: { room } } = await createConversation(api);
await test.step('expect login and see the chat in queue after login', async () => {
await poOmnichannel.sidenav.getSidebarItemByName(room.fname).click();
await expect(poOmnichannel.content.inputMessage).not.toBeVisible();
});
await test.step('expect take chat to be visible and return to queue not visible', async () => {
await expect(poOmnichannel.content.btnTakeChat).toBeVisible();
await expect(poOmnichannel.content.btnReturnToQueue).not.toBeVisible();
});
await test.step('expect to be able take chat', async () => {
await poOmnichannel.content.btnTakeChat.click();
await expect(poOmnichannel.content.lastSystemMessageBody).toHaveText('joined the channel');
await expect(poOmnichannel.content.inputMessage).toBeVisible();
await expect(poOmnichannel.content.btnTakeChat).not.toBeVisible();
await expect(poOmnichannel.content.btnReturnToQueue).toBeVisible();
await expect(poOmnichannel.sidenav.getSidebarItemByName(room.fname)).toBeVisible();
});
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment