turn dob picker into radio button choices

pull/1011/head
Gabby Gurdin 2 years ago
parent 54e490216e
commit 758ebde1f7

@ -2743,7 +2743,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"yourBirthdayPleaseShort": "Please provide your date of birth", "yourBirthdayPleaseShort": "Please selected your age group",
"@yourBirthdayPleaseShort": { "@yourBirthdayPleaseShort": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -3940,5 +3940,12 @@
"subscribedToUnlockTools": "Subscribe to unlock language tools, including", "subscribedToUnlockTools": "Subscribe to unlock language tools, including",
"more": "More", "more": "More",
"translationTooltip": "Translate", "translationTooltip": "Translate",
"audioTooltip": "Play Audio" "audioTooltip": "Play Audio",
"certifyAge": "I certify that I am over {age} years of age",
"@certifyAge": {
"type": "text",
"placeholders": {
"age": {}
}
}
} }

@ -3027,11 +3027,6 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"yourBirthdayPleaseShort": "Por favor, introduzca su fecha de nacimiento",
"@yourBirthdayPleaseShort": {
"type": "text",
"placeholders": {}
},
"inviteStudentByUserName": "Invitar a estudiantes por usuario", "inviteStudentByUserName": "Invitar a estudiantes por usuario",
"@inviteStudentByUserName": { "@inviteStudentByUserName": {
"type": "text", "type": "text",
@ -4578,5 +4573,13 @@
"clickMessageBody": "Haga clic en los mensajes para acceder a las definiciones, traducciones y audio.", "clickMessageBody": "Haga clic en los mensajes para acceder a las definiciones, traducciones y audio.",
"more": "Más", "more": "Más",
"translationTooltip": "Traducir", "translationTooltip": "Traducir",
"audioTooltip": "Reproducir audio" "audioTooltip": "Reproducir audio",
"yourBirthdayPleaseShort": "Seleccione su grupo de edad",
"certifyAge": "Certifico que soy mayor de {age} años",
"@certifyAge": {
"type": "text",
"placeholders": {
"age": {}
}
}
} }

