PaymentCardList.vue 2.76 KB
<template>
  <div class="grid md:grid-cols-2 grid-cols-1 gap-4">
    <template v-if="loading">
      <div
        v-for="i in 4"
        :key="i"
        class="min-h-[114px] p-4 rounded-lg border border-dashed border-backgroundBorder flex flex-row items-center gap-6"
      >
        <div class="flex flex-col gap-2 flex-grow">
          <VaSkeleton class height="1.5rem" variant="text" width="10rem" />
          <div class="flex gap-4">
            <VaSkeleton height="3rem" variant="rounded" width="5rem" />
            <VaSkeleton :lines="2" variant="text" />
          </div>
        </div>
      </div>
    </template>
    <template v-else>
      <CardListItem
        v-for="paymentCard in list"
        :key="paymentCard.id"
        :card="paymentCard"
        @edit="cardToEdit = paymentCard"
        @remove="remove(paymentCard)"
      />
      <div
        class="sm:h-[114px] p-4 rounded-lg border border-dashed border-primary flex flex-col sm:flex-row items-start sm:items-center gap-4"
        :style="{ backgroundColor: colorToRgba(getColor('primary'), 0.07) }"
      >
        <div class="flex flex-col gap-2 flex-grow">
          <div class="text-lg font-bold leading-relaxed">Important note</div>
          <div class="text-secondary text-sm leading-tight">
            Please carefully read Product Terms before adding your new payment card
          </div>
        </div>
        <VaButton class="flex-none w-full sm:w-auto" @click="showCreate = true">Add card</VaButton>
      </div>
    </template>
  </div>
  <PaymentCardCreateModal v-if="showCreate" @close="showCreate = false" />
  <PaymentCardUpdateModal v-if="cardToEdit" :payment-card="cardToEdit" @close="cardToEdit = undefined" />
</template>

<script lang="ts" setup>
import CardListItem from './PaymentCardListItem.vue'
import { usePaymentCardsStore } from '../../../../stores/payment-cards'
import { computed, ref } from 'vue'
import { useColors } from 'vuestic-ui'
import { PaymentCard } from '../../types'
import { useModal, useToast } from 'vuestic-ui'
import PaymentCardCreateModal from './PaymentCardCreateModal.vue'
import PaymentCardUpdateModal from './PaymentCardUpdateModal.vue'

const store = usePaymentCardsStore()

const list = computed(() => store.allPaymentCards)
const loading = computed(() => store.loading)
const { confirm } = useModal()

const showCreate = ref<boolean>(false)
const cardToEdit = ref<PaymentCard>()
const { init } = useToast()

store.load()
const remove = async (card: PaymentCard) => {
  confirm({
    message: 'Are you really sure you want to delete this card?',
    size: 'small',
    maxWidth: '380px',
  }).then((ok) => {
    if (!ok) return
    store.remove(card.id)
    init({ message: 'Payment card has been deleted', color: 'success' })
  })
}

const { getColor, colorToRgba } = useColors()
</script>