Preview:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:healum/utils/trackers.dart';
import 'package:intl/intl.dart';

class DataBase {
  final database = FirebaseFirestore.instance;

  isUserAdded(String uid) async {
    return (await database.collection("users").doc(uid).get()).exists;
  }

  addUser(String uid) async {
    DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
    await database
        .collection('users')
        .doc(uid)
        .set((await deviceInfo.androidInfo).toMap());
  }

  pushTrackerData(
      Tracker tracker, String uid, Map<String, dynamic> trackerData) async {
    DateTime dateTime = DateTime.now();
    Map<String, dynamic> data = {
      "date_added_on": Timestamp.now(),
      "day_added_on": DateFormat('EEEE').format(dateTime)
    };
    data.addEntries(trackerData.entries);
    await database
        .collection('users')
        .doc(uid)
        .collection(tracker.key)
        .doc()
        .set(data);
  }

  getFirstTrackerData(Tracker tracker, String uid) async {
    try {
      return (await database
              .collection('users')
              .doc(uid)
              .collection(tracker.key)
              .orderBy("date_added_on", descending: true)
              .limit(1)
              .get())
          .docChanges
          .first
          .doc
          .data()['value']
          .toString();
    } catch (_) {
      return null;
    }
  }

  updateSpecificTrackerDataByTimestamp(
      Tracker tracker, String uid, Timestamp timestamp) async {
    final doc = (await database
            .collection('users')
            .doc(uid)
            .collection(tracker.key)
            .where("date_added_on", isEqualTo: timestamp)
            .limit(1)
            .get())
        .docChanges
        .first
        .doc
        .reference;
    Map existingData = (await doc.get()).data();
    print(existingData);
    existingData['value'] = tracker.value;
    var batch = database.batch();
    batch.update(doc, existingData);
    await batch.commit();
  }

  Future<List> getAllTrackerData(Tracker tracker, String uid) async {
    try {
      var snapshotList = (await database
              .collection('users')
              .doc(uid)
              .collection(tracker.key)
              .orderBy("date_added_on", descending: true)
              .get())
          .docChanges;
      List<Map<String, dynamic>> mapList =
          snapshotList.map((e) => e.doc.data()).toList();
      return mapList;
    } catch (_) {
      return null;
    }
  }
}
downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter