diff --git a/src/equicordplugins/advancedPermissions/index.tsx b/src/equicordplugins/advancedPermissions/index.tsx new file mode 100644 index 000000000..09f90f925 --- /dev/null +++ b/src/equicordplugins/advancedPermissions/index.tsx @@ -0,0 +1,134 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import "./style.css"; + +import { definePluginSettings } from "@api/Settings"; +import { BaseText } from "@components/BaseText"; +import ErrorBoundary from "@components/ErrorBoundary"; +import { EquicordDevs } from "@utils/constants"; +import { Margins } from "@utils/margins"; +import definePlugin, { OptionType } from "@utils/types"; +import { findCssClassesLazy } from "@webpack"; +import { Clickable, useState } from "@webpack/common"; +import type { ReactNode } from "react"; + +const AdvancedClasses = findCssClassesLazy("trigger", "advancedTitle", "titleCaret"); +const CollapsibleCard = ErrorBoundary.wrap( + ({ children }: { children: ReactNode; }) => { + const [open, setOpen] = useState(!settings.store.collapsedByDefault); + + return ( +
+ setOpen(v => !v)} + > + + Simplified permissions + + + + + + {open ? children : null} +
+ ); + }, + { noop: true }, +); + +const settings = definePluginSettings({ + simplifiedCard: { + type: OptionType.SELECT, + description: "What to do with Discord's simplified permissions card", + options: [ + { label: "Hide it", value: "hide", default: true }, + { label: "Make it collapsible", value: "collapse" }, + { label: "Leave it visible", value: "show" }, + ], + }, + collapsedByDefault: { + type: OptionType.BOOLEAN, + default: false, + description: "Start the simplified permissions collapsed.", + disabled: () => settings.store.simplifiedCard !== "collapse", + }, +}); + +export default definePlugin({ + name: "AdvancedPermissions", + description: "Show advanced permissions card by default.", + authors: [EquicordDevs.bastih18], + settings, + + patches: [ + { + find: 'id:"PrivateChannelSettingCard"', + replacement: [ + { + // simplified card renderer + match: /(?<=permissionUpdates:\i\}\):null,).{0,100}roles:\i,members:\i\}\)/, + replace: "$self.renderCard($&)", + }, + { + // hide divider when card hidden, else tighten it + match: /(?<=advancedMode\);.{0,30}children:\[)/, + replace: "$self.cardHidden()?null:", + }, + { + // hide divider when card hidden, else tighten it + match: /className:\i\.\i(?=.{0,50}onExpandedChange)/, + replace: '$&+" vc-iamadvanced-divider"', + }, + { + // always force advanced open + match: /isExpanded:\i(?=,onExpandedChange:)/, + replace: "isExpanded:!0", + }, + { + // drop advanced header + match: /component:(?=.{0,50}slot:"trigger")/, + replace: "component:null&&", + }, + ], + }, + ], + + cardHidden() { + return settings.store.simplifiedCard === "hide"; + }, + + renderCard(card: ReactNode) { + switch (settings.store.simplifiedCard) { + case "hide": + return null; + case "collapse": + return {card}; + default: + return card; + } + }, +}); diff --git a/src/equicordplugins/advancedPermissions/style.css b/src/equicordplugins/advancedPermissions/style.css new file mode 100644 index 000000000..008e9c4ee --- /dev/null +++ b/src/equicordplugins/advancedPermissions/style.css @@ -0,0 +1,5 @@ +.vc-iamadvanced-divider { + /* override advancedModeDivider's large margins */ + margin-top: 8px !important; + margin-bottom: 8px !important; +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 714621b8a..6175799ca 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -1382,6 +1382,10 @@ export const EquicordDevs = Object.freeze({ name: "August (auggeeo)", id: 594864203102158859n }, + bastih18: { + name: "bastih18", + id: 273797150880563201n + } } satisfies Record); // iife so #__PURE__ works correctly