fetchData method

Future<FetchFirstResponse> fetchData({
  1. required String urlPath,
  2. Map<String, String>? headers,
  3. Duration? timeOut,
  4. OfflineFirstFetchPolicy fetchPolicy = OfflineFirstFetchPolicy.cacheThenNetwork,
  5. bool debugMode = false,
})

Implementation

Future<FetchFirstResponse> fetchData({
  required String urlPath,
  Map<String, String>? headers,
  Duration? timeOut,
  OfflineFirstFetchPolicy fetchPolicy = OfflineFirstFetchPolicy.cacheThenNetwork,
  bool debugMode = false,
}) async {
  try {
    if (debugMode) log("FetchPolicy: $fetchPolicy | URL: $urlPath");

    switch (fetchPolicy) {
      case OfflineFirstFetchPolicy.networkOnly:
        return await _fetchFromNetwork(urlPath, headers, timeOut, debugMode);

      case OfflineFirstFetchPolicy.cacheOnly:
        final cached = await _storage.getData(urlPath);
        if (debugMode) log("Loaded from cache (cacheOnly): $cached");

        return FetchFirstResponse(
          data: cached,
          status: cached != null,
          message: cached != null ? '' : 'No cached data found.',
        );

      case OfflineFirstFetchPolicy.cacheThenNetwork:
        final cached = await _storage.getData(urlPath);
        if (debugMode) log("Loaded from cache (cacheThenNetwork): $cached");

        _fetchFromNetwork(urlPath, headers, timeOut, debugMode); // fire & forget
        return FetchFirstResponse(
          data: cached,
          status: cached != null,
          message:
              cached != null
                  ? 'Loaded from cache. Fresh data updating in background.'
                  : 'No cached data. Fetching online...',
        );
    }
  } catch (e) {
    if (debugMode) log("Fetch error: $e");
    return FetchFirstResponse(data: null, status: false, message: e.toString());
  }
}