<template>
  <div v-if="!showForm">
    <h2 class="box__title">{{ $t('domainSettings.titleOverview') }}</h2>
    <Error :error="error"></Error>
    <div
      v-if="$fetchState.pending && !error.visible"
      class="loading domains-settings__loading"
    />
    <template v-else>
      <DomainCard
        v-for="domain in domains"
        :key="domain.id"
        class="margin-bottom-2"
        :domain="domain"
        :is-only-domain="domains.length === 1"
        @delete="deleteDomain(domain)"
      />
    </template>
    <p
      v-if="!error.visible && !$fetchState.pending && domains.length === 0"
      class="margin-top-3"
    >
      {{ $t('domainSettings.noDomainMessage') }}
    </p>
    <div class="actions actions--right">
      <button class="button button--primary" @click="showForm = true">
        <i class="fas fa-plus margin-right-1"></i>
        <span>{{ $t('domainSettings.addDomain') }}</span>
      </button>
    </div>
  </div>
  <DomainForm v-else :builder="builder" :hide-form="hideForm" />
</template>

<script>
import { mapActions, mapGetters } from 'vuex'
import error from '@baserow/modules/core/mixins/error'
import DomainCard from '@baserow/modules/builder/components/domain/DomainCard'
import DomainForm from '@baserow/modules/builder/components/domain/DomainForm'

export default {
  name: 'DomainsSettings',
  components: { DomainCard, DomainForm },
  mixins: [error],
  props: {
    builder: {
      type: Object,
      required: true,
    },
  },
  data() {
    return {
      showForm: false,
    }
  },
  async fetch() {
    try {
      await this.actionFetchDomains({ builderId: this.builder.id })
      this.hideError()
    } catch (error) {
      this.handleError(error)
    }
  },
  computed: {
    ...mapGetters({ domains: 'domain/getDomains' }),
  },
  methods: {
    ...mapActions({
      actionDeleteDomain: 'domain/delete',
      actionFetchDomains: 'domain/fetch',
    }),
    hideForm() {
      this.showForm = false
      this.hideError()
    },
    async deleteDomain({ id }) {
      try {
        await this.actionDeleteDomain({ domainId: id })
      } catch (error) {
        this.handleError(error)
      }
    },
  },
}
</script>