From c4ae044325f03c9dcaa8266e0384fb006530c947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C4=B1ra=C3=A7=20Arma=C4=9Fan=20=C3=96nal?= Date: Sun, 9 Mar 2025 22:37:44 +0300 Subject: [PATCH] Implement BetterBlockedUsers plugin! (#178) Allows you to search in blocked users list and makes names selectable in settings. --- .../betterBlockedUsers/index.tsx | 71 +++++++++++++++++++ .../betterBlockedUsers/styles.css | 3 + 2 files changed, 74 insertions(+) create mode 100644 src/equicordplugins/betterBlockedUsers/index.tsx create mode 100644 src/equicordplugins/betterBlockedUsers/styles.css diff --git a/src/equicordplugins/betterBlockedUsers/index.tsx b/src/equicordplugins/betterBlockedUsers/index.tsx new file mode 100644 index 00000000..30c11d1a --- /dev/null +++ b/src/equicordplugins/betterBlockedUsers/index.tsx @@ -0,0 +1,71 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import "./styles.css"; + +import { EquicordDevs } from "@utils/constants"; +import definePlugin from "@utils/types"; +import { React, RelationshipStore, TextInput, UserStore } from "@webpack/common"; + +let lastSearch = ""; +let updateFunc = (v: any) => { }; + +export default definePlugin({ + name: "BetterBlockedUsers", + description: "Allows you to search in blocked users list and makes names selectable in settings.", + authors: [EquicordDevs.TheArmagan], + patches: [ + { + find: '"],{numberOfBlockedUsers:', + replacement: [ + { + match: /(function \S+\((\S{1,3})\).{0,100}className:_\.header,children:\[.{0,500}numberOfIgnoredUsers:\S{1,3}}\)}\)]}\))/, + replace: "$1,$2.listType==='blocked'?$self.renderSearchInput():null" + }, + { + match: /(function \S+\((\S{1,3})\).{0,100},\[\S{1,3},\S{1,3}]=(\S{1,3})\.useState\(\d\);)(.{0,200}children:)(\S{1,3})(\.slice\(\d,\S{1,3})/, + replace: "$1let [searchResults,setSearchResults]=$3.useState([]);$self.setUpdateFunc($2,setSearchResults);$4(searchResults.length?searchResults:$5)$6" + } + ] + } + ], + renderSearchInput() { + const [value, setValue] = React.useState(lastSearch); + + React.useEffect(() => { + const searchResults = this.getFilteredUsers(lastSearch); + updateFunc(searchResults); + }, []); + + return { + const search = (e.target as HTMLInputElement).value.toLowerCase().trim(); + setValue(search); + lastSearch = search; + const searchResults = this.getFilteredUsers(search); + updateFunc(searchResults); + }} value={value} + >; + }, + getSearchResults() { + return !!lastSearch; + }, + setUpdateFunc(e, setResults) { + if (e.listType !== "blocked") return; + updateFunc = setResults; + return true; + }, + getFilteredUsers(search: string) { + search = search.toLowerCase(); + return (RelationshipStore as any).getBlockedIDs().filter(id => { + const user = UserStore.getUser(id) as any; + if (!user) return id === search; + return id === search || user?.username?.toLowerCase()?.includes(search) || user?.globalName?.toLowerCase()?.includes(search); + }) as string[]; + } +}); diff --git a/src/equicordplugins/betterBlockedUsers/styles.css b/src/equicordplugins/betterBlockedUsers/styles.css new file mode 100644 index 00000000..810c6772 --- /dev/null +++ b/src/equicordplugins/betterBlockedUsers/styles.css @@ -0,0 +1,3 @@ +[class*="usersList_"] [class*="text_"] { + user-select: text !important; +}