mirror of
https://github.com/Iconica-Development/flutter_timetable.git
synced 2025-05-18 19:43:43 +02:00
feat: add firebase timetable options
This commit is contained in:
parent
f031828067
commit
32b9f9f2c5
8 changed files with 52 additions and 14 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -29,6 +29,8 @@ pubspec.lock
|
||||||
.packages
|
.packages
|
||||||
build/
|
build/
|
||||||
.metadata
|
.metadata
|
||||||
|
.flutter-plugins
|
||||||
|
.flutter-plugins-dependencies
|
||||||
|
|
||||||
android/
|
android/
|
||||||
ios/
|
ios/
|
||||||
|
|
|
@ -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'),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue