From f4f9c9644ab27941af30bd4359f94b6f9ef5a483 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 9 Dec 2024 10:18:35 -0600 Subject: [PATCH] Allow managing web subscriptions from native --- src/screens/Subscriptions/index.tsx | 9 +++-- .../hooks/useManageSubscription/index.ts | 20 +++++++---- .../hooks/useManageSubscription/index.web.ts | 33 +---------------- .../hooks/useManageSubscription/web.ts | 35 +++++++++++++++++++ 4 files changed, 56 insertions(+), 41 deletions(-) create mode 100644 src/state/purchases/hooks/useManageSubscription/web.ts diff --git a/src/screens/Subscriptions/index.tsx b/src/screens/Subscriptions/index.tsx index cbca9e8a92..09f9669217 100644 --- a/src/screens/Subscriptions/index.tsx +++ b/src/screens/Subscriptions/index.tsx @@ -6,7 +6,7 @@ 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 {isAndroid, isIOS, isNative,isWeb} from '#/platform/detection' import {PurchasesState, usePurchases, usePurchasesApi} from '#/state/purchases' import {useManageSubscription} from '#/state/purchases/hooks/useManageSubscription' import {useNativeUserState} from '#/state/purchases/hooks/useNativeUserState' @@ -411,14 +411,17 @@ export function Subscription({ }) { const t = useTheme() const {_} = useLingui() - const {mutateAsync: manageSubscription} = useManageSubscription() + const {mutateAsync: manageSubscription} = useManageSubscription({ + platform: sub.platform, + }) const ui = useSubscriptionUI({subscription: sub}) const isExpired = sub.status !== 'active' && sub.status !== 'paused' const canManage = (isWeb && sub.platform === PlatformId.Web) || (isIOS && sub.platform === PlatformId.Ios) || - (isAndroid && sub.platform === PlatformId.Android) + (isAndroid && sub.platform === PlatformId.Android) || + (isNative && sub.platform === PlatformId.Web) const showManage = canManage && !isExpired const statusStyles = React.useMemo(() => { diff --git a/src/state/purchases/hooks/useManageSubscription/index.ts b/src/state/purchases/hooks/useManageSubscription/index.ts index 00232e4757..a6311cf467 100644 --- a/src/state/purchases/hooks/useManageSubscription/index.ts +++ b/src/state/purchases/hooks/useManageSubscription/index.ts @@ -2,15 +2,23 @@ import {Linking} from 'react-native' import Purchases from 'react-native-purchases' import {useMutation} from '@tanstack/react-query' -export function useManageSubscription() { +import {useManageSubscription as useManageWebSubscription} from '#/state/purchases/hooks/useManageSubscription/web' +import {PlatformId} from '#/state/purchases/types' + +export function useManageSubscription({platform}: {platform: PlatformId}) { + const web = useManageWebSubscription({platform}) return useMutation({ async mutationFn() { - const customer = await Purchases.getCustomerInfo() - - if (customer.managementURL) { - Linking.openURL(customer.managementURL) + if (platform === PlatformId.Web) { + await web.mutateAsync() } else { - // TODO + const customer = await Purchases.getCustomerInfo() + + if (customer.managementURL) { + Linking.openURL(customer.managementURL) + } else { + // TODO + } } }, }) diff --git a/src/state/purchases/hooks/useManageSubscription/index.web.ts b/src/state/purchases/hooks/useManageSubscription/index.web.ts index 4b3cc2f909..c73ad99814 100644 --- a/src/state/purchases/hooks/useManageSubscription/index.web.ts +++ b/src/state/purchases/hooks/useManageSubscription/index.web.ts @@ -1,32 +1 @@ -import {Linking} from 'react-native' -import {useMutation} from '@tanstack/react-query' - -import {api} from '#/state/purchases/api' -import {useSession} from '#/state/session' -import {IS_DEV} from '#/env' - -export function useManageSubscription() { - const {currentAccount} = useSession() - - return useMutation({ - async mutationFn() { - const {data, error} = await api<{ - managementUrl: string - }>('/account/create-management-url', { - method: 'POST', - json: { - did: currentAccount!.did, - redirecturl: IS_DEV - ? 'http://localhost:19006/subscriptions' - : 'https://bsky.app/subscriptions', - }, - }).json() - - if (error || !data) { - throw new Error('Failed to fetch subscriptions state') - } - - Linking.openURL(data.managementUrl) - }, - }) -} +export * from './web' diff --git a/src/state/purchases/hooks/useManageSubscription/web.ts b/src/state/purchases/hooks/useManageSubscription/web.ts new file mode 100644 index 0000000000..2ece6adf16 --- /dev/null +++ b/src/state/purchases/hooks/useManageSubscription/web.ts @@ -0,0 +1,35 @@ +import {Linking} from 'react-native' +import {useMutation} from '@tanstack/react-query' + +import {api} from '#/state/purchases/api' +import {PlatformId} from '#/state/purchases/types' +import {useSession} from '#/state/session' +import {IS_DEV} from '#/env' + +export function useManageSubscription(_props: {platform: PlatformId}) { + const {currentAccount} = useSession() + + return useMutation({ + async mutationFn() { + const {data, error} = await api<{ + managementUrl: string + }>('/account/create-management-url', { + method: 'POST', + json: { + did: currentAccount!.did, + redirecturl: IS_DEV + ? 'http://localhost:19006/subscriptions' + : 'https://bsky.app/subscriptions', + }, + }).json() + + console.log(error, data) + + if (error || !data) { + throw new Error('Failed to fetch subscriptions state') + } + + Linking.openURL(data.managementUrl) + }, + }) +}