main.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { autoAnimatePlugin } from '@formkit/auto-animate/vue'
  2. import { createCurdConfig } from '@uozi-admin/curd'
  3. import { createRequestConfig } from '@uozi-admin/request'
  4. import { createPinia } from 'pinia'
  5. import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
  6. import { createApp } from 'vue'
  7. import VueDOMPurifyHTML from 'vue-dompurify-html'
  8. import { setupInterceptors } from '@/lib/http/interceptors'
  9. import { initPWAThemeColor, watchThemeChanges } from '@/lib/pwa'
  10. import { useSettingsStore } from '@/pinia'
  11. import i18n from '../i18n.json'
  12. import App from './App.vue'
  13. import gettext from './gettext'
  14. import router from './routes'
  15. import '@uozi-admin/curd/dist/index.css'
  16. import 'virtual:uno.css'
  17. const pinia = createPinia()
  18. const app = createApp(App)
  19. function setupTranslations() {
  20. return Object.keys(i18n).reduce((acc, cur) => {
  21. acc[cur] = gettext.translations[cur]
  22. return acc
  23. }, {})
  24. }
  25. createRequestConfig({
  26. baseURL: './api',
  27. })
  28. pinia.use(piniaPluginPersistedstate)
  29. app.use(pinia)
  30. .use(gettext)
  31. .use(VueDOMPurifyHTML, {
  32. hooks: {
  33. uponSanitizeElement: (node, data) => {
  34. if (node.tagName && node.tagName.toLowerCase() === 'think') {
  35. data.allowedTags.think = true
  36. }
  37. },
  38. },
  39. })
  40. .use(setupInterceptors)
  41. .use(createCurdConfig({
  42. listApi: {
  43. paginationMap: {
  44. params: {
  45. current: 'page',
  46. pageSize: 'page_size',
  47. },
  48. response: {
  49. total: 'total',
  50. current: 'current_page',
  51. pageSize: 'per_page',
  52. totalPages: 'total_pages',
  53. },
  54. },
  55. },
  56. i18n: {
  57. legacy: false,
  58. locale: 'zh-CN',
  59. fallbackLocale: 'en-US',
  60. messages: setupTranslations(),
  61. },
  62. time: {
  63. timestamp: false,
  64. },
  65. selector: {
  66. omitZeroString: true,
  67. },
  68. }))
  69. // after pinia created
  70. const settings = useSettingsStore()
  71. gettext.current = settings.language || 'en'
  72. app.use(router).use(autoAnimatePlugin).mount('#app')
  73. // Initialize PWA theme color functionality after app is mounted
  74. nextTick(() => {
  75. initPWAThemeColor()
  76. watchThemeChanges()
  77. })
  78. export default app