From 26f3618c2cb60d26b3d7cd1734f39d36186fcee7 Mon Sep 17 00:00:00 2001 From: Sqaaakoi Date: Tue, 9 Apr 2024 12:41:48 +1200 Subject: [PATCH] TypingIndicator: Add an option to show user avatars (#2319) Co-authored-by: Vendicated --- src/plugins/typingIndicator/index.tsx | 44 ++++++++++++++++++++++----- src/plugins/typingIndicator/style.css | 18 +++++++++++ src/utils/constants.ts | 4 +++ 3 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 src/plugins/typingIndicator/style.css diff --git a/src/plugins/typingIndicator/index.tsx b/src/plugins/typingIndicator/index.tsx index 8bae2f53c..6df3f4b80 100644 --- a/src/plugins/typingIndicator/index.tsx +++ b/src/plugins/typingIndicator/index.tsx @@ -16,20 +16,28 @@ * along with this program. If not, see . */ +import "./style.css"; + import { definePluginSettings, Settings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; -import { findExportedComponentLazy, findStoreLazy } from "@webpack"; +import { findComponentByCodeLazy, findExportedComponentLazy, findStoreLazy } from "@webpack"; import { ChannelStore, GuildMemberStore, i18n, RelationshipStore, SelectedChannelStore, Tooltip, UserStore, useStateFromStores } from "@webpack/common"; import { buildSeveralUsers } from "../typingTweaks"; const ThreeDots = findExportedComponentLazy("Dots", "AnimatedDots"); +const UserSummaryItem = findComponentByCodeLazy("defaultRenderUser", "showDefaultAvatarsForNullUsers"); const TypingStore = findStoreLazy("TypingStore"); const UserGuildSettingsStore = findStoreLazy("UserGuildSettingsStore"); +const enum IndicatorMode { + Dots = 1 << 0, + Avatars = 1 << 1 +} + function getDisplayName(guildId: string, userId: string) { const user = UserStore.getUser(userId); return GuildMemberStore.getNick(guildId, userId) ?? (user as any).globalName ?? user.username; @@ -90,11 +98,24 @@ function TypingIndicator({ channelId }: { channelId: string; }) { return ( {props => ( -
- +
+ {((settings.store.indicatorMode & IndicatorMode.Avatars) === IndicatorMode.Avatars) && ( + UserStore.getUser(id))} + guildId={guildId} + renderIcon={false} + max={3} + showDefaultAvatarsForNullUsers + showUserPopout + size={16} + className="vc-typing-indicator-avatars" + /> + )} + {((settings.store.indicatorMode & IndicatorMode.Dots) === IndicatorMode.Dots) && ( +
+ +
+ )}
)} @@ -119,13 +140,22 @@ const settings = definePluginSettings({ type: OptionType.BOOLEAN, description: "Whether to show the typing indicator for blocked users.", default: false + }, + indicatorMode: { + type: OptionType.SELECT, + description: "How should the indicator be displayed?", + options: [ + { label: "Avatars and animated dots", value: IndicatorMode.Dots | IndicatorMode.Avatars, default: true }, + { label: "Animated dots", value: IndicatorMode.Dots }, + { label: "Avatars", value: IndicatorMode.Avatars }, + ], } }); export default definePlugin({ name: "TypingIndicator", description: "Adds an indicator if someone is typing on a channel.", - authors: [Devs.Nuckyz, Devs.fawn], + authors: [Devs.Nuckyz, Devs.fawn, Devs.Sqaaakoi], settings, patches: [ diff --git a/src/plugins/typingIndicator/style.css b/src/plugins/typingIndicator/style.css new file mode 100644 index 000000000..d92ef0f1e --- /dev/null +++ b/src/plugins/typingIndicator/style.css @@ -0,0 +1,18 @@ +.vc-typing-indicator { + display: flex; + align-items: center; + height: 20px; +} + +.vc-typing-indicator-avatars { + margin-left: 6px; +} + +.vc-typing-indicator-dots { + margin-left: 6px; + height: 16px; + display: flex; + align-items: center; + z-index: 0; + cursor: pointer; +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 3bad423d5..04a4f6778 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -426,6 +426,10 @@ export const Devs = /* #__PURE__*/ Object.freeze({ name: "newwares", id: 421405303951851520n }, + Sqaaakoi: { + name: "Sqaaakoi", + id: 259558259491340288n + }, Byron: { name: "byeoon", id: 1167275288036655133n