From 24202b0b2f4baab3f25504e4bed6a20d4c87f717 Mon Sep 17 00:00:00 2001 From: programminglaboratorys Date: Sat, 8 Jun 2024 12:38:38 +0300 Subject: [PATCH] resolving conflicts --- src/api/ExpressionPickerTabs.tsx | 61 +++++++ src/api/index.ts | 8 +- src/plugins/_api/expressionPickerTabs.ts | 30 +++ src/utils/constants.ts | 221 ++++++++++++----------- 4 files changed, 211 insertions(+), 109 deletions(-) create mode 100644 src/api/ExpressionPickerTabs.tsx create mode 100644 src/plugins/_api/expressionPickerTabs.ts diff --git a/src/api/ExpressionPickerTabs.tsx b/src/api/ExpressionPickerTabs.tsx new file mode 100644 index 000000000..8b220f0b5 --- /dev/null +++ b/src/api/ExpressionPickerTabs.tsx @@ -0,0 +1,61 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2024 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import ErrorBoundary from "@components/ErrorBoundary"; +import { Channel } from "discord-types/general"; + +export interface ExpressionPickerButtonProps { + id?: string; + "aria-controls": string; + "aria-selected": boolean; + isActive: boolean; + viewType: string; + children: string | JSX.Element; + autoFocus?: boolean; + [key: string]: any; +} + +export interface ExpressionPickerPanelProps { + selectedTab: string; + channel: Channel; +} + +export type ExpressionPickerButtonComponent = (props: ExpressionPickerButtonProps) => JSX.Element | null; +export type ExpressionPickerPanelComponent = (props: ExpressionPickerPanelProps) => JSX.Element | null; + + +export interface ExpressionPickerTabItem { + tab: string, + Component: ExpressionPickerPanelComponent; + autoFocus?: boolean; +} + +const ExpressionPickerComponents = new Map(); + + +export const addExpressionPickerTabButton = (id: string, tab: string, PanelComponent: ExpressionPickerPanelComponent, autoFocus?: boolean) => ExpressionPickerComponents.set(id, { tab: tab, Component: PanelComponent, autoFocus: autoFocus }); +export const removeExpressionPickerTabButton = (id: string) => ExpressionPickerComponents.delete(id); + + +export function* RenderTabButtons(ExpressionPickerButtonComponent: ExpressionPickerButtonComponent, selectedTab: string) { + for (const [id, { tab }] of ExpressionPickerComponents) { + yield ({tab}); + } +} + +export function* TabPanels(selectedTab: string, channel: Channel) { + for (const [id, { Component }] of ExpressionPickerComponents) { + if (id !== selectedTab) { continue; } + const PanelComponent: ExpressionPickerPanelComponent = Component; + yield (); + } +} diff --git a/src/api/index.ts b/src/api/index.ts index 02c70008a..b0742b327 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -14,13 +14,14 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -*/ + */ import * as $Badges from "./Badges"; import * as $ChatButtons from "./ChatButtons"; import * as $Commands from "./Commands"; import * as $ContextMenu from "./ContextMenu"; import * as $DataStore from "./DataStore"; +import * as $ExpressionPickerTabs from "./ExpressionPickerTabs"; import * as $MemberListDecorators from "./MemberListDecorators"; import * as $MessageAccessories from "./MessageAccessories"; import * as $MessageDecorations from "./MessageDecorations"; @@ -116,3 +117,8 @@ export const ChatButtons = $ChatButtons; * An API allowing you to update and re-render messages */ export const MessageUpdater = $MessageUpdater; + +/** + * An API allowing you to add panels to the expression picker + */ +export const ExpressionPickerTabs = $ExpressionPickerTabs; diff --git a/src/plugins/_api/expressionPickerTabs.ts b/src/plugins/_api/expressionPickerTabs.ts new file mode 100644 index 000000000..33b1ef477 --- /dev/null +++ b/src/plugins/_api/expressionPickerTabs.ts @@ -0,0 +1,30 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2024 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Devs } from "@utils/constants"; +import definePlugin from "@utils/types"; + + +export default definePlugin({ + name: "ExpressionPickerTabsAPI", + description: "an API to add panels to the expression picker", + authors: [Devs.iamme], + patches: [ + { + find: ".EXPRESSION_PICKER_CATEGORIES_A11Y_LABEL", + replacement: [ + { + match: /\.jsx\)\((\i),\{id:\i\.E\i,.+?,"aria-selected":(\i)===\i\.\i\.EMOJI.+?,viewType:(\i).+?\}\)/, + replace: "$&,...Vencord.Api.ExpressionPickerTabs.RenderTabButtons($1, $2)" + }, + { + match: /null,(\i)===\i\.ExpressionPickerViewType\.EMOJI\?.{0,55}channel:(\i),.+?\):null/, + replace: "$&,...Vencord.Api.ExpressionPickerTabs.TabPanels($1, $2)" + } + ] + } + ] +}); diff --git a/src/utils/constants.ts b/src/utils/constants.ts index ff754d5c2..b5ab291e4 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -*/ + */ export const WEBPACK_CHUNK = "webpackChunkdiscord_app"; export const REACT_GLOBAL = "Vencord.Webpack.Common.React"; @@ -39,27 +39,27 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, Ven: { name: "Vendicated", - id: 343383572805058560n + id: 343383572805058560n, }, Arjix: { name: "ArjixWasTaken", - id: 674710789138939916n + id: 674710789138939916n, }, Cyn: { name: "Cynosphere", - id: 150745989836308480n + id: 150745989836308480n, }, Trwy: { name: "trey", - id: 354427199023218689n + id: 354427199023218689n, }, Megu: { name: "Megumin", - id: 545581357812678656n + id: 545581357812678656n, }, botato: { name: "botato", - id: 440990343899643943n + id: 440990343899643943n, }, fawn: { name: "fawn", @@ -67,11 +67,11 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, rushii: { name: "rushii", - id: 295190422244950017n + id: 295190422244950017n, }, Glitch: { name: "Glitchy", - id: 269567451199569920n + id: 269567451199569920n, }, Samu: { name: "Samu", @@ -79,19 +79,19 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, Nyako: { name: "nyako", - id: 118437263754395652n + id: 118437263754395652n, }, MaiKokain: { name: "Mai", - id: 722647978577363026n + id: 722647978577363026n, }, echo: { name: "ECHO", - id: 712639419785412668n + id: 712639419785412668n, }, katlyn: { name: "katlyn", - id: 250322741406859265n + id: 250322741406859265n, }, nea: { name: "nea", @@ -99,87 +99,87 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, Nuckyz: { name: "Nuckyz", - id: 235834946571337729n + id: 235834946571337729n, }, D3SOX: { name: "D3SOX", - id: 201052085641281538n + id: 201052085641281538n, }, Nickyux: { name: "Nickyux", - id: 427146305651998721n + id: 427146305651998721n, }, mantikafasi: { name: "mantikafasi", - id: 287555395151593473n + id: 287555395151593473n, }, Xinto: { name: "Xinto", - id: 423915768191647755n + id: 423915768191647755n, }, JacobTm: { name: "Jacob.Tm", - id: 302872992097107991n + id: 302872992097107991n, }, DustyAngel47: { name: "DustyAngel47", - id: 714583473804935238n + id: 714583473804935238n, }, BanTheNons: { name: "BanTheNons", - id: 460478012794863637n + id: 460478012794863637n, }, BigDuck: { name: "BigDuck", - id: 1024588272623681609n + id: 1024588272623681609n, }, AverageReactEnjoyer: { name: "Average React Enjoyer", - id: 1004904120056029256n + id: 1004904120056029256n, }, adryd: { name: "adryd", - id: 0n + id: 0n, }, Tyman: { name: "Tyman", - id: 487443883127472129n + id: 487443883127472129n, }, afn: { name: "afn", - id: 420043923822608384n + id: 420043923822608384n, }, KraXen72: { name: "KraXen72", - id: 379304073515499530n + id: 379304073515499530n, }, kemo: { name: "kemo", - id: 715746190813298788n + id: 715746190813298788n, }, dzshn: { name: "dzshn", - id: 310449948011528192n + id: 310449948011528192n, }, Ducko: { name: "Ducko", - id: 506482395269169153n + id: 506482395269169153n, }, jewdev: { name: "jewdev", - id: 222369866529636353n + id: 222369866529636353n, }, Luna: { name: "Luny", - id: 821472922140803112n + id: 821472922140803112n, }, Vap: { name: "Vap0r1ze", - id: 454072114492866560n + id: 454072114492866560n, }, KingFish: { name: "King Fish", - id: 499400512559382538n + id: 499400512559382538n, }, Commandtechno: { name: "Commandtechno", @@ -187,7 +187,7 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, TheSun: { name: "sunnie", - id: 406028027768733696n + id: 406028027768733696n, }, axyie: { name: "'ax", @@ -195,44 +195,44 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, pointy: { name: "pointy", - id: 99914384989519872n + id: 99914384989519872n, }, SammCheese: { name: "Samm-Cheese", - id: 372148345894076416n + id: 372148345894076416n, }, zt: { name: "zt", - id: 289556910426816513n + id: 289556910426816513n, }, captain: { name: "Captain", - id: 347366054806159360n + id: 347366054806159360n, }, nick: { name: "nick", id: 347884694408265729n, - badge: false + badge: false, }, whqwert: { name: "whqwert", - id: 586239091520176128n + id: 586239091520176128n, }, lewisakura: { name: "lewisakura", - id: 96269247411400704n + id: 96269247411400704n, }, RuiNtD: { name: "RuiNtD", - id: 157917665162297344n + id: 157917665162297344n, }, hunt: { name: "hunt-g", - id: 222800179697287168n + id: 222800179697287168n, }, cloudburst: { name: "cloudburst", - id: 892128204150685769n + id: 892128204150685769n, }, Aria: { name: "Syncxv", @@ -240,51 +240,51 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, TheKodeToad: { name: "TheKodeToad", - id: 706152404072267788n + id: 706152404072267788n, }, LordElias: { name: "LordElias", - id: 319460781567639554n + id: 319460781567639554n, }, juby: { name: "Juby210", - id: 324622488644616195n + id: 324622488644616195n, }, Alyxia: { name: "Alyxia Sother", - id: 952185386350829688n + id: 952185386350829688n, }, Remty: { name: "Remty", - id: 335055032204656642n + id: 335055032204656642n, }, skyevg: { name: "skyevg", - id: 1090310844283363348n + id: 1090310844283363348n, }, Dziurwa: { name: "Dziurwa", - id: 1001086404203389018n + id: 1001086404203389018n, }, arHSM: { name: "arHSM", - id: 841509053422632990n + id: 841509053422632990n, }, F53: { name: "F53", - id: 280411966126948353n + id: 280411966126948353n, }, AutumnVN: { name: "AutumnVN", - id: 393694671383166998n + id: 393694671383166998n, }, pylix: { name: "pylix", - id: 492949202121261067n + id: 492949202121261067n, }, Tyler: { name: "\\\\GGTyler\\\\", - id: 143117463788191746n + id: 143117463788191746n, }, RyanCaoDev: { name: "RyanCaoDev", @@ -292,27 +292,27 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, FieryFlames: { name: "Fiery", - id: 890228870559698955n + id: 890228870559698955n, }, KannaDev: { name: "Kanna", - id: 317728561106518019n + id: 317728561106518019n, }, carince: { name: "carince", - id: 818323528755314698n + id: 818323528755314698n, }, PandaNinjas: { name: "PandaNinjas", - id: 455128749071925248n + id: 455128749071925248n, }, CatNoir: { name: "CatNoir", - id: 260371016348336128n + id: 260371016348336128n, }, outfoxxed: { name: "outfoxxed", - id: 837425748435796060n + id: 837425748435796060n, }, UwUDev: { name: "UwU", @@ -320,39 +320,39 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, amia: { name: "amia", - id: 142007603549962240n + id: 142007603549962240n, }, phil: { name: "phil", - id: 305288513941667851n + id: 305288513941667851n, }, ImLvna: { name: "Luna <3", - id: 799319081723232267n + id: 799319081723232267n, }, rad: { name: "rad", - id: 610945092504780823n + id: 610945092504780823n, }, AndrewDLO: { name: "Andrew-DLO", - id: 434135504792059917n + id: 434135504792059917n, }, HypedDomi: { name: "HypedDomi", - id: 354191516979429376n + id: 354191516979429376n, }, Rini: { name: "Rini", - id: 1079479184478441643n + id: 1079479184478441643n, }, castdrian: { name: "castdrian", - id: 224617799434108928n + id: 224617799434108928n, }, Arrow: { name: "arrow", - id: 958158495302176778n + id: 958158495302176778n, }, bb010g: { name: "bb010g", @@ -372,19 +372,19 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, archeruwu: { name: "archer_uwu", - id: 160068695383736320n + id: 160068695383736320n, }, ProffDea: { name: "ProffDea", - id: 609329952180928513n + id: 609329952180928513n, }, UlyssesZhan: { name: "UlyssesZhan", - id: 586808226058862623n + id: 586808226058862623n, }, ant0n: { name: "ant0n", - id: 145224646868860928n + id: 145224646868860928n, }, Board: { name: "BoardTM", @@ -392,11 +392,11 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, philipbry: { name: "philipbry", - id: 554994003318276106n + id: 554994003318276106n, }, Korbo: { name: "Korbo", - id: 455856406420258827n + id: 455856406420258827n, }, maisymoe: { name: "maisy", @@ -404,11 +404,11 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, Lexi: { name: "Lexi", - id: 506101469787717658n + id: 506101469787717658n, }, Mopi: { name: "Mopi", - id: 1022189106614243350n + id: 1022189106614243350n, }, Grzesiek11: { name: "Grzesiek11", @@ -436,7 +436,7 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, nin0dev: { name: "nin0dev", - id: 886685857560539176n + id: 886685857560539176n, }, Elvyra: { name: "Elvyra", @@ -444,75 +444,79 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, HappyEnderman: { name: "Happy enderman", - id: 1083437693347827764n + id: 1083437693347827764n, }, Vishnya: { name: "Vishnya", - id: 282541644484575233n + id: 282541644484575233n, }, Inbestigator: { name: "Inbestigator", - id: 761777382041714690n + id: 761777382041714690n, }, newwares: { name: "newwares", - id: 421405303951851520n + id: 421405303951851520n, }, JohnyTheCarrot: { name: "JohnyTheCarrot", - id: 132819036282159104n + id: 132819036282159104n, }, puv: { name: "puv", - id: 469441552251355137n + id: 469441552251355137n, }, Kodarru: { name: "Kodarru", - id: 785227396218748949n + id: 785227396218748949n, }, nakoyasha: { name: "nakoyasha", - id: 222069018507345921n + id: 222069018507345921n, }, Sqaaakoi: { name: "Sqaaakoi", - id: 259558259491340288n + id: 259558259491340288n, + }, + iamme: { + name: "i am me", + id: 984392761929256980n, }, Byron: { name: "byeoon", - id: 1167275288036655133n + id: 1167275288036655133n, }, Kaitlyn: { name: "kaitlyn", - id: 306158896630988801n + id: 306158896630988801n, }, PolisanTheEasyNick: { name: "Oleh Polisan", - id: 242305263313485825n + id: 242305263313485825n, }, HAHALOSAH: { name: "HAHALOSAH", - id: 903418691268513883n + id: 903418691268513883n, }, GabiRP: { name: "GabiRP", - id: 507955112027750401n + id: 507955112027750401n, }, ImBanana: { name: "Im_Banana", - id: 635250116688871425n + id: 635250116688871425n, }, xocherry: { name: "xocherry", - id: 221288171013406720n + id: 221288171013406720n, }, ScattrdBlade: { name: "ScattrdBlade", - id: 678007540608532491n + id: 678007540608532491n, }, goodbee: { name: "goodbee", - id: 658968552606400512n + id: 658968552606400512n, }, Moxxie: { name: "Moxxie", @@ -524,19 +528,20 @@ export const Devs = /* #__PURE__*/ Object.freeze({ }, nyx: { name: "verticalsync", - id: 328165170536775680n + id: 328165170536775680n, }, nekohaxx: { name: "nekohaxx", - id: 1176270221628153886n - } + id: 1176270221628153886n, + }, } satisfies Record); // iife so #__PURE__ works correctly export const DevsById = /* #__PURE__*/ (() => - Object.freeze(Object.fromEntries( - Object.entries(Devs) - .filter(d => d[1].id !== 0n) - .map(([_, v]) => [v.id, v] as const) - )) -)() as Record; + Object.freeze( + Object.fromEntries( + Object.entries(Devs) + .filter((d) => d[1].id !== 0n) + .map(([_, v]) => [v.id, v] as const) + ) + ))() as Record;