merge-requests/126/head
Aamir Muhammad 3 years ago
parent ec2bdedeef
commit 3871d3f1e3

@ -46,15 +46,15 @@ class ChatApiClient {
return userLoginResponse; return userLoginResponse;
} }
Future<List<ChatUser>?> getChatMemberFromSearch(String sName, int cUserId) async { Future<ChatUserModel> getChatMemberFromSearch(String searchParam, int cUserId, int pageNo) async {
Response response = await ApiClient().getJsonForResponse( ChatUserModel chatUserModel;
"${ApiConsts.chatLoginTokenUrl}getUserWithStatusAndFavAsync/$sName/$cUserId", Response response = await ApiClient().postJsonForResponse("${ApiConsts.chatLoginTokenUrl}getUserWithStatusAndFavAsync", {"employeeNumber": cUserId, "userName": searchParam, "pageNumber": pageNo},
token: AppState().chatDetails!.response!.token, token: AppState().chatDetails!.response!.token);
);
if (!kReleaseMode) { if (!kReleaseMode) {
logger.i("res: " + response.body); logger.i("res: " + response.body);
} }
return List<ChatUser>.from(json.decode(response.body).map((x) => ChatUser.fromJson(x))); chatUserModel = chatUserModelFromJson(response.body);
return chatUserModel;
} }
//Get User Recent Chats //Get User Recent Chats

