Skip to content

Commit

Permalink
fix: improvements to clerkerrorlistener [#120]
Browse files Browse the repository at this point in the history
  • Loading branch information
shinyford committed Feb 26, 2025
1 parent 51c0342 commit 13d7fac
Showing 1 changed file with 27 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import 'package:clerk_flutter/clerk_flutter.dart';
import 'package:clerk_flutter/src/utils/localization_extensions.dart';
import 'package:clerk_flutter/src/widgets/ui/style/colors.dart';
import 'package:clerk_flutter/src/widgets/ui/style/text_style.dart';
import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart';

/// Clerk Error Handler
Expand All @@ -24,35 +23,31 @@ class ClerkErrorListener extends StatefulWidget {
/// Construct a [ClerkErrorListener] widget
const ClerkErrorListener({
super.key,
this.handler = defaultErrorHandler,
this.handler,
required this.child,
});

/// Implement this function to handle errors
final ClerkErrorHandler handler;
final ClerkErrorHandler? handler;

/// Child to wrap
final Widget child;

/// Default Error Handler
static Future<void> defaultErrorHandler(
BuildContext context,
AuthError error,
) async {
final localizations = ClerkAuth.localizationsOf(context);
final message = error.localizedMessage(localizations);
@override
State<ClerkErrorListener> createState() => _ClerkErrorListenerState();
}

final messenger = ScaffoldMessenger.maybeOf(context);
if (messenger == null) {
if (kDebugMode) {
debugPrint(
'Warning: no ScaffoldMessenger found '
'to display error: $message',
);
}
return;
class _ClerkErrorListenerState extends State<ClerkErrorListener> {
StreamSubscription<void>? _errorSub;

Future<void> _errorHandler(AuthError error) async {
if (widget.handler case ClerkErrorHandler handler) {
return handler(context, error);
}

final messenger = ScaffoldMessenger.of(context);
final localizations = ClerkAuth.localizationsOf(context);
final message = error.localizedMessage(localizations);
final controller = messenger.showSnackBar(
SnackBar(
shape: const RoundedRectangleBorder(
Expand All @@ -74,32 +69,25 @@ class ClerkErrorListener extends StatefulWidget {
}

@override
State<ClerkErrorListener> createState() => _ClerkErrorListenerState();
}

class _ClerkErrorListenerState extends State<ClerkErrorListener> {
late StreamSubscription<void> _errorSub;

@override
void initState() {
super.initState();
_errorSub = ClerkAuth.errorStreamOf(context)
.asyncMap((error) => widget.handler(context, error))
.listen(null);
void didChangeDependencies() {
super.didChangeDependencies();
if (_errorSub == null) {
assert(
widget.handler != null || ScaffoldMessenger.maybeOf(context) != null,
'ClerkErrorListener must be placed beneath a ScaffoldMessenger '
'in the widget tree, or a handler provided',
);
_errorSub =
ClerkAuth.errorStreamOf(context).asyncMap(_errorHandler).listen(null);
}
}

@override
void dispose() {
_errorSub.cancel();
_errorSub?.cancel();
super.dispose();
}

@override
Widget build(BuildContext context) {
assert(
ScaffoldMessenger.maybeOf(context) != null,
'ClerkErrorListener must be placed beneath a ScaffoldMessenger in the widget tree',
);
return widget.child;
}
Widget build(BuildContext context) => widget.child;
}

0 comments on commit 13d7fac

Please sign in to comment.