snapshot of https://github.com/flutter/samples.git (main, 2026-09-16; blobs > 131072B omitted)
Some checks failed
Main Branch CI / Test Flutter beta on ubuntu-latest (push) Has been skipped
Main Branch CI / Test Flutter stable on ubuntu-latest (push) Has been skipped
Main Branch CI / Test Flutter beta on macos-latest (push) Has been cancelled
Main Branch CI / Test Flutter stable on macos-latest (push) Has been cancelled
Some checks failed
Main Branch CI / Test Flutter beta on ubuntu-latest (push) Has been skipped
Main Branch CI / Test Flutter stable on ubuntu-latest (push) Has been skipped
Main Branch CI / Test Flutter beta on macos-latest (push) Has been cancelled
Main Branch CI / Test Flutter stable on macos-latest (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
// Copyright 2024 The Flutter team. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
import '../../../data/repositories/activity/activity_repository.dart';
|
||||
import '../../../data/repositories/itinerary_config/itinerary_config_repository.dart';
|
||||
import '../../../domain/models/activity/activity.dart';
|
||||
import '../../../domain/models/itinerary_config/itinerary_config.dart';
|
||||
import '../../../utils/command.dart';
|
||||
import '../../../utils/result.dart';
|
||||
|
||||
class ActivitiesViewModel extends ChangeNotifier {
|
||||
ActivitiesViewModel({
|
||||
required ActivityRepository activityRepository,
|
||||
required ItineraryConfigRepository itineraryConfigRepository,
|
||||
}) : _activityRepository = activityRepository,
|
||||
_itineraryConfigRepository = itineraryConfigRepository {
|
||||
loadActivities = Command0(_loadActivities)..execute();
|
||||
saveActivities = Command0(_saveActivities);
|
||||
}
|
||||
|
||||
final _log = Logger('ActivitiesViewModel');
|
||||
final ActivityRepository _activityRepository;
|
||||
final ItineraryConfigRepository _itineraryConfigRepository;
|
||||
List<Activity> _daytimeActivities = <Activity>[];
|
||||
List<Activity> _eveningActivities = <Activity>[];
|
||||
final Set<String> _selectedActivities = <String>{};
|
||||
|
||||
/// List of daytime [Activity] per destination.
|
||||
List<Activity> get daytimeActivities => _daytimeActivities;
|
||||
|
||||
/// List of evening [Activity] per destination.
|
||||
List<Activity> get eveningActivities => _eveningActivities;
|
||||
|
||||
/// Selected [Activity] by ref.
|
||||
Set<String> get selectedActivities => _selectedActivities;
|
||||
|
||||
/// Load list of [Activity] for a [Destination] by ref.
|
||||
late final Command0 loadActivities;
|
||||
|
||||
/// Save list [selectedActivities] into itinerary configuration.
|
||||
late final Command0 saveActivities;
|
||||
|
||||
Future<Result<void>> _loadActivities() async {
|
||||
final result = await _itineraryConfigRepository.getItineraryConfig();
|
||||
switch (result) {
|
||||
case Error<ItineraryConfig>():
|
||||
_log.warning('Failed to load stored ItineraryConfig', result.error);
|
||||
return result;
|
||||
case Ok<ItineraryConfig>():
|
||||
}
|
||||
|
||||
final destinationRef = result.value.destination;
|
||||
if (destinationRef == null) {
|
||||
_log.severe('Destination missing in ItineraryConfig');
|
||||
return Result.error(Exception('Destination not found'));
|
||||
}
|
||||
|
||||
_selectedActivities.addAll(result.value.activities);
|
||||
|
||||
final resultActivities = await _activityRepository.getByDestination(
|
||||
destinationRef,
|
||||
);
|
||||
switch (resultActivities) {
|
||||
case Ok():
|
||||
{
|
||||
_daytimeActivities = resultActivities.value
|
||||
.where(
|
||||
(activity) => [
|
||||
TimeOfDay.any,
|
||||
TimeOfDay.morning,
|
||||
TimeOfDay.afternoon,
|
||||
].contains(activity.timeOfDay),
|
||||
)
|
||||
.toList();
|
||||
|
||||
_eveningActivities = resultActivities.value
|
||||
.where(
|
||||
(activity) => [
|
||||
TimeOfDay.evening,
|
||||
TimeOfDay.night,
|
||||
].contains(activity.timeOfDay),
|
||||
)
|
||||
.toList();
|
||||
|
||||
_log.fine(
|
||||
'Activities (daytime: ${_daytimeActivities.length}, '
|
||||
'evening: ${_eveningActivities.length}) loaded',
|
||||
);
|
||||
}
|
||||
case Error():
|
||||
{
|
||||
_log.warning('Failed to load activities', resultActivities.error);
|
||||
}
|
||||
}
|
||||
|
||||
notifyListeners();
|
||||
return resultActivities;
|
||||
}
|
||||
|
||||
/// Add [Activity] to selected list.
|
||||
void addActivity(String activityRef) {
|
||||
assert(
|
||||
(_daytimeActivities + _eveningActivities).any(
|
||||
(activity) => activity.ref == activityRef,
|
||||
),
|
||||
"Activity $activityRef not found",
|
||||
);
|
||||
_selectedActivities.add(activityRef);
|
||||
_log.finest('Activity $activityRef added');
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// Remove [Activity] from selected list.
|
||||
void removeActivity(String activityRef) {
|
||||
assert(
|
||||
(_daytimeActivities + _eveningActivities).any(
|
||||
(activity) => activity.ref == activityRef,
|
||||
),
|
||||
"Activity $activityRef not found",
|
||||
);
|
||||
_selectedActivities.remove(activityRef);
|
||||
_log.finest('Activity $activityRef removed');
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<Result<void>> _saveActivities() async {
|
||||
final resultConfig = await _itineraryConfigRepository.getItineraryConfig();
|
||||
switch (resultConfig) {
|
||||
case Error<ItineraryConfig>():
|
||||
_log.warning(
|
||||
'Failed to load stored ItineraryConfig',
|
||||
resultConfig.error,
|
||||
);
|
||||
return resultConfig;
|
||||
case Ok<ItineraryConfig>():
|
||||
}
|
||||
|
||||
final itineraryConfig = resultConfig.value;
|
||||
final result = await _itineraryConfigRepository.setItineraryConfig(
|
||||
itineraryConfig.copyWith(activities: _selectedActivities.toList()),
|
||||
);
|
||||
if (result is Error) {
|
||||
_log.warning('Failed to store ItineraryConfig', result.error);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user