From c1ae15cac36053b155ca2ddbd4bde2bcf0d3180e Mon Sep 17 00:00:00 2001 From: Kutlay Hanli Date: Sun, 4 Feb 2024 10:06:56 -0600 Subject: [PATCH] Add actionsBeforeDelete callback to ProfileScreen and DeleteAccountButton --- .../lib/src/screens/profile_screen.dart | 5 +++++ .../lib/src/widgets/delete_account_button.dart | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart b/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart index 4ae5d920..8d77b549 100644 --- a/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart +++ b/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart @@ -716,6 +716,9 @@ class ProfileScreen extends MultiProviderScreen { /// ``` final List? actions; + // Any actions that should be performed before the account is deleted. + final ActionsBeforeDeleteCallback? actionsBeforeDelete; + /// See [Scaffold.appBar]. final AppBar? appBar; @@ -751,6 +754,7 @@ class ProfileScreen extends MultiProviderScreen { this.avatarSize, this.children = const [], this.actions, + this.actionsBeforeDelete, this.appBar, this.cupertinoNavigationBar, this.actionCodeSettings, @@ -917,6 +921,7 @@ class ProfileScreen extends MultiProviderScreen { const SizedBox(height: 8), DeleteAccountButton( auth: auth, + actionsBeforeDelete: actionsBeforeDelete, showDeleteConfirmationDialog: showDeleteConfirmationDialog, onSignInRequired: () { return _reauthenticate(context); diff --git a/packages/firebase_ui_auth/lib/src/widgets/delete_account_button.dart b/packages/firebase_ui_auth/lib/src/widgets/delete_account_button.dart index b8279bbc..4d6758ce 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/delete_account_button.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/delete_account_button.dart @@ -11,6 +11,7 @@ import 'package:flutter/material.dart'; typedef DeleteFailedCallback = void Function(Exception exception); typedef SignInRequiredCallback = Future Function(); +typedef ActionsBeforeDeleteCallback = Future Function(); /// {@template ui.auth.widgets.delete_account_button} /// A button that triggers the deletion of the user's account. @@ -55,6 +56,9 @@ class DeleteAccountButton extends StatefulWidget { /// A callback that is called if the account deletion fails. final DeleteFailedCallback? onDeleteFailed; + /// A callback that is called before the account is deleted. + final ActionsBeforeDeleteCallback? actionsBeforeDelete; + /// {@macro ui.shared.widgets.button_variant} final ButtonVariant variant; @@ -69,6 +73,7 @@ class DeleteAccountButton extends StatefulWidget { this.auth, this.onSignInRequired, this.onDeleteFailed, + this.actionsBeforeDelete, this.variant = ButtonVariant.filled, this.showDeleteConfirmationDialog = false, }); @@ -112,6 +117,13 @@ class _DeleteAccountButtonState extends State { }); try { + if (widget.actionsBeforeDelete != null) { + final proceed = await widget.actionsBeforeDelete!(); + if (!proceed) { + throw Exception('Can not complete actions before delete.'); + } + } + final user = auth.currentUser!; await auth.currentUser?.delete();