feat(core): add account deletion entry to account settings (#12385)

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Implemented account deletion functionality with confirmation dialogs and success notifications.
  - Added a warning modal for team workspace owners before account deletion.
  - Introduced a new, richly formatted internationalized message for account deletion confirmation.
  - Added a new dialog component to inform users of successful account deletion.
- **Improvements**
  - Updated localization strings to provide detailed guidance and warnings for account deletion.
  - Enhanced error handling by converting errors into user-friendly notifications.
  - Simplified and improved the sign-out process with better error handling and streamlined navigation.
- **Style**
  - Added new style constants for success and warning modals related to account deletion.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
JimmFly
2025-05-27 08:00:44 +00:00
parent 18da2fe4e6
commit 8d3b20ecc7
15 changed files with 372 additions and 89 deletions
@@ -3,11 +3,10 @@ import {
notify,
useConfirmModal,
} from '@affine/component';
import { AuthService, ServerService } from '@affine/core/modules/cloud';
import { GlobalContextService } from '@affine/core/modules/global-context';
import { WorkspacesService } from '@affine/core/modules/workspace';
import { AuthService } from '@affine/core/modules/cloud';
import { UserFriendlyError } from '@affine/error';
import { useI18n } from '@affine/i18n';
import { useLiveData, useService } from '@toeverything/infra';
import { useService } from '@toeverything/infra';
import { useCallback } from 'react';
import { useNavigateHelper } from '../use-navigate-helper';
@@ -26,47 +25,21 @@ export const useSignOut = ({
}: ConfirmModalProps = {}) => {
const t = useI18n();
const { openConfirmModal } = useConfirmModal();
const { openPage } = useNavigateHelper();
const { jumpToIndex } = useNavigateHelper();
const serverService = useService(ServerService);
const authService = useService(AuthService);
const workspacesService = useService(WorkspacesService);
const globalContextService = useService(GlobalContextService);
const workspaces = useLiveData(workspacesService.list.workspaces$);
const currentWorkspaceFlavour = useLiveData(
globalContextService.globalContext.workspaceFlavour.$
);
const signOut = useCallback(async () => {
onConfirm?.()?.catch(console.error);
try {
await authService.signOut();
jumpToIndex();
} catch (err) {
console.error(err);
// TODO(@eyhn): i18n
notify.error({
title: 'Failed to sign out',
});
const error = UserFriendlyError.fromAny(err);
notify.error(error);
}
// if current workspace is sign out, switch to other workspace
if (currentWorkspaceFlavour === serverService.server.id) {
const localWorkspace = workspaces.find(
w => w.flavour !== serverService.server.id
);
if (localWorkspace) {
openPage(localWorkspace.id, 'all');
}
}
}, [
authService,
currentWorkspaceFlavour,
onConfirm,
openPage,
serverService.server.id,
workspaces,
]);
}, [authService, jumpToIndex, onConfirm]);
const getDefaultText = useCallback(
(key: SignOutConfirmModalI18NKeys) => {