fetchData method

Future<void> fetchData()

Implementation

Future<void> fetchData() async {
  // fetchFromClientFirebase();
  try {
    emit(ApiLoadingState());

    if (Instadiv.getInstance().storageOption ==
        StorageOption.clientFirebase) {
      FirebaseApp app = Instadiv.getInstance().firebaseApp;

      FirebaseFirestore firestore = FirebaseFirestore.instanceFor(app: app);

      // data = snapshot.docs.map((doc) => doc.data()).toList();
      List<Map<String, dynamic>> data = [];
      DocumentSnapshot<Map<String, dynamic>> snapshotProject = await firestore
          .collection(instaCollection)
          .doc(Instadiv.getInstance().project)
          .get();

      if (snapshotProject.exists) {
        int updatedAt = snapshotProject.get('updated_at');
        bool isTimestampUpdated = await ViewPref.getInstance()
            .isTimestampUpdated('updated_at', updatedAt);
        if (isTimestampUpdated == false) {
          List<Map<String, dynamic>> data =
          await ViewPref.getInstance().loadData();
          if(data.isNotEmpty ){
            emit(ApiLoadedState(data));
            return;
          }
        }
      } else {
        emit(ApiLoadedState(data));
        return;
      }

      final QuerySnapshot<Map<String, dynamic>> snapshot = await firestore
          .collection(instaCollection)
          .doc(Instadiv.getInstance().project)
          .collection('views')
          .get();

      for (var view in snapshot.docs) {
        var viewJson = view.data();
        viewJson['id'] = view.id;
        data.add(viewJson);

        int updatedAt = viewJson['updated_at'] ?? 0;
        String key = view.id + updatedAt.toString();
        ViewPref.getInstance().createLogMap(key);
      }
      ViewPref.getInstance().saveData(data);
      emit(ApiLoadedState(data));

    } else {
      if (Instadiv.getInstance().apiKey == null ||
          Instadiv.getInstance().project == null) {
        emit(ApiErrorState('Api key and project id not set'));
        return;
      }

      var url = Uri.parse(
          '${ApiConstants.baseUrl}${Instadiv.getInstance().apiKey!}/project/${Instadiv.getInstance().project!}');
      final response = await http.get(url);

      if (response.statusCode == 200 || response.statusCode == 304) {
        List<dynamic> parsedResponse = json.decode(response.body);
        List<Map<String, dynamic>> data = [];
        for (var item in parsedResponse) {
          if (item is Map<String, dynamic>) {
            data.add(item);
          }
        }
        emit(ApiLoadedState(data));
      } else {
        emit(ApiErrorState('Failed to load data'));
      }
    }
  } catch (e) {
    emit(ApiErrorState('An error occurred: $e'));
  }
}