diff --git a/assets/images/thinking_circle.png b/assets/images/thinking_circle.png new file mode 100644 index 0000000..3b80739 Binary files /dev/null and b/assets/images/thinking_circle.png differ diff --git a/lib/widgets/chat_bubble.dart b/lib/widgets/chat_bubble.dart index 9e1ad84..558d749 100644 --- a/lib/widgets/chat_bubble.dart +++ b/lib/widgets/chat_bubble.dart @@ -1,4 +1,5 @@ import 'package:ai_chat_assistant/utils/common_util.dart'; +import 'package:ai_chat_assistant/widgets/rotating_image.dart'; import 'package:basic_intl/intl.dart'; import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; @@ -127,6 +128,11 @@ class _ChatBubbleState extends State { case MessageStatus.listening: case MessageStatus.recognizing: case MessageStatus.thinking: + icon = RotatingImage( + imagePath: 'assets/images/thinking_circle.png' + ); + color = Colors.white; + break; case MessageStatus.executing: icon = const SizedBox( width: 16, @@ -349,13 +355,12 @@ class _ChatBubbleState extends State { }); }, child: Padding( - padding: const EdgeInsets.only(left: 12), - child: _disliked - ? Image.asset('assets/images/disliked2.png', - width: 20, height: 20) - : Image.asset('assets/images/disliked1.png', - width: 20, height: 20) - ), + padding: const EdgeInsets.only(left: 12), + child: _disliked + ? Image.asset('assets/images/disliked2.png', + width: 20, height: 20) + : Image.asset('assets/images/disliked1.png', + width: 20, height: 20)), ), ], ), diff --git a/lib/widgets/rotating_image.dart b/lib/widgets/rotating_image.dart new file mode 100644 index 0000000..6ce1ec6 --- /dev/null +++ b/lib/widgets/rotating_image.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +class RotatingImage extends StatefulWidget { + final String imagePath; + final double size; + final Duration duration; + + const RotatingImage({ + Key? key, + required this.imagePath, + this.size = 20, + this.duration = const Duration(seconds: 3) + }) : super(key: key); + + @override + State createState() => _RotatingImageState(); +} + +class _RotatingImageState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: widget.duration, + vsync: this, + )..repeat(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return RotationTransition( + turns: _controller, + child: Image.asset( + widget.imagePath, + width: widget.size, + height: widget.size + ), + ); + } +}