mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-13 21:05:19 +00:00
feat(core): compatible with multiple subscriptions (#6277)
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user