setting.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { message } from 'antd';
  2. import defaultSettings from '../defaultSettings';
  3. let lessNodesAppended;
  4. const updateTheme = primaryColor => {
  5. // Don't compile less in production!
  6. if (APP_TYPE !== 'site') {
  7. return;
  8. }
  9. // Determine if the component is remounted
  10. if (!primaryColor) {
  11. return;
  12. }
  13. const hideMessage = message.loading('正在编译主题!', 0);
  14. function buildIt() {
  15. if (!window.less) {
  16. return;
  17. }
  18. setTimeout(() => {
  19. window.less
  20. .modifyVars({
  21. '@primary-color': primaryColor,
  22. })
  23. .then(() => {
  24. hideMessage();
  25. })
  26. .catch(() => {
  27. message.error('Failed to update theme');
  28. hideMessage();
  29. });
  30. }, 200);
  31. }
  32. if (!lessNodesAppended) {
  33. // insert less.js and color.less
  34. const lessStyleNode = document.createElement('link');
  35. const lessConfigNode = document.createElement('script');
  36. const lessScriptNode = document.createElement('script');
  37. lessStyleNode.setAttribute('rel', 'stylesheet/less');
  38. lessStyleNode.setAttribute('href', '/color.less');
  39. lessConfigNode.innerHTML = `
  40. window.less = {
  41. async: true,
  42. env: 'production',
  43. javascriptEnabled: true
  44. };
  45. `;
  46. lessScriptNode.src = 'https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js';
  47. lessScriptNode.async = true;
  48. lessScriptNode.onload = () => {
  49. buildIt();
  50. lessScriptNode.onload = null;
  51. };
  52. document.body.appendChild(lessStyleNode);
  53. document.body.appendChild(lessConfigNode);
  54. document.body.appendChild(lessScriptNode);
  55. lessNodesAppended = true;
  56. } else {
  57. buildIt();
  58. }
  59. };
  60. const updateColorWeak = colorWeak => {
  61. document.body.className = colorWeak ? 'colorWeak' : '';
  62. };
  63. export default {
  64. namespace: 'setting',
  65. state: defaultSettings,
  66. reducers: {
  67. getSetting(state) {
  68. const setting = {};
  69. const urlParams = new URL(window.location.href);
  70. Object.keys(state).forEach(key => {
  71. if (urlParams.searchParams.has(key)) {
  72. const value = urlParams.searchParams.get(key);
  73. setting[key] = value === '1' ? true : value;
  74. }
  75. });
  76. const { primaryColor, colorWeak } = setting;
  77. if (state.primaryColor !== primaryColor) {
  78. updateTheme(primaryColor);
  79. }
  80. updateColorWeak(colorWeak);
  81. return {
  82. ...state,
  83. ...setting,
  84. };
  85. },
  86. changeSetting(state, { payload }) {
  87. const urlParams = new URL(window.location.href);
  88. Object.keys(defaultSettings).forEach(key => {
  89. if (urlParams.searchParams.has(key)) {
  90. urlParams.searchParams.delete(key);
  91. }
  92. });
  93. Object.keys(payload).forEach(key => {
  94. if (key === 'collapse') {
  95. return;
  96. }
  97. let value = payload[key];
  98. if (value === true) {
  99. value = 1;
  100. }
  101. if (defaultSettings[key] !== value) {
  102. urlParams.searchParams.set(key, value);
  103. }
  104. });
  105. const { primaryColor, colorWeak, contentWidth } = payload;
  106. if (state.primaryColor !== primaryColor) {
  107. updateTheme(primaryColor);
  108. }
  109. if (state.contentWidth !== contentWidth && window.dispatchEvent) {
  110. window.dispatchEvent(new Event('resize'));
  111. }
  112. updateColorWeak(colorWeak);
  113. window.history.replaceState(null, 'setting', urlParams.href);
  114. return {
  115. ...state,
  116. ...payload,
  117. };
  118. },
  119. },
  120. };