2021-07-04 15:33:05 -04:00
|
|
|
import { At } from "@styled-icons/boxicons-regular";
|
2021-07-06 07:16:29 -04:00
|
|
|
import { Envelope, Key, HelpCircle } from "@styled-icons/boxicons-solid";
|
2021-07-05 06:23:23 -04:00
|
|
|
import { Link, useHistory } from "react-router-dom";
|
|
|
|
import { Users } from "revolt.js/dist/api/objects";
|
|
|
|
|
|
|
|
import styles from "./Panes.module.scss";
|
|
|
|
import { Text } from "preact-i18n";
|
2021-06-19 17:37:12 -04:00
|
|
|
import { useContext, useEffect, useState } from "preact/hooks";
|
2021-07-05 06:23:23 -04:00
|
|
|
|
2021-06-19 17:37:12 -04:00
|
|
|
import { useIntermediate } from "../../../context/intermediate/Intermediate";
|
2021-07-05 06:23:23 -04:00
|
|
|
import {
|
2021-07-05 06:25:20 -04:00
|
|
|
ClientStatus,
|
|
|
|
StatusContext,
|
2021-07-05 06:23:23 -04:00
|
|
|
} from "../../../context/revoltjs/RevoltClient";
|
|
|
|
import { useForceUpdate, useSelf } from "../../../context/revoltjs/hooks";
|
|
|
|
|
|
|
|
import UserIcon from "../../../components/common/user/UserIcon";
|
|
|
|
import Button from "../../../components/ui/Button";
|
|
|
|
import Overline from "../../../components/ui/Overline";
|
2021-07-06 07:36:32 -04:00
|
|
|
import Tooltip from "../../../components/common/Tooltip";
|
2021-07-05 06:23:23 -04:00
|
|
|
import Tip from "../../../components/ui/Tip";
|
2021-06-19 17:37:12 -04:00
|
|
|
|
|
|
|
export function Account() {
|
2021-07-06 08:29:11 -04:00
|
|
|
const { openScreen, writeClipboard } = useIntermediate();
|
2021-07-05 06:25:20 -04:00
|
|
|
const status = useContext(StatusContext);
|
2021-06-19 17:37:12 -04:00
|
|
|
|
2021-07-05 06:25:20 -04:00
|
|
|
const ctx = useForceUpdate();
|
|
|
|
const user = useSelf(ctx);
|
|
|
|
if (!user) return null;
|
2021-06-19 17:37:12 -04:00
|
|
|
|
2021-07-05 06:25:20 -04:00
|
|
|
const [email, setEmail] = useState("...");
|
2021-07-06 08:29:11 -04:00
|
|
|
const [revealEmail, setRevealEmail] = useState(false);
|
2021-07-05 06:25:20 -04:00
|
|
|
const [profile, setProfile] = useState<undefined | Users.Profile>(
|
|
|
|
undefined,
|
|
|
|
);
|
|
|
|
const history = useHistory();
|
2021-06-19 17:37:12 -04:00
|
|
|
|
2021-07-05 06:25:20 -04:00
|
|
|
function switchPage(to: string) {
|
|
|
|
history.replace(`/settings/${to}`);
|
|
|
|
}
|
2021-06-19 17:37:12 -04:00
|
|
|
|
2021-07-05 06:25:20 -04:00
|
|
|
useEffect(() => {
|
|
|
|
if (email === "..." && status === ClientStatus.ONLINE) {
|
|
|
|
ctx.client
|
|
|
|
.req("GET", "/auth/user")
|
|
|
|
.then((account) => setEmail(account.email));
|
|
|
|
}
|
2021-06-19 17:37:12 -04:00
|
|
|
|
2021-07-05 06:25:20 -04:00
|
|
|
if (profile === undefined && status === ClientStatus.ONLINE) {
|
|
|
|
ctx.client.users
|
|
|
|
.fetchProfile(user._id)
|
|
|
|
.then((profile) => setProfile(profile ?? {}));
|
|
|
|
}
|
|
|
|
}, [status]);
|
2021-06-19 17:37:12 -04:00
|
|
|
|
2021-07-05 06:25:20 -04:00
|
|
|
return (
|
|
|
|
<div className={styles.user}>
|
|
|
|
<div className={styles.banner}>
|
|
|
|
<UserIcon
|
|
|
|
className={styles.avatar}
|
|
|
|
target={user}
|
|
|
|
size={72}
|
|
|
|
onClick={() => switchPage("profile")}
|
|
|
|
/>
|
2021-07-06 07:16:29 -04:00
|
|
|
<div className={styles.userDetail}>
|
|
|
|
<div className={styles.username}>@{user.username}</div>
|
2021-07-06 07:36:32 -04:00
|
|
|
<div className={styles.userid}>
|
2021-07-06 08:29:11 -04:00
|
|
|
<Tooltip content={<Text id="app.settings.pages.account.unique_id" />}>
|
2021-07-06 07:36:32 -04:00
|
|
|
<HelpCircle size={16} />
|
|
|
|
</Tooltip>
|
2021-07-06 08:29:11 -04:00
|
|
|
<Tooltip content={<Text id="app.special.copy" />}>
|
|
|
|
<a onClick={() => writeClipboard(user._id)}>
|
|
|
|
{user._id}
|
|
|
|
</a>
|
|
|
|
</Tooltip>
|
2021-07-06 07:36:32 -04:00
|
|
|
</div>
|
2021-07-06 07:16:29 -04:00
|
|
|
</div>
|
2021-07-05 06:25:20 -04:00
|
|
|
</div>
|
|
|
|
<div className={styles.details}>
|
|
|
|
{(
|
|
|
|
[
|
|
|
|
["username", user.username, <At size={24} />],
|
|
|
|
["email", email, <Envelope size={24} />],
|
2021-07-05 17:49:57 -04:00
|
|
|
["password", "***********", <Key size={24} />],
|
2021-07-05 06:25:20 -04:00
|
|
|
] as const
|
|
|
|
).map(([field, value, icon]) => (
|
|
|
|
<div>
|
|
|
|
{icon}
|
|
|
|
<div className={styles.detail}>
|
2021-07-05 17:49:57 -04:00
|
|
|
<div className={styles.subtext}>
|
2021-07-05 06:25:20 -04:00
|
|
|
<Text id={`login.${field}`} />
|
2021-07-05 17:49:57 -04:00
|
|
|
</div>
|
2021-07-06 08:29:11 -04:00
|
|
|
<p>{
|
|
|
|
field === 'email' ?
|
|
|
|
(revealEmail ? value :
|
|
|
|
<>***********@{value.split('@').pop()} <a onClick={() => setRevealEmail(true)}>
|
|
|
|
<Text id="app.special.modals.actions.reveal" /></a></>)
|
|
|
|
: value
|
|
|
|
}</p>
|
2021-07-05 06:25:20 -04:00
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<Button
|
|
|
|
onClick={() =>
|
|
|
|
openScreen({
|
|
|
|
id: "modify_account",
|
|
|
|
field: field,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
contrast>
|
|
|
|
<Text id="app.settings.pages.account.change_field" />
|
|
|
|
</Button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
))}
|
|
|
|
</div>
|
2021-07-06 08:29:11 -04:00
|
|
|
<h3><Text id="app.settings.pages.account.account_management.title" /></h3>
|
|
|
|
<h5><Text id="app.settings.pages.account.account_management.description" /></h5>
|
|
|
|
|
|
|
|
<h3><Text id="app.settings.pages.account.2fa.title" /></h3>
|
|
|
|
<h5>Currently work in progress, see <a href="https://gitlab.insrt.uk/insert/rauth/-/issues/2" target="_blank">tracking issue here</a>.</h5>
|
|
|
|
{/*<h5><Text id="app.settings.pages.account.two_factor_auth.description" /></h5>
|
2021-07-06 08:24:24 -04:00
|
|
|
<Button accent compact>
|
|
|
|
<Text id="app.settings.pages.account.two_factor_auth.add_auth" />
|
2021-07-05 17:49:57 -04:00
|
|
|
</Button>*/}
|
2021-07-06 08:29:11 -04:00
|
|
|
|
|
|
|
<h3><Text id="app.settings.pages.account.manage.title" /></h3>
|
|
|
|
<h5><Text id="app.settings.pages.account.manage.desciption" /></h5>
|
2021-07-06 08:24:24 -04:00
|
|
|
<div className={styles.buttons}>
|
2021-07-06 08:29:11 -04:00
|
|
|
{/* <Button contrast>
|
|
|
|
<Text id="app.settings.pages.account.manage.disable" />
|
|
|
|
</Button> */}
|
|
|
|
<a href="mailto:contact@revolt.chat?subject=Delete%20my%20account">
|
|
|
|
<Button contrast>
|
|
|
|
<Text id="app.settings.pages.account.manage.delete" />
|
|
|
|
</Button>
|
|
|
|
</a>
|
2021-07-06 08:24:24 -04:00
|
|
|
</div>
|
2021-07-06 08:29:11 -04:00
|
|
|
|
2021-07-05 06:25:20 -04:00
|
|
|
<Tip>
|
|
|
|
<span>
|
|
|
|
<Text id="app.settings.tips.account.a" />
|
|
|
|
</span>{" "}
|
|
|
|
<a onClick={() => switchPage("profile")}>
|
|
|
|
<Text id="app.settings.tips.account.b" />
|
|
|
|
</a>
|
|
|
|
</Tip>
|
|
|
|
</div>
|
|
|
|
);
|
2021-06-19 17:37:12 -04:00
|
|
|
}
|