fix: Bug - Add logout in mobile version of settings, allow clearing data on android
All checks were successful
Queue Release Build / prepare (push) Successful in 19s
Deploy Web Apps / deploy (push) Successful in 7m55s
Queue Release Build / build-windows (push) Successful in 28m37s
Queue Release Build / build-linux (push) Successful in 47m3s
Queue Release Build / build-android (push) Successful in 20m33s
Queue Release Build / finalize (push) Successful in 3m48s

Expose settings logout on mobile where the title bar is hidden, and enable
Capacitor data settings with storage visibility and local erase/sign-out.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-11 22:31:40 +02:00
parent cb59af6b6c
commit 07e91a0d09
20 changed files with 553 additions and 39 deletions

View File

@@ -0,0 +1,76 @@
import { expect, type Page } from '@playwright/test';
const MOBILE_VIEWPORT = { width: 390, height: 844 };
export async function openSettingsModal(page: Page, settingsPage = 'general'): Promise<void> {
await page.evaluate((targetPage) => {
interface SettingsModalServiceHandle {
open: (page: string) => void;
}
interface SettingsModalComponentHandle {
mobilePage?: { set: (page: 'menu' | 'detail') => void };
animating?: { set: (value: boolean) => void };
navigate?: (page: string) => void;
}
interface AppComponentHandle {
settingsModal?: SettingsModalServiceHandle;
}
interface AngularDebugApi {
getComponent: (element: Element) => AppComponentHandle & SettingsModalComponentHandle;
applyChanges?: (component: unknown) => void;
}
const debugApi = (window as Window & { ng?: AngularDebugApi }).ng;
const appRoot = document.querySelector('app-root');
const settingsHost = document.querySelector('app-settings-modal');
const appComponent = appRoot && debugApi?.getComponent(appRoot);
const settingsComponent = settingsHost && debugApi?.getComponent(settingsHost);
if (!appComponent?.settingsModal?.open) {
throw new Error('Angular debug API could not open settings modal');
}
appComponent.settingsModal.open(targetPage);
settingsComponent?.mobilePage?.set('menu');
settingsComponent?.animating?.set(true);
debugApi?.applyChanges?.(appComponent);
debugApi?.applyChanges?.(settingsComponent);
}, settingsPage);
await expect(page.getByRole('heading', { name: 'Settings', exact: true })).toBeVisible({ timeout: 10_000 });
await expect(page.getByTestId('settings-logout-button')).toBeVisible({ timeout: 10_000 });
}
export async function openSettingsDetailPage(page: Page, settingsPage: string): Promise<void> {
await openSettingsModal(page, settingsPage);
await page.evaluate((targetPage) => {
interface SettingsModalComponentHandle {
navigate?: (page: string) => void;
animating?: { set: (value: boolean) => void };
}
interface AngularDebugApi {
getComponent: (element: Element) => SettingsModalComponentHandle;
applyChanges?: (component: SettingsModalComponentHandle) => void;
}
const host = document.querySelector('app-settings-modal');
const debugApi = (window as Window & { ng?: AngularDebugApi }).ng;
const component = host && debugApi?.getComponent(host);
if (!component?.navigate) {
throw new Error('Angular debug API could not navigate settings modal');
}
component.navigate(targetPage);
component.animating?.set(true);
debugApi?.applyChanges?.(component);
}, settingsPage);
}
export async function openSettingsDataPage(page: Page): Promise<void> {
await openSettingsDetailPage(page, 'data');
await expect(page.locator('app-data-settings')).toBeVisible({ timeout: 10_000 });
}
export { MOBILE_VIEWPORT };

View File

@@ -0,0 +1,25 @@
import { expect, test } from '../../fixtures/multi-client';
import { expectDashboardReady } from '../../helpers/dashboard';
import { MOBILE_VIEWPORT, openSettingsModal } from '../../helpers/settings-modal';
import { RegisterPage } from '../../pages/register.page';
test.describe('Mobile settings logout', () => {
test('exposes logout in the settings menu on mobile viewports', async ({ createClient }) => {
const { page } = await createClient();
const suffix = `mobile_logout_${Date.now()}`;
await page.setViewportSize(MOBILE_VIEWPORT);
const register = new RegisterPage(page);
await register.goto();
await register.register(`user_${suffix}`, 'Mobile Logout User', 'TestPass123!');
await expectDashboardReady(page);
await openSettingsModal(page);
await page.getByTestId('settings-logout-button').click();
await expect(page).toHaveURL(/\/login/, { timeout: 15_000 });
await expect(page.locator('#login-username')).toBeVisible({ timeout: 10_000 });
});
});