Skip to content

Commit 76d93b0

Browse files
authored
feat(project): support delete account (#1577)
* feat(project): support delete account * validate before deleting account
1 parent bdf8eed commit 76d93b0

File tree

8 files changed

+112
-8
lines changed

8 files changed

+112
-8
lines changed

desktop/renderer-app/src/api-middleware/flatServer/index.ts

+12
Original file line numberDiff line numberDiff line change
@@ -681,3 +681,15 @@ export async function removeBinding(target: LoginPlatform): Promise<RemoveBindin
681681
target,
682682
});
683683
}
684+
685+
export interface DeleteAccountValidateResult {
686+
alreadyJoinedRoomCount: number;
687+
}
688+
689+
export async function deleteAccountValidate(): Promise<DeleteAccountValidateResult> {
690+
return await post<{}, DeleteAccountValidateResult>("user/deleteAccount/validate", {});
691+
}
692+
693+
export async function deleteAccount(): Promise<void> {
694+
await post<{}, {}>("user/deleteAccount", {});
695+
}

desktop/renderer-app/src/pages/UserSettingPage/GeneralSettingPage/index.tsx

+38-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import "./style.less";
22

33
import React, { useContext, useEffect, useState } from "react";
4-
import { Checkbox, Input, message, Radio, RadioChangeEvent } from "antd";
4+
import { Button, Checkbox, Input, message, Modal, Radio, RadioChangeEvent } from "antd";
55
import { observer } from "mobx-react-lite";
66
import { useTranslation } from "react-i18next";
77
import { AppearancePicker, FlatPrefersColorScheme } from "flat-components";
@@ -10,12 +10,19 @@ import { UserSettingLayoutContainer } from "../UserSettingLayoutContainer";
1010
import { ipcSyncByApp, ipcAsyncByApp } from "../../../utils/ipc";
1111
import { ConfigStoreContext, GlobalStoreContext } from "../../../components/StoreProvider";
1212
import { useSafePromise } from "../../../utils/hooks/lifecycle";
13-
import { loginCheck, rename } from "../../../api-middleware/flatServer";
13+
import {
14+
deleteAccount,
15+
deleteAccountValidate,
16+
loginCheck,
17+
rename,
18+
} from "../../../api-middleware/flatServer";
1419
import { ConfirmButtons } from "./ConfirmButtons";
1520
import { UploadAvatar, uploadAvatar } from "./UploadAvatar";
1621
import { useBindingList } from "./binding";
1722
import { BindWeChat } from "./binding/WeChat";
1823
import { BindGitHub } from "./binding/GitHub";
24+
import { RouteNameType, usePushHistory } from "../../../utils/routes";
25+
import { errorTips } from "../../../components/Tips/ErrorTips";
1926

2027
enum SelectLanguage {
2128
Chinese,
@@ -24,6 +31,7 @@ enum SelectLanguage {
2431

2532
export const GeneralSettingPage = observer(function GeneralSettingPage() {
2633
const sp = useSafePromise();
34+
const pushHistory = usePushHistory();
2735
const { t, i18n } = useTranslation();
2836
const [openAtLogin, setOpenAtLogin] = useState(false);
2937
const configStore = useContext(ConfigStoreContext);
@@ -81,6 +89,26 @@ export const GeneralSettingPage = observer(function GeneralSettingPage() {
8189
configStore.updatePrefersColorScheme(prefersColorScheme);
8290
};
8391

92+
async function removeAccount(): Promise<void> {
93+
const { alreadyJoinedRoomCount } = await sp(deleteAccountValidate());
94+
if (alreadyJoinedRoomCount > 0) {
95+
message.error(t("quit-all-rooms-before-delete-account"));
96+
return;
97+
}
98+
Modal.confirm({
99+
content: t("confirm-delete-account"),
100+
onOk: async () => {
101+
try {
102+
await sp(deleteAccount());
103+
globalStore.updateUserInfo(null);
104+
pushHistory(RouteNameType.LoginPage);
105+
} catch (err) {
106+
errorTips(err);
107+
}
108+
},
109+
});
110+
}
111+
84112
return (
85113
<UserSettingLayoutContainer>
86114
<div className="general-setting-container">
@@ -146,6 +174,14 @@ export const GeneralSettingPage = observer(function GeneralSettingPage() {
146174
defaultValue={configStore.prefersColorScheme}
147175
/>
148176
</div>
177+
<div className="general-setting-user-account">
178+
<span className="general-setting-title">{t("delete-account")}</span>
179+
<div>
180+
<Button danger onClick={removeAccount}>
181+
{t("delete-account")}
182+
</Button>
183+
</div>
184+
</div>
149185
</div>
150186
</UserSettingLayoutContainer>
151187
);

desktop/renderer-app/src/pages/UserSettingPage/GeneralSettingPage/style.less

+2-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@
108108
}
109109
}
110110

111-
.general-setting-binding-profile {
111+
.general-setting-binding-profile,
112+
.general-setting-user-account {
112113
padding-top: 12px;
113114
}
114115

packages/flat-i18n/locales/en.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -465,5 +465,8 @@
465465
"is-bind": "is bind",
466466
"not-bind": "not bind",
467467
"unbind-confirm": "Are you sure to unbind?",
468-
"unbind-success": "Unbind success"
468+
"unbind-success": "Unbind success",
469+
"delete-account": "Delete Account",
470+
"confirm-delete-account": "Are you sure to delete your account?",
471+
"quit-all-rooms-before-delete-account": "Please quit all rooms before deleting account."
469472
}

packages/flat-i18n/locales/zh-CN.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -465,5 +465,8 @@
465465
"is-bind": "已绑定",
466466
"not-bind": "未绑定",
467467
"unbind-confirm": "确定解除绑定吗?",
468-
"unbind-success": "解绑成功"
468+
"unbind-success": "解绑成功",
469+
"delete-account": "账号注销",
470+
"confirm-delete-account": "确定注销账号吗?",
471+
"quit-all-rooms-before-delete-account": "请先退出所有房间"
469472
}

web/flat-web/src/api-middleware/flatServer/index.ts

+12
Original file line numberDiff line numberDiff line change
@@ -681,3 +681,15 @@ export async function removeBinding(target: LoginPlatform): Promise<RemoveBindin
681681
target,
682682
});
683683
}
684+
685+
export interface DeleteAccountValidateResult {
686+
alreadyJoinedRoomCount: number;
687+
}
688+
689+
export async function deleteAccountValidate(): Promise<DeleteAccountValidateResult> {
690+
return await post<{}, DeleteAccountValidateResult>("user/deleteAccount/validate", {});
691+
}
692+
693+
export async function deleteAccount(): Promise<void> {
694+
await post<{}, {}>("user/deleteAccount", {});
695+
}

web/flat-web/src/pages/UserSettingPage/GeneralSettingPage/index.less

+2-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@
112112
padding-bottom: 3px;
113113
}
114114

