From 33181ab8ce0c44a02253df9ee3f53ee93c324757 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 26 Nov 2024 09:41:14 -0600 Subject: [PATCH] Add PTR --- src/screens/Subscriptions/index.tsx | 19 +++++++++++++++--- src/state/purchases/context.tsx | 11 +++++++++- src/state/purchases/index.tsx | 31 +++++++++++++++++++++++++---- 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/screens/Subscriptions/index.tsx b/src/screens/Subscriptions/index.tsx index a96b34c36e..785ddf6a42 100644 --- a/src/screens/Subscriptions/index.tsx +++ b/src/screens/Subscriptions/index.tsx @@ -1,12 +1,12 @@ import React from 'react' -import {TextStyle, View} from 'react-native' +import {RefreshControl,TextStyle, View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {NativeStackScreenProps} from '@react-navigation/native-stack' import {CommonNavigatorParams} from '#/lib/routes/types' import {isAndroid, isIOS, isWeb} from '#/platform/detection' -import {PurchasesState, usePurchases} from '#/state/purchases' +import {PurchasesState, usePurchases, usePurchasesApi} from '#/state/purchases' import {useManageSubscription} from '#/state/purchases/hooks/useManageSubscription' import {useNativeUserState} from '#/state/purchases/hooks/useNativeUserState' import { @@ -48,13 +48,26 @@ export type ScreenProps = NativeStackScreenProps< export function Subscriptions(_props: ScreenProps) { const {_} = useLingui() const purchases = usePurchases() + const {refetch} = usePurchasesApi() const {loading, restricted} = useNativeUserState() + const [refreshing, setRefreshing] = React.useState(false) + const onRefresh = async () => { + setRefreshing(true) + try { + await refetch() + } finally { + setRefreshing(false) + } + } return ( - + + }> {purchases.status === 'loading' || loading ? ( diff --git a/src/state/purchases/context.tsx b/src/state/purchases/context.tsx index efec6b151e..01d8ad3db4 100644 --- a/src/state/purchases/context.tsx +++ b/src/state/purchases/context.tsx @@ -12,12 +12,21 @@ export type PurchasesState = } | { status: 'ready' + refetching: boolean email?: string subscriptions: APISubscription[] entitlements: APIEntitlement[] config: {} } -export const Context = React.createContext({ +export type PurchasesApi = { + refetch: () => Promise +} + +export const StateContext = React.createContext({ status: 'loading', }) + +export const ApiContext = React.createContext({ + refetch: async () => {}, +}) diff --git a/src/state/purchases/index.tsx b/src/state/purchases/index.tsx index d9794f600a..35a651f891 100644 --- a/src/state/purchases/index.tsx +++ b/src/state/purchases/index.tsx @@ -1,6 +1,11 @@ import React from 'react' -import {Context, PurchasesState} from '#/state/purchases/context' +import { + ApiContext, + PurchasesApi, + PurchasesState, + StateContext, +} from '#/state/purchases/context' import {useNativeEventsListener} from '#/state/purchases/hooks/useNativeEventsListener' import {usePurchasesState} from '#/state/purchases/hooks/usePurchasesState' @@ -11,6 +16,7 @@ export function Provider({children}: {children: React.ReactNode}) { data: purchases, error: purchasesStateError, refetch, + isRefetching, } = usePurchasesState() const ctx = React.useMemo(() => { if (purchasesStateError) { @@ -25,13 +31,22 @@ export function Provider({children}: {children: React.ReactNode}) { } else { return { status: 'ready', + refetching: isRefetching, email: purchases?.email, subscriptions: purchases?.subscriptions ?? [], entitlements: purchases?.entitlements ?? [], config: {}, } } - }, [purchases, purchasesStateError]) + }, [purchases, purchasesStateError, isRefetching]) + + const apiCtx = React.useMemo(() => { + return { + refetch: async () => { + await refetch() + }, + } + }, [refetch]) useNativeEventsListener({ onCustomerInfoUpdated() { @@ -39,9 +54,17 @@ export function Provider({children}: {children: React.ReactNode}) { }, }) - return {children} + return ( + + {children} + + ) } export function usePurchases() { - return React.useContext(Context) + return React.useContext(StateContext) +} + +export function usePurchasesApi() { + return React.useContext(ApiContext) }