feat(core): compatible with multiple subscriptions (#6277)

This commit is contained in:
CatsJuice
2024-04-01 07:28:33 +00:00
parent 9381757982
commit af2158cb0c
5 changed files with 23 additions and 18 deletions

View File

@@ -1,20 +1,22 @@
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
import type { SubscriptionQuery } from '@affine/graphql';
import { subscriptionQuery } from '@affine/graphql';
import { SubscriptionPlan, subscriptionQuery } from '@affine/graphql';
import { useServerFeatures } from './affine/use-server-config';
import { useQuery } from './use-query';
export type Subscription = NonNullable<
NonNullable<SubscriptionQuery['currentUser']>['subscription']
NonNullable<SubscriptionQuery['currentUser']>['subscriptions'][number]
>;
export type SubscriptionMutator = (update?: Partial<Subscription>) => void;
const selector = (data: SubscriptionQuery) =>
data.currentUser?.subscription ?? null;
const selector = (data: SubscriptionQuery, plan: SubscriptionPlan) =>
(data.currentUser?.subscriptions ?? []).find(p => p.plan === plan);
export const useUserSubscription = () => {
export const useUserSubscription = (
plan: SubscriptionPlan = SubscriptionPlan.Pro
) => {
const { payment: hasPaymentFeature } = useServerFeatures();
const { data, mutate } = useQuery(
hasPaymentFeature ? { query: subscriptionQuery } : undefined
@@ -23,26 +25,25 @@ export const useUserSubscription = () => {
const set: SubscriptionMutator = useAsyncCallback(
async (update?: Partial<Subscription>) => {
await mutate(prev => {
if (!update || !prev?.currentUser?.subscription) {
if (!update || !prev?.currentUser?.subscriptions?.length) {
return;
}
return {
currentUser: {
subscription: {
...prev.currentUser?.subscription,
...update,
},
subscriptions: (prev.currentUser?.subscriptions ?? []).map(sub =>
sub.plan !== plan ? sub : { ...sub, ...update }
),
},
};
});
},
[mutate]
[mutate, plan]
);
if (!hasPaymentFeature) {
return [null, () => {}] as const;
}
return [selector(data), set] as const;
return [selector(data, plan), set] as const;
};