feat: add example templates to the local service and update stream after initialization

This commit is contained in:
Freek van de Ven 2024-07-08 16:20:00 +02:00 committed by Bart Ribbers
parent 39da1a4f21
commit fe2786d34f
3 changed files with 104 additions and 32 deletions

View file

@ -47,7 +47,7 @@ class Home extends StatelessWidget {
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
onPressed: () async { onPressed: () async {
debugPrint("starting availability user story"); debugPrint("starting availability user story");
await openAvailabilitiesForUser(context, "anonymous", null); await openAvailabilitiesForUser(context, "", null);
debugPrint("finishing availability user story"); debugPrint("finishing availability user story");
}, },
), ),

View file

@ -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<AvailabilityModel> 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<AvailabilityTemplateModel> 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: [],
),
),
],
];
}

View file

@ -1,12 +1,24 @@
import "dart:async"; 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/flutter_availability_data_interface.dart";
/// A local implementation of the [AvailabilityDataInterface] that stores data /// A local implementation of the [AvailabilityDataInterface] that stores data
/// in memory. /// in memory.
class LocalAvailabilityDataInterface implements AvailabilityDataInterface { class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
final Map<String, List<AvailabilityModel>> _userAvailabilities = {}; ///
final Map<String, List<AvailabilityTemplateModel>> _userTemplates = {}; LocalAvailabilityDataInterface() {
_notifyAvailabilityChanges();
_notifyTemplateChanges();
}
final Map<String, List<AvailabilityModel>> _userAvailabilities = {
"": getDefaultLocalAvailabilitiesForUser(),
};
final Map<String, List<AvailabilityTemplateModel>> _userTemplates = {
"": getDefaultLocalTemplatesForUser(),
};
final StreamController<Map<String, List<AvailabilityModel>>> final StreamController<Map<String, List<AvailabilityModel>>>
_availabilityController = StreamController.broadcast(); _availabilityController = StreamController.broadcast();
@ -105,8 +117,12 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
required String userId, required String userId,
DateTime? start, DateTime? start,
DateTime? end, DateTime? end,
}) => }) {
_availabilityController.stream.map((availabilitiesMap) { // load the availabilities 1 second later to simulate a network request
Future.delayed(const Duration(seconds: 1), _notifyAvailabilityChanges);
return _availabilityController.stream
.map<List<AvailabilityModel>>((availabilitiesMap) {
var availabilities = availabilitiesMap[userId]; var availabilities = availabilitiesMap[userId];
if (availabilities != null) { if (availabilities != null) {
if (start != null && end != null) { if (start != null && end != null) {
@ -123,7 +139,8 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
} else { } else {
return []; return [];
} }
}); }).handleError((error) => []);
}
@override @override
Stream<AvailabilityModel> getAvailabilityForUserById( Stream<AvailabilityModel> getAvailabilityForUserById(
@ -158,8 +175,10 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
Stream<List<AvailabilityTemplateModel>> getTemplatesForUser({ Stream<List<AvailabilityTemplateModel>> getTemplatesForUser({
required String userId, required String userId,
List<String>? templateIds, List<String>? templateIds,
}) => }) {
_templateController.stream.map((templatesMap) { // 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]; var templates = templatesMap[userId];
if (templateIds != null) { if (templateIds != null) {
return templates return templates
@ -169,7 +188,8 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
} else { } else {
return templates ?? []; return templates ?? [];
} }
}); }).handleError((error) => []);
}
@override @override
Future<AvailabilityModel> updateAvailabilityForUser( Future<AvailabilityModel> updateAvailabilityForUser(