Added create category context menu when right clicking in channel list

This commit is contained in:
Ryan Alexander 2021-08-17 06:31:25 +10:00
parent 24050a8e05
commit 49d54ee05a
3 changed files with 78 additions and 1 deletions

View file

@ -46,6 +46,7 @@ export type Screen =
| { type: "unfriend_user"; target: User } | { type: "unfriend_user"; target: User }
| { type: "block_user"; target: User } | { type: "block_user"; target: User }
| { type: "create_channel"; target: Server } | { type: "create_channel"; target: Server }
| { type: "create_category"; target: Server }
)) ))
| ({ id: "special_input" } & ( | ({ id: "special_input" } & (
| { | {

View file

@ -1,5 +1,6 @@
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useHistory } from "react-router-dom"; import { useHistory } from "react-router-dom";
import { Category } from "revolt-api/types/Servers";
import { Channel } from "revolt.js/dist/maps/Channels"; import { Channel } from "revolt.js/dist/maps/Channels";
import { Message as MessageI } from "revolt.js/dist/maps/Messages"; import { Message as MessageI } from "revolt.js/dist/maps/Messages";
import { Server } from "revolt.js/dist/maps/Servers"; import { Server } from "revolt.js/dist/maps/Servers";
@ -70,6 +71,7 @@ type SpecialProps = { onClose: () => void } & (
| { type: "unfriend_user"; target: User } | { type: "unfriend_user"; target: User }
| { type: "block_user"; target: User } | { type: "block_user"; target: User }
| { type: "create_channel"; target: Server } | { type: "create_channel"; target: Server }
| { type: "create_category"; target: Server }
); );
export const SpecialPromptModal = observer((props: SpecialProps) => { export const SpecialPromptModal = observer((props: SpecialProps) => {
@ -459,6 +461,64 @@ export const SpecialPromptModal = observer((props: SpecialProps) => {
/> />
); );
} }
case "create_category": {
const [name, setName] = useState("");
const [cats, setCats] = useState<Category[]>(
props.target.categories ?? [],
);
const history = useHistory();
return (
<PromptModal
onClose={onClose}
question={<Text id="app.context_menu.create_category" />}
actions={[
{
confirmation: true,
contrast: true,
children: (
<Text id="app.special.modals.actions.create" />
),
onClick: async () => {
setProcessing(true);
try {
cats.push({
id: ulid(),
title: name,
channels: [],
});
props.target.edit({ categories: cats });
onClose();
setProcessing(false);
} catch (err) {
setError(takeError(err));
setProcessing(false);
}
},
},
{
children: (
<Text id="app.special.modals.actions.cancel" />
),
onClick: onClose,
},
]}
content={
<>
<Overline block type="subtle">
<Text id="app.main.servers.channel_name" />
</Overline>
<InputBox
value={name}
onChange={(e) => setName(e.currentTarget.value)}
/>
</>
}
disabled={processing}
error={error}
/>
);
}
default: default:
return null; return null;
} }

View file

@ -102,6 +102,7 @@ type Action =
| { action: "set_status" } | { action: "set_status" }
| { action: "clear_status" } | { action: "clear_status" }
| { action: "create_channel"; target: Server } | { action: "create_channel"; target: Server }
| { action: "create_category"; target: Server }
| { | {
action: "create_invite"; action: "create_invite";
target: Channel; target: Channel;
@ -400,6 +401,7 @@ function ContextMenus(props: Props) {
case "delete_server": case "delete_server":
case "delete_message": case "delete_message":
case "create_channel": case "create_channel":
case "create_category":
case "create_invite": case "create_invite":
// Typescript flattens the case types into a single type and type structure and specifity is lost // Typescript flattens the case types into a single type and type structure and specifity is lost
openScreen({ openScreen({
@ -508,11 +510,16 @@ function ContextMenus(props: Props) {
const server = client.servers.get(server_list)!; const server = client.servers.get(server_list)!;
const permissions = server.permission; const permissions = server.permission;
if (server) { if (server) {
if (permissions & ServerPermission.ManageChannels) if (permissions & ServerPermission.ManageChannels) {
generateAction({
action: "create_category",
target: server,
});
generateAction({ generateAction({
action: "create_channel", action: "create_channel",
target: server, target: server,
}); });
}
if (permissions & ServerPermission.ManageServer) if (permissions & ServerPermission.ManageServer)
generateAction({ generateAction({
action: "open_server_settings", action: "open_server_settings",
@ -860,6 +867,15 @@ function ContextMenus(props: Props) {
} }
if (sid && server) { if (sid && server) {
if (server.channels[0] !== undefined)
generateAction(
{
action: "create_invite",
target: server.channels[0],
},
"create_invite",
);
if ( if (
serverPermissions & serverPermissions &
ServerPermission.ChangeNickname || ServerPermission.ChangeNickname ||