From d580a0a21158276901e125332f01ed0bd5a8ffd0 Mon Sep 17 00:00:00 2001 From: Apurva Kanthraviya Date: Thu, 23 May 2024 11:48:35 +0530 Subject: [PATCH] add default avatar for chat users --- README.md | 46 +++++++++++----------- lib/src/extensions/extensions.dart | 4 ++ lib/src/models/chat_user.dart | 17 ++++++++ lib/src/widgets/profile_image_widget.dart | 21 +++++----- lib/src/widgets/reactions_bottomsheet.dart | 6 ++- 5 files changed, 61 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index f254cf4c..c53ff70a 100644 --- a/README.md +++ b/README.md @@ -658,29 +658,6 @@ ChatView( ... ), ``` -29. Add default avatar for profile image `defaultAvatarImage`, - error builder for asset and network profile image `assetImageErrorBuilder` `networkImageErrorBuilder`, - Enum `ImageType` to define image as asset, network or base64 data. -```dart -ChatView( - ... - appBar: ChatViewAppBar( - defaultAvatarImage: defaultAvatar, - imageType: ImageType.network, - networkImageErrorBuilder: (context, url, error) { - return Center( - child: Text('Error $error'), - ); - }, - assetImageErrorBuilder: (context, error, stackTrace) { - return Center( - child: Text('Error $error'), - ); - }, - ), - ... -), -``` 29. Added a `customMessageReplyViewBuilder` to customize reply message view for custom type message. @@ -705,6 +682,29 @@ ChatView( ) ``` +30. Add default avatar for profile image `defaultAvatarImage`, + error builder for asset and network profile image `assetImageErrorBuilder` `networkImageErrorBuilder`, + Enum `ImageType` to define image as asset, network or base64 data. +```dart +ChatView( + ... + appBar: ChatViewAppBar( + defaultAvatarImage: defaultAvatar, + imageType: ImageType.network, + networkImageErrorBuilder: (context, url, error) { + return Center( + child: Text('Error $error'), + ); + }, + assetImageErrorBuilder: (context, error, stackTrace) { + return Center( + child: Text('Error $error'), + ); + }, + ), + ... +), +``` ## How to use diff --git a/lib/src/extensions/extensions.dart b/lib/src/extensions/extensions.dart index 9275fce8..9e5546b6 100644 --- a/lib/src/extensions/extensions.dart +++ b/lib/src/extensions/extensions.dart @@ -80,7 +80,11 @@ extension ValidateString on String { child: ProfileImageWidget( imageUrl: getChatUser(this)?.profilePhoto, imageType: getChatUser(this)?.imageType, + defaultAvatarImage: + getChatUser(this)?.defaultAvatarImage ?? profileImage, circleRadius: profileCircleRadius ?? 8, + assetImageErrorBuilder: getChatUser(this)?.assetImageErrorBuilder, + networkImageErrorBuilder: getChatUser(this)?.networkImageErrorBuilder, ), ); } diff --git a/lib/src/models/chat_user.dart b/lib/src/models/chat_user.dart index 91742b7e..63b5ea43 100644 --- a/lib/src/models/chat_user.dart +++ b/lib/src/models/chat_user.dart @@ -19,7 +19,10 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ +import 'package:chatview/src/utils/constants/constants.dart'; + import '../values/enumaration.dart'; +import '../values/typedefs.dart'; class ChatUser { /// Provides id of user. @@ -33,14 +36,26 @@ class ChatUser { /// Provides profile picture's data in base64 string. final String? profilePhoto; + /// Field to set default image if network url for profile image not provided + final String defaultAvatarImage; + /// Field to define image type [network, asset or base64] final ImageType imageType; + /// Error builder to build error widget for asset image + final AssetImageErrorBuilder? assetImageErrorBuilder; + + /// Error builder to build error widget for network image + final NetworkImageErrorBuilder? networkImageErrorBuilder; + ChatUser({ required this.id, required this.name, this.profilePhoto, + this.defaultAvatarImage = profileImage, this.imageType = ImageType.network, + this.assetImageErrorBuilder, + this.networkImageErrorBuilder, }); factory ChatUser.fromJson(Map json) => ChatUser( @@ -48,6 +63,7 @@ class ChatUser { name: json["name"], profilePhoto: json["profilePhoto"], imageType: json["imageType"], + defaultAvatarImage: json["defaultAvatarImage"], ); Map toJson() => { @@ -55,5 +71,6 @@ class ChatUser { 'name': name, 'profilePhoto': profilePhoto, 'imageType': imageType, + 'defaultAvatarImage': defaultAvatarImage, }; } diff --git a/lib/src/widgets/profile_image_widget.dart b/lib/src/widgets/profile_image_widget.dart index 7b840f1b..04386b4e 100644 --- a/lib/src/widgets/profile_image_widget.dart +++ b/lib/src/widgets/profile_image_widget.dart @@ -61,28 +61,29 @@ class ProfileImageWidget extends StatelessWidget { Widget build(BuildContext context) { return ClipRRect( borderRadius: BorderRadius.circular(circleRadius ?? 20), - child: ((imageType?.isBase64 ?? false) && imageUrl != null) + child: ((imageType?.isBase64 ?? false) && (imageUrl?.isNotEmpty ?? false)) ? Image.memory( base64Decode(imageUrl!), height: (circleRadius ?? 20) * 2, width: (circleRadius ?? 20) * 2, fit: BoxFit.cover, + errorBuilder: assetImageErrorBuilder ?? _errorWidget, ) - : (imageType?.isNetwork ?? true) - ? CachedNetworkImage( - imageUrl: imageUrl ?? defaultAvatarImage, + : ((imageType?.isAsset ?? false) && (imageUrl?.isNotEmpty ?? false)) + ? Image.asset( + imageUrl!, height: (circleRadius ?? 20) * 2, width: (circleRadius ?? 20) * 2, fit: BoxFit.cover, - errorWidget: - networkImageErrorBuilder ?? _networkImageErrorWidget, + errorBuilder: assetImageErrorBuilder ?? _errorWidget, ) - : Image.asset( - imageUrl ?? '', + : CachedNetworkImage( + imageUrl: imageUrl ?? defaultAvatarImage, height: (circleRadius ?? 20) * 2, width: (circleRadius ?? 20) * 2, fit: BoxFit.cover, - errorBuilder: assetImageErrorBuilder ?? _errorWidget, + errorWidget: + networkImageErrorBuilder ?? _networkImageErrorWidget, ), ); } @@ -91,6 +92,7 @@ class ProfileImageWidget extends StatelessWidget { return const Center( child: Icon( Icons.error_outline, + size: 18, ), ); } @@ -99,6 +101,7 @@ class ProfileImageWidget extends StatelessWidget { return const Center( child: Icon( Icons.error_outline, + size: 18, ), ); } diff --git a/lib/src/widgets/reactions_bottomsheet.dart b/lib/src/widgets/reactions_bottomsheet.dart index ad3ba8a6..56fe38f7 100644 --- a/lib/src/widgets/reactions_bottomsheet.dart +++ b/lib/src/widgets/reactions_bottomsheet.dart @@ -1,7 +1,6 @@ import 'package:chatview/src/controller/chat_controller.dart'; import 'package:chatview/src/models/models.dart'; import 'package:chatview/src/widgets/profile_image_widget.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ReactionsBottomSheet { @@ -71,6 +70,11 @@ class ReactionsBottomSheet { 16, imageUrl: reactedUser.profilePhoto, imageType: reactedUser.imageType, + defaultAvatarImage: reactedUser.defaultAvatarImage, + assetImageErrorBuilder: + reactedUser.assetImageErrorBuilder, + networkImageErrorBuilder: + reactedUser.networkImageErrorBuilder, ), const SizedBox(width: 12), Expanded(