diff --git a/components/ContextMenus.tsx b/components/ContextMenus.tsx new file mode 100644 index 0000000..0462d88 --- /dev/null +++ b/components/ContextMenus.tsx @@ -0,0 +1,94 @@ +import { NavContextMenuPatchCallback } from "@api/ContextMenu"; +import { ChannelStore, Menu, PermissionsBits, PermissionStore, UserStore, useStateFromStores } from "@webpack/common"; +import { ChannelDeckStore } from "../ChannelDeckStore"; +import { Channel, User } from "discord-types/general"; + +export const UserSettingsContextMenu: NavContextMenuPatchCallback = (children, props) => { + const decks = useStateFromStores([ChannelDeckStore], () => ChannelDeckStore.getDecks()); + if (!props) return; + children.push( + + + {decks.map(deck => { + ChannelDeckStore.setDeck({ ...deck, open: !deck.open }); + }} + />)} + + { + ChannelDeckStore.createDeck({ name: "New Channel Deck" }); + }} + > + + + ); +}; + +interface ChannelLikeContextMenuProps { + channel: Channel; + guildId?: string; + user: User; +} + +function MakeChannelContextMenu(name: "user" | "channel"): NavContextMenuPatchCallback { + return (children, { user, channel }: ChannelLikeContextMenuProps) => { + const decks = useStateFromStores([ChannelDeckStore], () => ChannelDeckStore.getDecks()); + const isUser = name === "user"; + if (isUser && !user) return; + if (!isUser && (!channel || channel.type === 4 || channel.type === 15)) return; + + if (isUser && user.id === UserStore.getCurrentUser().id) return; + if (!isUser && (!PermissionStore.can(PermissionsBits.VIEW_CHANNEL, channel) && channel.type !== 3)) return; + + const channelId = user ? ChannelStore.getDMFromUserId(user?.id) : channel?.id; + if (user && !channelId) return; + + children.push( + + + {decks.map(deck => c.channelId === channelId)} + action={async () => { + if (deck.columns.some(c => c.channelId === channelId)) + ChannelDeckStore.setDeck({ ...deck, columns: deck.columns.filter(c => c.channelId !== channelId) }); + else + ChannelDeckStore.setDeck({ ...deck, columns: [...deck.columns, { channelId: channelId, width: "100%" }] }); + }} + />)} + + { + ChannelDeckStore.createDeck({ name: "New Channel Deck", open: true, columns: [{ channelId: channelId, width: "100%" }] }); + }} + > + + + ); + }; +} + +export const contextMenus = { + "user-settings-cog": UserSettingsContextMenu, + "user-context": MakeChannelContextMenu("user"), + "channel-context": MakeChannelContextMenu("channel"), + "thread-context": MakeChannelContextMenu("channel"), + "gdm-context": MakeChannelContextMenu("channel"), +}; diff --git a/components/DeckPopout.tsx b/components/DeckPopout.tsx index a833512..0281f98 100644 --- a/components/DeckPopout.tsx +++ b/components/DeckPopout.tsx @@ -12,7 +12,7 @@ export default function DeckPopout({ deckId, windowKey }: { deckId: string; wind return diff --git a/components/LauncherContextMenu.tsx b/components/LauncherContextMenu.tsx deleted file mode 100644 index 69e7aff..0000000 --- a/components/LauncherContextMenu.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { NavContextMenuPatchCallback } from "@api/ContextMenu"; -import { Menu, PrivateChannelsStore, useStateFromStores } from "@webpack/common"; -import { settings } from "plugins/betterFolders"; -import { ChannelDeckStore } from "../ChannelDeckStore"; - -export const UserSettingsContextMenu: NavContextMenuPatchCallback = (children, props) => { - const decks = useStateFromStores([ChannelDeckStore], () => ChannelDeckStore.getDecks()); - if (!props) return; - children.push( - - - {decks.map(deck => { - ChannelDeckStore.setDeck({ ...deck, open: !deck.open }); - }} - />)} - - - ); -}; diff --git a/index.tsx b/index.tsx index 1d7c7fa..4547639 100644 --- a/index.tsx +++ b/index.tsx @@ -2,7 +2,7 @@ import { Devs } from "@utils/constants"; import definePlugin from "@utils/types"; import showUnsupportedMessage from "./unsupportedMessage"; import { ChannelDeckStore } from "./ChannelDeckStore"; -import { UserSettingsContextMenu } from "./components/LauncherContextMenu"; +import { contextMenus } from "./components/ContextMenus"; export default definePlugin({ name: "ChannelDeck", @@ -18,9 +18,7 @@ export default definePlugin({ ChannelDeckStore.unloadData(); }, - contextMenus: { - "user-settings-cog": UserSettingsContextMenu - }, + contextMenus, ChannelDeckStore });