revenge-plugins/plugins/server-drawer/src/utils/theme.ts

41 lines
1.6 KiB
TypeScript
Raw Normal View History

import { findByProps, findByStoreName } from "@vendetta/metro";
const Flux = findByProps("useStateFromStores");
const colors = findByProps("colors", "unsafe_rawColors")?.colors;
const ExpandedGuildFolderStore = findByStoreName("ExpandedGuildFolderStore");
export function useTheme() {
return {
text: colors?.TEXT_NORMAL ?? "#dbdee1",
folder: "#5865f2",
hover: colors?.STATE_LAYER_PRESS ?? "rgba(255,255,255,0.06)",
};
}
export function useFolderExpanded(folderId: string | number): boolean {
// Confirmed live: an account with folders and one without exercise different code paths (this
// hook is only ever called by FolderItem, which only exists when there's a folder to render) -
// an account with no folders rendered fine while one with folders showed nothing at all.
// ExpandedGuildFolderStore is a one-shot findByStoreName at module-eval time with no retry, so
// if it hadn't registered yet, this passed [undefined] into useStateFromStores - which throws
// rather than returning safely, taking down the whole drawer render, not just this one folder.
if (!Flux?.useStateFromStores || !ExpandedGuildFolderStore) return false;
return Flux.useStateFromStores(
[ExpandedGuildFolderStore],
() => {
const folders = ExpandedGuildFolderStore?.getExpandedFolders?.();
return folders instanceof Set ? folders.has(folderId) : false;
},
[folderId],
) ?? false;
}
export interface GuildNode {
type: string;
id: string | number;
name?: string;
color?: number | null;
expanded?: boolean;
children: GuildNode[];
}