///|
/// Collect all global event handlers from the virtual DOM tree
/// Returns an array of handler functions with their coordinates
pub fn[T, G] collect_global_handlers(
tree : @node.RespoNode[T, G],
coord : @immut/vector.Vector[@node.RespoCoord],
) -> Array[
(
(G, @node.DispatchFn[T]) -> Unit raise @node.RespoCommonError,
@immut/vector.Vector[@node.RespoCoord],
),
] {
let handlers : Array[
(
(G, @node.DispatchFn[T]) -> Unit raise @node.RespoCommonError,
@immut/vector.Vector[@node.RespoCoord],
),
] = []
// Helper function to recursively traverse the tree
fn collect_from_node(
node : @node.RespoNode[T, G],
current_coord : @immut/vector.Vector[@node.RespoCoord],
) -> Unit {
match node {
@node.Component(component) => {
// If this component has a listener, add it
match component.listeners {
Some(listener) => handlers.push((listener, current_coord))
None => ()
}
// Recursively collect from the component's tree
collect_from_node(component.tree, current_coord)
}
@node.Element(element) =>
// Recursively collect from all children
for child in element.children {
let child_coord = current_coord.push(@node.Key(child.0))
collect_from_node(child.1, child_coord)
}
}
}
collect_from_node(tree, coord)
handlers
}
///|
/// Dispatch a global event to all registered handlers in the tree
pub fn[T, G] dispatch_global_event(
event : G,
tree : @node.RespoNode[T, G],
dispatch : @node.DispatchFn[T],
) -> Unit raise @node.RespoCommonError {
let handlers = collect_global_handlers(tree, @immut/vector.new())
// Call each handler with the event
for _i, handler_info in handlers {
let (handler, _coord) = handler_info
handler(event, dispatch)
}
}