diff --git a/.changeset/lucky-countries-look.md b/.changeset/lucky-countries-look.md new file mode 100644 index 000000000000..79deda53edfc --- /dev/null +++ b/.changeset/lucky-countries-look.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed the disappearance of some settings after navigation under network latency. diff --git a/apps/meteor/client/lib/settings/PrivateSettingsCachedCollection.ts b/apps/meteor/client/lib/settings/PrivateSettingsCachedCollection.ts index b0276e753922..6f4e1c95a5fa 100644 --- a/apps/meteor/client/lib/settings/PrivateSettingsCachedCollection.ts +++ b/apps/meteor/client/lib/settings/PrivateSettingsCachedCollection.ts @@ -14,7 +14,7 @@ class PrivateSettingsCachedCollection extends CachedCollection { async setupListener(): Promise { sdk.stream('notify-logged', [this.eventName as 'private-settings-changed'], async (t: string, { _id, ...record }: { _id: string }) => { this.log('record received', t, { _id, ...record }); - this.collection.upsert({ _id }, record); + this.collection.update({ _id }, { $set: record }, { upsert: true }); this.sync(); }); } diff --git a/apps/meteor/tests/e2e/settings-persistence-on-ui-navigation.spec.ts b/apps/meteor/tests/e2e/settings-persistence-on-ui-navigation.spec.ts new file mode 100644 index 000000000000..f2610d54cd98 --- /dev/null +++ b/apps/meteor/tests/e2e/settings-persistence-on-ui-navigation.spec.ts @@ -0,0 +1,42 @@ +import { Users } from './fixtures/userStates'; +import { setSettingValueById } from './utils'; +import { test, expect } from './utils/test'; + +test.use({ storageState: Users.admin.state }); + +test.describe.serial('settings-persistence-on-ui-navigation', () => { + test.beforeAll(({ api }) => setSettingValueById(api, 'Hide_System_Messages', [])); + + test.beforeEach(async ({ page }) => { + await page.goto('/admin/settings/Message'); + + // Intercept the API call and delay its response + await page.route('/api/v1/method.call/saveSettings', async (route) => { + const response = await route.fetch(); + await new Promise((resolve) => setTimeout(resolve, 2000)); // Delay the response by 2 seconds + return route.fulfill({ + response, + status: response.status(), + headers: response.headers(), + body: await response.body(), + }); + }); + }); + + test.afterAll(({ api }) => setSettingValueById(api, 'Hide_System_Messages', [])); + + test('expect settings to persist in ui when navigating back and forth', async ({ page }) => { + const settingInput = await page.locator('[data-qa-setting-id="Hide_System_Messages"] input'); + await settingInput.pressSequentially('User joined'); + await settingInput.press('Enter'); + + await page.locator('button:has-text("Save changes")').click(); + await page.locator('button[title="Back"]').click(); + + await page.waitForResponse((response) => response.url().includes('/api/v1/method.call/saveSettings') && response.status() === 200); + + await page.locator('a[href="/admin/settings/Message"] >> text=Open').click(); + + await expect(page.locator('label[for="Hide_System_Messages"][title="Hide_System_Messages"]')).toBeVisible(); + }); +});