fix: restore build and stabilize E2E cross-signal behavior

Revert the automated member-ordering pass that broke Angular field init
(TS2729) and disable that rule until a safe reorder strategy exists.
Fix modal/confirm dialog i18n defaults via template fallbacks, search all
active endpoints (including offline), register foreign rooms with actor
owner IDs, sync profile display names from avatar summaries, and guard
dm-chat when a private call converts to a group conversation.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-11 12:16:40 +02:00
parent 79c6f91cd6
commit 31962aeb1a
131 changed files with 2483 additions and 3896 deletions

View File

@@ -8,15 +8,14 @@ import { MobileSqliteConnectionService } from '../../services/mobile-sqlite-conn
* Domain persistence routes through {@link CapacitorDatabaseService} on Capacitor shells.
*/
export class CapacitorMobilePersistenceAdapter implements MobilePersistenceAdapter {
private initialized = false;
constructor(private readonly connection: MobileSqliteConnectionService) {}
get isNativeSqlite(): boolean {
return this.connection.isAvailable;
}
private initialized = false;
constructor(private readonly connection: MobileSqliteConnectionService) {}
async initialize(): Promise<void> {
if (this.initialized) {
return;
@@ -33,5 +32,4 @@ export class CapacitorMobilePersistenceAdapter implements MobilePersistenceAdapt
this.initialized = true;
console.info('[mobile] native SQLite persistence initialized');
}
}

View File

@@ -22,22 +22,17 @@ const DEFAULT_POLL_INTERVAL_MS = 30 * 60_000;
export class MobileAppUpdateService {
readonly state = signal<MobileUpdateState>(createInitialMobileUpdateState());
private readonly appI18n = inject(AppI18nService);
private readonly mobilePlatform = inject(MobilePlatformService);
private adapter: MobileAppUpdateAdapter = new WebMobileAppUpdateAdapter();
private adapterReady: Promise<MobileAppUpdateAdapter> | null = null;
private initialized = false;
private pollTimerId: number | null = null;
get isCapacitor(): boolean {
return this.mobilePlatform.isCapacitor();
}
private readonly appI18n = inject(AppI18nService);
private readonly mobilePlatform = inject(MobilePlatformService);
private adapter: MobileAppUpdateAdapter = new WebMobileAppUpdateAdapter();
private adapterReady: Promise<MobileAppUpdateAdapter> | null = null;
private initialized = false;
private pollTimerId: number | null = null;
async initialize(): Promise<void> {
if (this.initialized) {
return;
@@ -175,5 +170,4 @@ export class MobileAppUpdateService {
void this.checkForUpdates();
}, DEFAULT_POLL_INTERVAL_MS);
}
}

View File

@@ -9,19 +9,15 @@ import { MobileSqliteConnectionService } from './mobile-sqlite-connection.servic
/** Facade for native SQLite persistence on mobile shells. */
@Injectable({ providedIn: 'root' })
export class MobilePersistenceService {
private readonly mobilePlatform = inject(MobilePlatformService);
private readonly sqliteConnection = inject(MobileSqliteConnectionService);
private adapter: MobilePersistenceAdapter = new WebMobilePersistenceAdapter();
private adapterReady: Promise<MobilePersistenceAdapter> | null = null;
get isNativeSqlite(): boolean {
return this.adapter.isNativeSqlite;
}
private readonly mobilePlatform = inject(MobilePlatformService);
private readonly sqliteConnection = inject(MobileSqliteConnectionService);
private adapter: MobilePersistenceAdapter = new WebMobilePersistenceAdapter();
private adapterReady: Promise<MobilePersistenceAdapter> | null = null;
initialize(): Promise<void> {
return this.ensureAdapter().then((adapter) => adapter.initialize());
}
@@ -44,5 +40,4 @@ export class MobilePersistenceService {
return this.adapterReady;
}
}

View File

@@ -7,19 +7,15 @@ import { getStoredCurrentUserId } from '../../../core/storage/current-user-stora
/** Shared native SQLite connection used by mobile persistence and DatabaseService. */
@Injectable({ providedIn: 'root' })
export class MobileSqliteConnectionService {
private store: MobileSqliteStore | null = null;
private activeDatabaseName: string | null = null;
private initializationPromise: Promise<MobileSqliteStore | null> | null = null;
private initializationFailed = false;
get isAvailable(): boolean {
return this.store?.isAvailable === true;
}
private store: MobileSqliteStore | null = null;
private activeDatabaseName: string | null = null;
private initializationPromise: Promise<MobileSqliteStore | null> | null = null;
private initializationFailed = false;
async initialize(): Promise<MobileSqliteStore | null> {
if (this.initializationFailed) {
return null;
@@ -70,5 +66,4 @@ export class MobileSqliteConnectionService {
return this.store;
}
}