1+ import 'dart:io' ;
2+
13import 'package:flutter/material.dart' ;
24import 'package:flutter/scheduler.dart' ;
35import 'package:flutter/services.dart' ;
6+ import 'package:flutter_pkid/flutter_pkid.dart' ;
47import 'package:flutter_riverpod/flutter_riverpod.dart' ;
8+ import 'package:http/http.dart' ;
59import 'package:package_info_plus/package_info_plus.dart' ;
610import 'package:threebotlogin/app_config.dart' ;
711import 'package:threebotlogin/apps/free_flow_pages/ffp_events.dart' ;
@@ -15,10 +19,14 @@ import 'package:threebotlogin/screens/authentication_screen.dart';
1519import 'package:threebotlogin/screens/change_pin_screen.dart' ;
1620import 'package:threebotlogin/screens/main_screen.dart' ;
1721import 'package:threebotlogin/services/fingerprint_service.dart' ;
22+ import 'package:threebotlogin/services/open_kyc_service.dart' ;
23+ import 'package:threebotlogin/services/pkid_service.dart' ;
1824import 'package:threebotlogin/services/shared_preference_service.dart' ;
25+ import 'package:threebotlogin/services/wallet_service.dart' ;
1926import 'package:threebotlogin/widgets/custom_dialog.dart' ;
2027import 'package:threebotlogin/widgets/layout_drawer.dart' ;
2128import 'package:threebotlogin/providers/theme_provider.dart' ;
29+ import 'package:threebotlogin/widgets/wallets/warning_dialog.dart' ;
2230import 'package:url_launcher/url_launcher.dart' ;
2331
2432class PreferenceScreen extends ConsumerStatefulWidget {
@@ -47,6 +55,7 @@ class _PreferenceScreenState extends ConsumerState<PreferenceScreen> {
4755 Globals globals = Globals ();
4856
4957 MaterialColor thiscolor = Colors .green;
58+ bool deleteLoading = false ;
5059
5160 @override
5261 void initState () {
@@ -164,7 +173,7 @@ class _PreferenceScreenState extends ConsumerState<PreferenceScreen> {
164173 }),
165174 ListTile (
166175 leading: const Icon (Icons .lock),
167- title: const Text ('Change pincode ' ),
176+ title: const Text ('Change PIN ' ),
168177 onTap: () async {
169178 _changePincode ();
170179 },
@@ -241,25 +250,37 @@ class _PreferenceScreenState extends ConsumerState<PreferenceScreen> {
241250 title: const Text ('Terms and conditions' ),
242251 onTap: () async => {await _showTermsAndConds ()},
243252 ),
253+ ListTile (
254+ leading: const Icon (Icons .logout_outlined),
255+ title: Text (
256+ 'Log Out' ,
257+ style: Theme .of (context)
258+ .textTheme
259+ .bodyLarge!
260+ .copyWith (color: Theme .of (context).colorScheme.onSurface),
261+ ),
262+ onTap: _showDialog,
263+ ),
244264 ExpansionTile (
245265 title: const Text (
246266 'Advanced settings' ,
247267 ),
248268 children: < Widget > [
249269 ListTile (
250- leading: const Icon (Icons .person),
270+ leading: Icon (
271+ Icons .remove_circle,
272+ color: Theme .of (context).colorScheme.error,
273+ ),
251274 title: Text (
252- 'Remove Account From Device ' ,
275+ 'Delete Account' ,
253276 style: Theme .of (context)
254277 .textTheme
255278 .bodyLarge!
256279 .copyWith (color: Theme .of (context).colorScheme.error),
257280 ),
258- trailing: Icon (
259- Icons .remove_circle,
260- color: Theme .of (context).colorScheme.error,
261- ),
262- onTap: _showDialog,
281+ onTap: () {
282+ _showDialog (delete: true );
283+ },
263284 ),
264285 ],
265286 ),
@@ -311,67 +332,99 @@ class _PreferenceScreenState extends ConsumerState<PreferenceScreen> {
311332 );
312333 }
313334
314- void _showDialog () {
335+ void _showDialog ({delete = false }) {
336+ String title = 'Log Out' ;
337+ String message = 'Are you sure you want to log out?' ;
338+ if (delete) {
339+ title = 'Are you sure?' ;
340+ message =
341+ "If you confirm, your account will be deleted. You won't be able to recover your account." ;
342+ }
343+ preferenceContext = context;
315344 showDialog (
316345 context: context,
317- builder: (BuildContext context) => CustomDialog (
318- type: DialogType .Warning ,
319- image: Icons .warning,
320- title: 'Are you sure?' ,
321- description:
322- 'If you confirm, your account will be removed from this device. You can always recover your account with your username and phrase.' ,
323- actions: < Widget > [
324- TextButton (
325- child: const Text ('Cancel' ),
326- onPressed: () {
327- Navigator .pop (context);
328- },
329- ),
330- TextButton (
331- child: Text (
332- 'Yes' ,
333- style: Theme .of (context)
334- .textTheme
335- .bodyMedium!
336- .copyWith (color: Theme .of (context).colorScheme.warning),
337- ),
338- onPressed: () async {
339- // try {
340- // String deviceID = await _listener.getToken();
341- // removeDeviceId(deviceID);
342- // } catch (e) {}
343- Events ().emit (CloseSocketEvent ());
344- Events ().emit (FfpClearCacheEvent ());
345- bool result = await clearData ();
346- if (result) {
347- Navigator .pop (context);
348- await Navigator .pushReplacement (
349- context,
350- MaterialPageRoute (
351- builder: (context) => const MainScreen (
352- initDone: true , registered: false )));
353- } else {
354- showDialog (
355- context: preferenceContext! ,
356- builder: (BuildContext context) => CustomDialog (
357- type: DialogType .Error ,
358- title: 'Error' ,
359- description:
360- 'Something went wrong when trying to remove your account.' ,
361- actions: < Widget > [
362- TextButton (
363- child: const Text ('Close' ),
364- onPressed: () {
365- Navigator .pop (context);
366- },
367- )
368- ],
346+ builder: (BuildContext context) => WarningDialogWidget (
347+ title: title,
348+ description: message,
349+ onAgree: () async {
350+ deleteLoading = true ;
351+ setState (() {});
352+ if (delete) {
353+ String ? pin = await getPin ();
354+ bool ? authenticated = await Navigator .push (
355+ context,
356+ MaterialPageRoute (
357+ builder: (context) => AuthenticationScreen (
358+ correctPin: pin! ,
359+ userMessage: 'Please enter your PIN code' ,
369360 ),
370- );
361+ ));
362+
363+ if (authenticated == null || ! authenticated) {
364+ deleteLoading = false ;
365+ setState (() {});
366+ return false ;
367+ }
368+ }
369+ Events ().emit (CloseSocketEvent ());
370+ Events ().emit (FfpClearCacheEvent ());
371+ bool deleted = true ;
372+ if (delete) {
373+ try {
374+ Response response = await deleteUser ();
375+ if (response.statusCode != HttpStatus .noContent) {
376+ deleted = false ;
371377 }
372- },
373- ),
374- ],
378+ } catch (e) {
379+ print ('Failed to delete user due to $e ' );
380+ deleted = false ;
381+ }
382+ if (deleted) {
383+ final seedPhrase = await getPhrase ();
384+ FlutterPkid client = await getPkidClient (seedPhrase: seedPhrase! );
385+ await client.setPKidDoc ('email' , '' );
386+ await client.setPKidDoc ('phone' , '' );
387+ await saveWalletsToPkid ([]);
388+ }
389+ }
390+ bool result = false ;
391+ if (deleted) {
392+ result = await clearData ();
393+ if (result) {
394+ Navigator .pop (context);
395+ await Navigator .pushReplacement (
396+ context,
397+ MaterialPageRoute (
398+ builder: (context) =>
399+ const MainScreen (initDone: true , registered: false )));
400+ }
401+ }
402+ if (! result || ! deleted) {
403+ await showDialog (
404+ context: preferenceContext! ,
405+ builder: (BuildContext context) => CustomDialog (
406+ type: DialogType .Error ,
407+ title: 'Error' ,
408+ description:
409+ 'Something went wrong when trying to remove your account.' ,
410+ actions: < Widget > [
411+ TextButton (
412+ child: const Text ('Close' ),
413+ onPressed: () {
414+ Navigator .pop (context);
415+ },
416+ )
417+ ],
418+ ),
419+ );
420+ deleteLoading = false ;
421+ setState (() {});
422+ return false ;
423+ }
424+ deleteLoading = false ;
425+ setState (() {});
426+ return true ;
427+ },
375428 ),
376429 );
377430 }
0 commit comments