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 .packages
build/ build/
.metadata .metadata
.flutter-plugins
.flutter-plugins-dependencies
android/ android/
ios/ ios/

View file

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

View file

@ -7,15 +7,23 @@ import 'package:flutter/material.dart';
@immutable @immutable
class FirebaseTimetableOptions { class FirebaseTimetableOptions {
const 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, alwaysFetch,
// if you use fetchOnce the timetable events will be fetched only once
fetchOnce, fetchOnce,
// will first be fetched and after that updates will be listened to
fetchOnceAndListen, fetchOnceAndListen,
// if you use listen the timetable events will be updated in real time
listen, 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/material.dart';
import 'package:flutter_timetable_firebase/src/config/firebase_timetable_options.dart'; import 'package:flutter_timetable_firebase/src/config/firebase_timetable_options.dart';
import 'package:flutter_timetable_interface/flutter_timetable_interface.dart'; import 'package:flutter_timetable_interface/flutter_timetable_interface.dart';
class FirebaseTimetableService<Event> class FirebaseTimetableService<Event extends TimetableEvent>
with ChangeNotifier with ChangeNotifier
implements TimetableService<Event> { implements TimetableService<Event> {
FirebaseTimetableService({ 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 @override
Future<void> addEvent(event) async { Future<void> addEvent(Event event) async {
event.toJson();
throw UnimplementedError(); throw UnimplementedError();
} }
@override @override
Future<bool> checkForConflict(event, DateTime day) async { Future<bool> checkForConflict(Event event, DateTime day) async {
throw UnimplementedError(); throw UnimplementedError();
} }
@ -27,12 +37,13 @@ class FirebaseTimetableService<Event>
} }
@override @override
Future<List<Event>> fetchEventsForDay(DateTime day) async { Future<List<Event>> fetchEventsForDay(DateTime day,
{String? category}) async {
throw UnimplementedError(); throw UnimplementedError();
} }
@override @override
List<Event> getEventsForDay(DateTime day) { List<Event> getEventsForDay(DateTime day, {String? category}) {
throw UnimplementedError(); throw UnimplementedError();
} }

View file

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

View file

@ -12,6 +12,7 @@ class TimetableEvent {
required this.end, required this.end,
required this.entityId, required this.entityId,
required this.eventId, required this.eventId,
this.category,
}); });
/// The date at which the event starts /// The date at which the event starts
@ -27,4 +28,18 @@ class TimetableEvent {
/// The identifier of the entity that the event belongs to /// The identifier of the entity that the event belongs to
/// This is used to check for conflicts between entities /// This is used to check for conflicts between entities
final String entityId; 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'; import 'package:flutter/material.dart';
abstract class TimetableService<Event> with ChangeNotifier { abstract class TimetableService<Event> with ChangeNotifier {
Future<List<Event>> fetchEventsForDay(DateTime day); Future<List<Event>> fetchEventsForDay(DateTime day, {String? category});
List<Event> getEventsForDay(DateTime day); List<Event> getEventsForDay(DateTime day, {String? category});
Future<void> addEvent(Event event); Future<void> addEvent(Event event);
Future<void> updateEvent(Event event); Future<void> updateEvent(Event event);
Future<void> deleteEvent(Event event); Future<void> deleteEvent(Event event);