From 7622cce151bb8926c56f1e1d69a01a07cff5e12b Mon Sep 17 00:00:00 2001 From: tzw Date: Tue, 5 Mar 2024 17:09:04 +0630 Subject: [PATCH] add account delection page --- assets/local/localization_en.json | 4 +- assets/local/localization_mu.json | 4 +- lib/data/provider/auth_fb.dart | 4 + lib/data/services/auth_imp.dart | 5 + lib/data/services/auth_service.dart | 1 + lib/domain/entities/setting.dart | 8 +- lib/pages/main/model/main_model.dart | 4 + lib/pages/profile/account_delection_page.dart | 105 ++++++++++++++++++ lib/pages/profile/profile_page.dart | 66 ++++++----- 9 files changed, 170 insertions(+), 31 deletions(-) create mode 100644 lib/pages/profile/account_delection_page.dart diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index 5dd083d..26d698e 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -13,6 +13,7 @@ "btn.ok": "Ok", "btn.continue":"Continue", "btn.previous":"Previous", + "btn.delete":"Continue to account deletion", "feet":"Feet", "inch":"Inch", "back.button_confirm":"Are you sure you want to continue without submitting changes?", @@ -170,7 +171,8 @@ "profile.edit.currency.title":"Preferred Currency", "profile.name": "Name", "profile.phone": "Phone", - "profile.delete": "Delete Account", + "profile.delete.title": "Delete Account", + "delete.confirm.label":"Are you sure to delete your account?", "profile.language": "Languages", "profile.logout": "logout", "profile.currency":"Preferred currency", diff --git a/assets/local/localization_mu.json b/assets/local/localization_mu.json index 0206f1d..f2ce5d6 100644 --- a/assets/local/localization_mu.json +++ b/assets/local/localization_mu.json @@ -12,6 +12,7 @@ "btn.ok": "အိုကေ", "btn.continue":"ဆက်ရန်", "btn.previous":"နောက်သို့", + "btn.delete":"အကောင့်ဖျက်ခြင်းကို ဆက်လက်လုပ်ဆောင်မည်", "feet":"ပေ", "inch":"လက်မ", "back.button_confirm":"Are you sure you want to continue without submitting changes?", @@ -171,7 +172,8 @@ "profile.edit.currency.title":"နှစ်သက်သော ငွေအမျိုးအစား", "profile.name":"နာမည်", "profile.phone": "ဖုန်းနံပါတ်", - "profile.delete": "အကောင့်ကို ဖျက်မည်", + "profile.delete.title": "အကောင့်ဖျက်ခြင်း", + "delete.confirm.label":"သင့်အကောင့်ကို ဖျက်ရန် သေချာပြီလား?", "profile.language": "ဘာသာစကားများ", "profile.logout": "အကောင့်ထွက်ရန်", "profile.currency":"နှစ်သက်သော ငွေအမျိုးအစား", diff --git a/lib/data/provider/auth_fb.dart b/lib/data/provider/auth_fb.dart index 7e79a04..fc2110f 100644 --- a/lib/data/provider/auth_fb.dart +++ b/lib/data/provider/auth_fb.dart @@ -202,6 +202,10 @@ class AuthFb { payload: {"preferred_currency": currency}, token: await getToken()); } + Future deleteAccount() async { + return await requestAPI("/accounts", "DELETE", token: await getToken()); + } + Stream settings() async* { Stream snapshot = FirebaseFirestore.instance .collection(config_collection) diff --git a/lib/data/services/auth_imp.dart b/lib/data/services/auth_imp.dart index e3d1b11..def1606 100644 --- a/lib/data/services/auth_imp.dart +++ b/lib/data/services/auth_imp.dart @@ -69,4 +69,9 @@ class AuthServiceImp implements AuthService { Future signoutStart() { return authFb.signoutStart(); } + + @override + Future deleteAccount() { + return authFb.deleteAccount(); + } } diff --git a/lib/data/services/auth_service.dart b/lib/data/services/auth_service.dart index ceba0bf..4a6c6ad 100644 --- a/lib/data/services/auth_service.dart +++ b/lib/data/services/auth_service.dart @@ -14,4 +14,5 @@ abstract class AuthService { Future hasInvite(); Stream getUserStream(); Stream getSetting(); + Future deleteAccount(); } diff --git a/lib/domain/entities/setting.dart b/lib/domain/entities/setting.dart index b9d303c..1c553d3 100644 --- a/lib/domain/entities/setting.dart +++ b/lib/domain/entities/setting.dart @@ -23,6 +23,8 @@ class Setting { final String? termsMm; String? about; String? courierWebsite; + String? deactivateTextEn; + String? deactivateTextMm; List shipmentTypes; @@ -40,7 +42,9 @@ class Setting { this.termsMm, this.about, this.shipmentTypes = const [], - this.courierWebsite}); + this.courierWebsite, + this.deactivateTextEn, + this.deactivateTextMm}); factory Setting.fromMap(Map map) { return Setting( @@ -58,6 +62,8 @@ class Setting { termsMm: map['terms_mm_markdown'], shipmentTypes: List.from(map['shipment_types']), courierWebsite: map['courier_website'], + deactivateTextEn: map['deactivate_text_en']??"", + deactivateTextMm: map['deactivate_text_mm']??"" ); } diff --git a/lib/pages/main/model/main_model.dart b/lib/pages/main/model/main_model.dart index c76dc0f..b541704 100644 --- a/lib/pages/main/model/main_model.dart +++ b/lib/pages/main/model/main_model.dart @@ -192,4 +192,8 @@ class MainModel extends ChangeNotifier { await Services.instance.authService.updatePreferredCurrency(currency); notifyListeners(); } + + Future deleteAccount() async { + return await Services.instance.authService.deleteAccount(); + } } diff --git a/lib/pages/profile/account_delection_page.dart b/lib/pages/profile/account_delection_page.dart new file mode 100644 index 0000000..980e760 --- /dev/null +++ b/lib/pages/profile/account_delection_page.dart @@ -0,0 +1,105 @@ +import 'package:fcs/domain/entities/setting.dart'; +import 'package:fcs/helpers/theme.dart'; +import 'package:fcs/pages/main/model/main_model.dart'; +import 'package:fcs/pages/widgets/local_app_bar.dart'; +import 'package:fcs/pages/widgets/progress.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:provider/provider.dart'; + +import '../main/model/language_model.dart'; +import '../main/util.dart'; +import '../widgets/local_text.dart'; + +class AccountDelectionPage extends StatefulWidget { + final Function onlogout; + const AccountDelectionPage({Key? key, required this.onlogout}) + : super(key: key); + @override + _AccountDelectionPageState createState() => _AccountDelectionPageState(); +} + +class _AccountDelectionPageState extends State { + bool _isLoading = false; + @override + Widget build(BuildContext context) { + bool isEng = Provider.of(context).isEng; + Setting? setting = Provider.of(context).setting; + String? text = isEng + ? (setting!.deactivateTextEn ?? "") + : (setting!.deactivateTextMm ?? ""); + + return LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + appBar: LocalAppBar( + labelKey: 'profile.delete.title', + backgroundColor: Colors.white, + labelColor: primaryColor, + arrowColor: primaryColor, + ), + body: SafeArea( + child: ScrollConfiguration( + behavior: const ScrollBehavior().copyWith(overscroll: false), + child: ListView( + padding: const EdgeInsets.all(10), + children: [ + Markdown( + shrinkWrap: true, + softLineBreak: true, + physics: const BouncingScrollPhysics(), + data: (text).replaceAll("\\n", '\n'), + styleSheet: MarkdownStyleSheet.fromTheme(ThemeData( + textTheme: TextTheme( + bodyMedium: TextStyle( + fontSize: isEng ? 15 : 14, + color: Colors.black87))))), + const SizedBox( + height: 50, + ), + Container( + padding: const EdgeInsets.all(20), + child: TextButton( + style: TextButton.styleFrom( + foregroundColor: buttonColor, + backgroundColor: primaryColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30.0), + )), + onPressed: () { + showConfirmDialog(context, 'delete.confirm.label', + () { + _deactivate(); + }); + }, + child: LocalText(context, "btn.delete", + fontSize: 15, color: buttonColor))), + ], + ), + ), + ), + ), + ); + } + + _deactivate() async { + try { + setState(() { + _isLoading = true; + }); + + // await context.read().deleteAccount(); + // await widget.onlogout(); + + Navigator.pop(context, true); + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + if (mounted) { + setState(() { + _isLoading = false; + }); + } + } + } +} diff --git a/lib/pages/profile/profile_page.dart b/lib/pages/profile/profile_page.dart index 7987623..ce83b58 100644 --- a/lib/pages/profile/profile_page.dart +++ b/lib/pages/profile/profile_page.dart @@ -24,6 +24,8 @@ import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import '../../helpers/theme.dart'; import 'package:collection/collection.dart'; +import 'account_delection_page.dart'; + typedef void ProfileCallback(); class Profile extends StatefulWidget { @@ -82,8 +84,8 @@ class _ProfileState extends State { labelTextKey: "profile.currency", iconData: FontAwesome5Regular.money_bill_alt, ); - final deleteacbox = DisplayText( - labelTextKey: "profile.delete", + final deleteAccountBox = DisplayText( + labelTextKey: "profile.delete.title", iconData: MaterialCommunityIcons.delete, ); @@ -128,8 +130,11 @@ class _ProfileState extends State { ); final logoutbutton = fcsButton( - context, getLocalString(context, "profile.logout"), - callack: _logout, iconData: Icons.exit_to_app); + context, getLocalString(context, "profile.logout"), callack: () { + showConfirmDialog(context, "profile.logout.confirm", () async { + await _logout(); + }); + }, iconData: Icons.exit_to_app); return LocalProgress( inAsyncCall: _isLoading, @@ -187,7 +192,9 @@ class _ProfileState extends State { ), Row( children: [ - Expanded(child: deleteacbox,), + Expanded( + child: deleteAccountBox, + ), Padding( padding: const EdgeInsets.only(right: 0), child: IconButton( @@ -196,7 +203,6 @@ class _ProfileState extends State { ) ], ), - getPrivilegeBox(context), SizedBox(height: 15), logoutbutton, @@ -359,10 +365,16 @@ class _ProfileState extends State { ), ); } -_editDelete() { - Navigator.of(context) - .push(CupertinoPageRoute(builder: (context) => ProfileEdit())); + + _editDelete() { + Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => AccountDelectionPage( + onlogout: () { + _logout(); + }, + ))); } + _editName() { Navigator.of(context) .push(CupertinoPageRoute(builder: (context) => ProfileEdit())); @@ -373,25 +385,23 @@ _editDelete() { CupertinoPageRoute(builder: (context) => ProfileCurrencyEdit())); } - _logout() { - showConfirmDialog(context, "profile.logout.confirm", () async { - setState(() { - _isLoading = true; - }); - try { - await context.read().signout(); - } catch (e) { - } finally { - Future.delayed(Duration(seconds: 1), () { - if (mounted) { - setState(() { - _isLoading = false; - }); - } - }); - Navigator.of(context).pushNamedAndRemoveUntil( - "/welcome", ModalRoute.withName('/welcome')); - } + _logout() async { + setState(() { + _isLoading = true; }); + try { + await context.read().signout(); + } catch (e) { + } finally { + Future.delayed(Duration(seconds: 1), () { + if (mounted) { + setState(() { + _isLoading = false; + }); + } + }); + Navigator.of(context) + .pushNamedAndRemoveUntil("/welcome", ModalRoute.withName('/welcome')); + } } }