Skip to content

Commit f5d311e

Browse files
committed
Merge branch 'feature/survey' into develop
2 parents b7804e2 + 951e814 commit f5d311e

File tree

6 files changed

+95
-2
lines changed

6 files changed

+95
-2
lines changed

lib/core/data/firestore_service.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ class FirestoreService {
2323
.snapshots();
2424
}
2525

26+
Future<DocumentSnapshot> getDocumentAsync(String path, String id) {
27+
return _db
28+
.collection(path)
29+
.document(id)
30+
.get();
31+
}
32+
2633
Future<void> updateDocument(String path, String id, Map<String,dynamic> data,{bool merge = true}) {
2734
return _db
2835
.collection(path)

lib/core/data/models/survey.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class SurveyItem {
2+
final String message;
3+
final String id;
4+
final List<String> options;
5+
final List<String> optionKeys;
6+
7+
SurveyItem(this.message, this.id, this.options, this.optionKeys);
8+
9+
SurveyItem.fromMap(Map<String,dynamic> data):
10+
id=data['id'],
11+
message=data['message'],
12+
optionKeys=List<String>.from(data['options_key'] ?? []),
13+
options=List<String>.from(data['options']);
14+
}

lib/core/presentation/pages/main_menu.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import 'package:firebase_remote_config/firebase_remote_config.dart';
88
import 'package:flutter/material.dart';
99
import 'package:flutter_ui_challenges/core/data/favorite_firestore_service.dart';
1010
import 'package:flutter_ui_challenges/core/data/models/menu.dart';
11+
import 'package:flutter_ui_challenges/core/data/models/survey.dart';
1112
import 'package:flutter_ui_challenges/core/presentation/widgets/preview.dart';
13+
import 'package:flutter_ui_challenges/core/presentation/widgets/survey_widget.dart';
1214
import 'package:flutter_ui_challenges/features/announcements/data/model/announcement.dart';
1315
import 'package:flutter_ui_challenges/features/announcements/widgets/announcement_slider.dart';
1416
import 'package:flutter_ui_challenges/features/auth/data/model/user.dart';
@@ -24,12 +26,14 @@ class MainMenu extends StatefulWidget {
2426
}
2527

2628
class _MainMenuState extends State<MainMenu> {
29+
RemoteConfig remoteConfig;
2730
Map<String, bool> viewData = <String, bool>{};
2831
List<SubMenuItem> unseen;
2932
bool viewDataLoaded;
3033
bool dialogShowing;
3134
bool showNewUiDialog;
3235
List<Announcement> announcements;
36+
SurveyItem survey;
3337
@override
3438
void initState() {
3539
super.initState();
@@ -56,18 +60,22 @@ class _MainMenuState extends State<MainMenu> {
5660
}
5761

5862
_getRemoteConfig() async {
59-
final RemoteConfig remoteConfig = await RemoteConfig.instance;
63+
if(remoteConfig == null)
64+
remoteConfig = await RemoteConfig.instance;
6065
final Map<String, dynamic> defaults = {
6166
"news": "[]",
67+
"survey":{},
6268
};
6369
await remoteConfig.setDefaults(defaults);
64-
await remoteConfig.fetch(expiration: const Duration(hours: 1));
70+
await remoteConfig.fetch(expiration: const Duration(hours: 12));
6571
await remoteConfig.activateFetched();
6672
final String value = remoteConfig.getString('news');
73+
final String surval = remoteConfig.getString('survey');
6774
setState(() {
6875
announcements = List<Map<String, dynamic>>.from(json.decode(value))
6976
.map((data) => Announcement.fromMap(data))
7077
.toList();
78+
survey = SurveyItem.fromMap(Map<String, dynamic>.from(json.decode(surval)));
7179
});
7280
}
7381

@@ -80,11 +88,13 @@ class _MainMenuState extends State<MainMenu> {
8088
Widget build(BuildContext context) => _buildMenuPage();
8189

8290
ListView _buildMenuPage() {
91+
User user = Provider.of<User>(context);
8392
if (showNewUiDialog && viewDataLoaded) _checkToShowDialog(context);
8493
return ListView(
8594
physics: BouncingScrollPhysics(),
8695
children: <Widget>[
8796
if (announcements.length > 0) AnnouncementSlider(news: announcements),
97+
if(survey != null && user != null && !user.surveys.contains(survey?.id)) SurveyWidget(survey: survey),
8898
...pages.map((page) => page is MenuItem
8999
? _buildExpandableMenu(page, context)
90100
: _buildSubMenu(page, context))
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'package:cloud_firestore/cloud_firestore.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_ui_challenges/core/data/firestore_service.dart';
4+
import 'package:flutter_ui_challenges/core/data/models/survey.dart';
5+
import 'package:flutter_ui_challenges/features/auth/data/model/user_repository.dart';
6+
import 'package:flutter_ui_challenges/features/auth/data/service/firestore_service.dart';
7+
import 'package:provider/provider.dart';
8+
9+
class SurveyWidget extends StatelessWidget {
10+
final SurveyItem survey;
11+
12+
const SurveyWidget({Key key, this.survey}) : super(key: key);
13+
@override
14+
Widget build(BuildContext context) {
15+
return Container(
16+
color: Theme.of(context).primaryColor,
17+
child: Card(
18+
margin: const EdgeInsets.all(8.0),
19+
child: Padding(
20+
padding: const EdgeInsets.all(16.0),
21+
child: Column(
22+
crossAxisAlignment: CrossAxisAlignment.start,
23+
children: <Widget>[
24+
Text(survey.message,style: TextStyle(
25+
fontSize: 20.0,
26+
fontWeight: FontWeight.w500,
27+
),),
28+
...survey.options.map((option) =>RadioListTile(
29+
groupValue: null,
30+
value: survey.optionKeys[survey.options.indexOf(option)],
31+
title: Text(option),
32+
onChanged: (val){
33+
FirestoreService().updateDocument('surveys', survey.id, {
34+
val: FieldValue.increment(1),
35+
});
36+
AuthFirestoreService().updateUserData(Provider.of<UserRepository>(context).user.uid, {"surveys": FieldValue.arrayUnion([survey.id])});
37+
Scaffold.of(context).showSnackBar(SnackBar(
38+
content: Text("Thank you for providing us feedback")
39+
));
40+
},
41+
))
42+
],
43+
),
44+
)
45+
),
46+
);
47+
}
48+
}

lib/features/auth/data/model/user.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,22 @@ class User {
44
final String email;
55
final String photoUrl;
66
final List<String> favorites;
7+
final List<String> surveys;
78

89
User({
910
this.id,
1011
this.name,
1112
this.email,
1213
this.photoUrl,
1314
this.favorites,
15+
this.surveys,
1416
});
1517

1618
User.fromMap(Map<String, dynamic> data, String id)
1719
: id = id,
1820
name = data['name'] ?? '',
1921
email = data['email'],
2022
favorites=List<String>.from(data['favorites'] ?? []),
23+
surveys=List<String>.from(data['surveys'] ?? []),
2124
photoUrl = data['photo_url'];
2225
}

lib/features/auth/data/service/firestore_service.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,15 @@ class AuthFirestoreService {
2727
(doc) => User.fromMap(doc.data, doc.documentID),
2828
);
2929
}
30+
31+
Future<User> getUserAsync(String id) async {
32+
var fs = await FirestoreService().getDocumentAsync('users', id);
33+
if(fs!=null)
34+
return User.fromMap(fs.data,fs.documentID);
35+
return null;
36+
}
37+
38+
Future<void> updateUserData(String id, Map<String,dynamic> data) {
39+
return FirestoreService().updateDocument('users', id, data,merge: true);
40+
}
3041
}

0 commit comments

Comments
 (0)