feat: add firebase service for fetching timetable events

This commit is contained in:
Freek van de Ven 2023-12-03 11:42:21 +01:00
parent 651ed33cfc
commit f031828067
16 changed files with 200 additions and 6 deletions

View file

@ -0,0 +1,23 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:flutter_timetable_firebase/flutter_timetable_firebase.dart';
import 'package:flutter_timetable_interface/flutter_timetable_interface.dart';
class MyRosterModel extends TimetableEvent {
const MyRosterModel({
required super.end,
required super.start,
required super.entityId,
required super.eventId,
this.isSick = false,
});
final bool isSick;
}
final myRosterServiceProvider = Provider(
(ref) => FirebaseTimetableService<MyRosterModel>(
options: FirebaseTimetableOptions(timelineCollectionName: 'roster'),
),
);
void main() {}

View file

@ -0,0 +1,30 @@
name: flutter_timetable_firebase_example
description: Timetable Widget
publish_to: 'none'
version: 1.1.0+2
environment:
sdk: ">=3.0.0 <4.0.0"
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
flutter_timetable_firebase:
path: ../
flutter_timetable_interface:
path: ../../flutter_timetable_interface
hooks_riverpod: ^2.4.9
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
flutter:
uses-material-design: true

View file

@ -0,0 +1,8 @@
// SPDX-FileCopyrightText: 2023 Iconica
//
// SPDX-License-Identifier: BSD-3-Clause
library flutter_timetable_firebase;
export 'src/config/firebase_timetable_options.dart';
export 'src/services/firebase_timetable_service.dart';

View file

@ -0,0 +1,21 @@
// SPDX-FileCopyrightText: 2023 Iconica
//
// SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart';
@immutable
class FirebaseTimetableOptions {
const FirebaseTimetableOptions({
this.timelineCollectionName = 'timetable',
});
final String timelineCollectionName;
}
enum FirebaseTimetableServiceStrategy {
alwaysFetch,
fetchOnce,
fetchOnceAndListen,
listen,
}

View file

@ -0,0 +1,43 @@
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>
with ChangeNotifier
implements TimetableService<Event> {
FirebaseTimetableService({
required this.options,
});
final FirebaseTimetableOptions options;
@override
Future<void> addEvent(event) async {
throw UnimplementedError();
}
@override
Future<bool> checkForConflict(event, DateTime day) async {
throw UnimplementedError();
}
@override
Future<void> deleteEvent(Event event) async {
throw UnimplementedError();
}
@override
Future<List<Event>> fetchEventsForDay(DateTime day) async {
throw UnimplementedError();
}
@override
List<Event> getEventsForDay(DateTime day) {
throw UnimplementedError();
}
@override
Future<void> updateEvent(Event event) async {
throw UnimplementedError();
}
}

View file

@ -0,0 +1,28 @@
# SPDX-FileCopyrightText: 2023 Iconica
#
# SPDX-License-Identifier: GPL-3.0-or-later
name: flutter_timetable_firebase
description: A new Flutter package project.
version: 2.0.0
repository: https://github.com/Iconica-Development/flutter_timetable
publish_to: none
environment:
sdk: ">=3.1.0 <4.0.0"
flutter: ">=1.17.0"
dependencies:
flutter:
sdk: flutter
flutter_timetable_interface:
git:
url: https://github.com/Iconica-Development/flutter_timetable
ref: 2.0.0
path: packages/flutter_timetable_interface
dev_dependencies:
flutter_lints: ^2.0.0
flutter:

View file

@ -4,4 +4,5 @@
library flutter_timetable_interface;
export 'src/model/time_block.dart';
export 'src/models/timetable_event.dart';
export 'src/services/timetable_service.dart';

View file

@ -0,0 +1,30 @@
// SPDX-FileCopyrightText: 2023 Iconica
//
// SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart';
@immutable
class TimetableEvent {
/// The model used for a [Block] in a [TimeTable] which can contain a Widget.
const TimetableEvent({
required this.start,
required this.end,
required this.entityId,
required this.eventId,
});
/// The date at which the event starts
final DateTime start;
/// The date at which the event ends
final DateTime end;
/// The unique identifier of the event
/// This is used to store the events
final String eventId;
/// The identifier of the entity that the event belongs to
/// This is used to check for conflicts between entities
final String entityId;
}

View file

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

View file

@ -3,7 +3,6 @@
// SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart';
import 'package:flutter_timetable_interface/flutter_timetable_interface.dart';
import 'package:flutter_timetable_view/flutter_timetable_view.dart';
void main() {

View file

@ -1,4 +1,4 @@
name: timetable_example
name: flutter_timetable_view_example
description: Timetable Widget
publish_to: 'none'

View file

@ -8,3 +8,4 @@ export 'src/models/table_theme.dart';
export 'src/timetable.dart';
export 'src/widgets/block.dart';
export 'src/widgets/table.dart';
export 'src/models/time_block.dart';

View file

@ -3,7 +3,7 @@
// SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart';
import 'package:flutter_timetable_interface/flutter_timetable_interface.dart';
import 'package:flutter_timetable_view/src/models/time_block.dart';
/// Combine blocks that have the same id and the same time.
List<TimeBlock> combineBlocksWithId(List<TimeBlock> blocks) {

View file

@ -6,9 +6,9 @@ import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_timetable_interface/flutter_timetable_interface.dart';
import 'package:flutter_timetable_view/src/block_service.dart';
import 'package:flutter_timetable_view/src/models/table_theme.dart';
import 'package:flutter_timetable_view/src/models/time_block.dart';
import 'package:flutter_timetable_view/src/widgets/block.dart';
import 'package:flutter_timetable_view/src/widgets/table.dart' as table;

View file

@ -4,8 +4,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_timetable_interface/flutter_timetable_interface.dart';
import 'package:flutter_timetable_view/src/block_service.dart';
import 'package:flutter_timetable_view/src/models/time_block.dart';
void main() {
group('test combineBlocksWithId', () {