feat: add firebase timetable options

This commit is contained in:
Freek van de Ven 2023-12-03 15:10:58 +01:00
parent f031828067
commit 32b9f9f2c5
8 changed files with 52 additions and 14 deletions

2
.gitignore vendored
View file

@ -29,6 +29,8 @@ pubspec.lock
.packages
build/
.metadata
.flutter-plugins
.flutter-plugins-dependencies
android/
ios/

View file

@ -16,7 +16,7 @@ class MyRosterModel extends TimetableEvent {
final myRosterServiceProvider = Provider(
(ref) => FirebaseTimetableService<MyRosterModel>(
options: FirebaseTimetableOptions(timelineCollectionName: 'roster'),
options: FirebaseTimetableOptions(timetableCollectionName: 'roster'),
),
);

View file

@ -7,15 +7,23 @@ import 'package:flutter/material.dart';
@immutable
class FirebaseTimetableOptions {
const FirebaseTimetableOptions({
this.timelineCollectionName = 'timetable',
this.timetableCollectionName = 'timetable',
this.cachingStrategy = TimetableCachingStrategy.alwaysFetch,
});
// the collection reference name
final String timetableCollectionName;
final String timelineCollectionName;
/// Changes the Firebase Timetable Service to use different caching approaches
final TimetableCachingStrategy cachingStrategy;
}
enum FirebaseTimetableServiceStrategy {
enum TimetableCachingStrategy {
// Everytime the timetable is requested it will be fetched from the database
alwaysFetch,
// if you use fetchOnce the timetable events will be fetched only once
fetchOnce,
// will first be fetched and after that updates will be listened to
fetchOnceAndListen,
// if you use listen the timetable events will be updated in real time
listen,
}

View file

@ -1,23 +1,33 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_timetable_firebase/src/config/firebase_timetable_options.dart';
import 'package:flutter_timetable_interface/flutter_timetable_interface.dart';
class FirebaseTimetableService<Event>
class FirebaseTimetableService<Event extends TimetableEvent>
with ChangeNotifier
implements TimetableService<Event> {
FirebaseTimetableService({
required this.options,
});
FirebaseApp? app,
options = const FirebaseTimetableOptions(),
}) {
var appInstance = app ?? Firebase.app();
_db = FirebaseFirestore.instanceFor(app: appInstance);
_options = options;
}
final FirebaseTimetableOptions options;
late FirebaseTimetableOptions _options;
late FirebaseFirestore _db;
@override
Future<void> addEvent(event) async {
Future<void> addEvent(Event event) async {
event.toJson();
throw UnimplementedError();
}
@override
Future<bool> checkForConflict(event, DateTime day) async {
Future<bool> checkForConflict(Event event, DateTime day) async {
throw UnimplementedError();
}
@ -27,12 +37,13 @@ class FirebaseTimetableService<Event>
}
@override
Future<List<Event>> fetchEventsForDay(DateTime day) async {
Future<List<Event>> fetchEventsForDay(DateTime day,
{String? category}) async {
throw UnimplementedError();
}
@override
List<Event> getEventsForDay(DateTime day) {
List<Event> getEventsForDay(DateTime day, {String? category}) {
throw UnimplementedError();
}

View file

@ -13,6 +13,8 @@ environment:
flutter: ">=1.17.0"
dependencies:
cloud_firestore: ^4.13.3
firebase_core: ^2.24.0
flutter:
sdk: flutter
flutter_timetable_interface:

View file

@ -12,6 +12,7 @@ class TimetableEvent {
required this.end,
required this.entityId,
required this.eventId,
this.category,
});
/// The date at which the event starts
@ -27,4 +28,18 @@ class TimetableEvent {
/// The identifier of the entity that the event belongs to
/// This is used to check for conflicts between entities
final String entityId;
/// This can be used to filter events
final String? category;
// tojson method and a factory fromJson contructor
Map<String, dynamic> toJson() => {};
factory TimetableEvent.fromJson(String eventId, Map<String, dynamic> json) =>
TimetableEvent(
start: json['start'],
end: json['end'],
entityId: json[''],
eventId: eventId,
);
}

View file

@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
abstract class TimetableService<Event> with ChangeNotifier {
Future<List<Event>> fetchEventsForDay(DateTime day);
List<Event> getEventsForDay(DateTime day);
Future<List<Event>> fetchEventsForDay(DateTime day, {String? category});
List<Event> getEventsForDay(DateTime day, {String? category});
Future<void> addEvent(Event event);
Future<void> updateEvent(Event event);
Future<void> deleteEvent(Event event);