eventMap property

Map<String, EventCallback> get eventMap
inherited

Constructs the map of event handlers for the underlying DomComponent.

This method combines the convenient, strongly-typed event callbacks (like onClick) with the flexible eventHandlers map into a single map that Jaspr can use.

Implementation

Map<String, EventCallback> get eventMap {
  final eventMap = <String, EventCallback>{};

  // Standard mouse events
  if (onMouseEnter != null) {
    eventMap['mouseenter'] = (dynamic rawEvent) => onMouseEnter!(rawEvent as MouseEvent);
  }
  if (onMouseLeave != null) {
    eventMap['mouseleave'] = (dynamic rawEvent) => onMouseLeave!(rawEvent as MouseEvent);
  }
  if (onClick != null) {
    eventMap['click'] = (dynamic rawEvent) => onClick!(rawEvent as MouseEvent);
  }

  // Standard keyboard events
  if (onKeyDown != null) {
    eventMap['keydown'] = (dynamic rawEvent) => onKeyDown!(rawEvent as KeyboardEvent);
  }
  if (onKeyUp != null) {
    eventMap['keyup'] = (dynamic rawEvent) => onKeyUp!(rawEvent as KeyboardEvent);
  }

  // Standard input/change events
  if (onInput != null) {
    eventMap['input'] = (dynamic rawEvent) => onInput!(rawEvent as String);
  }
  if (onChange != null) {
    eventMap['change'] = (dynamic rawEvent) => onChange!(rawEvent as String);
  }

  // Custom event handlers
  if (eventHandlers != null && eventHandlers!.isNotEmpty) {
    final eventEntries = eventHandlers!.entries;

    for (final entry in eventEntries) {
      final eventName = entry.key;
      final handlers = entry.value;

      eventMap[eventName] = (dynamic rawEvent) {
        // Attempt to cast to a more specific event type based on common event names
        // to provide better type safety for custom handlers.
        final Event event;
        switch (eventName) {
          case 'click':
          case 'mousedown':
          case 'mouseup':
          case 'mousemove':
          case 'mouseenter':
          case 'mouseleave':
            event = rawEvent as MouseEvent;
          case 'keydown':
          case 'keyup':
          case 'keypress':
            event = rawEvent as KeyboardEvent;
          case 'input':
          case 'change':
            // For input/change, Jaspr provides a String value. We wrap it in a generic Event
            // to match the UiEventHandler signature, though handlers should be aware of this.
            event = Event(rawEvent as String);
          default:
            event = rawEvent as Event;
        }

        for (final handler in handlers) {
          handler(event);
        }
      };
    }
  }
  return eventMap;
}