part of '../async_action_button.dart';

class AsyncActionButton extends StatelessWidget {
  final AsyncActionCallback? onPressed;
  final Widget child;
  final IconData? icon;
  final ButtonStyle? style;
  final AsyncActionController? controller;
  final AsyncErrorBuilder? errorBuilder;
  final void Function(String message)? onError;
  final VoidCallback? onSuccess;
  final bool showInlineError;

  const AsyncActionButton({
    required this.onPressed,
    required this.child,
    this.icon,
    this.style,
    this.controller,
    this.errorBuilder,
    this.onError,
    this.onSuccess,
    this.showInlineError = true,
    super.key,
  });

  @override
  Widget build(BuildContext context) => _AsyncMixin(
    onPressed: onPressed,
    controller: controller,
    errorBuilder: errorBuilder,
    onError: onError,
    onSuccess: onSuccess,
    builder: (context, busy, handler) {
      final spinner = AppProgressIndicator.small(
        color: Theme.of(context).colorScheme.onPrimary,
      );
      final content = busy
          ? Row(
              mainAxisSize: MainAxisSize.min,
              children: [spinner, const SizedBox(width: 8), child],
            )
          : (icon != null
                ? Row(
                    mainAxisSize: MainAxisSize.min,
                    children: [Icon(icon), const SizedBox(width: 8), child],
                  )
                : child);
      final button = ElevatedButton(
        onPressed: handler,
        style: style,
        child: content,
      );
      if (!showInlineError) return button;
      return _InlineErrorWrapper(controller: controller, child: button);
    },
  );
}
