mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-11-04 06:08:31 -06:00 
			
		
		
		
	Add prefers-color-scheme support
This should fix <https://github.com/omarroth/invidious/issues/559>. The cookie storage format has been changed from boolean ("true"/"false") to tri-state ("dark"/"light"/""), so that users without a cookie set will get dark mode if they have enabled the dark theme in their operating system. The code for handling the cookie state, along with the user's operating system theme, has been factored out into a new function `update_mode`, which is called both at window load and at the "storage" event listener, because the "storage" event listener is only trigerred when a change is made to the localStorage from another tab/window (for more info - see <https://stackoverflow.com/a/4679754>).
This commit is contained in:
		
							parent
							
								
									19eceb4ecc
								
							
						
					
					
						commit
						365a261af3
					
				@ -11,18 +11,21 @@ toggle_theme.addEventListener('click', function () {
 | 
				
			|||||||
    xhr.open('GET', url, true);
 | 
					    xhr.open('GET', url, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    set_mode(dark_mode);
 | 
					    set_mode(dark_mode);
 | 
				
			||||||
    localStorage.setItem('dark_mode', dark_mode);
 | 
					    localStorage.setItem('dark_mode', dark_mode ? 'dark' : 'light');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xhr.send();
 | 
					    xhr.send();
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
window.addEventListener('storage', function (e) {
 | 
					window.addEventListener('storage', function (e) {
 | 
				
			||||||
    if (e.key == 'dark_mode') {
 | 
					    if (e.key == 'dark_mode') {
 | 
				
			||||||
        var dark_mode = e.newValue === 'true';
 | 
					        update_mode(e.newValue);
 | 
				
			||||||
        set_mode(dark_mode);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					window.addEventListener('load', function () {
 | 
				
			||||||
 | 
					    update_mode(window.localStorage.dark_mode);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function set_mode (bool) {
 | 
					function set_mode (bool) {
 | 
				
			||||||
    document.getElementById('dark_theme').media = !bool ? 'none' : '';
 | 
					    document.getElementById('dark_theme').media = !bool ? 'none' : '';
 | 
				
			||||||
    document.getElementById('light_theme').media = bool ? 'none' : '';
 | 
					    document.getElementById('light_theme').media = bool ? 'none' : '';
 | 
				
			||||||
@ -33,3 +36,14 @@ function set_mode(bool) {
 | 
				
			|||||||
        toggle_theme.children[0].setAttribute('class', 'icon ion-ios-moon');
 | 
					        toggle_theme.children[0].setAttribute('class', 'icon ion-ios-moon');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_mode (mode) {
 | 
				
			||||||
 | 
					    set_mode(
 | 
				
			||||||
 | 
					           mode == 'true' // for backwards compatibility
 | 
				
			||||||
 | 
					        || mode == 'dark'
 | 
				
			||||||
 | 
					        || (mode != 'light'
 | 
				
			||||||
 | 
					            && window.matchMedia('(prefers-color-scheme: dark)').matches)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user