diff --git a/apps/example/lib/main.dart b/apps/example/lib/main.dart index fe12801..e28b8c0 100644 --- a/apps/example/lib/main.dart +++ b/apps/example/lib/main.dart @@ -47,7 +47,7 @@ class Home extends StatelessWidget { floatingActionButton: FloatingActionButton( onPressed: () async { debugPrint("starting availability user story"); - await openAvailabilitiesForUser(context, "anonymous", null); + await openAvailabilitiesForUser(context, "", null); debugPrint("finishing availability user story"); }, ), diff --git a/packages/flutter_availability/lib/src/service/initial_data.dart b/packages/flutter_availability/lib/src/service/initial_data.dart new file mode 100644 index 0000000..0e166b2 --- /dev/null +++ b/packages/flutter_availability/lib/src/service/initial_data.dart @@ -0,0 +1,52 @@ +import "package:flutter/material.dart"; +import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart"; + +/// Returns the default local availabilities for a user +List getDefaultLocalAvailabilitiesForUser() { + var currentMonth = DateTime(DateTime.now().year, DateTime.now().month); + return [ + for (var availability in <(String, int, String)>[ + ("1", 0, "1"), + ("2", 2, "2"), + ("3", 3, "2"), + ("4", 6, "4"), + ("5", 8, "5"), + ]) ...[ + AvailabilityModel( + id: availability.$1, + userId: "", + startDate: currentMonth.add(Duration(days: availability.$2)), + endDate: currentMonth.add(Duration(days: availability.$2)), + breaks: [], + templateId: availability.$3, + ), + ], + ]; +} + +/// returns the default local templates for a user +List getDefaultLocalTemplatesForUser() { + var currentMonth = DateTime(DateTime.now().year, DateTime.now().month); + return [ + for (var template in <(String, String, Color)>[ + ("1", "Morning", Colors.blue), + ("2", "Afternoon", Colors.green), + ("3", "Evening", Colors.red), + ("4", "Night", Colors.purple), + ("5", "All day", Colors.orange), + ]) ...[ + AvailabilityTemplateModel( + id: template.$1, + userId: "", + name: template.$2, + color: template.$3.value, + templateType: AvailabilityTemplateType.day, + templateData: DayTemplateData( + startTime: currentMonth, + endTime: currentMonth, + breaks: [], + ), + ), + ], + ]; +} diff --git a/packages/flutter_availability/lib/src/service/local_data_interface.dart b/packages/flutter_availability/lib/src/service/local_data_interface.dart index 7b93472..6a53666 100644 --- a/packages/flutter_availability/lib/src/service/local_data_interface.dart +++ b/packages/flutter_availability/lib/src/service/local_data_interface.dart @@ -1,12 +1,24 @@ import "dart:async"; +import "package:flutter_availability/src/service/initial_data.dart"; import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart"; /// A local implementation of the [AvailabilityDataInterface] that stores data /// in memory. class LocalAvailabilityDataInterface implements AvailabilityDataInterface { - final Map> _userAvailabilities = {}; - final Map> _userTemplates = {}; + /// + LocalAvailabilityDataInterface() { + _notifyAvailabilityChanges(); + _notifyTemplateChanges(); + } + + final Map> _userAvailabilities = { + "": getDefaultLocalAvailabilitiesForUser(), + }; + + final Map> _userTemplates = { + "": getDefaultLocalTemplatesForUser(), + }; final StreamController>> _availabilityController = StreamController.broadcast(); @@ -105,25 +117,30 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface { required String userId, DateTime? start, DateTime? end, - }) => - _availabilityController.stream.map((availabilitiesMap) { - var availabilities = availabilitiesMap[userId]; - if (availabilities != null) { - if (start != null && end != null) { - return availabilities - .where( - (availability) => - availability.startDate.isBefore(end) && - availability.endDate.isAfter(start), - ) - .toList(); - } else { - return availabilities; - } + }) { + // load the availabilities 1 second later to simulate a network request + Future.delayed(const Duration(seconds: 1), _notifyAvailabilityChanges); + + return _availabilityController.stream + .map>((availabilitiesMap) { + var availabilities = availabilitiesMap[userId]; + if (availabilities != null) { + if (start != null && end != null) { + return availabilities + .where( + (availability) => + availability.startDate.isBefore(end) && + availability.endDate.isAfter(start), + ) + .toList(); } else { - return []; + return availabilities; } - }); + } else { + return []; + } + }).handleError((error) => []); + } @override Stream getAvailabilityForUserById( @@ -158,18 +175,21 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface { Stream> getTemplatesForUser({ required String userId, List? templateIds, - }) => - _templateController.stream.map((templatesMap) { - var templates = templatesMap[userId]; - if (templateIds != null) { - return templates - ?.where((template) => templateIds.contains(template.id)) - .toList() ?? - []; - } else { - return templates ?? []; - } - }); + }) { + // load the templates 1 second later to simulate a network request + Future.delayed(const Duration(seconds: 1), _notifyTemplateChanges); + return _templateController.stream.map((templatesMap) { + var templates = templatesMap[userId]; + if (templateIds != null) { + return templates + ?.where((template) => templateIds.contains(template.id)) + .toList() ?? + []; + } else { + return templates ?? []; + } + }).handleError((error) => []); + } @override Future updateAvailabilityForUser(