track method

Future<void> track({
  1. required String event,
  2. Map<String, dynamic>? properties,
})

Tracks an event with optional properties.

Implementation

Future<void> track({
  required String event,
  Map<String, dynamic>? properties,
}) async {
  if (nudgeDisabled) {
    NLogger.i("Nudge tracking is disabled. Event: $event");
    return;
  }

  if (event.isEmpty) {
    NLogger.e("Track event failed: Event name cannot be null or empty.");
    return;
  }

  // clean properties to ensure no null values
  properties ??= {};

  //converts list into a comma-separated string
  //  properties.removeWhere(
  //   (key, value) {
  //     if (value == null) {
  //       NLogger.e("Removing null $key");
  //       return true;
  //     }
  //     return false;
  //   },
  // );
  properties = Map<String, dynamic>.from(properties ?? {});
  properties.updateAll((key, value) {
    if (value is List<int> ||
        value is List<double> ||
        value is List<bool>||
        value is List<String>) {
      // Convert numeric/bool lists into comma-separated string
      return value.join(",");
    }
    return value; // Leave other types unchanged
  });

  properties.removeWhere(
    (key, value) {
      if (value == null ||
          (value is String && value.isEmpty) ||
          (value is Map)||
          (value is List)) {
        NLogger.e("Removing null or invalid property: $key");
        return true;
      }

      return false;
    },
  );

  NLogger.i("Tracking Event: $event, Properties: ${jsonEncode(properties)}");

  await _nudgeCoreV2NativeServices.invokeNativeMethod('nudge_track', {
    'event': event,
    'properties': properties,
  });

  NLogger.i("Track Event Completed: $event");
}