diff --git a/src/controllers/modals/ModalController.tsx b/src/controllers/modals/ModalController.tsx
index feebb85e..cbb0dbb9 100644
--- a/src/controllers/modals/ModalController.tsx
+++ b/src/controllers/modals/ModalController.tsx
@@ -21,6 +21,7 @@ import Changelog from "./components/Changelog";
import ChannelInfo from "./components/ChannelInfo";
import Clipboard from "./components/Clipboard";
import Confirmation from "./components/Confirmation";
+import CreateChannel from "./components/CreateChannel";
import CreateGroup from "./components/CreateGroup";
import CreateInvite from "./components/CreateInvite";
import CreateRole from "./components/CreateRole";
@@ -250,6 +251,7 @@ export const modalController = new ModalControllerExtended({
delete_bot: Confirmation,
block_user: Confirmation,
unfriend_user: Confirmation,
+ create_channel: CreateChannel,
create_group: CreateGroup,
create_invite: CreateInvite,
create_role: CreateRole,
diff --git a/src/controllers/modals/components/CreateChannel.tsx b/src/controllers/modals/components/CreateChannel.tsx
new file mode 100644
index 00000000..14d2e696
--- /dev/null
+++ b/src/controllers/modals/components/CreateChannel.tsx
@@ -0,0 +1,69 @@
+import { useHistory } from "react-router-dom";
+
+import { Text } from "preact-i18n";
+
+import { ModalForm } from "@revoltchat/ui";
+
+import { ModalProps } from "../types";
+
+/**
+ * Channel creation modal
+ */
+export default function CreateChannel({
+ cb,
+ target,
+ ...props
+}: ModalProps<"create_channel">) {
+ const history = useHistory();
+
+ return (
+ }
+ schema={{
+ name: "text",
+ type: "radio",
+ }}
+ data={{
+ name: {
+ field: (
+
+ ) as React.ReactChild,
+ },
+ type: {
+ field: (
+
+ ) as React.ReactChild,
+ choices: [
+ {
+ name: (
+
+ ) as React.ReactChild,
+ value: "Text",
+ },
+ {
+ name: (
+
+ ) as React.ReactChild,
+ value: "Voice",
+ },
+ ],
+ },
+ }}
+ callback={async ({ name, type }) => {
+ const channel = await target.createChannel({
+ type: type as "Text" | "Voice",
+ name,
+ });
+
+ if (cb) {
+ cb(channel as any);
+ } else {
+ history.push(
+ `/server/${target._id}/channel/${channel._id}`,
+ );
+ }
+ }}
+ />
+ );
+}
diff --git a/src/controllers/modals/types.ts b/src/controllers/modals/types.ts
index 37b5e513..1bad3bb2 100644
--- a/src/controllers/modals/types.ts
+++ b/src/controllers/modals/types.ts
@@ -170,11 +170,7 @@ export type Modal = {
| {
type: "create_channel";
target: Server;
- cb?: (
- channel: Channel & {
- channel_type: "TextChannel" | "VoiceChannel";
- },
- ) => void;
+ cb?: (channel: Channel) => void;
}
| {
type: "create_category";