Skip to content
Snippets Groups Projects
App.vue 2.17 KiB
<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" };
    }
  });
});
</script>

<template>
  <NavbarTop />
  <div class="container-xxl mt-4 flex-grow-1">
    <router-view></router-view>
  </div>
  <FooterBottom />
</template>

<style scoped></style>