Skip to content

Commit

Permalink
add default avatar for chat users
Browse files Browse the repository at this point in the history
  • Loading branch information
apurva010 committed May 24, 2024
1 parent c5fbb87 commit d580a0a
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 33 deletions.
46 changes: 23 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down
4 changes: 4 additions & 0 deletions lib/src/extensions/extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
),
);
}
Expand Down
17 changes: 17 additions & 0 deletions lib/src/models/chat_user.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -33,27 +36,41 @@ 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<String, dynamic> json) => ChatUser(
id: json["id"],
name: json["name"],
profilePhoto: json["profilePhoto"],
imageType: json["imageType"],
defaultAvatarImage: json["defaultAvatarImage"],
);

Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'profilePhoto': profilePhoto,
'imageType': imageType,
'defaultAvatarImage': defaultAvatarImage,
};
}
21 changes: 12 additions & 9 deletions lib/src/widgets/profile_image_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
),
);
}
Expand All @@ -91,6 +92,7 @@ class ProfileImageWidget extends StatelessWidget {
return const Center(
child: Icon(
Icons.error_outline,
size: 18,
),
);
}
Expand All @@ -99,6 +101,7 @@ class ProfileImageWidget extends StatelessWidget {
return const Center(
child: Icon(
Icons.error_outline,
size: 18,
),
);
}
Expand Down
6 changes: 5 additions & 1 deletion lib/src/widgets/reactions_bottomsheet.dart
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down Expand Up @@ -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(
Expand Down

0 comments on commit d580a0a

Please sign in to comment.