feat(modal): port ModifyAccount and PendingRequest

This commit is contained in:
Paul Makles 2022-06-18 15:02:59 +01:00
parent 211ff2058a
commit 6755217ad2
9 changed files with 56 additions and 57 deletions

View file

@ -56,7 +56,7 @@ export default observer(
keyof Props | "children" | "as" keyof Props | "children" | "as"
>, >,
) => { ) => {
const client = useClient(); const client = useApplicationState().client!;
const { const {
target, target,

View file

@ -12,6 +12,7 @@ import {
} from "@revoltchat/ui"; } from "@revoltchat/ui";
import { useIntermediate } from "../../../context/intermediate/Intermediate"; import { useIntermediate } from "../../../context/intermediate/Intermediate";
import { modalController } from "../../../context/modals";
import { import {
ClientStatus, ClientStatus,
StatusContext, StatusContext,
@ -62,8 +63,9 @@ export default function EditAccount() {
account account
action={<Pencil size={20} />} action={<Pencil size={20} />}
onClick={() => onClick={() =>
openScreen({ modalController.push({
id: "modify_account", type: "modify_account",
client,
field, field,
}) })
}> }>

View file

@ -8,8 +8,6 @@ import { SpecialPromptModal } from "./modals/Prompt";
import { ChannelInfo } from "./popovers/ChannelInfo"; import { ChannelInfo } from "./popovers/ChannelInfo";
import { CreateBotModal } from "./popovers/CreateBot"; import { CreateBotModal } from "./popovers/CreateBot";
import { ImageViewer } from "./popovers/ImageViewer"; import { ImageViewer } from "./popovers/ImageViewer";
import { ModifyAccountModal } from "./popovers/ModifyAccount";
import { PendingRequests } from "./popovers/PendingRequests";
import { ServerIdentityModal } from "./popovers/ServerIdentityModal"; import { ServerIdentityModal } from "./popovers/ServerIdentityModal";
import { UserPicker } from "./popovers/UserPicker"; import { UserPicker } from "./popovers/UserPicker";
import { UserProfile } from "./popovers/UserProfile"; import { UserProfile } from "./popovers/UserProfile";
@ -35,12 +33,6 @@ export default function Popovers() {
case "channel_info": case "channel_info":
// @ts-expect-error someone figure this out :) // @ts-expect-error someone figure this out :)
return <ChannelInfo {...screen} onClose={onClose} />; return <ChannelInfo {...screen} onClose={onClose} />;
case "pending_requests":
// @ts-expect-error someone figure this out :)
return <PendingRequests {...screen} onClose={onClose} />;
case "modify_account":
// @ts-expect-error someone figure this out :)
return <ModifyAccountModal onClose={onClose} {...screen} />;
case "create_bot": case "create_bot":
// @ts-expect-error someone figure this out :) // @ts-expect-error someone figure this out :)
return <CreateBotModal onClose={onClose} {...screen} />; return <CreateBotModal onClose={onClose} {...screen} />;

View file

@ -1,28 +0,0 @@
import { observer } from "mobx-react-lite";
import { User } from "revolt.js";
import styles from "./UserPicker.module.scss";
import { Text } from "preact-i18n";
import { Modal } from "@revoltchat/ui";
import { Friend } from "../../../pages/friends/Friend";
interface Props {
users: User[];
onClose: () => void;
}
export const PendingRequests = observer(({ users, onClose }: Props) => {
return (
<Modal
title={<Text id="app.special.friends.pending" />}
onClose={onClose}>
<div className={styles.list}>
{users.map((x) => (
<Friend user={x!} key={x!._id} />
))}
</div>
</Modal>
);
});

View file

@ -5,14 +5,12 @@ import { useContext, useState } from "preact/hooks";
import { Category, Error, Modal } from "@revoltchat/ui"; import { Category, Error, Modal } from "@revoltchat/ui";
import { noopTrue } from "../../../lib/js";
import FormField from "../../../pages/login/FormField"; import FormField from "../../../pages/login/FormField";
import { AppContext } from "../../revoltjs/RevoltClient"; import { AppContext } from "../../revoltjs/RevoltClient";
import { takeError } from "../../revoltjs/util"; import { takeError } from "../../revoltjs/util";
import { ModalProps } from "../types";
interface Props {
onClose: () => void;
field: "username" | "email" | "password";
}
interface FormInputs { interface FormInputs {
password: string; password: string;
@ -25,7 +23,10 @@ interface FormInputs {
current_password?: string; current_password?: string;
} }
export function ModifyAccountModal({ onClose, field }: Props) { export default function ModifyAccount({
field,
...props
}: ModalProps<"modify_account">) {
const client = useContext(AppContext); const client = useContext(AppContext);
const [processing, setProcessing] = useState(false); const [processing, setProcessing] = useState(false);
const { handleSubmit, register, errors } = useForm<FormInputs>(); const { handleSubmit, register, errors } = useForm<FormInputs>();
@ -46,19 +47,19 @@ export function ModifyAccountModal({ onClose, field }: Props) {
current_password: password, current_password: password,
email: new_email, email: new_email,
}); });
onClose(); props.onClose();
} else if (field === "password") { } else if (field === "password") {
await client.api.patch("/auth/account/change/password", { await client.api.patch("/auth/account/change/password", {
current_password: password, current_password: password,
password: new_password, password: new_password,
}); });
onClose(); props.onClose();
} else if (field === "username") { } else if (field === "username") {
await client.api.patch("/users/@me/username", { await client.api.patch("/users/@me/username", {
username: new_username, username: new_username,
password, password,
}); });
onClose(); props.onClose();
} }
} catch (err) { } catch (err) {
setError(takeError(err)); setError(takeError(err));
@ -68,16 +69,13 @@ export function ModifyAccountModal({ onClose, field }: Props) {
return ( return (
<Modal <Modal
onClose={onClose} {...props}
title={<Text id={`app.special.modals.account.change.${field}`} />} title={<Text id={`app.special.modals.account.change.${field}`} />}
disabled={processing} disabled={processing}
actions={[ actions={[
{ {
confirmation: true, confirmation: true,
onClick: async () => { onClick: () => void handleSubmit(onSubmit)(),
await handleSubmit(onSubmit)();
return true;
},
children: children:
field === "email" ? ( field === "email" ? (
<Text id="app.special.modals.actions.send_email" /> <Text id="app.special.modals.actions.send_email" />
@ -86,7 +84,7 @@ export function ModifyAccountModal({ onClose, field }: Props) {
), ),
}, },
{ {
onClick: onClose, onClick: noopTrue,
children: <Text id="app.special.modals.actions.cancel" />, children: <Text id="app.special.modals.actions.cancel" />,
palette: "plain", palette: "plain",
}, },

View file

@ -0,0 +1,21 @@
import { Text } from "preact-i18n";
import { Column, Modal } from "@revoltchat/ui";
import { Friend } from "../../../pages/friends/Friend";
import { ModalProps } from "../types";
export default function PendingFriendRequests({
users,
...props
}: ModalProps<"pending_friend_requests">) {
return (
<Modal {...props} title={<Text id="app.special.friends.pending" />}>
<Column>
{users.map((x) => (
<Friend user={x!} key={x!._id} />
))}
</Column>
</Modal>
);
}

View file

@ -21,7 +21,9 @@ import LinkWarning from "./components/LinkWarning";
import MFAEnableTOTP from "./components/MFAEnableTOTP"; import MFAEnableTOTP from "./components/MFAEnableTOTP";
import MFAFlow from "./components/MFAFlow"; import MFAFlow from "./components/MFAFlow";
import MFARecovery from "./components/MFARecovery"; import MFARecovery from "./components/MFARecovery";
import ModifyAccount from "./components/ModifyAccount";
import OutOfDate from "./components/OutOfDate"; import OutOfDate from "./components/OutOfDate";
import PendingFriendRequests from "./components/PendingFriendRequests";
import ShowToken from "./components/ShowToken"; import ShowToken from "./components/ShowToken";
import SignOutSessions from "./components/SignOutSessions"; import SignOutSessions from "./components/SignOutSessions";
import SignedOut from "./components/SignedOut"; import SignedOut from "./components/SignedOut";
@ -206,7 +208,9 @@ export const modalController = new ModalControllerExtended({
mfa_flow: MFAFlow, mfa_flow: MFAFlow,
mfa_recovery: MFARecovery, mfa_recovery: MFARecovery,
mfa_enable_totp: MFAEnableTOTP, mfa_enable_totp: MFAEnableTOTP,
modify_account: ModifyAccount,
out_of_date: OutOfDate, out_of_date: OutOfDate,
pending_friend_requests: PendingFriendRequests,
show_token: ShowToken, show_token: ShowToken,
signed_out: SignedOut, signed_out: SignedOut,
sign_out_sessions: SignOutSessions, sign_out_sessions: SignOutSessions,

View file

@ -1,4 +1,4 @@
import { API, Client } from "revolt.js"; import { API, Client, User } from "revolt.js";
export type Modal = { export type Modal = {
key?: string; key?: string;
@ -56,6 +56,15 @@ export type Modal = {
link: string; link: string;
callback: () => true; callback: () => true;
} }
| {
type: "pending_friend_requests";
users: User[];
}
| {
type: "modify_account";
client: Client;
field: "username" | "email" | "password";
}
| { | {
type: "signed_out"; type: "signed_out";
} }

View file

@ -13,6 +13,7 @@ import { TextReact } from "../../lib/i18n";
import { isTouchscreenDevice } from "../../lib/isTouchscreenDevice"; import { isTouchscreenDevice } from "../../lib/isTouchscreenDevice";
import { useIntermediate } from "../../context/intermediate/Intermediate"; import { useIntermediate } from "../../context/intermediate/Intermediate";
import { modalController } from "../../context/modals";
import { useClient } from "../../context/revoltjs/RevoltClient"; import { useClient } from "../../context/revoltjs/RevoltClient";
import CollapsibleSection from "../../components/common/CollapsibleSection"; import CollapsibleSection from "../../components/common/CollapsibleSection";
@ -129,8 +130,8 @@ export default observer(() => {
<div <div
className={styles.pending} className={styles.pending}
onClick={() => onClick={() =>
openScreen({ modalController.push({
id: "pending_requests", type: "pending_friend_requests",
users: incoming, users: incoming,
}) })
}> }>