Untitled

 avatar
unknown
plain_text
14 days ago
1.6 kB
5
Indexable
import 'dart:async';
import 'dart:math';

enum NetworkStatus { pending, approved, failed }

class MockApiService {
  NetworkStatus _status = NetworkStatus.pending;
  final StreamController<NetworkStatus> _statusController = StreamController.broadcast();
  final Random _random = Random();
  final Duration mockDuration;

  MockApiService({this.mockDuration = const Duration(seconds: 5)}) {
    _simulateStatusChange();
  }

  /// Exposes a real-time stream of network status changes.
  Stream<NetworkStatus> get statusStream => _statusController.stream;

  Future<NetworkStatus> fetchStatus() async {
    await Future.delayed(const Duration(seconds: 1)); // Simulate network delay
    return _status;
  }

  /// Simulates status transitions, with a chance of failure before approval.
  void _simulateStatusChange() {
    Timer.periodic(mockDuration, (timer) {
      if (_status == NetworkStatus.pending) {
        if (_random.nextDouble() < 0.3) {
          _status = NetworkStatus.failed;
        } else {
          _status = NetworkStatus.approved;
        }
        _statusController.add(_status);

        // Stop the timer once we hit an approved state
        if (_status == NetworkStatus.approved) {
          timer.cancel();
        }
      }
    });
  }

  /// Retry logic: Allows retrying failed requests.
  void retry() {
    if (_status == NetworkStatus.failed) {
      _status = NetworkStatus.pending;
      _statusController.add(_status);
      _simulateStatusChange();
    }
  }

  /// Ensures the stream is properly closed when not needed.
  void dispose() {
    _statusController.close();
  }
}
Editor is loading...
Leave a Comment