import '../../../../../api/marianumconnect/queries/timetable_get_element_week/timetable_element_type.dart'; /// Whose timetable a [TimetableBloc] shows. The render pipeline is identical /// for every subject; only the week endpoint, persistence and the /// user-private extras (custom events) differ. sealed class TimetableSubject { const TimetableSubject(); /// Suffix of the hydrated storage slot. Must be unique per subject so /// subjects never overwrite each other's cached weeks. String get storageId; /// Whether the bloc keeps its state across app restarts. bool get persistent; /// Custom events are user-private and only exist for the own plan. bool get supportsCustomEvents; } /// The signed-in user's own plan (`timetable/me`). final class OwnTimetable extends TimetableSubject { const OwnTimetable(); // Empty on purpose: keeps the pre-existing storage slot "TimetableBloc", so // updating the app does not drop the cached weeks. @override String get storageId => ''; @override bool get persistent => true; @override bool get supportsCustomEvents => true; @override bool operator ==(Object other) => other is OwnTimetable; @override int get hashCode => (OwnTimetable).hashCode; } /// A foreign element picked by the user (teacher, room, class, student). final class ElementTimetable extends TimetableSubject { final TimetableElementRef element; const ElementTimetable(this.element); @override String get storageId => 'element-${element.type.name}-${element.id}'; @override bool get persistent => false; @override bool get supportsCustomEvents => false; @override bool operator ==(Object other) => other is ElementTimetable && other.element.type == element.type && other.element.id == element.id; @override int get hashCode => Object.hash(element.type, element.id); } /// A guardian's child (`timetable/child/{id}`). Kept across restarts per /// child, so switching between siblings shows the cached plan immediately. final class ChildTimetable extends TimetableSubject { final String childId; const ChildTimetable(this.childId); @override String get storageId => 'child-$childId'; @override bool get persistent => true; @override bool get supportsCustomEvents => false; @override bool operator ==(Object other) => other is ChildTimetable && other.childId == childId; @override int get hashCode => childId.hashCode; } /// No plan to show: signed out, or a guardian without (known) children. The /// bloc loads nothing; the view explains why. final class NoTimetable extends TimetableSubject { const NoTimetable(); @override String get storageId => 'none'; @override bool get persistent => false; @override bool get supportsCustomEvents => false; @override bool operator ==(Object other) => other is NoTimetable; @override int get hashCode => (NoTimetable).hashCode; }