feat(core): confirm before cancel in billing page (#4749)

This commit is contained in:
Cats Juice
2023-10-28 14:12:25 +08:00
committed by GitHub
parent abbd8235aa
commit 8c194ab8b0

View File

@@ -21,7 +21,7 @@ import { useMutation, useQuery } from '@affine/workspace/affine/gql';
import { ArrowRightSmallIcon } from '@blocksuite/icons'; import { ArrowRightSmallIcon } from '@blocksuite/icons';
import { Button, IconButton } from '@toeverything/components/button'; import { Button, IconButton } from '@toeverything/components/button';
import { useSetAtom } from 'jotai'; import { useSetAtom } from 'jotai';
import { Suspense, useCallback, useMemo } from 'react'; import { Suspense, useCallback, useMemo, useState } from 'react';
import { openSettingModalAtom } from '../../../../../atoms'; import { openSettingModalAtom } from '../../../../../atoms';
import { useCurrentLoginStatus } from '../../../../../hooks/affine/use-current-login-status'; import { useCurrentLoginStatus } from '../../../../../hooks/affine/use-current-login-status';
@@ -29,6 +29,7 @@ import {
type SubscriptionMutator, type SubscriptionMutator,
useUserSubscription, useUserSubscription,
} from '../../../../../hooks/use-subscription'; } from '../../../../../hooks/use-subscription';
import { DowngradeModal } from '../plans/modals';
import * as styles from './style.css'; import * as styles from './style.css';
enum DescriptionI18NKey { enum DescriptionI18NKey {
@@ -83,6 +84,19 @@ export const BillingSettings = () => {
const SubscriptionSettings = () => { const SubscriptionSettings = () => {
const [subscription, mutateSubscription] = useUserSubscription(); const [subscription, mutateSubscription] = useUserSubscription();
const { isMutating, trigger } = useMutation({
mutation: cancelSubscriptionMutation,
});
const [openCancelModal, setOpenCancelModal] = useState(false);
const cancel = useCallback(() => {
trigger(null, {
onSuccess: data => {
mutateSubscription(data.cancelSubscription);
},
});
}, [trigger, mutateSubscription]);
const { data: pricesQueryResult } = useQuery({ const { data: pricesQueryResult } = useQuery({
query: pricesQuery, query: pricesQuery,
}); });
@@ -189,6 +203,8 @@ const SubscriptionSettings = () => {
</SettingRow> </SettingRow>
) : ( ) : (
<SettingRow <SettingRow
style={{ cursor: 'pointer' }}
onClick={() => (isMutating ? null : setOpenCancelModal(true))}
className="dangerous-setting" className="dangerous-setting"
name={t[ name={t[
'com.affine.payment.billing-setting.cancel-subscription' 'com.affine.payment.billing-setting.cancel-subscription'
@@ -199,9 +215,14 @@ const SubscriptionSettings = () => {
cancelDate: new Date(subscription.end).toLocaleDateString(), cancelDate: new Date(subscription.end).toLocaleDateString(),
})} })}
> >
<CancelSubscription onSubscriptionUpdate={mutateSubscription} /> <CancelSubscription loading={isMutating} />
</SettingRow> </SettingRow>
)} )}
<DowngradeModal
open={openCancelModal}
onCancel={() => (isMutating ? null : cancel())}
onOpenChange={setOpenCancelModal}
/>
</> </>
)} )}
</div> </div>
@@ -287,29 +308,13 @@ const ResumeSubscription = ({
); );
}; };
const CancelSubscription = ({ const CancelSubscription = ({ loading }: { loading?: boolean }) => {
onSubscriptionUpdate,
}: {
onSubscriptionUpdate: SubscriptionMutator;
}) => {
const { isMutating, trigger } = useMutation({
mutation: cancelSubscriptionMutation,
});
const cancel = useCallback(() => {
trigger(null, {
onSuccess: data => {
onSubscriptionUpdate(data.cancelSubscription);
},
});
}, [trigger, onSubscriptionUpdate]);
return ( return (
<IconButton <IconButton
style={{ pointerEvents: 'none' }}
icon={<ArrowRightSmallIcon />} icon={<ArrowRightSmallIcon />}
disabled={isMutating} disabled={loading}
loading={isMutating} loading={loading}
onClick={cancel /* TODO: popup confirmation modal instead */}
/> />
); );
}; };