/// Coordinates Today Screen Controller state for the FocusFlow Flutter UI. library; import 'package:flutter/foundation.dart'; import 'package:scheduler_core/scheduler_core.dart'; import '../models/today_screen_models.dart'; typedef TodayStateReader = Future> 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 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(); } }