<template>
  <Context ref="context">
    <ul class="context__menu">
      <li v-if="hasValidExporter">
        <a @click="exportView()">
          <i class="context__menu-icon fas fa-fw fa-file-export"></i>
          {{ $t('viewContext.exportView') }}
        </a>
      </li>
      <li>
        <a @click="duplicateView()">
          <i class="context__menu-icon fas fa-fw fa-clone"></i>
          {{ $t('viewContext.duplicateView') }}
        </a>
      </li>
      <li>
        <a @click="openWebhookModal()">
          <i class="context__menu-icon fas fa-fw fa-globe"></i>
          {{ $t('viewContext.webhooks') }}
        </a>
      </li>
      <li>
        <a @click="enableRename()">
          <i class="context__menu-icon fas fa-fw fa-pen"></i>
          {{ $t('viewContext.renameView') }}
        </a>
      </li>
      <li>
        <a @click="deleteView()">
          <i class="context__menu-icon fas fa-fw fa-trash"></i>
          {{ $t('viewContext.deleteView') }}
        </a>
      </li>
    </ul>
    <ExportTableModal
      ref="exportViewModal"
      :database="database"
      :table="table"
      :view="view"
    />
    <WebhookModal ref="webhookModal" :table="table" />
  </Context>
</template>

<script>
import context from '@baserow/modules/core/mixins/context'
import error from '@baserow/modules/core/mixins/error'
import viewTypeHasExporterTypes from '@baserow/modules/database/utils/viewTypeHasExporterTypes'

import ExportTableModal from '@baserow/modules/database/components/export/ExportTableModal'
import WebhookModal from '@baserow/modules/database/components/webhook/WebhookModal.vue'

export default {
  name: 'ViewContext',
  components: { ExportTableModal, WebhookModal },
  mixins: [context, error],
  props: {
    database: {
      type: Object,
      required: true,
    },
    view: {
      type: Object,
      required: true,
    },
    table: {
      type: Object,
      required: true,
    },
  },
  computed: {
    hasValidExporter() {
      return viewTypeHasExporterTypes(this.view.type, this.$registry)
    },
  },
  methods: {
    setLoading(view, value) {
      this.$store.dispatch('view/setItemLoading', { view, value })
    },
    enableRename() {
      this.$refs.context.hide()
      this.$emit('enable-rename')
    },
    async deleteView() {
      this.setLoading(this.view, true)

      try {
        await this.$store.dispatch('view/delete', this.view)
      } catch (error) {
        this.handleError(error, 'view')
      }

      this.setLoading(this.view, false)
    },
    async duplicateView() {
      this.setLoading(this.view, true)
      let newView

      try {
        newView = await this.$store.dispatch('view/duplicate', this.view)
      } catch (error) {
        this.handleError(error, 'view')
      }

      this.$refs.context.hide()
      this.setLoading(this.view, false)

      // Redirect to the newly created view.
      this.$nuxt.$router.push({
        name: 'database-table',
        params: {
          databaseId: this.table.database_id,
          tableId: this.table.id,
          viewId: newView.id,
        },
      })
    },
    exportView() {
      this.$refs.context.hide()
      this.$refs.exportViewModal.show()
    },
    openWebhookModal() {
      this.$refs.context.hide()
      this.$refs.webhookModal.show()
    },
  },
}
</script>