processUIEvent method
Execute rules for UI events with fresh appContext
Implementation
Future<void> processUIEvent(ObslyEventBase event) async {
if (!_isAvailable || !_isExecutionEnabled) return;
final rulesStartTime = DateTime.now();
ObslyLogger.verboseDetails('RULES', 'π§ Rules processing started');
const elementId = 'Unknown Element';
const action = 'Unknown Action';
try {
final uiContext = _extractUIContext(event);
if (uiContext != null) {
final contextElementId = uiContext['elementId'] ?? elementId;
final contextAction = uiContext['action'] ?? action;
// Log UI rule processing in verbose mode
ObslyLogger.verbose('π±οΈ UI Event: $contextAction on $contextElementId');
ObslyLogger.verbose('π― Starting UI rule evaluation: $contextElementId ($contextAction)');
// Build fresh appContext for this evaluation
final currentAppContext = _buildCurrentAppContext();
// Log context access for debugging (only in verbose mode)
ObslyLogger.verboseDetails('RULES', 'UI Rule context access: app_context');
// Merge UI context with app context
final fullContext = {
...currentAppContext,
'event': {
'click': contextElementId,
'domPath': uiContext['widgetPath'] ?? '',
'action': contextAction,
if (uiContext['metadata'] != null) ...uiContext['metadata'],
},
};
// Log the merged context in verbose mode
ObslyLogger.verbose('ποΈ UI Rule merged context prepared');
ObslyLogger.verbose('π CONTEXT SENT TO RULES ENGINE:');
ObslyLogger.verbose(' event.click = "${fullContext['event']?['click']}"');
ObslyLogger.verbose(' uiContext.elementId = "$contextElementId"');
// Use unified execution method
final results = await RulesManager.instance.executeRulesForEvent(
eventType: 'ui',
context: fullContext,
);
// Log results with consolidated summary
final allTags = results
.expand((r) => RulesResultFormatter.formatForUI(r.rawResult, includeTimestamp: false)['tags']
as List<Map<String, dynamic>>)
.toList();
final allVariables = results
.expand((r) => RulesResultFormatter.formatForUI(r.rawResult, includeTimestamp: false)['variables']
as List<Map<String, dynamic>>)
.toList();
final rulesDuration = DateTime.now().difference(rulesStartTime);
// Consolidated rule execution summary
ObslyLogger.debugSummary('UI Rules', {
'element': contextElementId,
'action': contextAction,
'rules_executed': results.length,
'tags_generated': allTags.length,
'variables_set': allVariables.length,
'duration_ms': rulesDuration.inMilliseconds,
'status': results.isNotEmpty ? 'SUCCESS' : 'NO_RESULTS',
});
// Detailed logging in verbose mode
final resultStatus = results.isNotEmpty ? 'β
SUCCESS' : 'β NO RESULTS';
ObslyLogger.verbose('π UI Rules result: $resultStatus | Rules: ${results.length} | Tags: ${allTags.length} | Variables: ${allVariables.length}');
}
} catch (e, stackTrace) {
final rulesDuration = DateTime.now().difference(rulesStartTime);
ObslyLogger.verboseDetails('RULES', 'π§ Rules processing failed after: ${rulesDuration.inMilliseconds}ms');
ObslyLogger.errorWithContext(
'RulesIntegration',
'processUIEvent',
e.toString(),
stackTrace,
context: {'elementId': elementId, 'action': action},
);
}
}