syncWhenOnline method

Future<void> syncWhenOnline()

Sync queue when online

Implementation

Future<void> syncWhenOnline() async {
  if (!isOnline.value || isSyncing.value) return;

  isSyncing.value = true;

  try {
    while (_queue.isNotEmpty) {
      final action = _queue.first;
      _actionStatus[action.id] = OfflineActionStatus.executing;

      try {
        await _executeAction(action);
        _queue.removeFirst();
        _actionStatus[action.id] = OfflineActionStatus.success;
      } catch (e) {
        if (e is ConflictException) {
          await _handleConflict(action, e);
        } else {
          // Retry logic
          action.retryCount++;
          if (action.retryCount >= 3) {
            // Move to failed actions
            _queue.removeFirst();
            _failedActions.add(action);
            _actionStatus[action.id] = OfflineActionStatus.failed;

            if (kDebugMode) {
              debugPrint('Action ${action.type} failed after 3 retries: $e');
            }
          } else {
            // Retry immediately with exponential backoff
            if (kDebugMode) {
              debugPrint('Action ${action.type} failed, retrying (attempt ${action.retryCount + 1}/3): $e');
            }
            await Future.delayed(Duration(milliseconds: 100 * action.retryCount));
            // Continue loop to retry this action
          }
        }
      }

      await _persistQueue();
    }
  } finally {
    isSyncing.value = false;
  }
}