Skip to content

Commit 0d95c34

Browse files
fix buggy behaviour of filter
1 parent 9fcc4c4 commit 0d95c34

File tree

7 files changed

+46
-18
lines changed

7 files changed

+46
-18
lines changed

lib/authentication/service/auth_provider.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@ import 'dart:async';
22

33
import 'package:acs_upb_mobile/authentication/model/user.dart';
44
import 'package:acs_upb_mobile/generated/l10n.dart';
5+
import 'package:acs_upb_mobile/pages/filter/service/filter_provider.dart';
56
import 'package:acs_upb_mobile/widgets/toast.dart';
67
import 'package:cloud_firestore/cloud_firestore.dart';
78
import 'package:firebase_auth/firebase_auth.dart';
89
import 'package:flutter/material.dart';
9-
import 'package:preferences/preference_service.dart';
10+
import 'package:provider/provider.dart';
1011

1112
extension DatabaseUser on User {
1213
static User fromSnap(DocumentSnapshot snap) {
13-
return User(uid: snap.documentID, firstName: snap.data['name']['first'], lastName: snap.data['name']['last'],
14-
group: snap.data['group']);
14+
return User(
15+
uid: snap.documentID,
16+
firstName: snap.data['name']['first'],
17+
lastName: snap.data['name']['last'],
18+
group: snap.data['group']);
1519
}
1620

1721
Map<String, dynamic> toData() {
@@ -102,6 +106,9 @@ class AuthProvider with ChangeNotifier {
102106
}
103107

104108
Future<User> getCurrentUser() async {
109+
if (isAnonymous) {
110+
return null;
111+
}
105112
DocumentSnapshot snapshot =
106113
await Firestore.instance.collection('users').document(user.uid).get();
107114
return DatabaseUser.fromSnap(snapshot);
@@ -152,7 +159,7 @@ class AuthProvider with ChangeNotifier {
152159
return true;
153160
}
154161

155-
Future<void> signOut() {
162+
Future<void> signOut(BuildContext context) {
156163
if (isAnonymous) {
157164
try {
158165
user.delete();
@@ -161,8 +168,7 @@ class AuthProvider with ChangeNotifier {
161168
}
162169
}
163170

164-
// Reset filter preference
165-
PrefService.setStringList('relevantNodes', null);
171+
Provider.of<FilterProvider>(context, listen: false).resetFilter();
166172
return FirebaseAuth.instance.signOut();
167173
}
168174

lib/pages/filter/model/filter.dart

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class Filter {
3030
List<Map<String, String>> localizedLevelNames;
3131

3232
Filter({this.root, this.localizedLevelNames, void Function() listener}) {
33+
this.root.value = true; // root value is true by default
3334
_addListener(listener ?? () {}, this.root);
3435
}
3536

@@ -43,10 +44,11 @@ class Filter {
4344
}
4445

4546
void _relevantNodesHelper(List<String> list, FilterNode node) {
46-
if (node.children != null) {
47-
node.children.forEach((child) => this._relevantNodesHelper(list, child));
48-
}
4947
if (node.value) {
48+
if (node.children != null) {
49+
node.children
50+
.forEach((child) => this._relevantNodesHelper(list, child));
51+
}
5052
list.add(node.name);
5153
}
5254
}
@@ -79,10 +81,16 @@ class Filter {
7981

8082
/// Set the value of node with name [nodeName] and its parents to `true`.
8183
bool setRelevantUpToRoot(String nodeName) {
82-
return _setRelevantHelper(nodeName, root, true);
84+
if (nodeName != null) {
85+
return _setRelevantHelper(nodeName, root, true);
86+
}
87+
return false;
8388
}
8489

8590
bool setRelevantNodes(List<String> nodes) {
91+
if(nodes == null || nodes.isEmpty) {
92+
return false;
93+
}
8694
bool setAllNodes = true;
8795
nodes.forEach(
8896
(node) => setAllNodes &= _setRelevantHelper(node, root, false));

lib/pages/filter/service/filter_provider.dart

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,18 @@ class FilterProvider with ChangeNotifier {
2222
final Firestore _db = Firestore.instance;
2323
Filter _relevanceFilter;
2424

25+
void resetFilter() {
26+
_relevanceFilter = null;
27+
28+
// Reset filter preference
29+
PrefService.setStringList('relevantNodes', null);
30+
}
31+
2532
Future<Filter> getRelevanceFilter(BuildContext context) async {
33+
if (_relevanceFilter != null) {
34+
return _relevanceFilter;
35+
}
36+
2637
try {
2738
var col = _db.collection('filters');
2839
var ref = col.document('relevance');
@@ -57,8 +68,10 @@ class FilterProvider with ChangeNotifier {
5768
if (authProvider.isAuthenticated) {
5869
User user = await authProvider.getCurrentUser();
5970
// Try to set the default as the user's group
60-
_relevanceFilter.setRelevantUpToRoot(user.group);
61-
relevantNodes = PrefService.get('relevantNodes');
71+
if (user != null) {
72+
_relevanceFilter.setRelevantUpToRoot(user.group);
73+
relevantNodes = PrefService.get('relevantNodes');
74+
}
6275
}
6376
}
6477

@@ -67,8 +80,9 @@ class FilterProvider with ChangeNotifier {
6780
}
6881

6982
return _relevanceFilter;
70-
} catch (e) {
83+
} catch (e, stackTrace) {
7184
print(e);
85+
print(stackTrace);
7286
return null;
7387
}
7488
}

lib/pages/portal/service/website_provider.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class WebsiteProvider with ChangeNotifier {
7070
.map((doc) => WebsiteFromSnap.fromSnap(doc))
7171
.toList();
7272
} catch (e) {
73+
print(e);
7374
return null;
7475
}
7576
}

lib/pages/profile/profile_page.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class ProfilePage extends StatelessWidget {
5050
if (authProvider.isAuthenticated)
5151
FloatingActionButton(
5252
onPressed: () async {
53-
authProvider.signOut();
53+
authProvider.signOut(context);
5454
Navigator.pushReplacementNamed(context, Routes.login);
5555
},
5656
tooltip: 'Sign Out',

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ description: A mobile application for students at ACS UPB.
1111
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
1212
# Read more about iOS versioning at
1313
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
14-
version: 0.3.5+1
14+
version: 0.3.6+1
1515

1616
environment:
1717
sdk: ">=2.6.0 <3.0.0"

test/filter_test.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,18 +191,18 @@ void main() {
191191
]..sort()));
192192

193193
// Non-existent node
194-
expect(testFilter.setRelevantNodes(['Nope', 'IA']), isFalse);
194+
expect(testFilter.setRelevantNodes(['Nope', '312CD']), isFalse);
195195
expect(
196196
testFilter.relevantNodes..sort(),
197197
equals([
198198
'314CB',
199199
'313CB',
200+
'312CD',
200201
'311CD',
201202
'1-CB',
202203
'1-CD',
203204
'CTI-1',
204205
'CTI',
205-
'IA',
206206
'BSc',
207207
'All'
208208
]..sort()));
@@ -222,7 +222,6 @@ void main() {
222222
'1-CD',
223223
'CTI-1',
224224
'CTI',
225-
'IA',
226225
'BSc',
227226
'All'
228227
]..sort()));

0 commit comments

Comments
 (0)