aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/views/settings/index.tsx
blob: b9a8209b64bbab4559ae1ca1a9d86222e653d8db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import React, { useState } from "react";
import { useHistory } from "react-router";
import { useTranslation } from "react-i18next";

import { useUser, userService } from "@/services/user";

import ChangePasswordDialog from "./ChangePasswordDialog";
import ChangeAvatarDialog from "./ChangeAvatarDialog";
import ChangeNicknameDialog from "./ChangeNicknameDialog";
import ConfirmDialog from "../common/dailog/ConfirmDialog";
import Card from "../common/Card";

import "./index.css";

const SettingsPage: React.FC = (_) => {
  const { i18n, t } = useTranslation();
  const user = useUser();
  const history = useHistory();

  const [dialog, setDialog] = useState<
    null | "changepassword" | "changeavatar" | "changenickname" | "logout"
  >(null);

  const language = i18n.language.slice(0, 2);

  return (
    <>
      <div className="container">
        {user ? (
          <Card className="my-3 py-3">
            <h3 className="px-3 mb-3 cru-color-primary">
              {t("settings.subheaders.account")}
            </h3>
            <div
              className="settings-item clickable first"
              onClick={() => setDialog("changeavatar")}
            >
              {t("settings.changeAvatar")}
            </div>
            <div
              className="settings-item clickable"
              onClick={() => setDialog("changenickname")}
            >
              {t("settings.changeNickname")}
            </div>
            <div
              className="settings-item clickable cru-color-danger"
              onClick={() => setDialog("changepassword")}
            >
              {t("settings.changePassword")}
            </div>
            <div
              className="settings-item clickable cru-color-danger"
              onClick={() => {
                setDialog("logout");
              }}
            >
              {t("settings.logout")}
            </div>
          </Card>
        ) : null}
        <Card className="my-3 py-3">
          <h3 className="px-3 mb-3 cru-color-primary">
            {t("settings.subheaders.customization")}
          </h3>
          <div className="row settings-item first mx-0">
            <div className="col col-12 col-sm-auto">
              <div>{t("settings.languagePrimary")}</div>
              <small className="d-block cru-color-secondary">
                {t("settings.languageSecondary")}
              </small>
            </div>
            <div className="col col-12 col-sm-auto">
              <select
                value={language}
                onChange={(e) => {
                  void i18n.changeLanguage(e.target.value);
                }}
              >
                <option value="zh">中文</option>
                <option value="en">English</option>
              </select>
            </div>
          </div>
        </Card>
      </div>
      <ChangePasswordDialog
        open={dialog === "changepassword"}
        close={() => setDialog(null)}
      />
      <ConfirmDialog
        title="settings.dialogConfirmLogout.title"
        body="settings.dialogConfirmLogout.prompt"
        onClose={() => setDialog(null)}
        open={dialog === "logout"}
        onConfirm={() => {
          void userService.logout().then(() => {
            history.push("/");
          });
        }}
      />
      <ChangeAvatarDialog
        open={dialog === "changeavatar"}
        close={() => setDialog(null)}
      />
      <ChangeNicknameDialog
        open={dialog === "changenickname"}
        close={() => setDialog(null)}
      />
    </>
  );
};

export default SettingsPage;