better context menu and title

This commit is contained in:
Sqaaakoi 2025-02-27 18:59:45 +13:00
parent 4504633d3c
commit a05127b7aa
No known key found for this signature in database
4 changed files with 97 additions and 32 deletions

View file

@ -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(
<Menu.MenuItem
id="channeldeck"
label="Channel Decks"
>
<Menu.MenuGroup>
{decks.map(deck => <Menu.MenuCheckboxItem
label={deck.name}
id={`deck-${deck.id}`}
key={`deck-${deck.id}`}
checked={deck.open}
action={() => {
ChannelDeckStore.setDeck({ ...deck, open: !deck.open });
}}
/>)}
</Menu.MenuGroup>
<Menu.MenuItem
id="create-deck"
label="Create deck"
action={() => {
ChannelDeckStore.createDeck({ name: "New Channel Deck" });
}}
>
</Menu.MenuItem>
</Menu.MenuItem>
);
};
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(
<Menu.MenuItem
id="channeldeck"
label="Channel Decks"
>
<Menu.MenuGroup>
{decks.map(deck => <Menu.MenuCheckboxItem
label={deck.name}
id={`deck-${deck.id}`}
key={`deck-${deck.id}`}
checked={deck.columns.some(c => 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%" }] });
}}
/>)}
</Menu.MenuGroup>
<Menu.MenuItem
id="create-deck"
label="Create deck and add channel"
action={() => {
ChannelDeckStore.createDeck({ name: "New Channel Deck", open: true, columns: [{ channelId: channelId, width: "100%" }] });
}}
>
</Menu.MenuItem>
</Menu.MenuItem>
);
};
}
export const contextMenus = {
"user-settings-cog": UserSettingsContextMenu,
"user-context": MakeChannelContextMenu("user"),
"channel-context": MakeChannelContextMenu("channel"),
"thread-context": MakeChannelContextMenu("channel"),
"gdm-context": MakeChannelContextMenu("channel"),
};

View file

@ -12,7 +12,7 @@ export default function DeckPopout({ deckId, windowKey }: { deckId: string; wind
return <PopoutWindow
withTitleBar
windowKey={windowKey}
title={deck?.name}
title={[deck?.name, "Channel Deck"].filter(Boolean).join(" | ")}
>
<DeckContext.Provider value={deck}>
<DeckView />

View file

@ -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(
<Menu.MenuItem
id="channeldeck"
label="Channel Decks"
>
<Menu.MenuGroup>
{decks.map(deck => <Menu.MenuCheckboxItem
label={deck.name}
id={`deck-${deck.id}`}
key={`deck-${deck.id}`}
checked={deck.open}
action={() => {
ChannelDeckStore.setDeck({ ...deck, open: !deck.open });
}}
/>)}
</Menu.MenuGroup>
</Menu.MenuItem>
);
};

View file

@ -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
});