Skip to content
Snippets Groups Projects
App.vue 2.17 KiB
Newer Older
  • Learn to ignore specific revisions
  • <script setup lang="ts">
    
    import NavbarTop from "@/components/NavbarTop.vue";
    
    import { onBeforeMount } from "vue";
    import { useCookies } from "vue3-cookies";
    
    import { useAuthStore } from "@/stores/users";
    
    import { useRouter } from "vue-router";
    
    import { OpenAPI as S3ProxyOpenAPI } from "@/client/s3proxy";
    import { OpenAPI as AuthOpenAPI } from "@/client/auth";
    import { OpenAPI as WorkflowOpenAPI } from "@/client/workflow";
    
    import { environment } from "@/environment";
    
    import FooterBottom from "@/components/FooterBottom.vue";
    
    import axios from "axios";
    
    
    const { cookies } = useCookies();
    const store = useAuthStore();
    const router = useRouter();
    
    onBeforeMount(() => {
    
      S3ProxyOpenAPI.BASE = environment.S3PROXY_API_BASE_URL;
      AuthOpenAPI.BASE = environment.AUTH_API_BASE_URL;
      WorkflowOpenAPI.BASE = environment.WORKFLOW_API_BASE_URL;
    
      axios.interceptors.response.use(
        (res) => res,
        (err) => {
          if (
            (err.response.status === 400 || err.response.status === 403) &&
            err.response.data.detail?.includes("JWT")
          ) {
            store.logout();
    
            cookies.remove("bearer");
    
            router.push({
              name: "login",
              query: {
                login_error:
                  err.response.status === 400 ? "token_invalid" : "token_expired",
              },
            });
          }
          return Promise.reject(err);
        },
      );
    
      store.setToken(cookies.get("bearer"));
      router.beforeEach(async (to) => {
        // make sure the user is authenticated
        if (
          !store.authenticated &&
          // ❗️ Avoid an infinite redirect
          to.name !== "login"
        ) {
    
          // redirect the user to the login page and preserve query params for login error message
          return { name: "login", query: to.query };
    
        } else if (
          to.meta.requiresDeveloperRole &&
          !(store.workflowDev || store.admin)
        ) {
          return { name: "dashboard" };
    
        } else if (
          to.meta.requiresReviewerRole &&
          !(store.workflowReviewer || store.admin)
        ) {
          return { name: "dashboard" };
    
      <div class="container-xxl mt-4 flex-grow-1">
    
        <router-view></router-view>
      </div>