mirror of https://github.com/halo-dev/halo
				
				
				
			
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
import { getBrowserLanguage, i18n, setupI18n } from "@/locales";
 | 
						|
import { setupApiClient } from "@/setup/setupApiClient";
 | 
						|
import { setupComponents } from "@/setup/setupComponents";
 | 
						|
import "@/setup/setupStyles";
 | 
						|
import { setupVueQuery } from "@/setup/setupVueQuery";
 | 
						|
import { useGlobalInfoStore } from "@/stores/global-info";
 | 
						|
import { useRoleStore } from "@/stores/role";
 | 
						|
import { useUserStore } from "@/stores/user";
 | 
						|
import { getCookie } from "@/utils/cookie";
 | 
						|
import { hasPermission } from "@/utils/permission";
 | 
						|
import { consoleApiClient } from "@halo-dev/api-client";
 | 
						|
import router from "@uc/router";
 | 
						|
import { setupCoreModules, setupPluginModules } from "@uc/setup/setupModules";
 | 
						|
import { createPinia } from "pinia";
 | 
						|
import { createApp, type DirectiveBinding } from "vue";
 | 
						|
import App from "./App.vue";
 | 
						|
 | 
						|
const app = createApp(App);
 | 
						|
 | 
						|
setupComponents(app);
 | 
						|
setupI18n(app);
 | 
						|
setupVueQuery(app);
 | 
						|
setupApiClient();
 | 
						|
 | 
						|
app.use(createPinia());
 | 
						|
 | 
						|
async function loadUserPermissions() {
 | 
						|
  const { data: currentPermissions } =
 | 
						|
    await consoleApiClient.user.getPermissions({
 | 
						|
      name: "-",
 | 
						|
    });
 | 
						|
  const roleStore = useRoleStore();
 | 
						|
  roleStore.$patch({
 | 
						|
    permissions: currentPermissions,
 | 
						|
  });
 | 
						|
  app.directive(
 | 
						|
    "permission",
 | 
						|
    (el: HTMLElement, binding: DirectiveBinding<string[]>) => {
 | 
						|
      const uiPermissions = Array.from<string>(
 | 
						|
        currentPermissions.uiPermissions
 | 
						|
      );
 | 
						|
      const { value } = binding;
 | 
						|
      const { any, enable } = binding.modifiers;
 | 
						|
 | 
						|
      if (hasPermission(uiPermissions, value, any)) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      if (enable) {
 | 
						|
        //TODO
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      el?.remove?.();
 | 
						|
    }
 | 
						|
  );
 | 
						|
}
 | 
						|
 | 
						|
(async function () {
 | 
						|
  await initApp();
 | 
						|
})();
 | 
						|
 | 
						|
async function initApp() {
 | 
						|
  try {
 | 
						|
    setupCoreModules(app);
 | 
						|
 | 
						|
    const userStore = useUserStore();
 | 
						|
    await userStore.fetchCurrentUser();
 | 
						|
 | 
						|
    // set locale
 | 
						|
    i18n.global.locale.value = getCookie("language") || getBrowserLanguage();
 | 
						|
 | 
						|
    const globalInfoStore = useGlobalInfoStore();
 | 
						|
    await globalInfoStore.fetchGlobalInfo();
 | 
						|
 | 
						|
    if (userStore.isAnonymous) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    await loadUserPermissions();
 | 
						|
 | 
						|
    try {
 | 
						|
      await setupPluginModules(app);
 | 
						|
    } catch (e) {
 | 
						|
      console.error("Failed to load plugins", e);
 | 
						|
    }
 | 
						|
  } catch (error) {
 | 
						|
    console.error("Failed to init app", error);
 | 
						|
  } finally {
 | 
						|
    app.use(router);
 | 
						|
    app.mount("#app");
 | 
						|
  }
 | 
						|
}
 |