Bunch of contract updates

This commit is contained in:
Eric Bailey
2024-10-28 18:14:36 -05:00
parent 6d0c5078e9
commit e9c6a8461c
9 changed files with 188 additions and 64 deletions
+24 -2
View File
@@ -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'
+16 -7
View File
@@ -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),
}
},
})
}
+15 -3
View File
@@ -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 -2
View File
@@ -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: [],
}