diff --git a/src/plugins/pinDms/contextMenus.tsx b/src/plugins/pinDms/contextMenus.tsx index d75c9f90..7d89ec12 100644 --- a/src/plugins/pinDms/contextMenus.tsx +++ b/src/plugins/pinDms/contextMenus.tsx @@ -19,10 +19,11 @@ import { addContextMenuPatch, findGroupChildrenByChildId, NavContextMenuPatchCallback, removeContextMenuPatch } from "@api/ContextMenu"; import { Menu } from "@webpack/common"; -import { isPinned, movePin, snapshotArray, togglePin } from "./settings"; +import { isPinned, movePin, PinOrder, settings, snapshotArray, togglePin } from "./settings"; function PinMenuItem(channelId: string) { const pinned = isPinned(channelId); + const canMove = pinned && settings.store.pinOrder === PinOrder.Custom; return ( <> @@ -31,14 +32,14 @@ function PinMenuItem(channelId: string) { label={pinned ? "Unpin DM" : "Pin DM"} action={() => togglePin(channelId)} /> - {pinned && snapshotArray[0] !== channelId && ( + {canMove && snapshotArray[0] !== channelId && ( movePin(channelId, -1)} /> )} - {pinned && snapshotArray[snapshotArray.length - 1] !== channelId && ( + {canMove && snapshotArray[snapshotArray.length - 1] !== channelId && ( . */ -import { Settings, useSettings } from "@api/settings"; +import { definePluginSettings, Settings, useSettings } from "@api/settings"; +import { OptionType } from "@utils/types"; +import { findStoreLazy } from "@webpack"; + +export const enum PinOrder { + LastMessage, + Custom +} + +export const settings = definePluginSettings({ + pinOrder: { + type: OptionType.SELECT, + description: "Which order should pinned DMs be displayed in?", + options: [ + { label: "Most recent message", value: PinOrder.LastMessage, default: true }, + { label: "Custom (right click channels to reorder)", value: PinOrder.Custom } + ] + } +}); + +const PrivateChannelSortStore = findStoreLazy("PrivateChannelSortStore"); export let snapshotArray: string[]; let snapshot: Set | undefined; @@ -51,9 +71,16 @@ export function togglePin(id: string) { save([...snapshot]); } -export function getPinAt(idx: number) { +function sortedSnapshot() { requireSnapshot(); - return snapshotArray[idx]; + if (settings.store.pinOrder === PinOrder.LastMessage) + return PrivateChannelSortStore.getPrivateChannelIds().filter(isPinned); + + return snapshotArray; +} + +export function getPinAt(idx: number) { + return sortedSnapshot()[idx]; } export function movePin(id: string, direction: -1 | 1) { diff --git a/src/webpack/common/types/utils.d.ts b/src/webpack/common/types/utils.d.ts index 038163d0..1534f329 100644 --- a/src/webpack/common/types/utils.d.ts +++ b/src/webpack/common/types/utils.d.ts @@ -68,7 +68,7 @@ export interface SnowflakeUtils { extractTimestamp(snowflake: string): number; age(snowflake: string): number; atPreviousMillisecond(snowflake: string): string; - compare(snowflake1: string, snowflake2: string): number; + compare(snowflake1?: string, snowflake2?: string): number; } interface RestRequestData {