From e2270602a3618a86243b6ccfd191c6b040d8220c Mon Sep 17 00:00:00 2001 From: Aden Linday Date: Fri, 17 Apr 2026 15:39:58 +0930 Subject: [PATCH] feat: finish custom message folders --- src/plugins/built-in/messageFolders/index.ts | 90 ++++++++++++++++++-- 1 file changed, 84 insertions(+), 6 deletions(-) diff --git a/src/plugins/built-in/messageFolders/index.ts b/src/plugins/built-in/messageFolders/index.ts index c0b35cb9..e8170e86 100644 --- a/src/plugins/built-in/messageFolders/index.ts +++ b/src/plugins/built-in/messageFolders/index.ts @@ -1,7 +1,23 @@ import type { Plugin } from "../../core/types"; +import { booleanSetting } from "@/plugins/core/settingsHelpers"; import { waitForElm } from "@/seqta/utils/waitForElm"; import styles from "./styles.css?inline"; +const messageFoldersSettings = { + showTagsInAllMessages: booleanSetting({ + default: true, + title: "Show folder tags in All Messages", + description: + "When off, folder tags are not shown on the message list until you select a folder.", + }), + hideFolderedMessagesInAll: booleanSetting({ + default: true, + title: "Hide foldered messages in All Messages", + description: + "When on, messages assigned to a custom folder are hidden from the inbox until you open that folder.", + }), +} as const; + interface Folder { id: string; name: string; @@ -20,7 +36,6 @@ const FOLDER_COLORS = [ const FOLDER_ICON_SVG = ``; const PLUS_SVG = ``; -const CHECK_SVG_DARK = ``; const CHECK_SVG_WHITE = ``; const CLOSE_SVG = ``; const EDIT_SVG = ``; @@ -30,12 +45,12 @@ function generateId(): string { return Date.now().toString(36) + Math.random().toString(36).slice(2, 7); } -const messageFoldersPlugin: Plugin<{}, MessageFoldersStorage> = { +const messageFoldersPlugin: Plugin = { id: "messageFolders", name: "Message Folders", description: "Organize direct messages into custom folders", version: "1.0.0", - settings: {}, + settings: messageFoldersSettings, disableToggle: true, defaultEnabled: true, @@ -95,6 +110,25 @@ const messageFoldersPlugin: Plugin<{}, MessageFoldersStorage> = { return (getAssignments()[folderId] ?? []).length; }; + const restoreSubjectPlain = (subject: Element) => { + subject.querySelector(".bsplus-msg-badges")?.remove(); + const textWrap = subject.querySelector(".bsplus-subject-text"); + if (textWrap) { + subject.textContent = textWrap.textContent ?? ""; + } + }; + + const isMessageInAnyCustomFolder = (messageId: string): boolean => { + for (const msgIds of Object.values(getAssignments())) { + if (msgIds.includes(messageId)) return true; + } + return false; + }; + + const shouldShowBadgesInList = (): boolean => { + return api.settings.showTagsInAllMessages || activeFolderId !== null; + }; + // ── Confirm modal ── const showConfirmModal = ( @@ -190,6 +224,7 @@ const messageFoldersPlugin: Plugin<{}, MessageFoldersStorage> = { allItem.addEventListener("click", () => { activeFolderId = null; applyFolderFilter(); + applyBadges(); renderSidebarFolders(); }); section.appendChild(allItem); @@ -258,6 +293,7 @@ const messageFoldersPlugin: Plugin<{}, MessageFoldersStorage> = { item.addEventListener("click", () => { activeFolderId = folder.id; applyFolderFilter(); + applyBadges(); renderSidebarFolders(); }); @@ -372,6 +408,7 @@ const messageFoldersPlugin: Plugin<{}, MessageFoldersStorage> = { if (activeFolderId !== null) { activeFolderId = null; applyFolderFilter(); + applyBadges(); renderSidebarFolders(); } } @@ -496,9 +533,22 @@ const messageFoldersPlugin: Plugin<{}, MessageFoldersStorage> = { // ── Message badges ── const applyBadges = () => { + const messageItems = document.querySelectorAll("[class*='MessageList__MessageList___'] ol > li[data-message]"); + + if (!shouldShowBadgesInList()) { + for (const li of messageItems) { + const subject = li.querySelector("[class*='MessageList__subject___']"); + if (subject && (subject.querySelector(".bsplus-msg-badges") || subject.querySelector(".bsplus-subject-text"))) { + restoreSubjectPlain(subject); + } else { + li.querySelector(".bsplus-msg-badges")?.remove(); + } + } + return; + } + const folders = getFolders(); const assignments = getAssignments(); - const messageItems = document.querySelectorAll("[class*='MessageList__MessageList___'] ol > li[data-message]"); for (const li of messageItems) { const msgId = li.getAttribute("data-message"); @@ -547,6 +597,7 @@ const messageFoldersPlugin: Plugin<{}, MessageFoldersStorage> = { e.stopPropagation(); activeFolderId = folder.id; applyFolderFilter(); + applyBadges(); renderSidebarFolders(); }); badgeContainer.appendChild(badge); @@ -561,8 +612,19 @@ const messageFoldersPlugin: Plugin<{}, MessageFoldersStorage> = { const moreBtn = document.querySelector("[class*='MessageList__MessageList___'] ol > button"); if (activeFolderId === null) { - for (const li of messageItems) { - li.classList.remove("bsplus-folder-hidden"); + if (api.settings.hideFolderedMessagesInAll) { + for (const li of messageItems) { + const msgId = li.getAttribute("data-message"); + if (msgId && isMessageInAnyCustomFolder(msgId)) { + li.classList.add("bsplus-folder-hidden"); + } else { + li.classList.remove("bsplus-folder-hidden"); + } + } + } else { + for (const li of messageItems) { + li.classList.remove("bsplus-folder-hidden"); + } } if (moreBtn) (moreBtn as HTMLElement).classList.remove("bsplus-folder-hidden"); return; @@ -649,6 +711,17 @@ const messageFoldersPlugin: Plugin<{}, MessageFoldersStorage> = { const mountUnsub = api.seqta.onMount("div.messages", handleMessagesPage); unregisters.push(mountUnsub); + unregisters.push( + api.settings.onChange("showTagsInAllMessages", () => { + applyBadges(); + }), + ); + unregisters.push( + api.settings.onChange("hideFolderedMessagesInAll", () => { + applyFolderFilter(); + }), + ); + return () => { for (const u of unregisters) u.unregister(); messageListObserver?.disconnect(); @@ -659,6 +732,11 @@ const messageFoldersPlugin: Plugin<{}, MessageFoldersStorage> = { document.querySelectorAll(".bsplus-folders-section").forEach((el) => el.remove()); document.querySelectorAll(".bsplus-folder-btn").forEach((el) => el.remove()); document.querySelectorAll(".bsplus-msg-badges").forEach((el) => el.remove()); + document.querySelectorAll("[class*='MessageList__subject___']").forEach((subject) => { + if (subject.querySelector(".bsplus-subject-text")) { + restoreSubjectPlain(subject); + } + }); document.querySelectorAll(".bsplus-folder-hidden").forEach((el) => el.classList.remove("bsplus-folder-hidden"), );