From 12bde64117c6a670636298aebec36bfac0b8b710 Mon Sep 17 00:00:00 2001 From: Joey Boerwinkel Date: Mon, 29 Jul 2024 11:04:29 +0200 Subject: [PATCH] feat: change local data interface implementation to singleton According to our agreed appshell architecture we will make the local implementations as singletons to represent a single source persistent layer, like a database. On top of that, the service should be usable across multiple instances of the service, even if no datasource is provided. --- .../lib/src/config/availability_options.dart | 1 - .../flutter_availability_data_interface.dart | 1 + .../lib/src/local_repository}/initial_data.dart | 15 +++++++-------- .../local_repository}/local_data_interface.dart | 17 +++++++++++++---- .../lib/src/service/availability_service.dart | 7 ++++--- 5 files changed, 25 insertions(+), 16 deletions(-) rename packages/{flutter_availability/lib/src/service => flutter_availability_data_interface/lib/src/local_repository}/initial_data.dart (82%) rename packages/{flutter_availability/lib/src/service => flutter_availability_data_interface/lib/src/local_repository}/local_data_interface.dart (91%) diff --git a/packages/flutter_availability/lib/src/config/availability_options.dart b/packages/flutter_availability/lib/src/config/availability_options.dart index 72f24b1..b92a15a 100644 --- a/packages/flutter_availability/lib/src/config/availability_options.dart +++ b/packages/flutter_availability/lib/src/config/availability_options.dart @@ -3,7 +3,6 @@ import "dart:async"; import "package:flutter/material.dart"; import "package:flutter_availability/src/config/availability_translations.dart"; import "package:flutter_availability/src/service/errors.dart"; -import "package:flutter_availability/src/service/local_data_interface.dart"; import "package:flutter_availability/src/ui/widgets/defaults/default_base_screen.dart"; import "package:flutter_availability/src/ui/widgets/defaults/default_buttons.dart"; import "package:flutter_availability/src/ui/widgets/defaults/default_confirmation_dialog.dart"; diff --git a/packages/flutter_availability_data_interface/lib/flutter_availability_data_interface.dart b/packages/flutter_availability_data_interface/lib/flutter_availability_data_interface.dart index 764f000..ed4a79a 100644 --- a/packages/flutter_availability_data_interface/lib/flutter_availability_data_interface.dart +++ b/packages/flutter_availability_data_interface/lib/flutter_availability_data_interface.dart @@ -2,6 +2,7 @@ library flutter_availability_data_interface; export "src/data_interface.dart"; +export "src/local_repository/local_data_interface.dart"; export "src/models/availability.dart"; export "src/models/templates.dart"; export "src/service/availability_service.dart"; diff --git a/packages/flutter_availability/lib/src/service/initial_data.dart b/packages/flutter_availability_data_interface/lib/src/local_repository/initial_data.dart similarity index 82% rename from packages/flutter_availability/lib/src/service/initial_data.dart rename to packages/flutter_availability_data_interface/lib/src/local_repository/initial_data.dart index 6817fac..7aca2c2 100644 --- a/packages/flutter_availability/lib/src/service/initial_data.dart +++ b/packages/flutter_availability_data_interface/lib/src/local_repository/initial_data.dart @@ -1,4 +1,3 @@ -import "package:flutter/material.dart"; import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart"; /// Returns the default local availabilities for a user @@ -36,18 +35,18 @@ List getDefaultLocalAvailabilitiesForUser() { 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), + for (var template in <(String, String, int)>[ + ("1", "Morning", 0xFF0000FF), + ("2", "Afternoon", 0xFF00FF00), + ("3", "Evening", 0xFFFF0000), + ("4", "Night", 0xFFFF00FF), + ("5", "All day", 0xFF9999), ]) ...[ AvailabilityTemplateModel( id: template.$1, userId: "", name: template.$2, - color: template.$3.value, + color: template.$3, templateType: AvailabilityTemplateType.day, templateData: DayTemplateData( startTime: currentMonth, diff --git a/packages/flutter_availability/lib/src/service/local_data_interface.dart b/packages/flutter_availability_data_interface/lib/src/local_repository/local_data_interface.dart similarity index 91% rename from packages/flutter_availability/lib/src/service/local_data_interface.dart rename to packages/flutter_availability_data_interface/lib/src/local_repository/local_data_interface.dart index 79480d0..692c8c7 100644 --- a/packages/flutter_availability/lib/src/service/local_data_interface.dart +++ b/packages/flutter_availability_data_interface/lib/src/local_repository/local_data_interface.dart @@ -1,17 +1,26 @@ import "dart:async"; -import "package:flutter_availability/src/service/initial_data.dart"; import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart"; +import "package:flutter_availability_data_interface/src/local_repository/initial_data.dart"; +import "package:rxdart/rxdart.dart"; /// A local implementation of the [AvailabilityDataInterface] that stores data /// in memory. class LocalAvailabilityDataInterface implements AvailabilityDataInterface { + /// Creates a representation of the local data interface. /// - LocalAvailabilityDataInterface() { + /// A second call of the constructor will return the same value as earlier + /// calls according to the singleton principle + factory LocalAvailabilityDataInterface() => + _localDataInterface ??= LocalAvailabilityDataInterface._(); + + LocalAvailabilityDataInterface._() { _notifyAvailabilityChanges(); _notifyTemplateChanges(); } + static LocalAvailabilityDataInterface? _localDataInterface; + final Map> _userAvailabilities = { "": getDefaultLocalAvailabilitiesForUser(), }; @@ -21,9 +30,9 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface { }; final StreamController>> - _availabilityController = StreamController.broadcast(); + _availabilityController = BehaviorSubject(); final StreamController>> - _templateController = StreamController.broadcast(); + _templateController = BehaviorSubject(); void _notifyAvailabilityChanges() { _availabilityController.add(_userAvailabilities); diff --git a/packages/flutter_availability_data_interface/lib/src/service/availability_service.dart b/packages/flutter_availability_data_interface/lib/src/service/availability_service.dart index 4c9ba9e..c1a0dc8 100644 --- a/packages/flutter_availability_data_interface/lib/src/service/availability_service.dart +++ b/packages/flutter_availability_data_interface/lib/src/service/availability_service.dart @@ -1,4 +1,5 @@ import "package:flutter_availability_data_interface/src/data_interface.dart"; +import "package:flutter_availability_data_interface/src/local_repository/local_data_interface.dart"; import "package:flutter_availability_data_interface/src/models/availability.dart"; import "package:flutter_availability_data_interface/src/models/templates.dart"; import "package:flutter_availability_data_interface/src/utils/public.dart"; @@ -7,10 +8,10 @@ import "package:rxdart/rxdart.dart"; /// class AvailabilityService { /// - const AvailabilityService({ + AvailabilityService({ required this.userId, - required this.dataInterface, - }); + AvailabilityDataInterface? dataInterface, + }) : dataInterface = dataInterface ?? LocalAvailabilityDataInterface(); /// The user id for which the availabilities are managed final String userId;