82 lines
1.9 KiB
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();
|
|
}
|
|
}
|