feat(account): ability to update account email and password

This commit is contained in:
Jagandeep Brar
2022-04-06 12:56:40 -04:00
parent 30fc6400e3
commit 5ea6269bca
13 changed files with 323 additions and 8 deletions

View File

@@ -1,3 +1,4 @@
import 'package:email_validator/email_validator.dart';
import 'package:flutter/material.dart';
import 'package:lunasea/modules/settings/core/types/header.dart';
import 'package:tuple/tuple.dart';
@@ -556,6 +557,125 @@ class SettingsDialogs {
return Tuple2(_flag, _textController.text);
}
Future<Tuple3<bool, String, String>> updateAccountEmail(
BuildContext context,
) async {
final _formKey = GlobalKey<FormState>();
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
bool _flag = false;
void _setValues(bool flag) {
if (_formKey.currentState!.validate()) {
_flag = flag;
Navigator.of(context).pop();
}
}
await LunaDialog.dialog(
context: context,
title: 'settings.UpdateEmail'.tr(),
buttons: [
LunaDialog.button(
text: 'lunasea.Update'.tr(),
onPressed: () => _setValues(true),
),
],
content: [
Form(
key: _formKey,
child: Column(
children: [
LunaDialog.textFormInput(
controller: _emailController,
title: 'settings.Email'.tr(),
onSubmitted: (_) => _setValues(true),
validator: (value) {
return EmailValidator.validate(value ?? '')
? null
: 'settings.EmailValidation'.tr();
},
),
LunaDialog.textFormInput(
controller: _passwordController,
title: 'settings.CurrentPassword'.tr(),
obscureText: true,
onSubmitted: (_) => _setValues(true),
validator: (value) {
return value?.isEmpty ?? true
? 'settings.PasswordValidation'.tr()
: null;
},
),
],
),
),
],
contentPadding: LunaDialog.textDialogContentPadding(),
);
return Tuple3(_flag, _emailController.text, _passwordController.text);
}
Future<Tuple3<bool, String, String>> updateAccountPassword(
BuildContext context,
) async {
final _formKey = GlobalKey<FormState>();
final _currentPassController = TextEditingController();
final _newPassController = TextEditingController();
bool _flag = false;
void _setValues(bool flag) {
if (_formKey.currentState!.validate()) {
_flag = flag;
Navigator.of(context).pop();
}
}
await LunaDialog.dialog(
context: context,
title: 'settings.UpdatePassword'.tr(),
buttons: [
LunaDialog.button(
text: 'lunasea.Update'.tr(),
onPressed: () => _setValues(true),
),
],
content: [
Form(
key: _formKey,
child: Column(
children: [
LunaDialog.textFormInput(
controller: _currentPassController,
title: 'settings.CurrentPassword'.tr(),
obscureText: true,
onSubmitted: (_) => _setValues(true),
validator: (value) {
return value?.isEmpty ?? true
? 'settings.PasswordValidation'.tr()
: null;
},
),
LunaDialog.textFormInput(
controller: _newPassController,
title: 'settings.NewPassword'.tr(),
obscureText: true,
onSubmitted: (_) => _setValues(true),
validator: (value) {
return value?.isEmpty ?? true
? 'settings.PasswordValidation'.tr()
: null;
},
),
],
),
),
],
contentPadding: LunaDialog.textDialogContentPadding(),
);
return Tuple3(_flag, _newPassController.text, _currentPassController.text);
}
Future<Tuple2<bool, String>> addProfile(
BuildContext context,
List<String?> profiles,

View File

@@ -2,6 +2,10 @@ import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/modules/settings.dart';
import '../widgets/change_email_tile.dart';
import '../widgets/change_password_tile.dart';
import '../widgets/delete_account_tile.dart';
class SettingsAccountSettingsRouter extends SettingsPageRouter {
SettingsAccountSettingsRouter() : super('/settings/account/settings');
@@ -27,12 +31,12 @@ class _State extends State<_SettingsAccountSettingsRoute>
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'settings.AccountSettings'.tr(),
scrollControllers: [scrollController],
@@ -43,7 +47,9 @@ class _State extends State<_SettingsAccountSettingsRoute>
return LunaListView(
controller: scrollController,
children: const [
SettingsAccountDeleteAccountTile(),
ChangeEmailTile(),
ChangePasswordTile(),
DeleteAccountTile(),
],
);
}

View File

@@ -1,4 +1,3 @@
export 'widgets/config_backup_tile.dart';
export 'widgets/config_delete_tile.dart';
export 'widgets/config_restore_tile.dart';
export 'widgets/delete_account_tile.dart';

View File

@@ -0,0 +1,59 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/modules/settings.dart';
class ChangeEmailTile extends StatefulWidget {
const ChangeEmailTile({
Key? key,
}) : super(key: key);
@override
State<StatefulWidget> createState() => _State();
}
class _State extends State<ChangeEmailTile> {
LunaLoadingState _loadingState = LunaLoadingState.INACTIVE;
void updateState(LunaLoadingState state) {
if (mounted) setState(() => _loadingState = state);
}
@override
Widget build(BuildContext context) {
return LunaBlock(
title: 'settings.UpdateEmail'.tr(),
trailing: LunaIconButton(
icon: LunaIcons.EMAIL,
loadingState: _loadingState,
),
onTap: _update,
);
}
Future<void> _update() async {
if (_loadingState == LunaLoadingState.ACTIVE) return;
updateState(LunaLoadingState.ACTIVE);
Tuple3<bool, String, String> _result =
await SettingsDialogs().updateAccountEmail(context);
if (_result.item1) {
await LunaFirebaseAuth()
.updateEmail(_result.item2, _result.item3)
.then((res) {
if (res.state) {
showLunaSuccessSnackBar(
title: 'settings.EmailUpdated'.tr(),
message: _result.item2,
);
} else {
updateState(LunaLoadingState.INACTIVE);
showLunaErrorSnackBar(
title: 'settings.FailedToUpdateEmail'.tr(),
message: res.error?.message ?? 'lunasea.UnknownError'.tr(),
);
}
});
}
updateState(LunaLoadingState.INACTIVE);
}
}

View File

@@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/modules/settings.dart';
class ChangePasswordTile extends StatefulWidget {
const ChangePasswordTile({
Key? key,
}) : super(key: key);
@override
State<StatefulWidget> createState() => _State();
}
class _State extends State<ChangePasswordTile> {
LunaLoadingState _loadingState = LunaLoadingState.INACTIVE;
void updateState(LunaLoadingState state) {
if (mounted) setState(() => _loadingState = state);
}
@override
Widget build(BuildContext context) {
return LunaBlock(
title: 'settings.UpdatePassword'.tr(),
trailing: LunaIconButton(
icon: LunaIcons.PASSWORD,
loadingState: _loadingState,
),
onTap: _delete,
);
}
Future<void> _delete() async {
if (_loadingState == LunaLoadingState.ACTIVE) return;
updateState(LunaLoadingState.ACTIVE);
Tuple3<bool, String, String> _result =
await SettingsDialogs().updateAccountPassword(context);
if (_result.item1) {
await LunaFirebaseAuth()
.updatePassword(_result.item2, _result.item3)
.then((res) {
if (res.state) {
showLunaSuccessSnackBar(
title: 'settings.PasswordUpdated'.tr(),
message: 'settings.PleaseSignInAgain'.tr(),
);
Navigator.of(context).lunaSafetyPop();
LunaFirebaseAuth().signOut();
} else {
updateState(LunaLoadingState.INACTIVE);
showLunaErrorSnackBar(
title: 'settings.FailedToUpdatePassword'.tr(),
message: res.error?.message ?? 'lunasea.UnknownError'.tr(),
);
}
});
}
updateState(LunaLoadingState.INACTIVE);
}
}

View File

@@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/modules/settings.dart';
class SettingsAccountDeleteAccountTile extends StatefulWidget {
const SettingsAccountDeleteAccountTile({
class DeleteAccountTile extends StatefulWidget {
const DeleteAccountTile({
Key? key,
}) : super(key: key);
@@ -11,7 +11,7 @@ class SettingsAccountDeleteAccountTile extends StatefulWidget {
State<StatefulWidget> createState() => _State();
}
class _State extends State<SettingsAccountDeleteAccountTile> {
class _State extends State<DeleteAccountTile> {
LunaLoadingState _loadingState = LunaLoadingState.INACTIVE;
void updateState(LunaLoadingState state) {