Fix AlwaysExpandRoles, PermissionsViewer, ShowConnections (#3916)

Co-authored-by: prism <69634294+imjustprism@users.noreply.github.com>
This commit is contained in:
thororen 2026-01-21 20:48:24 -05:00 • committed by GitHub
parent 799ecc38dd
commit 44bdb60bb6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 23 additions and 17 deletions

View file

@ -27,17 +27,17 @@ export default definePlugin({
authors: [Devs.surgedevs],
patches: [
{
find: 'action:"EXPAND_ROLES"',
find: "hasDeveloperContextMenu:",
replacement: [
{
match: /(roles:\i(?=.+?(\i)\(!0\)[,;]\i\({action:"EXPAND_ROLES"}\)).+?\[\i,\2\]=\i\.useState\()!1\)/,
replace: (_, rest, setExpandedRoles) => `${rest}!0)`
match: /(?<=\?\i\.current\[\i\].{0,100}?)useState\(!1\)/,
replace: "useState(!0)"
},
{
// Fix not calculating non-expanded roles because the above patch makes the default "expanded",
// which makes the collapse button never show up and calculation never occur
match: /(?<=useLayoutEffect\(\(\)=>{if\()\i/,
replace: isExpanded => "false"
match: /(?<=useLayoutEffect\(\(\)=>\{if\()\i/,
replace: "false"
}
]
}

View file

@ -37,14 +37,13 @@ interface UserPermission {
type UserPermissions = Array<UserPermission>;
const { RoleRootClasses, RoleClasses, RoleBorderClasses } = proxyLazyWebpack(() => {
const [RoleRootClasses, RoleClasses, RoleBorderClasses] = findBulk(
filters.byProps("root", "expandButton", "collapseButton"),
const { RoleClasses, RoleBorderClasses } = proxyLazyWebpack(() => {
const [RoleClasses, RoleBorderClasses] = findBulk(
filters.byProps("role", "roleCircle", "roleName"),
filters.byProps("roleCircle", "dot", "dotBorderColor")
) as Record<string, string>[];
return { RoleRootClasses, RoleClasses, RoleBorderClasses };
return { RoleClasses, RoleBorderClasses };
});
interface FakeRoleProps extends React.HTMLAttributes<HTMLDivElement> {
@ -190,7 +189,7 @@ function UserPermissionsComponent({ guild, guildMember, closePopout }: { guild:
</div>
</div>
{userPermissions.length > 0 && (
<div className={classes(RoleRootClasses.root)}>
<div className={classes(RoleClasses.root)}>
{userPermissions.map(({ permission, roleColor, roleName }) => (
<Tooltip
key={permission}

View file

@ -26,7 +26,7 @@ import { TooltipContainer } from "@components/TooltipContainer";
import { Devs } from "@utils/constants";
import { classes } from "@utils/misc";
import definePlugin, { OptionType } from "@utils/types";
import type { Guild, GuildMember } from "@vencord/discord-types";
import type { Guild } from "@vencord/discord-types";
import { findByPropsLazy } from "@webpack";
import { Button, ChannelStore, Dialog, GuildMemberStore, GuildRoleStore, GuildStore, match, Menu, PermissionsBits, Popout, useRef, UserStore } from "@webpack/common";
@ -168,13 +168,16 @@ export default definePlugin({
{
find: "#{intl::COLLAPSE_ROLES}",
replacement: {
match: /className:(\i\.expandButton),.+?null,/,
replace: "$&$self.ViewPermissionsButton({className:$1,props:arguments[0]}),"
match: /(?<=\i\.id\)\),\i\(\))(?=,\i\?)/,
replace: ",$self.ViewPermissionsButton(arguments[0])"
}
}
],
ViewPermissionsButton: ErrorBoundary.wrap(({ className, props: { guild, guildMember } }: { className: string, props: { guild: Guild; guildMember: GuildMember; }; }) => {
ViewPermissionsButton: ErrorBoundary.wrap(({ className, guild, userId }: { className: string; guild: Guild; userId: string; }) => {
const guildMember = GuildMemberStore.getMember(guild.id, userId);
if (!guildMember) return null;
const buttonRef = useRef(null);
return (

View file

@ -160,10 +160,10 @@ export default definePlugin({
patches: [
{
find: ".hasAvatarForGuild(null==",
find: "UserProfilePopoutBody",
replacement: {
match: /currentUser:\i,guild:\i[^}]*?\}\)(?=])(?<=user:(\i),bio:null==(\i)\?.+?)/,
replace: "$&,$self.profilePopoutComponent({ user: $1, displayProfile: $2 })"
match: /userId:\i\.id,guild:\i\}\)(?=])/,
replace: "$&,$self.profilePopoutComponent(arguments[0])"
}
}
],

View file

@ -625,6 +625,10 @@ export const Devs = /* #__PURE__*/ Object.freeze({
name: "u32",
id: 1063237286818488351n,
},
prism: {
name: "prism",
id: 390884143749136386n,
},
} satisfies Record<string, Dev>);
// iife so #__PURE__ works correctly