fix(ui): preserve VS Code themes during settings broadcasts

This commit is contained in:
Bohdan Triapitsyn
2026-09-03 12:41:59 +03:00
141 changed files with 3435 additions and 286 deletions
@@ -295,12 +295,12 @@ describe('settings sync resolution', () => {
const serverTheme = { useSystemTheme: false as const, themeVariant: 'dark' as const, lightThemeId: 'server-light', darkThemeId: 'server-dark' };
test('a non-bootstrap sync (settings save echo) never changes preferences', () => {
expect(resolveThemePreferencesFromSettingsSync({ bootstrap: false, settings: serverTheme }, current)).toBeNull();
expect(resolveThemePreferencesFromSettingsSync({ adoptTheme: false, settings: serverTheme }, current)).toBeNull();
expect(resolveThemePreferencesFromSettingsSync(null, current)).toBeNull();
});
test('a bootstrap sync adopts the server theme', () => {
expect(resolveThemePreferencesFromSettingsSync({ bootstrap: true, settings: serverTheme }, current)).toEqual({
expect(resolveThemePreferencesFromSettingsSync({ adoptTheme: true, settings: serverTheme }, current)).toEqual({
themeMode: 'dark',
lightThemeId: 'server-light',
darkThemeId: 'server-dark',
@@ -308,19 +308,19 @@ describe('settings sync resolution', () => {
});
test('theme fields omitted by the server keep the current preferences (not-set is not reset-to-defaults)', () => {
expect(resolveThemePreferencesFromSettingsSync({ bootstrap: true, settings: {} }, current)).toBeNull();
expect(resolveThemePreferencesFromSettingsSync({ adoptTheme: true, settings: {} }, current)).toBeNull();
expect(
resolveThemePreferencesFromSettingsSync({ bootstrap: true, settings: { useSystemTheme: true } }, current),
resolveThemePreferencesFromSettingsSync({ adoptTheme: true, settings: { useSystemTheme: true } }, current),
).toBeNull();
expect(
resolveThemePreferencesFromSettingsSync({ bootstrap: true, settings: { lightThemeId: 'server-light' } }, current),
resolveThemePreferencesFromSettingsSync({ adoptTheme: true, settings: { lightThemeId: 'server-light' } }, current),
).toEqual({ themeMode: 'system', lightThemeId: 'server-light', darkThemeId: 'dark-theme' });
});
test('a bootstrap sync carrying the current preferences resolves to no change', () => {
expect(
resolveThemePreferencesFromSettingsSync(
{ bootstrap: true, settings: { useSystemTheme: true, lightThemeId: 'light-theme', darkThemeId: 'dark-theme' } },
{ adoptTheme: true, settings: { useSystemTheme: true, lightThemeId: 'light-theme', darkThemeId: 'dark-theme' } },
current,
),
).toBeNull();
+2 -2
View File
@@ -201,10 +201,10 @@ type SettingsSyncThemePayload = Pick<
* theme lookup downstream and falls back cosmetically.
*/
export const resolveThemePreferencesFromSettingsSync = (
detail: { bootstrap: boolean; settings: SettingsSyncThemePayload } | null,
detail: { adoptTheme: boolean; settings: SettingsSyncThemePayload } | null,
current: StoredThemePreferences,
): StoredThemePreferences | null => {
if (!detail?.bootstrap) {
if (!detail?.adoptTheme) {
return null;
}