diff --git a/lib/panache.dart b/lib/panache.dart index bb80e02..7f1eeaf 100644 --- a/lib/panache.dart +++ b/lib/panache.dart @@ -3,9 +3,9 @@ import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:panache/src/model/lorem.dart'; import 'package:panache/src/ui/components/animated_text.dart'; +import 'package:panache/src/ui/components/panache_snack_bar.dart'; import 'package:panache/src/ui/components/sidebar.dart'; import 'package:panache/src/ui/style/color.dart'; -import 'package:panache/src/ui/style/text.dart'; class Panache extends HookWidget { const Panache({super.key}); @@ -13,6 +13,7 @@ class Panache extends HookWidget { @override Widget build(BuildContext context) { final generated = useState(Lorem().generate()); + final copying = useState(false); return GestureDetector( behavior: HitTestBehavior.translucent, @@ -69,25 +70,28 @@ class Panache extends HookWidget { backgroundColor: PanacheColor.thirdlyColor, ), padding: EdgeInsets.all(0.0), - icon: const Icon(Icons.copy), + icon: Icon( + copying.value ? Icons.hourglass_empty : Icons.copy, + ), onPressed: () async { - final snackBar = SnackBar( - backgroundColor: PanacheColor.primaryColor, - width: 360.0, - content: Text( - "Copied Text!!", - style: - PanacheTextStyle.medium.copyWith(color: Colors.black), - ), - duration: const Duration(seconds: 2), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - behavior: SnackBarBehavior.floating, - ); - ScaffoldMessenger.of(context).showSnackBar(snackBar); + copying.value = true; + + try { + await Clipboard.setData( + ClipboardData(text: generated.value), + ); + copying.value = false; + + if (context.mounted) { + showSnackBar(context, 'Copied Text!!'); + } + } catch (e) { + copying.value = false; - await Clipboard.setData(ClipboardData(text: generated.value)); + if (context.mounted) { + showSnackBar(context, 'Copied Failure', isError: true); + } + } }, ), ), diff --git a/lib/src/ui/components/panache_snack_bar.dart b/lib/src/ui/components/panache_snack_bar.dart new file mode 100644 index 0000000..c2e9c77 --- /dev/null +++ b/lib/src/ui/components/panache_snack_bar.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:panache/src/ui/style/color.dart'; +import 'package:panache/src/ui/style/text.dart'; + +showSnackBar(BuildContext context, String text, {bool isError = false}) { + ScaffoldMessenger.of(context).showSnackBar( + PanacheSnackBar(text: text, isError: isError), + ); +} + +class PanacheSnackBar extends SnackBar { + final String text; + final bool isError; + + PanacheSnackBar({super.key, required this.text, this.isError = false}) + : super( + backgroundColor: + isError ? PanacheColor.errorColor : PanacheColor.primaryColor, + width: 360.0, + content: Text( + text, + style: PanacheTextStyle.medium.copyWith(color: Colors.black), + ), + duration: const Duration(seconds: 2), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + behavior: SnackBarBehavior.floating, + ); +}