. * * @file * @ingroup Skins */ declare( strict_types=1 ); namespace Citizen\Partials; use Citizen\GetConfigTrait; use MediaWiki\MediaWikiServices; use OutputPage; /** * Theme switcher partial of Skin Citizen */ class Theme { use GetConfigTrait; /** * @var OutputPage */ private $out; public function __construct( OutputPage $out ) { $this->out = $out; } /** * Sets the corresponding theme class on the element * If the theme is set to auto, the theme switcher script will be added * * @param array &$options */ public function setSkinTheme( array &$options ) { // Set theme to site theme $theme = $this->getConfigValue( 'CitizenThemeDefault' ) ?? 'auto'; // Set theme to user theme if registered if ( $this->out->getUser()->isRegistered() ) { $theme = MediaWikiServices::getInstance()->getUserOptionsLookup()->getOption( $this->out->getUser(), 'CitizenThemeUser', 'auto' ); } $cookieTheme = $this->out->getRequest()->getCookie( 'skin-citizen-theme', null, 'auto' ); if ( $cookieTheme !== 'auto' ) { $theme = $cookieTheme; } // Add HTML class based on theme set $this->out->addHtmlClasses( 'skin-citizen-' . $theme ); if ( $this->out->getRequest()->getCookie( 'skin-citizen-theme-override' ) === null ) { // Only set the theme cookie if the theme wasn't overridden by the user through the button $this->out->getRequest()->response()->setCookie( 'skin-citizen-theme', $theme, 0, [ 'httpOnly' => false, ] ); } // Script content at 'skins.citizen.scripts.theme/inline.js $this->out->getOutput()->addHeadItem( 'theme-switcher', '' ); // Add styles and scripts module if ( $theme === 'auto' ) { $options['scripts'] = array_merge( $options['scripts'], [ 'skins.citizen.scripts.theme' ] ); } $options['styles'] = array_merge( $options['styles'], [ 'skins.citizen.styles.theme' ] ); } }