MOBILE-3814 collapsible: Subscribe to dark mode change to color header
parent
39937e2252
commit
df1dba532f
|
@ -16,6 +16,7 @@ import { Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit, SimpleChang
|
||||||
import { CorePromisedValue } from '@classes/promised-value';
|
import { CorePromisedValue } from '@classes/promised-value';
|
||||||
import { CoreLoadingComponent } from '@components/loading/loading';
|
import { CoreLoadingComponent } from '@components/loading/loading';
|
||||||
import { CoreTabsOutletComponent } from '@components/tabs-outlet/tabs-outlet';
|
import { CoreTabsOutletComponent } from '@components/tabs-outlet/tabs-outlet';
|
||||||
|
import { CoreSettingsHelper } from '@features/settings/services/settings-helper';
|
||||||
import { ScrollDetail } from '@ionic/core';
|
import { ScrollDetail } from '@ionic/core';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
|
@ -156,6 +157,10 @@ export class CoreCollapsibleHeaderDirective implements OnInit, OnChanges, OnDest
|
||||||
this.resizeListener = CoreDomUtils.onWindowResize(() => {
|
this.resizeListener = CoreDomUtils.onWindowResize(() => {
|
||||||
this.initializeFloatingTitle();
|
this.initializeFloatingTitle();
|
||||||
}, 50);
|
}, 50);
|
||||||
|
|
||||||
|
this.subscriptions.push(CoreSettingsHelper.onDarkModeChange().subscribe(() => {
|
||||||
|
this.initializeFloatingTitle();
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -27,6 +27,7 @@ import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreCourse } from '@features/course/services/course';
|
import { CoreCourse } from '@features/course/services/course';
|
||||||
import { makeSingleton, Translate } from '@singletons';
|
import { makeSingleton, Translate } from '@singletons';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
|
import { Observable, Subject } from 'rxjs';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Object with space usage and cache entries that can be erased.
|
* Object with space usage and cache entries that can be erased.
|
||||||
|
@ -64,6 +65,7 @@ export class CoreSettingsHelperProvider {
|
||||||
protected prefersDark?: MediaQueryList;
|
protected prefersDark?: MediaQueryList;
|
||||||
protected colorSchemes: CoreColorScheme[] = [];
|
protected colorSchemes: CoreColorScheme[] = [];
|
||||||
protected currentColorScheme = CoreColorScheme.LIGHT;
|
protected currentColorScheme = CoreColorScheme.LIGHT;
|
||||||
|
protected darkModeObservable = new Subject<boolean>();
|
||||||
|
|
||||||
async initialize(): Promise<void> {
|
async initialize(): Promise<void> {
|
||||||
this.prefersDark = window.matchMedia('(prefers-color-scheme: dark)');
|
this.prefersDark = window.matchMedia('(prefers-color-scheme: dark)');
|
||||||
|
@ -93,7 +95,9 @@ export class CoreSettingsHelperProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen for changes to the prefers-color-scheme media query.
|
// Listen for changes to the prefers-color-scheme media query.
|
||||||
this.prefersDark.addEventListener && this.prefersDark.addEventListener('change', this.toggleDarkModeListener.bind(this));
|
this.prefersDark.addEventListener && this.prefersDark.addEventListener('change', () => {
|
||||||
|
this.setColorScheme(this.currentColorScheme);
|
||||||
|
});
|
||||||
|
|
||||||
// Init zoom level.
|
// Init zoom level.
|
||||||
await this.upgradeZoomLevel();
|
await this.upgradeZoomLevel();
|
||||||
|
@ -444,22 +448,28 @@ export class CoreSettingsHelperProvider {
|
||||||
return window.matchMedia('(prefers-color-scheme)').media !== 'not all';
|
return window.matchMedia('(prefers-color-scheme)').media !== 'not all';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Listener function to toggle dark mode.
|
|
||||||
*/
|
|
||||||
protected toggleDarkModeListener(): void {
|
|
||||||
this.setColorScheme(this.currentColorScheme);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toggles dark mode based on enabled boolean.
|
* Toggles dark mode based on enabled boolean.
|
||||||
*
|
*
|
||||||
* @param enable True to enable dark mode, false to disable.
|
* @param enable True to enable dark mode, false to disable.
|
||||||
*/
|
*/
|
||||||
protected toggleDarkMode(enable: boolean = false): void {
|
protected toggleDarkMode(enable: boolean = false): void {
|
||||||
document.body.classList.toggle('dark', enable);
|
const isDark = document.body.classList.contains('dark');
|
||||||
|
if (isDark !== enable) {
|
||||||
|
document.body.classList.toggle('dark', enable);
|
||||||
|
this.darkModeObservable.next(enable);
|
||||||
|
|
||||||
CoreApp.setStatusBarColor();
|
CoreApp.setStatusBarColor();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns dark mode change observable.
|
||||||
|
*
|
||||||
|
* @return Dark mode change observable.
|
||||||
|
*/
|
||||||
|
onDarkModeChange(): Observable<boolean> {
|
||||||
|
return this.darkModeObservable;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue