@etsoo/react
Version:
TypeScript ReactJs UI Independent Framework
63 lines (53 loc) • 1.27 kB
text/typescript
import React from "react";
/**
* Event watcher action
*/
export interface EventWatcherAction {
/**
* Event type
*/
type?: string | string[];
/**
* Once action or not
*/
once?: boolean;
/**
* Action
*/
action: (event: React.BaseSyntheticEvent | string) => any;
}
/**
* Event watcher
*/
export class EventWatcher {
private actions: EventWatcherAction[] = [];
/**
* Add action
* @param action Action
*/
add(action: EventWatcherAction) {
this.actions.push(action);
}
/**
* Do the event
* @param event Event
*/
do(event: React.BaseSyntheticEvent | string) {
// Type
const type = typeof event === "string" ? event : event.type;
// Execute
const removeIndices: number[] = [];
this.actions.forEach((item, index) => {
if (!this.isMatch(item, type)) return;
item.action(event);
if (item.once) removeIndices.push(index);
});
// Remove all once actions
removeIndices.reverse().forEach((index) => this.actions.splice(index, 1));
}
private isMatch(action: EventWatcherAction, type: string) {
if (action.type == null) return true;
if (typeof action.type === "string") return action.type === type;
return action.type.includes(type);
}
}