mirror of
https://github.com/jagandeepbrar/lunasea.git
synced 2026-08-31 12:42:34 +00:00
feat(account): ability to update account email and password
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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(),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user