Bunch of contract updates
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import {RawSubscriptionObject} from '#/state/purchases/subscriptions/api/types'
|
||||
import {EntitlementId} from '#/state/purchases/subscriptions/types'
|
||||
|
||||
export async function getMainSubscriptions({
|
||||
did,
|
||||
@@ -13,10 +14,31 @@ export async function getMainSubscriptions({
|
||||
|
||||
if (!res.ok) {
|
||||
console.error('error fetching subscriptions', res.status, await res.text())
|
||||
return {
|
||||
active: [],
|
||||
available: [],
|
||||
}
|
||||
}
|
||||
|
||||
const json = await res.json()
|
||||
|
||||
return json as {
|
||||
active: RawSubscriptionObject[]
|
||||
available: RawSubscriptionObject[]
|
||||
}
|
||||
}
|
||||
|
||||
export async function getEntitlements({did}: {did: string}) {
|
||||
const res = await fetch(
|
||||
`https://bsky-purchases.ngrok.io/entitlements?user=${did}`,
|
||||
)
|
||||
|
||||
if (!res.ok) {
|
||||
console.error('error fetching entitlements', res.status, await res.text())
|
||||
return []
|
||||
}
|
||||
|
||||
const {subscriptions} = await res.json()
|
||||
const {entitlements} = await res.json()
|
||||
|
||||
return subscriptions as RawSubscriptionObject[]
|
||||
return entitlements as {id: EntitlementId}[]
|
||||
}
|
||||
|
||||
@@ -6,7 +6,15 @@ export type RawSubscriptionObjectBase<T> = T & {
|
||||
lookupKey: string
|
||||
checkoutId: string
|
||||
interval: 'monthly' | 'annual'
|
||||
autoRenew: boolean
|
||||
active: boolean
|
||||
autoRenewStatus:
|
||||
| 'will_renew'
|
||||
| 'will_not_renew'
|
||||
| 'will_change_product'
|
||||
| 'will_pause'
|
||||
| 'requires_price_increase_consent'
|
||||
| 'has_already_renewed'
|
||||
| null
|
||||
status:
|
||||
| 'trialing'
|
||||
| 'active'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import Purchases from 'react-native-purchases'
|
||||
import {useMutation, useQuery} from '@tanstack/react-query'
|
||||
import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query'
|
||||
|
||||
import {isAndroid} from '#/platform/detection'
|
||||
import {getMainSubscriptions} from '#/state/purchases/subscriptions/api'
|
||||
@@ -17,15 +17,12 @@ export function useMainSubscriptions() {
|
||||
return useQuery<Subscriptions>({
|
||||
queryKey: ['availableSubscriptions', did],
|
||||
async queryFn() {
|
||||
Purchases.logIn(did)
|
||||
Purchases.setEmail(currentAccount!.email!)
|
||||
|
||||
const platform = isAndroid ? 'android' : ('ios' as const)
|
||||
const platform = isAndroid ? 'android' : 'ios'
|
||||
const rawSubscriptions = await getMainSubscriptions({
|
||||
did: currentAccount!.did,
|
||||
platform,
|
||||
})
|
||||
const platformSubscriptions = rawSubscriptions
|
||||
const platformSubscriptions = rawSubscriptions.available
|
||||
.filter(s => s.platform !== 'web')
|
||||
.filter(s => s.platform === platform)
|
||||
const lookupKeys = Array.from(
|
||||
@@ -51,17 +48,29 @@ export function useMainSubscriptions() {
|
||||
})
|
||||
.filter(Boolean) as Subscription[]
|
||||
|
||||
return organizeMainSubscriptionsByTier(subscriptions)
|
||||
return {
|
||||
active: rawSubscriptions.active,
|
||||
available: organizeMainSubscriptionsByTier(subscriptions),
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export function usePurchaseSubscription() {
|
||||
const {currentAccount} = useSession()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
return useMutation({
|
||||
async mutationFn(product: Subscription['product']) {
|
||||
if (product.platform === 'web') {
|
||||
throw new Error('Cannot purchase web subscription on native')
|
||||
}
|
||||
// TODO don't do this here
|
||||
Purchases.addCustomerInfoUpdateListener(_info => {
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: ['availableSubscriptions', currentAccount!.did],
|
||||
})
|
||||
})
|
||||
return Purchases.purchaseStoreProduct(product.data)
|
||||
},
|
||||
})
|
||||
|
||||
@@ -22,7 +22,7 @@ export function useMainSubscriptions() {
|
||||
did: currentAccount!.did,
|
||||
platform: 'web',
|
||||
})
|
||||
const platformSubscriptions = rawSubscriptions.filter(
|
||||
const platformSubscriptions = rawSubscriptions.available.filter(
|
||||
s => s.platform === 'web',
|
||||
)
|
||||
const subscriptions = platformSubscriptions.map(sub => {
|
||||
@@ -40,7 +40,10 @@ export function useMainSubscriptions() {
|
||||
return subscription
|
||||
})
|
||||
|
||||
return organizeMainSubscriptionsByTier(subscriptions)
|
||||
return {
|
||||
active: rawSubscriptions.active,
|
||||
available: organizeMainSubscriptionsByTier(subscriptions),
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import {PurchasesStoreProduct} from 'react-native-purchases'
|
||||
|
||||
import {RawSubscriptionObjectBase} from '#/state/purchases/subscriptions/api/types'
|
||||
import {
|
||||
RawSubscriptionObject,
|
||||
RawSubscriptionObjectBase,
|
||||
} from '#/state/purchases/subscriptions/api/types'
|
||||
|
||||
export enum SubscriptionId {
|
||||
Main0MonthlyAuto = 'main:0:monthly:auto',
|
||||
@@ -11,6 +14,12 @@ export enum SubscriptionId {
|
||||
Main2AnnualAuto = 'main:2:annual:auto',
|
||||
}
|
||||
|
||||
export enum EntitlementId {
|
||||
Main0 = 'main:0',
|
||||
Main1 = 'main:1',
|
||||
Main2 = 'main:2',
|
||||
}
|
||||
|
||||
export type Subscription =
|
||||
| RawSubscriptionObjectBase<{
|
||||
platform: 'android'
|
||||
@@ -50,6 +59,9 @@ export type Subscription =
|
||||
}>
|
||||
|
||||
export type Subscriptions = {
|
||||
monthly: Subscription[]
|
||||
annual: Subscription[]
|
||||
active: RawSubscriptionObject[]
|
||||
available: {
|
||||
monthly: Subscription[]
|
||||
annual: Subscription[]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
import {useQuery} from '@tanstack/react-query'
|
||||
|
||||
import {getEntitlements} from '#/state/purchases/subscriptions/api'
|
||||
import {useSession} from '#/state/session'
|
||||
|
||||
export function useEntitlements() {
|
||||
const {currentAccount} = useSession()
|
||||
return useQuery({
|
||||
queryKey: ['entitlements', currentAccount!.did],
|
||||
async queryFn() {
|
||||
return getEntitlements({did: currentAccount!.did})
|
||||
},
|
||||
})
|
||||
}
|
||||
@@ -2,8 +2,8 @@ import {Subscription, Subscriptions} from './types'
|
||||
|
||||
export function organizeMainSubscriptionsByTier(
|
||||
subscriptions: Subscription[],
|
||||
): Subscriptions {
|
||||
const result: Subscriptions = {
|
||||
): Subscriptions['subscriptions'] {
|
||||
const result: Subscriptions['subscriptions'] = {
|
||||
monthly: [],
|
||||
annual: [],
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user