Breakup timeline selection into Circles, Groups, and Channels

This commit is contained in:
Hank Grabowski 2024-08-28 12:18:06 -04:00
parent 37d3b1a125
commit c8eea6cdae
3 changed files with 75 additions and 17 deletions

View file

@ -599,7 +599,7 @@ class _EditorScreenState extends State<EditorScreen> {
final circles = context
.watch<ActiveProfileSelector<TimelineManager>>()
.activeEntry
.andThen((tm) => tm.getCircles())
.andThen((tm) => tm.getTimelineGroupingListData(GroupingType.circle))
.getValueOrElse(() => []);
circles.sort((g1, g2) => g1.name.compareTo(g2.name));

View file

@ -3,17 +3,18 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:logging/logging.dart';
import 'package:provider/provider.dart';
import 'package:relatica/controls/focus_mode_status_headline.dart';
import 'package:relatica/riverpod_controllers/focus_mode.dart';
import '../controls/app_bottom_nav_bar.dart';
import '../controls/focus_mode_status_headline.dart';
import '../controls/linear_status_indicator.dart';
import '../controls/login_aware_cached_network_image.dart';
import '../controls/responsive_max_width.dart';
import '../controls/standard_app_drawer.dart';
import '../controls/timeline/timeline_panel.dart';
import '../globals.dart';
import '../models/timeline_grouping_list_data.dart';
import '../models/timeline_identifiers.dart';
import '../riverpod_controllers/focus_mode.dart';
import '../services/auth_service.dart';
import '../services/network_status_service.dart';
import '../services/timeline_manager.dart';
@ -114,9 +115,24 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
.activeEntry
.value;
final circles = manager.getCircles().getValueOrElse(() => []).toList();
final circles = manager
.getTimelineGroupingListData(GroupingType.circle)
.getValueOrElse(() => [])
.toList();
circles.sort((g1, g2) => g1.name.compareTo(g2.name));
final groups = manager
.getTimelineGroupingListData(GroupingType.group)
.getValueOrElse(() => [])
.toList();
groups.sort((g1, g2) => g1.name.compareTo(g2.name));
final channels = manager
.getTimelineGroupingListData(GroupingType.channel)
.getValueOrElse(() => [])
.toList();
channels.sort((g1, g2) => g1.name.compareTo(g2.name));
final items = [
...standardTypes
.map((t) => TimelineIdentifiers(timeline: t))
@ -137,17 +153,41 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
decoration: TextDecoration.underline,
),
)),
...circles
.map((c) => TimelineIdentifiers(
timeline: TimelineType.circle,
auxData: c.id,
label: '${c.name} - ${c.groupingType.name}'))
.map((e) => DropdownMenuItem(
value: e,
child: Text(
e.toLabel(),
overflow: TextOverflow.fade,
))),
..._timelineGroupingListDataCollectionToDropdown(circles),
const DropdownMenuItem(
value: null,
enabled: false,
child: Divider(),
),
const DropdownMenuItem(
value: null,
enabled: false,
child: Text(
'Groups',
style: TextStyle(
fontWeight: FontWeight.bold,
fontStyle: FontStyle.italic,
decoration: TextDecoration.underline,
),
)),
..._timelineGroupingListDataCollectionToDropdown(groups),
const DropdownMenuItem(
value: null,
enabled: false,
child: Divider(),
),
const DropdownMenuItem(
value: null,
enabled: false,
child: Text(
'Channels',
style: TextStyle(
fontWeight: FontWeight.bold,
fontStyle: FontStyle.italic,
decoration: TextDecoration.underline,
),
)),
..._timelineGroupingListDataCollectionToDropdown(channels),
];
if (items.where((i) => i.value == currentTimeline).isEmpty) {
@ -169,3 +209,17 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
});
}
}
List<DropdownMenuItem<TimelineIdentifiers>>
_timelineGroupingListDataCollectionToDropdown(
List<TimelineGroupingListData> circles) =>
circles
.map((c) => TimelineIdentifiers(
timeline: TimelineType.circle, auxData: c.id, label: c.name))
.map((e) => DropdownMenuItem(
value: e,
child: Text(
e.toLabel(),
overflow: TextOverflow.fade,
)))
.toList();

View file

@ -42,14 +42,18 @@ class TimelineManager extends ChangeNotifier {
notifyListeners();
}
Result<List<TimelineGroupingListData>, ExecError> getCircles() {
Result<List<TimelineGroupingListData>, ExecError> getTimelineGroupingListData(
GroupingType type) {
if (circlesNotInitialized) {
_refreshCircleData();
circlesNotInitialized = false;
return Result.ok([]);
}
return Result.ok(circlesRepo.getMyCircles());
return Result.ok(circlesRepo
.getMyCircles()
.where((e) => e.groupingType == type)
.toList());
}
Future<void> _refreshCircleData() async {