preferences.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <script lang="ts" setup>
  2. import { computed } from 'vue';
  3. import { loadLocaleMessages } from '@vben-core/locales';
  4. import { preferences, updatePreferences } from '@vben-core/preferences';
  5. import { capitalizeFirstLetter } from '@vben-core/toolkit';
  6. import Preferences from './preferences-sheet.vue';
  7. /**
  8. * preferences 转成 vue props
  9. * preferences.widget.aiAssistant=>widgetAiAssistant
  10. */
  11. const attrs = computed(() => {
  12. const result: Record<string, any> = {};
  13. for (const [key, value] of Object.entries(preferences)) {
  14. for (const [subKey, subValue] of Object.entries(value)) {
  15. result[`${key}${capitalizeFirstLetter(subKey)}`] = subValue;
  16. }
  17. }
  18. return result;
  19. });
  20. /**
  21. * preferences 转成 vue listener
  22. * preferences.widget.aiAssistant=>@update:widgetAiAssistant
  23. */
  24. const listen = computed(() => {
  25. const result: Record<string, any> = {};
  26. for (const [key, value] of Object.entries(preferences)) {
  27. if (typeof value === 'object') {
  28. for (const subKey of Object.keys(value)) {
  29. result[`update:${key}${capitalizeFirstLetter(subKey)}`] = (
  30. val: any,
  31. ) => {
  32. updatePreferences({ [key]: { [subKey]: val } });
  33. if (key === 'app' && subKey === 'locale') {
  34. loadLocaleMessages(val);
  35. }
  36. };
  37. }
  38. } else {
  39. result[key] = value;
  40. }
  41. }
  42. return result;
  43. });
  44. </script>
  45. <template>
  46. <Preferences v-bind="attrs" v-on="listen" />
  47. </template>