Просмотр исходного кода

add boot.js and transplant color-scheme related code

Yuki Takei 5 лет назад
Родитель
Сommit
7a2b9e639b

+ 1 - 0
config/webpack.common.js

@@ -20,6 +20,7 @@ module.exports = (options) => {
   return {
     mode: options.mode,
     entry: Object.assign({
+      'js/boot':                      './src/client/js/boot',
       'js/app':                       './src/client/js/app',
       'js/admin':                     './src/client/js/admin',
       'js/nologin':                   './src/client/js/nologin',

+ 21 - 0
src/client/js/boot.js

@@ -0,0 +1,21 @@
+import loggerFactory from '@alias/logger';
+import Xss from '@commons/service/xss';
+
+import {
+  mediaQueryListForDarkMode,
+  applyColorScheme,
+} from './util/color-scheme';
+
+const logger = loggerFactory('growi:cli:bootstrap');
+
+if (!window) {
+  window = {};
+}
+
+// setup xss library
+const xss = new Xss();
+window.xss = xss;
+
+logger.debug('Dark Mode:', mediaQueryListForDarkMode.matches);
+
+applyColorScheme();

+ 13 - 44
src/client/js/services/AppContainer.js

@@ -8,6 +8,11 @@ import InterceptorManager from '@commons/service/interceptor-manager';
 import emojiStrategy from '../util/emojione/emoji_strategy_shrinked.json';
 import GrowiRenderer from '../util/GrowiRenderer';
 
+import {
+  mediaQueryListForDarkMode,
+  applyColorScheme,
+  savePreferenceByUser,
+} from '../util/color-scheme';
 import Apiv1ErrorHandler from '../util/apiv1ErrorHandler';
 
 import {
@@ -128,7 +133,7 @@ export default class AppContainer extends Container {
 
   init() {
     this.initDeviceSize();
-    this.initColorScheme();
+    this.initMediaQueryForColorScheme();
     this.initPlugins();
   }
 
@@ -152,20 +157,16 @@ export default class AppContainer extends Container {
     this.addBreakpointListener('md', mdOrAvobeHandler, true);
   }
 
-  async initColorScheme() {
+  async initMediaQueryForColorScheme() {
     const switchStateByMediaQuery = async(mql) => {
       const preferDarkMode = mql.matches;
-      await this.setState({ preferDarkModeByMediaQuery: preferDarkMode });
+      this.setState({ preferDarkModeByMediaQuery: preferDarkMode });
 
-      this.applyColorScheme();
+      applyColorScheme();
     };
 
-    const mqlForDarkMode = window.matchMedia('(prefers-color-scheme: dark)');
     // add event listener
-    mqlForDarkMode.addListener(switchStateByMediaQuery);
-
-    // initialize: check media query
-    switchStateByMediaQuery(mqlForDarkMode);
+    mediaQueryListForDarkMode.addListener(switchStateByMediaQuery);
   }
 
   initPlugins() {
@@ -416,41 +417,9 @@ export default class AppContainer extends Container {
    * @param {boolean} isDarkMode
    */
   async setColorSchemePreference(isDarkMode) {
-    await this.setState({ preferDarkModeByUser: isDarkMode });
-
-    // store settings to localStorage
-    const { localStorage } = window;
-    if (isDarkMode == null) {
-      delete localStorage.removeItem('preferDarkModeByUser');
-    }
-    else {
-      localStorage.preferDarkModeByUser = isDarkMode;
-    }
-
-    this.applyColorScheme();
-  }
-
-  /**
-   * Apply color scheme as 'dark' attribute of <html></html>
-   */
-  applyColorScheme() {
-    const { preferDarkModeByMediaQuery, preferDarkModeByUser } = this.state;
-
-    let isDarkMode = preferDarkModeByMediaQuery;
-    if (preferDarkModeByUser != null) {
-      isDarkMode = preferDarkModeByUser;
-    }
-
-    // switch to dark mode
-    if (isDarkMode) {
-      document.documentElement.removeAttribute('light');
-      document.documentElement.setAttribute('dark', 'true');
-    }
-    // switch to light mode
-    else {
-      document.documentElement.setAttribute('light', 'true');
-      document.documentElement.removeAttribute('dark');
-    }
+    this.setState({ preferDarkModeByUser: isDarkMode });
+    savePreferenceByUser(isDarkMode);
+    applyColorScheme();
   }
 
   async apiGet(path, params) {

+ 45 - 0
src/client/js/util/color-scheme.js

@@ -0,0 +1,45 @@
+const mediaQueryListForDarkMode = window.matchMedia('(prefers-color-scheme: dark)');
+
+/**
+ * Apply color scheme as 'dark' attribute of <html></html>
+ */
+function applyColorScheme() {
+  const { preferDarkModeByUser } = localStorage;
+
+  let isDarkMode = mediaQueryListForDarkMode.matches;
+  if (preferDarkModeByUser != null) {
+    isDarkMode = preferDarkModeByUser === 'true';
+  }
+
+  // switch to dark mode
+  if (isDarkMode) {
+    document.documentElement.removeAttribute('light');
+    document.documentElement.setAttribute('dark', 'true');
+  }
+  // switch to light mode
+  else {
+    document.documentElement.setAttribute('light', 'true');
+    document.documentElement.removeAttribute('dark');
+  }
+}
+
+/**
+ * Set color scheme preference by user
+ * @param {boolean} isDarkMode
+ */
+function savePreferenceByUser(isDarkMode) {
+  // store settings to localStorage
+  const { localStorage } = window;
+  if (isDarkMode == null) {
+    delete localStorage.removeItem('preferDarkModeByUser');
+  }
+  else {
+    localStorage.preferDarkModeByUser = isDarkMode;
+  }
+}
+
+export {
+  mediaQueryListForDarkMode,
+  applyColorScheme,
+  savePreferenceByUser,
+};

+ 4 - 3
src/server/views/layout/layout.html

@@ -25,10 +25,11 @@
 
   {% include '../widget/headers/scripts-for-dev.html' %}
 
-  <script src="{{ webpack_asset('js/vendors.js') }}" defer></script>
-  <script src="{{ webpack_asset('js/commons.js') }}" defer></script>
+  <script src="{{ webpack_asset('js/vendors.js') }}"></script>
+  <script src="{{ webpack_asset('js/commons.js') }}"></script>
+  <script src="{{ webpack_asset('js/boot.js') }}"></script>
   {% if getConfig('crowi', 'plugin:isEnabledPlugins') %}
-  <script src="{{ webpack_asset('js/plugin.js') }}" defer></script>
+  <script src="{{ webpack_asset('js/plugin.js') }}"></script>
   {% endif %}
   {% block html_head_loading_legacy %}
     <script src="{{ webpack_asset('js/legacy.js') }}" defer></script>