Added events processor

This commit is contained in:
2024-09-05 13:27:27 +05:30
parent ae83e30f4a
commit 4e11f29b0b
2 changed files with 134 additions and 0 deletions

View File

@@ -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<string>()
const excludedHandlers = new Set<string>()
// 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 }

View File

@@ -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
}
}