import { usePaymentStore } from '#lib/stores/payment' import { usePromotion, useDepositData, useCancelPromotion, useNadal, } from '#lib/composables' import type { PhoneCardProvider, PhoneCardDepositRequest, } from '#lib/types/deposit' import { DepositMethodEnum } from '#lib/enums/deposit' import type { BaseNadalResponse } from '#lib/types/api' import { computed } from 'vue' /** * Provides methods and state related to Phone Card deposits, including fetching providers and creating deposits. * @returns {Object} An object containing state and methods for managing Phone Card deposit functionality. * @namespace */ export function usePhoneCard() { const { payment } = useNadal() const { isUsingPromotion, promotionPackages, fetchPromotionPackages } = usePromotion() const { openModalCancelPromotion } = useCancelPromotion() const store = usePaymentStore() const { fetchPhoneCardProviders } = useDepositData() /** * Computes and returns a list of Phone Card providers with additional metadata. * @type {ComputedRef} */ const cardProviders = computed((): PhoneCardProvider[] => { const networks = store.phoneCardProviders.map((item) => ({ ...item, value: item.providerId, label: item.providerName, })) return networks?.length ? networks : [] }) /** * Creates a deposit using a Phone Card. * @async * @param {PhoneCardDepositRequest} data - The request data for creating the Phone Card deposit. * @returns {Promise} A promise that resolves to the response from the deposit creation request. */ async function onCreateDeposit( data: PhoneCardDepositRequest, ): Promise { if (isUsingPromotion.value) { openModalCancelPromotion() return Promise.resolve(undefined) } const bodyRequest = { ...data, method: DepositMethodEnum.PhoneCard, } return await payment.depositCard< PhoneCardDepositRequest, BaseNadalResponse >(bodyRequest) } /** * Fetches Phone Card provider data and promotion packages. * @async * @returns {Promise} A promise that resolves when the data has been fetched. */ const fetchData = async (): Promise => { await Promise.all([fetchPhoneCardProviders(), fetchPromotionPackages()]) } return { cardProviders, promotionPackages, fetchData, onCreateDeposit, } }