// Bridge data-transfer types deserialized from JSON pushed by the React host. // // The shape is normalized: groups and items are stored as maps keyed by // ID, with groupOrder preserving display ordering. // // Keep in sync with `apps/web/src/lib/flutter-bridge.ts`. class TimelineState { final TimelineData timeline; final Map groups; final Map items; final List groupOrder; final String? selectedItemId; final bool darkMode; TimelineState({ required this.timeline, required this.groups, required this.items, required this.groupOrder, this.selectedItemId, this.darkMode = true, }); factory TimelineState.fromJson(Map json) { final rawGroups = json['groups'] as Map; final rawItems = json['items'] as Map; return TimelineState( timeline: TimelineData.fromJson(json['timeline'] as Map), groups: rawGroups.map( (k, v) => MapEntry(k, TimelineGroupData.fromJson(v as Map)), ), items: rawItems.map( (k, v) => MapEntry(k, TimelineItemData.fromJson(v as Map)), ), groupOrder: (json['groupOrder'] as List).cast(), selectedItemId: json['selectedItemId'] as String?, darkMode: json['darkMode'] as bool? ?? true, ); } } class TimelineData { final String id; final String title; TimelineData({required this.id, required this.title}); factory TimelineData.fromJson(Map json) { return TimelineData( id: json['id'] as String, title: json['title'] as String, ); } } class TimelineGroupData { final String id; final String title; final int sortOrder; TimelineGroupData({ required this.id, required this.title, required this.sortOrder, }); factory TimelineGroupData.fromJson(Map json) { return TimelineGroupData( id: json['id'] as String, title: json['title'] as String, sortOrder: json['sortOrder'] as int, ); } } class TimelineItemData { final String id; final String groupId; final String title; final String? description; final String start; final String? end; final int lane; TimelineItemData({ required this.id, required this.groupId, required this.title, this.description, required this.start, this.end, required this.lane, }); factory TimelineItemData.fromJson(Map json) { return TimelineItemData( id: json['id'] as String, groupId: json['groupId'] as String, title: json['title'] as String, description: json['description'] as String?, start: json['start'] as String, end: json['end'] as String?, lane: json['lane'] as int, ); } }