@ -1,17 +1,16 @@
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:intl/intl.dart';
import 'package:fluffychat/pangea/constants/age_limits.dart'; import 'package:fluffychat/pangea/constants/age_limits.dart';
import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/pages/p_user_age/p_user_age_view.dart'; import 'package:fluffychat/pangea/pages/p_user_age/p_user_age_view.dart';
import 'package:fluffychat/pangea/utils/p_extension.dart'; import 'package:fluffychat/pangea/utils/p_extension.dart';
import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import 'package:fluffychat/widgets/fluffy_chat_app.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:intl/intl.dart';
import '../../utils/bot_name.dart'; import '../../utils/bot_name.dart';
import '../../utils/error_handler.dart'; import '../../utils/error_handler.dart';
@ -24,13 +23,11 @@ class PUserAge extends StatefulWidget {
class PUserAgeController extends State<PUserAge> { class PUserAgeController extends State<PUserAge> {
bool loading = false; bool loading = false;
final GlobalKey<FormState> formKey = GlobalKey<FormState>(); int? selectedAge;
TextEditingController dobController = TextEditingController(); TextEditingController dobController = TextEditingController();
// #Pangea
String? error; String? error;
bool unknownErrorState = false; bool unknownErrorState = false;
// DateTime? dateOfBirth;
final PangeaController pangeaController = MatrixState.pangeaController; final PangeaController pangeaController = MatrixState.pangeaController;
@ -52,13 +49,12 @@ class PUserAgeController extends State<PUserAge> {
); );
} }
String? dobFieldValidator(String? value) { String? dobValidator() {
try { try {
if (value?.isEmpty ?? true) { if (selectedDate == null) {
return L10n.of(context)!.yourBirthdayPleaseShort; return L10n.of(context)!.yourBirthdayPleaseShort;
} }
final DateTime dob = _textToDate!; if (!selectedDate!.isAtLeastYearsOld(AgeLimits.toUseTheApp)) {
if (!dob.isAtLeastYearsOld(AgeLimits.toUseTheApp)) {
return L10n.of(context)!.mustBe13; return L10n.of(context)!.mustBe13;
} }
return null; return null;
@ -68,30 +64,26 @@ class PUserAgeController extends State<PUserAge> {
} }
} }
DateTime? get _textToDate { DateTime? get selectedDate {
try { if (selectedAge == null) return null;
final DateTime initial = DateFormat.yMd().parse(dobController.text); final now = DateTime.now();
return initial; return DateTime(now.year - selectedAge!, now.month, now.day);
} catch (err) {
return null;
}
} }
DateTime get initialDate =>
_textToDate ?? DateTime.now().subtract(const Duration(days: 13 * 365));
//Note: used linear progress bar (also used in fluffychat signup button) for consistency //Note: used linear progress bar (also used in fluffychat signup button) for consistency
createUserInPangea() async { createUserInPangea() async {
try { try {
setState(() { setState(() {
error = null; error = dobValidator();
}); });
if (!formKey.currentState!.validate()) return;
if (error?.isNotEmpty == true) return;
setState(() { setState(() {
loading = true; loading = true;
}); });
final String date = DateFormat('MM-dd-yyyy').format(_textToDate!); final String date = DateFormat('MM-dd-yyyy').format(selectedDate!);
if (pangeaController.userController.userModel?.access == null) { if (pangeaController.userController.userModel?.access == null) {
await pangeaController.userController.createPangeaUser(dob: date); await pangeaController.userController.createPangeaUser(dob: date);
@ -100,11 +92,6 @@ class PUserAgeController extends State<PUserAge> {
dateOfBirth: date, dateOfBirth: date,
); );
} }
// Matrix.of(context).widget.router!.currentState!.to(
// '/rooms',
// queryParameters:
// Matrix.of(context).widget.router!.currentState!.queryParameters,
// );
FluffyChatApp.router.go('/rooms'); FluffyChatApp.router.go('/rooms');
} catch (err, s) { } catch (err, s) {
setState(() { setState(() {
@ -117,6 +104,12 @@ class PUserAgeController extends State<PUserAge> {
} }
} }
void setSelectedAge(int? value) {
setState(() {
selectedAge = value;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return !unknownErrorState return !unknownErrorState

@ -1,10 +1,7 @@
import 'package:fluffychat/pangea/pages/p_user_age/p_user_age.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:intl/intl.dart';
import 'package:syncfusion_flutter_datepicker/datepicker.dart';
import 'package:fluffychat/pangea/pages/p_user_age/p_user_age.dart';
import '../../../widgets/layouts/login_scaffold.dart'; import '../../../widgets/layouts/login_scaffold.dart';
class PUserAgeView extends StatelessWidget { class PUserAgeView extends StatelessWidget {
@ -17,11 +14,8 @@ class PUserAgeView extends StatelessWidget {
appBar: AppBar( appBar: AppBar(
automaticallyImplyLeading: !controller.loading, automaticallyImplyLeading: !controller.loading,
), ),
body: Form( body: ListView(
key: controller.formKey,
child: ListView(
children: [ children: [
// #Pangea
Container( Container(
margin: const EdgeInsets.only(top: 10), margin: const EdgeInsets.only(top: 10),
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
@ -34,92 +28,52 @@ class PUserAgeView extends StatelessWidget {
const SizedBox( const SizedBox(
height: 10, height: 10,
), ),
Padding( Container(
padding: const EdgeInsets.symmetric(horizontal: 12),
child: TextFormField(
readOnly: controller.loading,
autocorrect: false,
controller: controller.dobController,
keyboardType: TextInputType.datetime,
autofillHints:
controller.loading ? null : [AutofillHints.birthday],
validator: controller.dobFieldValidator,
onTap: () async {
showDialog(
context: context,
builder: (BuildContext context) {
return Center(
child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25), borderRadius: BorderRadius.circular(10),
color: Theme.of(context).colorScheme.background, color: Theme.of(context)
.colorScheme
.onSecondaryContainer
.withAlpha(50),
), ),
padding: const EdgeInsets.all(12),
// height: 350,
width: 500,
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, children: [
children: <Widget>[ ListTile(
Card( title: Text(
child: SfDateRangePicker( L10n.of(context)!.certifyAge(13),
view: DateRangePickerView.month, style: const TextStyle(color: Colors.white),
showNavigationArrow: true,
showActionButtons: true,
selectionMode:
DateRangePickerSelectionMode.single,
initialDisplayDate: controller.initialDate,
initialSelectedDate: controller.initialDate,
onSubmit: (val) {
final DateTime? pickedDate =
val as DateTime?;
if (pickedDate != null) {
controller.dobController.text =
DateFormat.yMd().format(pickedDate);
controller.error = null;
} else {
controller.error =
L10n.of(context)!.invalidDob;
}
Navigator.pop(context);
},
onCancel: () => Navigator.pop(context),
), ),
leading: Radio<int>(
value: 13,
groupValue: controller.selectedAge,
onChanged: controller.setSelectedAge,
), ),
],
), ),
ListTile(
title: Text(
L10n.of(context)!.certifyAge(18),
style: const TextStyle(color: Colors.white),
), ),
); leading: Radio<int>(
}, value: 18,
); groupValue: controller.selectedAge,
}, onChanged: controller.setSelectedAge,
// onChanged: (String newValue) {
// try {
// controller.dateOfBirth =
// DateTime.parse(controller.dobController.text);
// controller.error = null;
// } catch (err) {
// controller.error = L10n.of(context)!.invalidDob;
// }
// },
decoration: InputDecoration(
prefixIcon: const Icon(Icons.calendar_today),
hintText: L10n.of(context)!.enterYourDob,
fillColor: Theme.of(context)
.colorScheme
.background
.withOpacity(0.75),
errorText: controller.error,
errorStyle: TextStyle(
color: controller.dobController.text.isEmpty
? Colors.orangeAccent
: Colors.orange,
), ),
), ),
],
), ),
), ),
const SizedBox( const SizedBox(
height: 10, height: 10,
), ),
if (controller.error != null)
Padding(
padding: const EdgeInsets.all(12),
child: Text(
controller.error!,
style: const TextStyle(color: Colors.white),
),
),
Hero( Hero(
tag: 'loginButton', tag: 'loginButton',
child: Padding( child: Padding(
@ -134,7 +88,7 @@ class PUserAgeView extends StatelessWidget {
), ),
], ],
), ),
), // ),
); );
} }
} }

Loading…
Cancel
Save