internal/dashboard/frontend/src/App.vue

<script setup lang="ts">
import { useTimeoutPoll, useTitle } from "@vueuse/core";
import { computed, onMounted } from "vue";
import { useRoute } from "vue-router";
import TopBar from "./components/TopBar.vue";
import { fetchHoneypotTypes, useBlocklistStore } from "./store";

const blocklistStore = useBlocklistStore();
const route = useRoute();

useTimeoutPoll(blocklistStore.fetchBlocklist, 60 * 1000, {
  immediateCallback: true,
});

useTitle(
  computed(() => {
    const title = "HONEYPIE";
    if (route.name === "ip" || route.name === "subnet") {
      if (route.params.mask) {
        return `${route.params.ip}/${route.params.mask} - ${title}`;
      }
      return `${route.params.ip} - ${title}`;
    }
    if (route.name === "port") {
      return `Port ${route.params.port} - ${title}`;
    }

    if (
      ["city", "country", "asn", "domain", "fqdn"].includes(
        route.name as string,
      )
    ) {
      return `${route.params.value} - ${title}`;
    }

    if (["events", "charts", "stats"].includes(route.name as string)) {
      const name =
        String(route.name).charAt(0).toUpperCase() +
        String(route.name).slice(1);
      return `${name} - ${title}`;
    }

    return title;
  }),
);

onMounted(() => {
  fetchHoneypotTypes();
});
</script>

<template>
  <div class="flex min-h-screen flex-col">
    <TopBar />
    <RouterView />
  </div>
</template>