1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-10-23 06:53:23 +00:00
comunicmobile/lib/ui/widgets/survey_widget.dart
2020-04-25 17:32:25 +02:00

137 lines
3.5 KiB
Dart

import 'package:comunic/helpers/survey_helper.dart';
import 'package:comunic/models/survey.dart';
import 'package:comunic/models/survey_choice.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:pie_chart/pie_chart.dart';
/// Survey widget
///
/// @author Pierre HUBERT
class SurveyWidget extends StatefulWidget {
final Survey survey;
const SurveyWidget({Key key, @required this.survey})
: assert(survey != null),
super(key: key);
@override
_SurveyWidgetState createState() => _SurveyWidgetState();
}
class _SurveyWidgetState extends State<SurveyWidget> {
final SurveyHelper _helper = SurveyHelper();
Survey get survey => widget.survey;
Map<String, double> _buildDataMap() {
Map<String, double> data = Map();
widget.survey.choices.forEach((e) => data.putIfAbsent(
e.name + " (" + e.responses.toString() + ")", () => 1.0 * e.responses));
return data;
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Text(
widget.survey.question,
style: TextStyle(fontWeight: FontWeight.bold),
),
_buildUserResponse(),
survey.hasResponses ? _buildChart() : _buildNoResponseNotice(),
],
);
}
Widget _buildUserResponse() {
if (survey.hasResponded) return _buildUserRespondedWidget();
return _buildUserResponseFormWidget();
}
Widget _buildUserRespondedWidget() {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Flexible(
child: Text(
tr("Your response: %response%",
args: {"response": survey.userResponse.name}),
textAlign: TextAlign.center,
),
),
MaterialButton(
child: Text(tr("Cancel").toUpperCase()),
onPressed: _cancelUserResponse,
)
],
);
}
Future<void> _cancelUserResponse() async {
if (!await showConfirmDialog(
context: context,
title: tr("Cancel response to survey"),
message:
tr("Do you really want to cancel your response to this survey ?"),
)) return;
if (!await _helper.cancelResponse(survey)) {
showSimpleSnack(
context, tr("Could not cancel your response to the survey !"));
return;
}
setState(() {
survey.cancelUserResponse();
});
}
Widget _buildUserResponseFormWidget() {
return ConstrainedBox(
constraints: BoxConstraints(maxWidth: 300),
child: DropdownButton<SurveyChoice>(
isExpanded: true,
hint: Text(tr("Respond to survey")),
items: survey.choices
.map(
(f) => DropdownMenuItem<SurveyChoice>(
value: f,
child: Text(f.name),
),
)
.toList(),
onChanged: _respondToSurvey,
),
);
}
Widget _buildChart() {
return PieChart(
dataMap: _buildDataMap(),
);
}
Widget _buildNoResponseNotice() {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Text(tr("No response yet to this survey.")),
);
}
/// Respond to survey
Future<void> _respondToSurvey(SurveyChoice choice) async {
// Send the response to the server
if (!await _helper.respondToSurvey(survey: survey, choice: choice))
return showSimpleSnack(
context, tr("Could not send your response to the survey!"));
setState(() {
survey.setUserResponse(choice);
});
}
}