From 83b30bec3f4e74e50519e4bb1051ce3039fa49fe Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Thu, 16 Jan 2025 21:06:07 +0900 Subject: [PATCH 1/3] refactor: prepare snack bar component --- lib/panache.dart | 18 ++------------- lib/src/ui/components/panache_snack_bar.dart | 24 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 lib/src/ui/components/panache_snack_bar.dart diff --git a/lib/panache.dart b/lib/panache.dart index bb80e02..adda532 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}); @@ -71,21 +71,7 @@ class Panache extends HookWidget { padding: EdgeInsets.all(0.0), icon: const Icon(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); + showSnackBar(context); await Clipboard.setData(ClipboardData(text: generated.value)); }, 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..65af4e7 --- /dev/null +++ b/lib/src/ui/components/panache_snack_bar.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:panache/src/ui/style/color.dart'; +import 'package:panache/src/ui/style/text.dart'; + +showSnackBar(BuildContext context) { + ScaffoldMessenger.of(context).showSnackBar(PanacheSnackBar()); +} + +class PanacheSnackBar extends SnackBar { + PanacheSnackBar({super.key}) + : super( + 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, + ); +} From 5ab4b6e90f2bf5a2d06570a59d83eb2f29d01018 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Thu, 16 Jan 2025 21:16:18 +0900 Subject: [PATCH 2/3] fix: add error handling --- lib/panache.dart | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/panache.dart b/lib/panache.dart index adda532..51ae41b 100644 --- a/lib/panache.dart +++ b/lib/panache.dart @@ -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,11 +70,24 @@ 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 { - showSnackBar(context); + copying.value = true; + + try { + await Clipboard.setData( + ClipboardData(text: generated.value), + ); + copying.value = false; - await Clipboard.setData(ClipboardData(text: generated.value)); + if (context.mounted) { + showSnackBar(context); + } + } catch (e) { + copying.value = false; + } }, ), ), From e70b2bc61769b7621751283612145f63644dff1a Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Thu, 16 Jan 2025 21:21:18 +0900 Subject: [PATCH 3/3] feat: display error color --- lib/panache.dart | 6 +++++- lib/src/ui/components/panache_snack_bar.dart | 16 +++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/panache.dart b/lib/panache.dart index 51ae41b..7f1eeaf 100644 --- a/lib/panache.dart +++ b/lib/panache.dart @@ -83,10 +83,14 @@ class Panache extends HookWidget { copying.value = false; if (context.mounted) { - showSnackBar(context); + showSnackBar(context, 'Copied Text!!'); } } catch (e) { copying.value = false; + + 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 index 65af4e7..c2e9c77 100644 --- a/lib/src/ui/components/panache_snack_bar.dart +++ b/lib/src/ui/components/panache_snack_bar.dart @@ -2,17 +2,23 @@ import 'package:flutter/material.dart'; import 'package:panache/src/ui/style/color.dart'; import 'package:panache/src/ui/style/text.dart'; -showSnackBar(BuildContext context) { - ScaffoldMessenger.of(context).showSnackBar(PanacheSnackBar()); +showSnackBar(BuildContext context, String text, {bool isError = false}) { + ScaffoldMessenger.of(context).showSnackBar( + PanacheSnackBar(text: text, isError: isError), + ); } class PanacheSnackBar extends SnackBar { - PanacheSnackBar({super.key}) + final String text; + final bool isError; + + PanacheSnackBar({super.key, required this.text, this.isError = false}) : super( - backgroundColor: PanacheColor.primaryColor, + backgroundColor: + isError ? PanacheColor.errorColor : PanacheColor.primaryColor, width: 360.0, content: Text( - "Copied Text!!", + text, style: PanacheTextStyle.medium.copyWith(color: Colors.black), ), duration: const Duration(seconds: 2),