mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 17:23:37 +00:00
[PM-5539] Migrate ThemingService (#8219)
* Update ThemingService * Finish ThemingService * Lint * More Tests & Docs * Refactor to ThemeStateService * Rename File * Fix Import * Remove `type` added to imports * Update InitServices * Fix Test * Remove Unreferenced Code * Remove Unneeded Null Check * Add Ticket Link * Add Back THEMING_DISK * Fix Desktop * Create SYSTEM_THEME_OBSERVABLE * Fix Browser Injection * Update Desktop Manual Access * Fix Default Theme * Update Test
This commit is contained in:
@@ -3,7 +3,6 @@ import { FormBuilder } from "@angular/forms";
|
||||
import { BehaviorSubject, firstValueFrom, Observable, Subject } from "rxjs";
|
||||
import { concatMap, debounceTime, filter, map, switchMap, takeUntil, tap } from "rxjs/operators";
|
||||
|
||||
import { AbstractThemingService } from "@bitwarden/angular/platform/services/theming/theming.service.abstraction";
|
||||
import { ModalService } from "@bitwarden/angular/services/modal.service";
|
||||
import { SettingsService } from "@bitwarden/common/abstractions/settings.service";
|
||||
import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service";
|
||||
@@ -21,6 +20,7 @@ import { StateService } from "@bitwarden/common/platform/abstractions/state.serv
|
||||
import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service";
|
||||
import { ThemeType, KeySuffixOptions } from "@bitwarden/common/platform/enums";
|
||||
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
||||
import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service";
|
||||
import { DialogService } from "@bitwarden/components";
|
||||
|
||||
import { SetPinComponent } from "../../auth/components/set-pin.component";
|
||||
@@ -116,7 +116,7 @@ export class SettingsComponent implements OnInit {
|
||||
private messagingService: MessagingService,
|
||||
private cryptoService: CryptoService,
|
||||
private modalService: ModalService,
|
||||
private themingService: AbstractThemingService,
|
||||
private themeStateService: ThemeStateService,
|
||||
private settingsService: SettingsService,
|
||||
private dialogService: DialogService,
|
||||
private userVerificationService: UserVerificationServiceAbstraction,
|
||||
@@ -263,7 +263,7 @@ export class SettingsComponent implements OnInit {
|
||||
await this.stateService.getEnableBrowserIntegrationFingerprint(),
|
||||
enableDuckDuckGoBrowserIntegration:
|
||||
await this.stateService.getEnableDuckDuckGoBrowserIntegration(),
|
||||
theme: await this.stateService.getTheme(),
|
||||
theme: await firstValueFrom(this.themeStateService.selectedTheme$),
|
||||
locale: await firstValueFrom(this.i18nService.locale$),
|
||||
};
|
||||
this.form.setValue(initialValues, { emitEvent: false });
|
||||
@@ -557,7 +557,7 @@ export class SettingsComponent implements OnInit {
|
||||
}
|
||||
|
||||
async saveTheme() {
|
||||
await this.themingService.updateConfiguredTheme(this.form.value.theme);
|
||||
await this.themeStateService.setSelectedTheme(this.form.value.theme);
|
||||
}
|
||||
|
||||
async saveMinOnCopyToClipboard() {
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
import { ThemingService } from "@bitwarden/angular/platform/services/theming/theming.service";
|
||||
import { ThemeType } from "@bitwarden/common/platform/enums";
|
||||
|
||||
export class DesktopThemingService extends ThemingService {
|
||||
protected async getSystemTheme(): Promise<ThemeType> {
|
||||
return await ipc.platform.getSystemTheme();
|
||||
}
|
||||
|
||||
protected monitorSystemThemeChanges(): void {
|
||||
ipc.platform.onSystemThemeUpdated((theme: ThemeType) => this.updateSystemTheme(theme));
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
import { DOCUMENT } from "@angular/common";
|
||||
import { Inject, Injectable } from "@angular/core";
|
||||
|
||||
import { AbstractThemingService } from "@bitwarden/angular/platform/services/theming/theming.service.abstraction";
|
||||
@@ -38,6 +39,7 @@ export class InitService {
|
||||
private themingService: AbstractThemingService,
|
||||
private encryptService: EncryptService,
|
||||
private configService: ConfigService,
|
||||
@Inject(DOCUMENT) private document: Document,
|
||||
) {}
|
||||
|
||||
init() {
|
||||
@@ -58,7 +60,7 @@ export class InitService {
|
||||
setTimeout(() => this.notificationsService.init(), 3000);
|
||||
const htmlEl = this.win.document.documentElement;
|
||||
htmlEl.classList.add("os_" + this.platformUtilsService.getDeviceString());
|
||||
await this.themingService.monitorThemeChanges();
|
||||
this.themingService.applyThemeChangesTo(this.document);
|
||||
let installAction = null;
|
||||
const installedVersion = await this.stateService.getInstalledVersion();
|
||||
const currentVersion = await this.platformUtilsService.getApplicationVersion();
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
import { DOCUMENT } from "@angular/common";
|
||||
import { APP_INITIALIZER, InjectionToken, NgModule } from "@angular/core";
|
||||
|
||||
import { AbstractThemingService } from "@bitwarden/angular/platform/services/theming/theming.service.abstraction";
|
||||
import { safeProvider } from "@bitwarden/angular/platform/utils/safe-provider";
|
||||
import {
|
||||
SECURE_STORAGE,
|
||||
STATE_FACTORY,
|
||||
@@ -13,7 +10,7 @@ import {
|
||||
OBSERVABLE_MEMORY_STORAGE,
|
||||
OBSERVABLE_DISK_STORAGE,
|
||||
WINDOW,
|
||||
SafeInjectionToken,
|
||||
SYSTEM_THEME_OBSERVABLE,
|
||||
} from "@bitwarden/angular/services/injection-tokens";
|
||||
import { JslibServicesModule } from "@bitwarden/angular/services/jslib-services.module";
|
||||
import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service";
|
||||
@@ -63,13 +60,13 @@ import { ElectronRendererSecureStorageService } from "../../platform/services/el
|
||||
import { ElectronRendererStorageService } from "../../platform/services/electron-renderer-storage.service";
|
||||
import { ElectronStateService } from "../../platform/services/electron-state.service";
|
||||
import { I18nRendererService } from "../../platform/services/i18n.renderer.service";
|
||||
import { fromIpcSystemTheme } from "../../platform/utils/from-ipc-system-theme";
|
||||
import { EncryptedMessageHandlerService } from "../../services/encrypted-message-handler.service";
|
||||
import { NativeMessageHandlerService } from "../../services/native-message-handler.service";
|
||||
import { NativeMessagingService } from "../../services/native-messaging.service";
|
||||
import { SearchBarService } from "../layout/search/search-bar.service";
|
||||
|
||||
import { DesktopFileDownloadService } from "./desktop-file-download.service";
|
||||
import { DesktopThemingService } from "./desktop-theming.service";
|
||||
import { InitService } from "./init.service";
|
||||
import { RendererCryptoFunctionService } from "./renderer-crypto-function.service";
|
||||
|
||||
@@ -151,11 +148,10 @@ const RELOAD_CALLBACK = new InjectionToken<() => any>("RELOAD_CALLBACK");
|
||||
provide: FileDownloadService,
|
||||
useClass: DesktopFileDownloadService,
|
||||
},
|
||||
safeProvider({
|
||||
provide: AbstractThemingService,
|
||||
useClass: DesktopThemingService,
|
||||
deps: [StateServiceAbstraction, WINDOW, DOCUMENT as SafeInjectionToken<Document>],
|
||||
}),
|
||||
{
|
||||
provide: SYSTEM_THEME_OBSERVABLE,
|
||||
useFactory: () => fromIpcSystemTheme(),
|
||||
},
|
||||
{
|
||||
provide: EncryptedMessageHandlerService,
|
||||
deps: [
|
||||
|
||||
@@ -246,8 +246,7 @@ export class WindowMain {
|
||||
// Retrieve the background color
|
||||
// Resolves background color missmatch when starting the application.
|
||||
async getBackgroundColor(): Promise<string> {
|
||||
const data: { theme?: string } = await this.storageService.get("global");
|
||||
let theme = data?.theme;
|
||||
let theme = await this.storageService.get("global_theming_selection");
|
||||
|
||||
if (theme == null || theme === "system") {
|
||||
theme = nativeTheme.shouldUseDarkColors ? "dark" : "light";
|
||||
|
||||
15
apps/desktop/src/platform/utils/from-ipc-system-theme.ts
Normal file
15
apps/desktop/src/platform/utils/from-ipc-system-theme.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { defer, fromEventPattern, merge } from "rxjs";
|
||||
|
||||
import { ThemeType } from "@bitwarden/common/platform/enums";
|
||||
|
||||
/**
|
||||
* @returns An observable watching the system theme via IPC channels
|
||||
*/
|
||||
export const fromIpcSystemTheme = () => {
|
||||
return merge(
|
||||
defer(() => ipc.platform.getSystemTheme()),
|
||||
fromEventPattern<ThemeType>((handler) =>
|
||||
ipc.platform.onSystemThemeUpdated((theme) => handler(theme)),
|
||||
),
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user