115-
.general-setting-binding-profile {
115+
.general-setting-binding-profile,
116+
.general-setting-user-account {
116117
padding-top: 12px;
117118
}
118119

web/flat-web/src/pages/UserSettingPage/GeneralSettingPage/index.tsx

+38-2
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,26 @@ import "./index.less";
44

55
import React, { useContext, useState } from "react";
66
import { observer } from "mobx-react-lite";
7-
import { Checkbox, Input, message, Radio } from "antd";
7+
import { Button, Checkbox, Input, message, Modal, Radio } from "antd";
88
import { FlatPrefersColorScheme, AppearancePicker } from "flat-components";
99
import { UserSettingLayoutContainer } from "../UserSettingLayoutContainer";
1010
import { useTranslation } from "react-i18next";
1111

1212
import { ConfigStoreContext, GlobalStoreContext } from "../../../components/StoreProvider";
1313
import { useSafePromise } from "../../../utils/hooks/lifecycle";
14-
import { loginCheck, rename } from "../../../api-middleware/flatServer";
14+
import {
15+
deleteAccount,
16+
deleteAccountValidate,
17+
loginCheck,
18+
rename,
19+
} from "../../../api-middleware/flatServer";
1520
import { ConfirmButtons } from "./ConfirmButtons";
1621
import { uploadAvatar, UploadAvatar } from "./UploadAvatar";
1722
import { BindWeChat } from "./binding/WeChat";
1823
import { useBindingList } from "./binding";
1924
import { BindGitHub } from "./binding/GitHub";
25+
import { errorTips } from "../../../components/Tips/ErrorTips";
26+
import { RouteNameType, usePushHistory } from "../../../utils/routes";
2027

2128
enum SelectLanguage {
2229
Chinese,
@@ -28,6 +35,7 @@ export const GeneralSettingPage = observer(function GeneralSettingPage() {
2835
const configStore = useContext(ConfigStoreContext);
2936

3037
const sp = useSafePromise();
38+
const pushHistory = usePushHistory();
3139
const { t, i18n } = useTranslation();
3240

3341
const [name, setName] = useState(globalStore.userName || "");
@@ -65,6 +73,26 @@ export const GeneralSettingPage = observer(function GeneralSettingPage() {
6573
configStore.updatePrefersColorScheme(prefersColorScheme);
6674
};
6775

76+
async function removeAccount(): Promise<void> {
77+
const { alreadyJoinedRoomCount } = await sp(deleteAccountValidate());
78+
if (alreadyJoinedRoomCount > 0) {
79+
message.error(t("quit-all-rooms-before-delete-account"));
80+
return;
81+
}
82+
Modal.confirm({
83+
content: t("confirm-delete-account"),
84+
onOk: async () => {
85+
try {
86+
await sp(deleteAccount());
87+
globalStore.updateUserInfo(null);
88+
pushHistory(RouteNameType.LoginPage);
89+
} catch (err) {
90+
errorTips(err);
91+
}
92+
},
93+
});
94+
}
95+
6896
return (
6997
<UserSettingLayoutContainer>
7098
<div className="general-setting-container">
@@ -134,6 +162,14 @@ export const GeneralSettingPage = observer(function GeneralSettingPage() {
134162
<span className="checkbox-item-inner">{t("turn-on-device-test")}</span>
135163
</Checkbox>
136164
</div>
165+
<div className="general-setting-user-account">
166+
<span className="general-setting-title">{t("delete-account")}</span>
167+
<div>
168+
<Button danger onClick={removeAccount}>
169+
{t("delete-account")}
170+
</Button>
171+
</div>
172+
</div>
137173
</div>
138174
</UserSettingLayoutContainer>
139175
);

0 commit comments

Comments
 (0)