From 4e11f29b0b6e608784ecbdfccf3c241f5bdb9c10 Mon Sep 17 00:00:00 2001 From: mohiit1502 Date: Thu, 5 Sep 2024 13:27:27 +0530 Subject: [PATCH] Added events processor --- src/packages/event-manager/src/index.ts | 124 ++++++++++++++++++++++ src/packages/event-manager/src/types.d.ts | 10 ++ 2 files changed, 134 insertions(+) create mode 100644 src/packages/event-manager/src/types.d.ts diff --git a/src/packages/event-manager/src/index.ts b/src/packages/event-manager/src/index.ts index e69de29..a5841e8 100644 --- a/src/packages/event-manager/src/index.ts +++ b/src/packages/event-manager/src/index.ts @@ -0,0 +1,124 @@ +import { EventHandlerOptions, EventHandlers } from "./types" + +// Define event types +enum ArEventTypes { + CLICK = "click", + INPUT = "input", + SELECTIONCHANGE = "selectionchange", + KEYDOWN = "keydown", + BOLD = "bold", + ITALIC = "italic", + UNDERLINE = "underline", + STRIKETHROUGH = "strikethrough", + SUBSCRIPT = "subscript", + SUPERSCRIPT = "superscript", +} + +// Define event handlers +const eventHandlers: EventHandlers = { + [ArEventTypes.CLICK]: { + handler1: () => console.log("Handler 1 for Click event triggered!"), + handler2: () => console.log("Handler 2 for Click event triggered!"), + }, + [ArEventTypes.INPUT]: { + handler1: () => console.log("Handler 1 for Input event triggered!"), + handler2: () => console.log("Handler 2 for Input event triggered!"), + }, + [ArEventTypes.KEYDOWN]: { + handler1: () => console.log("Handler 1 for Keydown event triggered!"), + handler2: () => console.log("Handler 2 for Keydown event triggered!"), + }, + [ArEventTypes.BOLD]: { + handler: () => console.log("Bold handler triggered!"), + }, + [ArEventTypes.ITALIC]: { + handler: () => console.log("Italic handler triggered!"), + }, + [ArEventTypes.UNDERLINE]: { + handler: () => console.log("Underline handler triggered!"), + }, + // Add more handlers as needed +} + +// Define keyboard shortcut handlers +const macShortcuts: { [key: string]: ArEventTypes } = { + "cmd+b": ArEventTypes.BOLD, // Bold + "cmd+i": ArEventTypes.ITALIC, // Italic + "cmd+u": ArEventTypes.UNDERLINE, // Underline + "cmd+s": ArEventTypes.STRIKETHROUGH, // Strikethrough + "cmd+z": ArEventTypes.SUBSCRIPT, // Subscript + "cmd+y": ArEventTypes.SUPERSCRIPT, // Superscript +} + +const windowsShortcuts: { [key: string]: ArEventTypes } = { + "ctrl+b": ArEventTypes.BOLD, // Bold + "ctrl+i": ArEventTypes.ITALIC, // Italic + "ctrl+u": ArEventTypes.UNDERLINE, // Underline + "ctrl+s": ArEventTypes.STRIKETHROUGH, // Strikethrough + "ctrl+z": ArEventTypes.SUBSCRIPT, // Subscript + "ctrl+y": ArEventTypes.SUPERSCRIPT, // Superscript +} + +class EventsManager { + public static hook(options?: EventHandlerOptions) { + const includedHandlers = new Set() + const excludedHandlers = new Set() + + // Process include options + options?.include?.forEach(({ eventType, handlerNames }) => { + handlerNames.forEach((handlerName) => { + const handlerKey = `${eventType}:${handlerName}` + includedHandlers.add(handlerKey) + }) + }) + + // Process exclude options + options?.exclude?.forEach(({ eventType, handlerNames }) => { + handlerNames.forEach((handlerName) => { + const handlerKey = `${eventType}:${handlerName}` + if (includedHandlers.has(handlerKey)) { + console.warn( + `Excluding handler ${handlerName} for event ${eventType} as it is present in both include and exclude lists.`, + ) + } + excludedHandlers.add(handlerKey) + }) + }) + + // Hook event handlers + for (const [eventType, handlers] of Object.entries(eventHandlers)) { + for (const [handlerName, handler] of Object.entries(handlers)) { + const handlerKey = `${eventType}:${handlerName}` + if (includedHandlers.size > 0 && !includedHandlers.has(handlerKey)) { + continue + } + if (excludedHandlers.has(handlerKey)) { + continue + } + document.addEventListener(eventType, handler) + } + } + + // Determine platform and hook keyboard shortcut handlers + const isMac = /Mac|iPod|iPhone|iPad/.test(navigator.platform) + const shortcuts = isMac ? macShortcuts : windowsShortcuts + + document.addEventListener("keydown", (event) => { + const key = `${isMac ? "cmd" : "ctrl"}+${event.key.toLowerCase()}` + const eventType = shortcuts[key] + if (eventType && !excludedHandlers.has(`${eventType}:handler`)) { + if ( + includedHandlers.size === 0 || + includedHandlers.has(`${eventType}:handler`) + ) { + eventHandlers[eventType].handler() + event.preventDefault() // Prevent default action for the shortcut + } + } + }) + } +} + +// Export the module +export default EventsManager +export { ArEventTypes } diff --git a/src/packages/event-manager/src/types.d.ts b/src/packages/event-manager/src/types.d.ts new file mode 100644 index 0000000..4bdda78 --- /dev/null +++ b/src/packages/event-manager/src/types.d.ts @@ -0,0 +1,10 @@ +export type EventHandlerOptions = { + include?: { eventType: ArEventTypes; handlerNames: string[] }[] + exclude?: { eventType: ArEventTypes; handlerNames: string[] }[] +} + +export interface EventHandlers { + [key: string]: { + [handlerName: string]: () => void + } +}