import { Ref, isRef, computed } from '@vue/composition-api' import { useQuery, useResult } from '@vue/apollo-composable' import gql from 'graphql-tag' export interface UseProductSubscriptionOptions { fragment?: string } // @TODO select team export function useProductSubscription (productName: string | Ref, options: UseProductSubscriptionOptions = {}) { const finalProductName = computed(() => isRef(productName) ? productName.value : productName) const { result, loading, refetch } = useQuery(gql` query getCurrentUserSubscription ($productName: String!) { currentUser { id sub: subscriptionByProduct (productName: $productName) { ...inlineSubscription } teams { id sub: subscriptionByProduct (productName: $productName) { ...inlineSubscription } } } product (name: $productName) { id name label description includedOptions } } fragment inlineSubscription on Subscription { id active status managed ${options.fragment || ''} } `, () => ({ productName: finalProductName.value, }), { fetchPolicy: 'network-only', }) const subscription = useResult(result, null, data => data?.currentUser?.sub || data?.currentUser?.teams?.find(t => t.sub)?.sub) const product = useResult(result, null, data => data?.product) return { loading, subscription, product, refetch, } } // @TODO select team export function useIsSubscriptionActive (productName: string | Ref) { const finalProductName = computed(() => isRef(productName) ? productName.value : productName) const { result, loading, refetch } = useQuery(gql` query getCurrentUserSubscription ($productName: String!) { currentUser { id sub: subscriptionByProduct (productName: $productName) { ...subscription } teams { id sub: subscriptionByProduct (productName: $productName) { ...subscription } } } } fragment subscription on Subscription { id active } `, () => ({ productName: finalProductName.value, }), { fetchPolicy: 'network-only', }) const active = useResult(result, false, data => (data?.currentUser?.sub || data?.currentUser?.teams?.find(t => t.sub)?.sub)?.active) return { loading, active, refetch, } }