fix(presence): your own status shows at once (and clears) in the member list
CI / Build & Quality Checks (push) Skipped
CI / Secret scan (gitleaks) (push) Skipped
CI / Playwright smoke (e2e) (push) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 48s
CI / Build & Quality Checks (pull_request) Successful in 3m31s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Playwright smoke (e2e) (pull_request) Successful in 17m34s

Reported: after changing your status it did not appear in the members
drawer until you switched rooms.

The SDK creates our own User object with `new User()` instead of
User.createUser, so its User.* events are never re-emitted on the client.
The shared presence store (PERF-1) listens on the client, so it never heard
our own presence changes; a remount (room switch) re-read the User and
showed it. The store now also refreshes on the ClientEvent.Event the SDK
emits for every sync presence event (after updating the User).

Also read the status from the latest presence event: the SDK only
overwrites presenceStatusMsg with a non-empty status_msg, so a cleared
status lingered (for everyone) until reload.

e2e: set a quick status, close settings, it shows in the drawer; clear it,
it goes. Fails without the fix (status never appears).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
This commit is contained in:
Lotus CI
2026-10-28 06:28:36 -04:00
co-authored by Claude Opus 5.5
parent 29ece6a0c8
commit c247024bcd
2 changed files with 60 additions and 2 deletions
+31
View File
@@ -473,6 +473,37 @@ test.describe('local homeserver regression', () => {
await expect(page.getByText(/Status set\. Sharing it with others/)).toHaveCount(0);
});
test('own status shows in the members drawer without switching rooms, and clears', async ({
page,
}) => {
// The SDK creates our own User with `new User()` (no event re-emit), so the
// shared presence store missed our own presence until a remount. Reported:
// a new status only appeared after switching rooms.
await page.setViewportSize({ width: 1440, height: 900 });
const me = await ensureUser(uniq('own'));
const room = await createRoom(me, 'Own Status Room');
await sendText(me, room, 'hello');
await loginUI(page, me);
await openRoom(page, room);
await page.getByRole('button', { name: 'User Settings' }).click();
await page.getByRole('dialog').first().getByText('Account', { exact: true }).first().click();
await page
.getByRole('group', { name: 'Quick statuses' })
.getByRole('button', { name: /Gaming/ })
.click();
await page.keyboard.press('Escape');
await expect(page.getByText('🎮 Gaming')).toBeVisible({ timeout: 15_000 });
await page.getByRole('button', { name: 'User Settings' }).click();
await page.getByRole('dialog').first().getByText('Account', { exact: true }).first().click();
await page
.getByRole('button', { name: /^Clear/ })
.first()
.click();
await page.keyboard.press('Escape');
await expect(page.getByText('🎮 Gaming')).toHaveCount(0, { timeout: 15_000 });
});
test('touch: long-press opens the message action sheet (#166)', async ({ browser }) => {
const ctx = await browser.newContext({ ...devices['Pixel 7'] });
const page = await ctx.newPage();