focus-flow/apps/focus_flow_flutter/lib/controllers/today_screen_controller.dart

82 lines
1.9 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:scheduler_core/scheduler_core.dart';
import '../models/today_screen_models.dart';
typedef TodayStateReader = Future<ApplicationResult<TodayState>> Function();
sealed class TodayScreenState {
const TodayScreenState();
}
class TodayScreenLoading extends TodayScreenState {
const TodayScreenLoading();
}
class TodayScreenReady extends TodayScreenState {
const TodayScreenReady(this.data);
final TodayScreenData data;
}
class TodayScreenEmpty extends TodayScreenState {
const TodayScreenEmpty();
}
class TodayScreenFailure extends TodayScreenState {
const TodayScreenFailure(this.message);
final String message;
}
class TodayScreenController extends ChangeNotifier {
TodayScreenController({required this.read});
final TodayStateReader read;
TodayScreenState _state = const TodayScreenLoading();
TimelineCardModel? _selectedCard;
TodayScreenState get state => _state;
TimelineCardModel? get selectedCard => _selectedCard;
Future<void> load() async {
_state = const TodayScreenLoading();
notifyListeners();
try {
final result = await read();
final failure = result.failure;
if (failure != null) {
_state = TodayScreenFailure(failure.detailCode ?? failure.code.name);
notifyListeners();
return;
}
final data = TodayScreenData.fromTodayState(result.requireValue);
_state = data.cards.isEmpty
? const TodayScreenEmpty()
: TodayScreenReady(data);
notifyListeners();
} on Object catch (error) {
_state = TodayScreenFailure(error.toString());
notifyListeners();
}
}
void selectCard(TimelineCardModel card) {
if (!card.isSelectable) {
return;
}
_selectedCard = card;
notifyListeners();
}
void clearSelection() {
if (_selectedCard == null) {
return;
}
_selectedCard = null;
notifyListeners();
}
}