aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/views/settings
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-05-02 18:08:17 +0800
committercrupest <crupest@outlook.com>2022-05-02 18:08:17 +0800
commit793504c6f6c3cc03bbeb60a99947a40b4ce7742c (patch)
treef4b73e0e6cd08fb049e1703ab0bcaae4bf4e0010 /FrontEnd/src/views/settings
parente6092ad3ddf137aa83f054f34e5f1af78b31c25a (diff)
downloadtimeline-793504c6f6c3cc03bbeb60a99947a40b4ce7742c.tar.gz
timeline-793504c6f6c3cc03bbeb60a99947a40b4ce7742c.tar.bz2
timeline-793504c6f6c3cc03bbeb60a99947a40b4ce7742c.zip
...
Diffstat (limited to 'FrontEnd/src/views/settings')
-rw-r--r--FrontEnd/src/views/settings/index.tsx70
1 files changed, 57 insertions, 13 deletions
diff --git a/FrontEnd/src/views/settings/index.tsx b/FrontEnd/src/views/settings/index.tsx
index 633bb209..f5d26e69 100644
--- a/FrontEnd/src/views/settings/index.tsx
+++ b/FrontEnd/src/views/settings/index.tsx
@@ -3,7 +3,7 @@ import { useNavigate } from "react-router-dom";
import { useTranslation } from "react-i18next";
import classnames from "classnames";
-import { convertI18nText, I18nText } from "@/common";
+import { convertI18nText, I18nText, UiLogicError } from "@/common";
import { useUser, userService } from "@/services/user";
import { getHttpUserClient } from "@/http/user";
import { TimelineVisibility } from "@/http/timeline";
@@ -69,10 +69,12 @@ function SettingItemContainer({
className={classnames(
"row settings-item mx-0",
first && "first",
+ onClick && "clickable",
className
)}
+ onClick={onClick}
>
- <div className="px-0 col col-12 col-sm-auto" onClick={onClick}>
+ <div className="px-0 col col-12 col-sm-auto">
<div className={classNames(danger && "cru-color-danger")}>
{convertI18nText(title, t)}
</div>
@@ -87,16 +89,8 @@ function SettingItemContainer({
type ButtonSettingItemProps = SettingItemContainerWithoutChildrenProps;
-const ButtonSettingItem: React.FC<ButtonSettingItemProps> = ({
- className,
- ...props
-}) => {
- return (
- <SettingItemContainer
- className={classNames("clickable", className)}
- {...props}
- />
- );
+const ButtonSettingItem: React.FC<ButtonSettingItemProps> = ({ ...props }) => {
+ return <SettingItemContainer {...props} />;
};
interface SelectSettingItemProps
@@ -145,9 +139,18 @@ const SettingsPage: React.FC = (_) => {
const navigate = useNavigate();
const [dialog, setDialog] = useState<
- null | "changepassword" | "changeavatar" | "changenickname" | "logout"
+ | null
+ | "changepassword"
+ | "changeavatar"
+ | "changenickname"
+ | "logout"
+ | "renewregistercode"
>(null);
+ const [registerCode, setRegisterCode] = useState<undefined | null | string>(
+ undefined
+ );
+
const [bookmarkVisibility, setBookmarkVisibility] =
useState<TimelineVisibility>();
@@ -163,6 +166,20 @@ const SettingsPage: React.FC = (_) => {
}
}, [user]);
+ React.useEffect(() => {
+ setRegisterCode(undefined);
+ }, [user]);
+
+ React.useEffect(() => {
+ if (user != null && registerCode === undefined) {
+ void getHttpUserClient()
+ .getRegisterCode(user.username)
+ .then((code) => {
+ setRegisterCode(code.registerCode ?? null);
+ });
+ }
+ }, [user, registerCode]);
+
const language = i18n.language.slice(0, 2);
return (
@@ -170,6 +187,19 @@ const SettingsPage: React.FC = (_) => {
<div className="container">
{user ? (
<SettingSection title="settings.subheaders.account">
+ <SettingItemContainer
+ title="settings.myRegisterCode"
+ subtext="settings.myRegisterCodeDesc"
+ onClick={() => setDialog("renewregistercode")}
+ >
+ {registerCode === undefined ? (
+ <Spinner />
+ ) : registerCode === null ? (
+ <span>Noop</span>
+ ) : (
+ <code>{registerCode}</code>
+ )}
+ </SettingItemContainer>
<ButtonSettingItem
title="settings.changeAvatar"
onClick={() => setDialog("changeavatar")}
@@ -263,6 +293,20 @@ const SettingsPage: React.FC = (_) => {
});
}}
/>
+ <ConfirmDialog
+ title="settings.renewRegisterCode"
+ body="settings.renewRegisterCodeDesc"
+ onClose={() => setDialog(null)}
+ open={dialog === "renewregistercode"}
+ onConfirm={() => {
+ if (user == null) throw new UiLogicError();
+ void getHttpUserClient()
+ .renewRegisterCode(user.username)
+ .then(() => {
+ setRegisterCode(undefined);
+ });
+ }}
+ />
<ChangeAvatarDialog
open={dialog === "changeavatar"}
close={() => setDialog(null)}