Merge pull request #87 from ryanalexander/context-categories

This commit is contained in:
Paul Makles 2021-08-18 00:58:06 +01:00 committed by GitHub
commit ae22c344a1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 66 additions and 1 deletions

View file

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

View file

@ -1,5 +1,6 @@
import { observer } from "mobx-react-lite";
import { useHistory } from "react-router-dom";
import { Category } from "revolt-api/types/Servers";
import { Channel } from "revolt.js/dist/maps/Channels";
import { Message as MessageI } from "revolt.js/dist/maps/Messages";
import { Server } from "revolt.js/dist/maps/Servers";
@ -70,6 +71,7 @@ type SpecialProps = { onClose: () => void } & (
| { type: "unfriend_user"; target: User }
| { type: "block_user"; target: User }
| { type: "create_channel"; target: Server }
| { type: "create_category"; target: Server }
);
export const SpecialPromptModal = observer((props: SpecialProps) => {
@ -459,6 +461,61 @@ export const SpecialPromptModal = observer((props: SpecialProps) => {
/>
);
}
case "create_category": {
const [name, setName] = useState("");
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 {
props.target.edit({
categories: [
...props.target.categories ?? [],
{ id: ulid(), title: name, channels: [] }
]
});
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:
return null;
}

View file

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