diff options
Diffstat (limited to 'source/js/darkmode.ts')
-rw-r--r-- | source/js/darkmode.ts | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/source/js/darkmode.ts b/source/js/darkmode.ts new file mode 100644 index 0000000..db24d0a --- /dev/null +++ b/source/js/darkmode.ts @@ -0,0 +1,37 @@ +// Darkmode Listener +enum SystemDarkmodePrefrence { + dark = 0, + light = 1 +}; + +class DarkmodeListener { + private _mode: SystemDarkmodePrefrence; + private _handlers: ((mode: SystemDarkmodePrefrence)=>void)[]; + + public constructor() { + let darking = window.matchMedia('(prefers-color-scheme: dark)').matches; + this._mode = darking ? SystemDarkmodePrefrence.dark : SystemDarkmodePrefrence.light; + this._handlers = []; + this._listen(); + } + + private _listen(): void { + let media = window.matchMedia('(prefers-color-scheme: dark)'); + let callback = (event: MediaQueryListEvent) => { + let mode = event.matches ? SystemDarkmodePrefrence.dark : SystemDarkmodePrefrence.light; + this._handlers.forEach(handler => { + handler(mode); + }); + this._mode = mode; + }; + media.addEventListener("change", callback); + } + + public add(callback: (mode: SystemDarkmodePrefrence)=>void): void { + this._handlers.push(callback); + } + + public mode(): SystemDarkmodePrefrence { + return this._mode; + } +}; |