diff --git a/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/index.tsx b/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/index.tsx
index f206039628..a99e6f7098 100644
--- a/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/index.tsx
+++ b/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/index.tsx
@@ -19,7 +19,9 @@ import { Trans } from '@affine/i18n';
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { useMutation, useQuery } from '@affine/workspace/affine/gql';
import { ArrowRightSmallIcon } from '@blocksuite/icons';
+import { Skeleton } from '@mui/material';
import { Button, IconButton } from '@toeverything/components/button';
+import { Loading } from '@toeverything/components/loading';
import { useSetAtom } from 'jotai';
import { nanoid } from 'nanoid';
import { Suspense, useCallback, useMemo, useState } from 'react';
@@ -63,16 +65,14 @@ export const BillingSettings = () => {
title={t['com.affine.payment.billing-setting.title']()}
subtitle={t['com.affine.payment.billing-setting.subtitle']()}
/>
- {/* TODO: loading fallback */}
-
+ }>
- {/* TODO: loading fallback */}
-
+ }>
@@ -390,3 +390,28 @@ const InvoiceLine = ({
);
};
+
+const SubscriptionSettingSkeleton = () => {
+ const t = useAFFiNEI18N();
+ return (
+
+
+
+
+
+
+ );
+};
+
+const BillingHistorySkeleton = () => {
+ const t = useAFFiNEI18N();
+ return (
+
+
+
+
+
+ );
+};
diff --git a/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/style.css.ts b/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/style.css.ts
index 55243b36dd..f923725250 100644
--- a/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/style.css.ts
+++ b/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/style.css.ts
@@ -51,3 +51,17 @@ export const currentPlanName = style({
export const button = style({
padding: '4px 12px',
});
+
+export const subscriptionSettingSkeleton = style({
+ display: 'flex',
+ flexDirection: 'column',
+ gap: '24px',
+});
+
+export const billingHistorySkeleton = style({
+ display: 'flex',
+ flexDirection: 'column',
+ minHeight: '72px',
+ alignItems: 'center',
+ justifyContent: 'center',
+});