mirror of
https://gitlab.com/mysocialportal/relatica
synced 2024-10-18 10:03:31 +00:00
Breakup timeline selection into Circles, Groups, and Channels
This commit is contained in:
parent
37d3b1a125
commit
c8eea6cdae
3 changed files with 75 additions and 17 deletions
|
@ -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));
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue