1
0

use-preferences.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { diff } from '@vben-core/toolkit';
  2. import { computed } from 'vue';
  3. import { isDarkTheme, preferencesManager } from './preferences';
  4. function usePreferences() {
  5. const preferences = preferencesManager.getPreferences();
  6. const flatPreferences = preferencesManager.getFlatPreferences();
  7. const initialPreferences = preferencesManager.getInitialPreferences();
  8. /**
  9. * @zh_CN 计算偏好设置的变化
  10. */
  11. const diffPreference = computed(() => {
  12. return diff(initialPreferences, preferences);
  13. });
  14. /**
  15. * @zh_CN 判断是否为暗黑模式
  16. * @param preferences - 当前偏好设置对象,它的主题值将被用来判断是否为暗黑模式。
  17. * @returns 如果主题为暗黑模式,返回 true,否则返回 false。
  18. */
  19. const isDark = computed(() => {
  20. return isDarkTheme(flatPreferences.appThemeMode);
  21. });
  22. const theme = computed(() => {
  23. return isDark.value ? 'dark' : 'light';
  24. });
  25. /**
  26. * @zh_CN 布局方式
  27. */
  28. const layout = computed(() =>
  29. flatPreferences.appIsMobile ? 'side-nav' : flatPreferences.appLayout,
  30. );
  31. /**
  32. * @zh_CN 是否全屏显示content,不需要侧边、底部、顶部、tab区域
  33. */
  34. const isFullContent = computed(
  35. () => flatPreferences.appLayout === 'full-content',
  36. );
  37. /**
  38. * @zh_CN 是否侧边导航模式
  39. */
  40. const isSideNav = computed(() => flatPreferences.appLayout === 'side-nav');
  41. /**
  42. * @zh_CN 是否侧边混合模式
  43. */
  44. const isSideMixedNav = computed(
  45. () => flatPreferences.appLayout === 'side-mixed-nav',
  46. );
  47. /**
  48. * @zh_CN 是否为头部导航模式
  49. */
  50. const isHeaderNav = computed(
  51. () => flatPreferences.appLayout === 'header-nav',
  52. );
  53. /**
  54. * @zh_CN 是否为混合导航模式
  55. */
  56. const isMixedNav = computed(() => flatPreferences.appLayout === 'mixed-nav');
  57. /**
  58. * @zh_CN 是否包含侧边导航模式
  59. */
  60. const isSideMode = computed(() => {
  61. return isMixedNav.value || isSideMixedNav.value || isSideNav.value;
  62. });
  63. /**
  64. * @zh_CN 是否开启keep-alive
  65. * 在tabs可见以及开启keep-alive的情况下才开启
  66. */
  67. const keepAlive = computed(
  68. () => flatPreferences.tabbarKeepAlive && flatPreferences.tabbarEnable,
  69. );
  70. /**
  71. * @zh_CN 登录注册页面布局是否为左侧
  72. */
  73. const authPanelLeft = computed(() => {
  74. return flatPreferences.appAuthPageLayout === 'panel-left';
  75. });
  76. /**
  77. * @zh_CN 登录注册页面布局是否为左侧
  78. */
  79. const authPanelRight = computed(() => {
  80. return flatPreferences.appAuthPageLayout === 'panel-right';
  81. });
  82. /**
  83. * @zh_CN 登录注册页面布局是否为中间
  84. */
  85. const authPanelCenter = computed(() => {
  86. return flatPreferences.appAuthPageLayout === 'panel-center';
  87. });
  88. return {
  89. authPanelCenter,
  90. authPanelLeft,
  91. authPanelRight,
  92. diffPreference,
  93. isDark,
  94. isFullContent,
  95. isHeaderNav,
  96. isMixedNav,
  97. isSideMixedNav,
  98. isSideMode,
  99. isSideNav,
  100. keepAlive,
  101. layout,
  102. theme,
  103. };
  104. }
  105. export { usePreferences };