setting.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import { message } from 'antd';
  2. import { Reducer } from 'redux';
  3. import defaultSettings, { DefaultSettings } from '../../config/defaultSettings';
  4. import themeColorClient from '../components/SettingDrawer/themeColorClient';
  5. export interface SettingModelType {
  6. namespace: 'settings';
  7. state: DefaultSettings;
  8. reducers: {
  9. getSetting: Reducer<DefaultSettings>;
  10. changeSetting: Reducer<DefaultSettings>;
  11. };
  12. }
  13. const updateTheme = (newPrimaryColor?: string) => {
  14. const timeOut = 0;
  15. const hideMessage = message.loading('正在切换主题!', timeOut);
  16. themeColorClient.changeColor(newPrimaryColor).finally(() => hideMessage());
  17. };
  18. /*
  19. let lessNodesAppended: boolean;
  20. const updateTheme: (primaryColor?: string) => void = primaryColor => {
  21. // Don't compile less in production!
  22. // preview.pro.ant.design only do not use in your production;
  23. // preview.pro.ant.design 专用环境变量,请不要在你的项目中使用它。
  24. if (ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION !== 'site') {
  25. return;
  26. }
  27. // Determine if the component is remounted
  28. if (!primaryColor) {
  29. return;
  30. }
  31. const hideMessage = message.loading('正在编译主题!', 0);
  32. function buildIt() {
  33. if (!(window as any).less) {
  34. // tslint:disable-next-line no-console
  35. return console.log('no less');
  36. }
  37. setTimeout(() => {
  38. (window as any).less
  39. .modifyVars({
  40. '@primary-color': primaryColor,
  41. })
  42. .then(() => {
  43. hideMessage();
  44. })
  45. .catch(() => {
  46. message.error('Failed to update theme');
  47. hideMessage();
  48. });
  49. }, 200);
  50. }
  51. if (!lessNodesAppended) {
  52. // insert less.js and color.less
  53. const lessStyleNode = document.createElement('link');
  54. const lessConfigNode = document.createElement('script');
  55. const lessScriptNode = document.createElement('script');
  56. lessStyleNode.setAttribute('rel', 'stylesheet/less');
  57. lessStyleNode.setAttribute('href', '/color.less');
  58. lessConfigNode.innerHTML = `
  59. window.less = {
  60. async: true,
  61. env: 'production',
  62. javascriptEnabled: true
  63. };
  64. `;
  65. lessScriptNode.src = 'https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js';
  66. lessScriptNode.async = true;
  67. lessScriptNode.onload = () => {
  68. buildIt();
  69. lessScriptNode.onload = null;
  70. };
  71. document.body.appendChild(lessStyleNode);
  72. document.body.appendChild(lessConfigNode);
  73. document.body.appendChild(lessScriptNode);
  74. lessNodesAppended = true;
  75. } else {
  76. buildIt();
  77. }
  78. };
  79. */
  80. const updateColorWeak: (colorWeak: boolean) => void = colorWeak => {
  81. const root = document.getElementById('root');
  82. if (root) {
  83. root.className = colorWeak ? 'colorWeak' : '';
  84. }
  85. };
  86. const SettingModel: SettingModelType = {
  87. namespace: 'settings',
  88. state: defaultSettings,
  89. reducers: {
  90. getSetting(state = defaultSettings) {
  91. const setting: Partial<DefaultSettings> = {};
  92. const urlParams = new URL(window.location.href);
  93. Object.keys(state).forEach(key => {
  94. if (urlParams.searchParams.has(key)) {
  95. const value = urlParams.searchParams.get(key);
  96. setting[key] = value === '1' ? true : value;
  97. }
  98. });
  99. const { primaryColor, colorWeak } = setting;
  100. if (state.primaryColor !== primaryColor) {
  101. updateTheme(primaryColor);
  102. }
  103. updateColorWeak(!!colorWeak);
  104. return {
  105. ...state,
  106. ...setting,
  107. };
  108. },
  109. changeSetting(state = defaultSettings, { payload }) {
  110. const urlParams = new URL(window.location.href);
  111. Object.keys(defaultSettings).forEach(key => {
  112. if (urlParams.searchParams.has(key)) {
  113. urlParams.searchParams.delete(key);
  114. }
  115. });
  116. Object.keys(payload).forEach(key => {
  117. if (key === 'collapse') {
  118. return;
  119. }
  120. let value = payload[key];
  121. if (value === true) {
  122. value = 1;
  123. }
  124. if (defaultSettings[key] !== value) {
  125. urlParams.searchParams.set(key, value);
  126. }
  127. });
  128. const { primaryColor, colorWeak, contentWidth } = payload;
  129. if (state.primaryColor !== primaryColor) {
  130. updateTheme(primaryColor);
  131. }
  132. if (state.contentWidth !== contentWidth && window.dispatchEvent) {
  133. window.dispatchEvent(new Event('resize'));
  134. }
  135. updateColorWeak(colorWeak);
  136. window.history.replaceState(null, 'setting', urlParams.href);
  137. return {
  138. ...state,
  139. ...payload,
  140. };
  141. },
  142. },
  143. };
  144. export default SettingModel;