Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/frontend/vue/components/common/BasicLink.vue
3375 views
<template>
  <a
    :class="{'basic-link_has-link': hasLink }"
    :href="url"
    :rel="isExternal ? 'noopener' : null"
    :target="isExternal ? '_blank' : null"
    @click="onClick"
    @mouseenter="$emit('mouseenter')"
  >
    <slot />
  </a>
</template>

<script lang="ts">
import { defineComponent } from "vue-demi";

export default defineComponent({
  name: "BasicLink",
  props: {
    isStatic: {
      type: Boolean,
      default: false,
      required: false,
    },
    segment: {
      type: Object,
      default: undefined,
      required: false,
    },
    url: {
      type: String,
      default: "#",
      required: false,
    },
  },
  computed: {
    hasLink(): boolean {
      return !!this.url;
    },
    isAnchor(): boolean {
      return this.isExternal || this.isMail || this.isIdAnchor || this.isStatic;
    },
    isExternal(): boolean {
      return !!this.url && this.url.startsWith("http");
    },
    isIdAnchor(): boolean {
      return !!this.url && this.url.startsWith("#");
    },
    isMail(): boolean {
      return !!this.url && this.url.startsWith("mailto");
    }
  },
  methods: {
    onClick(event: PointerEvent) {
      if (this.segment)
        this.$trackClickEvent(this.segment.cta, this.segment.location);
      if (this.url === '#')
        event.preventDefault()
    }
  }
});
</script>

<style lang="scss" scoped>
.basic-link {
  &_has-link {
    cursor: pointer;
  }
}
</style>