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(
onPressed: () async {
debugPrint("starting availability user story");
await openAvailabilitiesForUser(context, "anonymous", null);
await openAvailabilitiesForUser(context, "", null);
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 "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<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>>>
_availabilityController = StreamController.broadcast();
@ -105,8 +117,12 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
required String userId,
DateTime? start,
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];
if (availabilities != null) {
if (start != null && end != null) {
@ -123,7 +139,8 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
} else {
return [];
}
});
}).handleError((error) => []);
}
@override
Stream<AvailabilityModel> getAvailabilityForUserById(
@ -158,8 +175,10 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
Stream<List<AvailabilityTemplateModel>> getTemplatesForUser({
required String userId,
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];
if (templateIds != null) {
return templates
@ -169,7 +188,8 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
} else {
return templates ?? [];
}
});
}).handleError((error) => []);
}
@override
Future<AvailabilityModel> updateAvailabilityForUser(