track static method

Future<void> track(
  1. String eventKey
)

Tracks an event occurrence.

For count-based triggers, this method should be called each time the event occurs. It will trigger the event when the count reaches the configured threshold.

This method also handles:

  • End time checks
  • Maximum recurrence checks
  • Count-based recurrence

Returns a Future that completes when the tracking is done.

Implementation

static Future<void> track(String eventKey) async {
  final config = _configs[eventKey];
  if (config == null) return;

  if (config.endTime != null && DateTime.now().isAfter(config.endTime!)) {
    config.onStateUpdate?.call(false);
    return;
  }

  await _eventCounter.incrementCounter(eventKey);
  final count = await _eventCounter.getCounter(eventKey);
  final recurrenceCount = await _eventCounter.getRecurrenceCounter(eventKey);

  if (config.maxRecurrences != null &&
      recurrenceCount >= config.maxRecurrences! + 1) {
    config.onStateUpdate?.call(false);
    return;
  }

  if (config.triggerType == TriggerType.count &&
      count >= config.triggerCount! &&
      recurrenceCount == 0) {
    _triggerEvent(config, isRecurrence: false);
    return;
  }

  if (config.triggerType == TriggerType.time &&
      DateTime.now().isAfter(config.triggerTime!) &&
      recurrenceCount == 0) {
    _triggerEvent(config, isRecurrence: false);
    return;
  }

  if (config.recurrenceType == RecurrenceType.count && recurrenceCount > 0) {
    if (config.maxRecurrences != null &&
        recurrenceCount >= config.maxRecurrences! + 1) {
      config.onStateUpdate?.call(false);
      return;
    }

    final remainingCount = count - config.triggerCount!;
    if (remainingCount > 0 && remainingCount % config.recurrenceCount! == 0) {
      _triggerEvent(config, isRecurrence: true);
    }
  }
}