~cytrogen/fluent-reader-mobile

ref: 3324b6538fdb63cb5a6af307fb66cb0e483421fd fluent-reader-mobile/lib/pages/group_list_page.dart -rw-r--r-- 4.6 KiB
3324b653 — Bruce Liu Merge branch 'master' of https://github.com/mustafagenc/fluent-reader-lite into 1.0.4 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import 'package:fluent_reader_lite/components/badge.dart';
import 'package:fluent_reader_lite/components/dismissible_background.dart';
import 'package:fluent_reader_lite/components/mark_all_action_sheet.dart';
import 'package:fluent_reader_lite/components/my_list_tile.dart';
import 'package:fluent_reader_lite/generated/l10n.dart';
import 'package:fluent_reader_lite/models/groups_model.dart';
import 'package:fluent_reader_lite/models/source.dart';
import 'package:fluent_reader_lite/models/sources_model.dart';
import 'package:fluent_reader_lite/utils/global.dart';
import 'package:fluent_reader_lite/utils/utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';

class GroupListPage extends StatefulWidget {
  @override
  _GroupListPageState createState() => _GroupListPageState();
}

class _GroupListPageState extends State<GroupListPage> {
  static const List<String> _uncategorizedIndicator = [null, null];

  int _unreadCount(Iterable<RSSSource> sources) {
    return sources.fold(0, (c, s) => c + (s != null ? s.unreadCount : 0));
  }

  static const _dismissThresholds = {
    DismissDirection.startToEnd: 0.25,
  };

  @override
  Widget build(BuildContext context) {
    final navigationBar = CupertinoSliverNavigationBar(
      largeTitle: Text(S.of(context).groups),
      automaticallyImplyLeading: false,
      backgroundColor: Global.isTablet ? CupertinoColors.systemBackground : null,
      leading: CupertinoButton(
        minSize: 36,
        padding: EdgeInsets.zero,
        child: Text(S.of(context).cancel),
        onPressed: () { Navigator.of(context).pop(); },
      ),
    );
    final allSources = Consumer<SourcesModel>(
      builder: (context, sourcesModel, child) {
        var count = _unreadCount(sourcesModel.getSources());
        return SliverToBoxAdapter(child: MyListTile(
          title: Text(S.of(context).allSubscriptions),
          trailing: count > 0 ? Badge(count) : null,
          onTap: () { Navigator.of(context).pop(List<String>.empty()); },
          background: CupertinoColors.systemBackground,
        ));
      },
    );
    final dismissBg = DismissibleBackground(CupertinoIcons.checkmark_circle, true);
    final groupList = Consumer2<GroupsModel, SourcesModel>(
      builder: (context, groupsModel, sourcesModel, child) {
        final groupNames = groupsModel.groups.keys.toList();
        groupNames.sort(Utils.localStringCompare);
        if (groupsModel.uncategorized != null) {
          groupNames.insert(0, null);
        }
        return SliverList(
          delegate: SliverChildBuilderDelegate((context, index) {
            String groupName;
            List<String> group;
            final isUncategorized = groupsModel.showUncategorized && index == 0;
            if (isUncategorized) {
              groupName = S.of(context).uncategorized;
              group = groupsModel.uncategorized;
            } else {
              groupName = groupNames[index];
              group = groupsModel.groups[groupName];
            }
            final count = _unreadCount(
              group.map((sid) => sourcesModel.getSource(sid))
            );
            final tile = MyListTile(
              title: Flexible(child: Text(groupName, overflow: TextOverflow.ellipsis)),
              trailing: count > 0 ? Badge(count) : null,
              onTap: () { 
                Navigator.of(context).pop(
                  isUncategorized ? _uncategorizedIndicator : [groupName]
                );
              },
              background: CupertinoColors.systemBackground,
            );
            return Dismissible(
              key: Key("$groupName$index"),
              child: tile,
              background: dismissBg,
              direction: DismissDirection.startToEnd,
              dismissThresholds: _dismissThresholds,
              confirmDismiss: (_) async {
                HapticFeedback.mediumImpact();
                Set<String> sids = Set.from(group);
                showCupertinoModalPopup(
                  context: context,
                  builder: (context) => MarkAllActionSheet(sids),
                );
                return false;
              },
            );
          }, childCount: groupNames.length),
        );
      },
    );
    final padding = SliverToBoxAdapter(child: Padding(
      padding: EdgeInsets.only(bottom: 80),
    ),);
    return CupertinoPageScaffold(
      backgroundColor: CupertinoColors.systemBackground,
      child: CupertinoScrollbar(child: CustomScrollView(
        slivers: [
          navigationBar,
          allSources,
          groupList,
          padding,
        ],
      ))
    );
  }
}