44 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:flextras/flextras.dart';
 | 
						|
import 'package:flutter/foundation.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:flutter_gutter/flutter_gutter.dart';
 | 
						|
import 'package:flutter_hooks/flutter_hooks.dart';
 | 
						|
import 'package:moneymgr_mobile/utils/extensions.dart';
 | 
						|
import 'package:moneymgr_mobile/utils/hooks.dart';
 | 
						|
 | 
						|
/// A button that shows a circular progress indicator when the [onPressed] callback
 | 
						|
/// is pending.
 | 
						|
class AppButton extends HookWidget {
 | 
						|
  const AppButton({super.key, required this.onPressed, required this.label});
 | 
						|
 | 
						|
  final AsyncCallback? onPressed;
 | 
						|
  final String label;
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    final (:pending, :snapshot, :hasError) = useAsyncTask();
 | 
						|
 | 
						|
    return FilledButton(
 | 
						|
      onPressed: onPressed == null ? null : () => pending.value = onPressed!(),
 | 
						|
      style: ButtonStyle(
 | 
						|
        backgroundColor: hasError ? WidgetStatePropertyAll(Colors.red) : null,
 | 
						|
      ),
 | 
						|
      child: SeparatedRow(
 | 
						|
        separatorBuilder: () => const GutterSmall(),
 | 
						|
        mainAxisAlignment: MainAxisAlignment.center,
 | 
						|
        children: [
 | 
						|
          if (snapshot.connectionState == ConnectionState.waiting)
 | 
						|
            SizedBox.square(
 | 
						|
              dimension: 12,
 | 
						|
              child: CircularProgressIndicator(
 | 
						|
                strokeWidth: 2,
 | 
						|
                color: context.colorScheme.onPrimary,
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
          Text(label),
 | 
						|
        ],
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |