use-preferences.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import { computed } from 'vue';
  2. import { diff } from '@vben-core/shared/utils';
  3. import { preferencesManager } from './preferences';
  4. import { isDarkTheme } from './update-css-variables';
  5. function usePreferences() {
  6. const preferences = preferencesManager.getPreferences();
  7. const initialPreferences = preferencesManager.getInitialPreferences();
  8. /**
  9. * @zh_CN 计算偏好设置的变化
  10. */
  11. const diffPreference = computed(() => {
  12. return diff(initialPreferences, preferences);
  13. });
  14. const appPreferences = computed(() => preferences.app);
  15. const shortcutKeysPreferences = computed(() => preferences.shortcutKeys);
  16. /**
  17. * @zh_CN 判断是否为暗黑模式
  18. * @param preferences - 当前偏好设置对象,它的主题值将被用来判断是否为暗黑模式。
  19. * @returns 如果主题为暗黑模式,返回 true,否则返回 false。
  20. */
  21. const isDark = computed(() => {
  22. return isDarkTheme(preferences.theme.mode);
  23. });
  24. const locale = computed(() => {
  25. return preferences.app.locale;
  26. });
  27. const isMobile = computed(() => {
  28. return appPreferences.value.isMobile;
  29. });
  30. const theme = computed(() => {
  31. return isDark.value ? 'dark' : 'light';
  32. });
  33. /**
  34. * @zh_CN 布局方式
  35. */
  36. const layout = computed(() =>
  37. isMobile.value ? 'sidebar-nav' : appPreferences.value.layout,
  38. );
  39. /**
  40. * @zh_CN 是否显示顶栏
  41. */
  42. const isShowHeaderNav = computed(() => {
  43. return preferences.header.enable;
  44. });
  45. /**
  46. * @zh_CN 是否全屏显示content,不需要侧边、底部、顶部、tab区域
  47. */
  48. const isFullContent = computed(
  49. () => appPreferences.value.layout === 'full-content',
  50. );
  51. /**
  52. * @zh_CN 是否侧边导航模式
  53. */
  54. const isSideNav = computed(
  55. () => appPreferences.value.layout === 'sidebar-nav',
  56. );
  57. /**
  58. * @zh_CN 是否侧边混合模式
  59. */
  60. const isSideMixedNav = computed(
  61. () => appPreferences.value.layout === 'sidebar-mixed-nav',
  62. );
  63. /**
  64. * @zh_CN 是否为头部导航模式
  65. */
  66. const isHeaderNav = computed(
  67. () => appPreferences.value.layout === 'header-nav',
  68. );
  69. /**
  70. * @zh_CN 是否为头部混合导航模式
  71. */
  72. const isHeaderMixedNav = computed(
  73. () => appPreferences.value.layout === 'header-mixed-nav',
  74. );
  75. /**
  76. * @zh_CN 是否为顶部通栏+侧边导航模式
  77. */
  78. const isHeaderSidebarNav = computed(
  79. () => appPreferences.value.layout === 'header-sidebar-nav',
  80. );
  81. /**
  82. * @zh_CN 是否为混合导航模式
  83. */
  84. const isMixedNav = computed(
  85. () => appPreferences.value.layout === 'mixed-nav',
  86. );
  87. /**
  88. * @zh_CN 是否包含侧边导航模式
  89. */
  90. const isSideMode = computed(() => {
  91. return (
  92. isMixedNav.value ||
  93. isSideMixedNav.value ||
  94. isSideNav.value ||
  95. isHeaderMixedNav.value ||
  96. isHeaderSidebarNav.value
  97. );
  98. });
  99. const sidebarCollapsed = computed(() => {
  100. return preferences.sidebar.collapsed;
  101. });
  102. /**
  103. * @zh_CN 是否开启keep-alive
  104. * 在tabs可见以及开启keep-alive的情况下才开启
  105. */
  106. const keepAlive = computed(
  107. () => preferences.tabbar.enable && preferences.tabbar.keepAlive,
  108. );
  109. /**
  110. * @zh_CN 登录注册页面布局是否为左侧
  111. */
  112. const authPanelLeft = computed(() => {
  113. return appPreferences.value.authPageLayout === 'panel-left';
  114. });
  115. /**
  116. * @zh_CN 登录注册页面布局是否为左侧
  117. */
  118. const authPanelRight = computed(() => {
  119. return appPreferences.value.authPageLayout === 'panel-right';
  120. });
  121. /**
  122. * @zh_CN 登录注册页面布局是否为中间
  123. */
  124. const authPanelCenter = computed(() => {
  125. return appPreferences.value.authPageLayout === 'panel-center';
  126. });
  127. /**
  128. * @zh_CN 内容是否已经最大化
  129. * 排除 full-content模式
  130. */
  131. const contentIsMaximize = computed(() => {
  132. const headerIsHidden = preferences.header.hidden;
  133. const sidebarIsHidden = preferences.sidebar.hidden;
  134. return headerIsHidden && sidebarIsHidden && !isFullContent.value;
  135. });
  136. /**
  137. * @zh_CN 是否启用全局搜索快捷键
  138. */
  139. const globalSearchShortcutKey = computed(() => {
  140. const { enable, globalSearch } = shortcutKeysPreferences.value;
  141. return enable && globalSearch;
  142. });
  143. /**
  144. * @zh_CN 是否启用全局注销快捷键
  145. */
  146. const globalLogoutShortcutKey = computed(() => {
  147. const { enable, globalLogout } = shortcutKeysPreferences.value;
  148. return enable && globalLogout;
  149. });
  150. const globalLockScreenShortcutKey = computed(() => {
  151. const { enable, globalLockScreen } = shortcutKeysPreferences.value;
  152. return enable && globalLockScreen;
  153. });
  154. /**
  155. * @zh_CN 偏好设置按钮位置
  156. */
  157. const preferencesButtonPosition = computed(() => {
  158. const { enablePreferences, preferencesButtonPosition } = preferences.app;
  159. // 如果没有启用偏好设置按钮
  160. if (!enablePreferences) {
  161. return {
  162. fixed: false,
  163. header: false,
  164. };
  165. }
  166. const { header, sidebar } = preferences;
  167. const headerHidden = header.hidden;
  168. const sidebarHidden = sidebar.hidden;
  169. const contentIsMaximize = headerHidden && sidebarHidden;
  170. const isHeaderPosition = preferencesButtonPosition === 'header';
  171. // 如果设置了固定位置
  172. if (preferencesButtonPosition !== 'auto') {
  173. return {
  174. fixed: preferencesButtonPosition === 'fixed',
  175. header: isHeaderPosition,
  176. };
  177. }
  178. // 如果是全屏模式或者没有固定在顶部,
  179. const fixed =
  180. contentIsMaximize ||
  181. isFullContent.value ||
  182. isMobile.value ||
  183. !isShowHeaderNav.value;
  184. return {
  185. fixed,
  186. header: !fixed,
  187. };
  188. });
  189. return {
  190. authPanelCenter,
  191. authPanelLeft,
  192. authPanelRight,
  193. contentIsMaximize,
  194. diffPreference,
  195. globalLockScreenShortcutKey,
  196. globalLogoutShortcutKey,
  197. globalSearchShortcutKey,
  198. isDark,
  199. isFullContent,
  200. isHeaderMixedNav,
  201. isHeaderNav,
  202. isHeaderSidebarNav,
  203. isMixedNav,
  204. isMobile,
  205. isSideMixedNav,
  206. isSideMode,
  207. isSideNav,
  208. keepAlive,
  209. layout,
  210. locale,
  211. preferencesButtonPosition,
  212. sidebarCollapsed,
  213. theme,
  214. };
  215. }
  216. export { usePreferences };