2022-04-20 10:38:24 +02:00
'use strict' ;
2019-08-15 18:29:55 +02:00
var toggle _theme = document . getElementById ( 'toggle_theme' ) ;
2019-05-05 14:34:27 +02:00
toggle _theme . href = 'javascript:void(0);' ;
toggle _theme . addEventListener ( 'click' , function ( ) {
2022-04-20 11:49:05 +02:00
var dark _mode = document . body . classList . contains ( 'light-theme' ) ;
2019-05-05 14:34:27 +02:00
var url = '/toggle_theme?redirect=false' ;
var xhr = new XMLHttpRequest ( ) ;
xhr . responseType = 'json' ;
2019-06-16 19:34:00 +02:00
xhr . timeout = 10000 ;
2019-05-05 14:34:27 +02:00
xhr . open ( 'GET' , url , true ) ;
set _mode ( dark _mode ) ;
2021-12-26 13:53:32 +01:00
try {
window . localStorage . setItem ( 'dark_mode' , dark _mode ? 'dark' : 'light' ) ;
2022-04-20 13:57:14 +02:00
} catch ( e ) { }
2019-06-15 17:08:06 +02:00
xhr . send ( ) ;
2019-05-05 14:34:27 +02:00
} ) ;
window . addEventListener ( 'storage' , function ( e ) {
2019-08-15 18:29:55 +02:00
if ( e . key === 'dark_mode' ) {
update _mode ( e . newValue ) ;
2019-05-05 14:34:27 +02:00
}
} ) ;
2020-11-16 04:19:41 +01:00
window . addEventListener ( 'DOMContentLoaded' , function ( ) {
2021-12-26 13:53:32 +01:00
const dark _mode = document . getElementById ( 'dark_mode_pref' ) . textContent ;
try {
// Update localStorage if dark mode preference changed on preferences page
window . localStorage . setItem ( 'dark_mode' , dark _mode ) ;
2022-04-20 13:57:14 +02:00
} catch ( e ) { }
2021-12-26 13:53:32 +01:00
update _mode ( dark _mode ) ;
2019-08-15 18:29:55 +02:00
} ) ;
2020-03-02 16:33:47 +01:00
var darkScheme = window . matchMedia ( '(prefers-color-scheme: dark)' ) ;
var lightScheme = window . matchMedia ( '(prefers-color-scheme: light)' ) ;
darkScheme . addListener ( scheme _switch ) ;
lightScheme . addListener ( scheme _switch ) ;
function scheme _switch ( e ) {
// ignore this method if we have a preference set
2021-12-26 13:53:32 +01:00
try {
if ( localStorage . getItem ( 'dark_mode' ) ) {
return ;
}
2022-04-20 13:57:14 +02:00
} catch ( exception ) { }
2020-03-02 16:33:47 +01:00
if ( e . matches ) {
2022-04-20 11:49:05 +02:00
if ( e . media . includes ( 'dark' ) ) {
2020-03-02 16:33:47 +01:00
set _mode ( true ) ;
2022-04-20 11:49:05 +02:00
} else if ( e . media . includes ( 'light' ) ) {
2020-03-02 16:33:47 +01:00
set _mode ( false ) ;
}
}
}
2019-08-15 18:29:55 +02:00
function set _mode ( bool ) {
2019-05-05 14:34:27 +02:00
if ( bool ) {
2020-11-16 04:19:41 +01:00
// dark
2019-05-05 14:34:27 +02:00
toggle _theme . children [ 0 ] . setAttribute ( 'class' , 'icon ion-ios-sunny' ) ;
2020-11-16 04:19:41 +01:00
document . body . classList . remove ( 'no-theme' ) ;
document . body . classList . remove ( 'light-theme' ) ;
document . body . classList . add ( 'dark-theme' ) ;
2019-05-05 14:34:27 +02:00
} else {
2020-11-16 04:19:41 +01:00
// light
2019-05-05 14:34:27 +02:00
toggle _theme . children [ 0 ] . setAttribute ( 'class' , 'icon ion-ios-moon' ) ;
2020-11-16 04:19:41 +01:00
document . body . classList . remove ( 'no-theme' ) ;
document . body . classList . remove ( 'dark-theme' ) ;
document . body . classList . add ( 'light-theme' ) ;
2019-05-05 14:34:27 +02:00
}
}
2019-08-15 18:29:55 +02:00
function update _mode ( mode ) {
if ( mode === 'true' /* for backwards compatibility */ || mode === 'dark' ) {
// If preference for dark mode indicated
set _mode ( true ) ;
}
2022-04-27 14:01:34 +02:00
else if ( mode === 'false' /* for backwards compatibility */ || mode === 'light' ) {
// If preference for light mode indicated
set _mode ( false ) ;
}
2019-08-15 18:29:55 +02:00
else if ( document . getElementById ( 'dark_mode_pref' ) . textContent === '' && window . matchMedia ( '(prefers-color-scheme: dark)' ) . matches ) {
// If no preference indicated here and no preference indicated on the preferences page (backend), but the browser tells us that the operating system has a dark theme
set _mode ( true ) ;
}
// else do nothing, falling back to the mode defined by the `dark_mode` preference on the preferences page (backend)
}