@ -3,7 +3,7 @@ import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart';
class ApiConsts { class ApiConsts {
//static String baseUrl = "http://10.200.204.20:2801/"; // Local server //static String baseUrl = "http://10.200.204.20:2801/"; // Local server
// static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA server // static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA server
//static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server
static String baseUrl = "https://hmgwebservices.com"; // Live server static String baseUrl = "https://hmgwebservices.com"; // Live server
static String baseUrlServices = baseUrl + "/Services/"; // server static String baseUrlServices = baseUrl + "/Services/"; // server
// static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server

@ -1,5 +1,11 @@
import 'dart:convert';
import 'dart:io'; import 'dart:io';
ChatUserModel chatUserModelFromJson(String str) => ChatUserModel.fromJson(json.decode(str));
String chatUserModelToJson(ChatUserModel data) => json.encode(data.toJson());
class ChatUserModel { class ChatUserModel {
ChatUserModel({ ChatUserModel({
this.response, this.response,
@ -7,16 +13,40 @@ class ChatUserModel {
}); });
List<ChatUser>? response; List<ChatUser>? response;
dynamic errorResponses; List<ErrorResponse>? errorResponses;
factory ChatUserModel.fromJson(Map<String, dynamic> json) => ChatUserModel( factory ChatUserModel.fromJson(Map<String, dynamic> json) => ChatUserModel(
response: json["response"] == null ? null : List<ChatUser>.from(json["response"].map((x) => ChatUser.fromJson(x))), response: json["response"] == null ? null : List<ChatUser>.from(json["response"].map((x) => ChatUser.fromJson(x))),
errorResponses: json["errorResponses"], errorResponses: json["errorResponses"] == null ? null : List<ErrorResponse>.from(json["errorResponses"].map((x) => ErrorResponse.fromJson(x))),
); );
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"response": response == null ? null : List<dynamic>.from(response!.map((x) => x.toJson())), "response": response == null ? null : List<dynamic>.from(response!.map((x) => x.toJson())),
"errorResponses": errorResponses, "errorResponses": errorResponses == null ? null : List<dynamic>.from(errorResponses!.map((x) => x.toJson())),
};
}
class ErrorResponse {
ErrorResponse({
this.fieldName,
this.message,
});
dynamic? fieldName;
String? message;
factory ErrorResponse.fromRawJson(String str) => ErrorResponse.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory ErrorResponse.fromJson(Map<String, dynamic> json) => ErrorResponse(
fieldName: json["fieldName"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"fieldName": fieldName,
"message": message == null ? null : message,
}; };
} }
@ -34,6 +64,8 @@ class ChatUser {
this.isPin, this.isPin,
this.isFav, this.isFav,
this.isAdmin, this.isAdmin,
this.rKey,
this.totalCount,
this.isTyping, this.isTyping,
this.isImageLoaded, this.isImageLoaded,
this.isImageLoading, this.isImageLoading,
@ -44,7 +76,7 @@ class ChatUser {
String? userName; String? userName;
String? email; String? email;
dynamic? phone; dynamic? phone;
dynamic? title; String? title;
int? userStatus; int? userStatus;
dynamic? image; dynamic? image;
int? unreadMessageCount; int? unreadMessageCount;
@ -52,17 +84,23 @@ class ChatUser {
bool? isPin; bool? isPin;
bool? isFav; bool? isFav;
bool? isAdmin; bool? isAdmin;
dynamic? rKey;
int? totalCount;
bool? isTyping; bool? isTyping;
bool? isImageLoaded; bool? isImageLoaded;
bool? isImageLoading; bool? isImageLoading;
File? userLocalDownlaodedImage; File? userLocalDownlaodedImage;
factory ChatUser.fromRawJson(String str) => ChatUser.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory ChatUser.fromJson(Map<String, dynamic> json) => ChatUser( factory ChatUser.fromJson(Map<String, dynamic> json) => ChatUser(
id: json["id"] == null ? null : json["id"], id: json["id"] == null ? null : json["id"],
userName: json["userName"] == null ? null : json["userName"], userName: json["userName"] == null ? null : json["userName"],
email: json["email"] == null ? null : json["email"], email: json["email"] == null ? null : json["email"],
phone: json["phone"], phone: json["phone"],
title: json["title"], title: json["title"] == null ? null : json["title"],
userStatus: json["userStatus"] == null ? null : json["userStatus"], userStatus: json["userStatus"] == null ? null : json["userStatus"],
image: json["image"], image: json["image"],
unreadMessageCount: json["unreadMessageCount"] == null ? null : json["unreadMessageCount"], unreadMessageCount: json["unreadMessageCount"] == null ? null : json["unreadMessageCount"],
@ -70,6 +108,8 @@ class ChatUser {
isPin: json["isPin"] == null ? null : json["isPin"], isPin: json["isPin"] == null ? null : json["isPin"],
isFav: json["isFav"] == null ? null : json["isFav"], isFav: json["isFav"] == null ? null : json["isFav"],
isAdmin: json["isAdmin"] == null ? null : json["isAdmin"], isAdmin: json["isAdmin"] == null ? null : json["isAdmin"],
rKey: json["rKey"],
totalCount: json["totalCount"] == null ? null : json["totalCount"],
isTyping: false, isTyping: false,
isImageLoaded: false, isImageLoaded: false,
isImageLoading: true, isImageLoading: true,
@ -80,7 +120,7 @@ class ChatUser {
"userName": userName == null ? null : userName, "userName": userName == null ? null : userName,
"email": email == null ? null : email, "email": email == null ? null : email,
"phone": phone, "phone": phone,
"title": title, "title": title == null ? null : title,
"userStatus": userStatus == null ? null : userStatus, "userStatus": userStatus == null ? null : userStatus,
"image": image, "image": image,
"unreadMessageCount": unreadMessageCount == null ? null : unreadMessageCount, "unreadMessageCount": unreadMessageCount == null ? null : unreadMessageCount,
@ -88,5 +128,7 @@ class ChatUser {
"isPin": isPin == null ? null : isPin, "isPin": isPin == null ? null : isPin,
"isFav": isFav == null ? null : isFav, "isFav": isFav == null ? null : isFav,
"isAdmin": isAdmin == null ? null : isAdmin, "isAdmin": isAdmin == null ? null : isAdmin,
"rKey": rKey,
"totalCount": totalCount == null ? null : totalCount,
}; };
} }

@ -82,7 +82,6 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
} }
Future<void> buildHubConnection() async { Future<void> buildHubConnection() async {
chatHubConnection = await getHubConnection(); chatHubConnection = await getHubConnection();
await chatHubConnection.start(); await chatHubConnection.start();
if (kDebugMode) { if (kDebugMode) {
@ -173,7 +172,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
if (isNewChat) { if (isNewChat) {
userChatHistory = []; userChatHistory = [];
} else if (loadMore) { } else if (loadMore) {
Utils.showToast("No More Data To Load");
} }
} else { } else {
if (loadMore) { if (loadMore) {
@ -330,7 +329,15 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
user.userStatus = items.first["userStatus"]; user.userStatus = items.first["userStatus"];
} }
} }
if (teamMembersList != null) {
if (teamMembersList.isNotEmpty) {
for (ChatUser user in teamMembersList!) {
if (user.id == items.first["id"]) {
user.userStatus = items.first["userStatus"];
}
}
}
}
notifyListeners(); notifyListeners();
} }

@ -238,6 +238,7 @@ class _ChatHomeScreenState extends State<ChatHomeScreen> {
), ),
), ),
onPressed: () async { onPressed: () async {
print(AppState().chatDetails!.response!.token);
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: () {}, callBackFunc: () {},

@ -24,6 +24,7 @@ import 'package:mohem_flutter_app/ui/chat/chat_detailed_screen.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class SearchEmployeeBottomSheet extends StatefulWidget { class SearchEmployeeBottomSheet extends StatefulWidget {
int? notificationID; int? notificationID;
@ -47,6 +48,8 @@ class SearchEmployeeBottomSheet extends StatefulWidget {
class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> { class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
TextEditingController username = TextEditingController(); TextEditingController username = TextEditingController();
ScrollController sc = ScrollController();
String searchText = ""; String searchText = "";
List<String>? optionsList = [ List<String>? optionsList = [
@ -62,6 +65,7 @@ class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
// Chat Items // Chat Items
List<ChatUser>? chatUsersList = []; List<ChatUser>? chatUsersList = [];
int pageNo = 1;
int _selectedSearchIndex = 0; int _selectedSearchIndex = 0;
@ -88,12 +92,16 @@ class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
} }
void fetchChatUser({bool isNeedLoading = true}) async { void fetchChatUser({bool isNeedLoading = true}) async {
if (pageNo == 1)
chatUsersList = [];
try { try {
Utils.showLoading(context); Utils.showLoading(context);
chatUsersList = await ChatApiClient().getChatMemberFromSearch( await ChatApiClient().getChatMemberFromSearch(searchText, AppState().chatDetails!.response!.id!, pageNo).then((ChatUserModel value) {
searchText, print(value.response!.length);
int.parse(AppState().chatDetails!.response!.id.toString()), if (value.response != null) {
); chatUsersList = value.response;
}
});
chatUsersList!.removeWhere((ChatUser element) => element.id == AppState().chatDetails!.response!.id); chatUsersList!.removeWhere((ChatUser element) => element.id == AppState().chatDetails!.response!.id);
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
@ -107,232 +115,263 @@ class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
return null; return null;
} }
@override void loadMoreChatUsers() async {
Widget build(BuildContext context) { try {
return SizedBox( await ChatApiClient().getChatMemberFromSearch(searchText, AppState().chatDetails!.response!.id!, pageNo).then((ChatUserModel value) {
width: double.infinity, if (value.response != null) {
height: MediaQuery.of(context).size.height - 100, chatUsersList!.addAll(value.response!);
child: Column( }
children: [ });
Column( chatUsersList!.removeWhere((ChatUser element) => element.id == AppState().chatDetails!.response!.id);
crossAxisAlignment: CrossAxisAlignment.start, } catch (e) {
children: [ Utils.hideLoading(context);
widget.title.toText24(isBold: true), Utils.handleException(e, context, null);
21.height, }
"Search".toText16(), }
11.height,
Row( void scrollListener() async {
children: [ if (sc.position.pixels ==
radioOption("Name", 0, _selectedSearchIndex), sc.position.maxScrollExtent) {
radioOption("User Name", 1, _selectedSearchIndex), pageNo++;
radioOption("Email", 2, _selectedSearchIndex), setState(() {});
], }
),
14.height, @override
Row( void initState() {
children: [ super.initState();
DynamicTextFieldWidget( sc.addListener(scrollListener);
"Search", }
"Search By Username",
inputAction: TextInputAction.done, @override
suffixIconData: Icons.search, Widget build(BuildContext context) {
onChange: (text) { return SizedBox(
searchText = text; width: double.infinity,
setState(() {}); height: MediaQuery
}, .of(context)
).expanded, .size
IconButton( .height - 100,
constraints: const BoxConstraints(), child: Column(
onPressed: () async { children: [
await SystemChannels.textInput.invokeMethod('TextInput.hide'); Column(
widget.fromChat ? fetchChatUser() : fetchUserByInput(); crossAxisAlignment: CrossAxisAlignment.start,
}, children: [
icon: const Icon(Icons.search), widget.title.toText24(isBold: true),
) 21.height,
], "Search".toText16(),
), 11.height,
if (replacementList != null) Row(
replacementList!.isEmpty children: [
? Utils.getNoDataWidget(context).expanded radioOption("Name", 0, _selectedSearchIndex),
: ListView( radioOption("User Name", 1, _selectedSearchIndex),
physics: const BouncingScrollPhysics(), radioOption("Email", 2, _selectedSearchIndex),
padding: EdgeInsets.only(top: 21, bottom: 8), ],
children: [ ),
if (favouriteUserList?.isNotEmpty ?? false) ...[ 14.height,
"Favorites".toText16(), Row(
12.height, children: [
ListView.separated( DynamicTextFieldWidget(
physics: const NeverScrollableScrollPhysics(), "Search",
shrinkWrap: true, "Search By Username",
itemBuilder: (cxt, index) => employeeItemView(favouriteUserList![index]), inputAction: TextInputAction.done,
separatorBuilder: (cxt, index) => Container( suffixIconData: Icons.search,
height: 1, onChange: (text) {
color: MyColors.borderE3Color, searchText = text;
), setState(() {});
itemCount: favouriteUserList?.length ?? 0), },
12.height, ).expanded,
], IconButton(
if (nonFavouriteUserList?.isNotEmpty ?? false) ...[ constraints: const BoxConstraints(),
"Related".toText16(), onPressed: () async {
12.height, await SystemChannels.textInput.invokeMethod('TextInput.hide');
ListView.separated( widget.fromChat ? fetchChatUser() : fetchUserByInput();
physics: const NeverScrollableScrollPhysics(), },
shrinkWrap: true, icon: const Icon(Icons.search),
itemBuilder: (cxt, index) => employeeItemView(nonFavouriteUserList![index]), )
separatorBuilder: (cxt, index) => Container( ],
height: 1, ),
color: MyColors.borderE3Color, if (replacementList != null)
), replacementList!.isEmpty
itemCount: nonFavouriteUserList?.length ?? 0), ? Utils
] .getNoDataWidget(context)
], .expanded
).expanded,
if (widget.fromChat)
if (chatUsersList != null && widget.fromChat)
chatUsersList!.isEmpty
? Column(
children: [
20.height,
Utils.getNoDataWidget(context),
],
)
: ListView( : ListView(
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.only( padding: EdgeInsets.only(top: 21, bottom: 8),
top: 15, children: [
), if (favouriteUserList?.isNotEmpty ?? false) ...[
children: <Widget>[ "Favorites".toText16(),
ListView.separated( 12.height,
physics: const NeverScrollableScrollPhysics(), ListView.separated(
shrinkWrap: true, physics: const NeverScrollableScrollPhysics(),
itemBuilder: (BuildContext cxt, int index) { shrinkWrap: true,
return SizedBox( itemBuilder: (cxt, index) => employeeItemView(favouriteUserList![index]),
height: 55, separatorBuilder: (cxt, index) =>
child: ListTile( Container(
leading: Stack( height: 1,
children: [ color: MyColors.borderE3Color,
SvgPicture.asset( ),
"assets/images/user.svg", itemCount: favouriteUserList?.length ?? 0),
height: 48, 12.height,
width: 48, ],
), if (nonFavouriteUserList?.isNotEmpty ?? false) ...[
Positioned( "Related".toText16(),
right: 5, 12.height,
bottom: 1, ListView.separated(
child: Container( physics: const NeverScrollableScrollPhysics(),
width: 10, shrinkWrap: true,
height: 10, itemBuilder: (cxt, index) => employeeItemView(nonFavouriteUserList![index]),
decoration: BoxDecoration( separatorBuilder: (cxt, index) =>
color: chatUsersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red, Container(
borderRadius: const BorderRadius.all( height: 1,
Radius.circular(10), color: MyColors.borderE3Color,
), ),
), itemCount: nonFavouriteUserList?.length ?? 0),
), ]
) ],
], ).expanded,
if (widget.fromChat)
if (chatUsersList != null && widget.fromChat)
chatUsersList!.isEmpty
? Column(
children: [
20.height,
Utils.getNoDataWidget(context),
],
)
: ListView
.separated(
physics: const AlwaysScrollableScrollPhysics(),
controller: sc,
shrinkWrap: true,
itemBuilder: (BuildContext cxt, int index) {
return SizedBox(
height: 55,
child: ListTile(
leading: Stack(
children: [
SvgPicture.asset(
"assets/images/user.svg",
height: 48,
width: 48,
),
Positioned(
right: 5,
bottom: 1,
child: Container(
width: 10,
height: 10,
decoration: BoxDecoration(
color: chatUsersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red,
borderRadius: const BorderRadius.all(
Radius.circular(10),
),
), ),
title: (chatUsersList![index].userName ?? "").toText14(color: MyColors.darkTextColor),
minVerticalPadding: 0,
onTap: () {
Navigator.pop(context);
Navigator.pushNamed(
context,
AppRoutes.chatDetailed,
arguments: ChatDetailedScreenParams(chatUsersList![index], true),
);
},
), ),
); )
}, ],
separatorBuilder: (BuildContext context, int index) => const Padding(
padding: EdgeInsets.only(right: 10, left: 70, bottom: 0, top: 0),
child: Divider(
color: Color(0xFFE5E5E5),
),
),
itemCount: chatUsersList?.length ?? 0,
), ),
12.height, title: (chatUsersList![index].userName ?? "").toText14(color: MyColors.darkTextColor),
], minVerticalPadding: 0,
).expanded, onTap: () {
], Navigator.pop(context);
).paddingOnly(left: 21, right: 21, bottom: 0, top: 21).expanded, Navigator.pushNamed(
Container(width: double.infinity, height: 1, color: MyColors.lightGreyEFColor), context,
DefaultButton( AppRoutes.chatDetailed,
LocaleKeys.cancel.tr(), arguments: ChatDetailedScreenParams(chatUsersList![index], true),
() { );
Navigator.pop(context); },
}, ),
textColor: MyColors.grey3AColor, );
colors: const [ },
Color(0xffE6E6E6), separatorBuilder: (BuildContext context, int index) =>
Color(0xffE6E6E6), const Padding(
], padding: EdgeInsets.only(right: 10, left: 70, bottom: 0, top: 0),
).insideContainer child: Divider(
], color: Color(0xFFE5E5E5),
), ),
); ),
} itemCount: chatUsersList?.length ?? 0,
)
Widget employeeItemView(ReplacementList replacement) { .expanded,
return InkWell( ],
onTap: () { )
Navigator.pop(context); .paddingOnly(left: 21, right: 21, bottom: 0, top: 21)
widget.onSelectEmployee(replacement); .expanded,
}, Container(width: double.infinity, height: 1, color: MyColors.lightGreyEFColor),
child: SizedBox( DefaultButton(
height: 50, LocaleKeys.cancel.tr(),
child: Row( () {
children: [ Navigator.pop(context);
CircularAvatar( },
url: replacement.employeeImage ?? "", textColor: MyColors.grey3AColor,
height: 30, colors: const [
width: 30, Color(0xffE6E6E6),
isImageBase64: true, Color(0xffE6E6E6),
), ],
16.width, ).insideContainer
Expanded(
child: (replacement.employeeDisplayName ?? "").toText12(),
),
Icon(Icons.star, size: 16, color: replacement.isFavorite! ? MyColors.yellowFavColor : MyColors.borderCEColor),
], ],
), ),
), );
); }
}
Widget radioOption(String title, int value, int groupValue) { Widget employeeItemView(ReplacementList replacement) {
return Row( return InkWell(
children: [ onTap: () {
Container( Navigator.pop(context);
width: 24, widget.onSelectEmployee(replacement);
height: 24, },
decoration: BoxDecoration( child: SizedBox(
color: Colors.transparent, height: 50,
border: Border.all(color: MyColors.borderColor, width: 1), child: Row(
borderRadius: const BorderRadius.all( children: [
Radius.circular(100), CircularAvatar(
), url: replacement.employeeImage ?? "",
height: 30,
width: 30,
isImageBase64: true,
),
16.width,
Expanded(
child: (replacement.employeeDisplayName ?? "").toText12(),
),
Icon(Icons.star, size: 16, color: replacement.isFavorite! ? MyColors.yellowFavColor : MyColors.borderCEColor),
],
), ),
padding: const EdgeInsets.all(4), ),
child: Container( );
width: double.infinity, }
height: double.infinity,
Widget radioOption(String title, int value, int groupValue) {
return Row(
children: [
Container(
width: 24,
height: 24,
decoration: BoxDecoration( decoration: BoxDecoration(
color: value == groupValue ? MyColors.grey3AColor : Colors.transparent, color: Colors.transparent,
border: Border.all(color: MyColors.borderColor, width: 1),
borderRadius: const BorderRadius.all( borderRadius: const BorderRadius.all(
Radius.circular(100), Radius.circular(100),
), ),
), ),
padding: const EdgeInsets.all(4),
child: Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
color: value == groupValue ? MyColors.grey3AColor : Colors.transparent,
borderRadius: const BorderRadius.all(
Radius.circular(100),
),
),
),
), ),
), 9.width,
9.width, title.toText12(color: MyColors.grey57Color)
title.toText12(color: MyColors.grey57Color) ],
], ).onPress(() {
).onPress(() { _selectedSearchIndex = value;
_selectedSearchIndex = value; setState(() {});
setState(() {}); }).expanded;
}).expanded; }
} }
}

@ -273,7 +273,7 @@ class ChatHomeShimmer extends StatelessWidget {
children: <Widget>[ children: <Widget>[
Container( Container(
width: double.infinity, width: double.infinity,
height: 8.0, height: 20.0,
color: Colors.white, color: Colors.white,
), ),
const Padding( const Padding(
@ -281,7 +281,7 @@ class ChatHomeShimmer extends StatelessWidget {
), ),
Container( Container(
width: double.infinity, width: double.infinity,
height: 8.0, height: 15.0,
color: Colors.white, color: Colors.white,
), ),
const Padding( const Padding(
@ -289,7 +289,7 @@ class ChatHomeShimmer extends StatelessWidget {
), ),
Container( Container(
width: 40.0, width: 40.0,
height: 8.0, height: 10.0,
color: Colors.white, color: Colors.white,
), ),
], ],

Loading…
Cancel
Save