diff --git a/.gitignore b/.gitignore
index 60b1d169..bbb74115 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,5 +12,7 @@
/android/app/.cxx
*.g.dart
*.freezed.dart
+*.gr.dart
+*.mocks.dart
android/build/
ios/XCBuildData/
diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html
index f21ab9cc..4921e6e4 100644
--- a/android/build/reports/problems/problems-report.html
+++ b/android/build/reports/problems/problems-report.html
@@ -650,12 +650,12 @@ code + .copy-button {
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 956db669..d2269b71 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -388,7 +388,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution: ITVIO, OOO (VL68C36HYS)";
CODE_SIGN_STYLE = Manual;
- CURRENT_PROJECT_VERSION = 1;
+ CURRENT_PROJECT_VERSION = 52;
DEVELOPMENT_TEAM = VL68C36HYS;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -406,7 +406,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- MARKETING_VERSION = 1.2.1;
+ MARKETING_VERSION = 1.0.50;
PRODUCT_BUNDLE_IDENTIFIER = com.eatvioapp.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.eatvioapp.app 1747050044";
@@ -538,7 +538,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution: ITVIO, OOO (VL68C36HYS)";
CODE_SIGN_STYLE = Manual;
- CURRENT_PROJECT_VERSION = 1;
+ CURRENT_PROJECT_VERSION = 52;
DEVELOPMENT_TEAM = VL68C36HYS;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -556,7 +556,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- MARKETING_VERSION = 1.2.1;
+ MARKETING_VERSION = 1.0.50;
PRODUCT_BUNDLE_IDENTIFIER = com.eatvioapp.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.eatvioapp.app 1747050044";
@@ -576,7 +576,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution: ITVIO, OOO (VL68C36HYS)";
CODE_SIGN_STYLE = Manual;
- CURRENT_PROJECT_VERSION = 1;
+ CURRENT_PROJECT_VERSION = 52;
DEVELOPMENT_TEAM = VL68C36HYS;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -594,7 +594,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- MARKETING_VERSION = 1.2.1;
+ MARKETING_VERSION = 1.0.50;
PRODUCT_BUNDLE_IDENTIFIER = com.eatvioapp.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.eatvioapp.app 1747050044";
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index d7a769f2..6de3b03b 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -21,7 +21,7 @@
CFBundleSignature
????
CFBundleVersion
- 39
+ 52
ITSAppUsesNonExemptEncryption
LSRequiresIPhoneOS
diff --git a/lib/core/app_router.dart b/lib/core/app_router.dart
index 95f94c04..5e9f2cf6 100644
--- a/lib/core/app_router.dart
+++ b/lib/core/app_router.dart
@@ -374,10 +374,10 @@ class AppRouter {
name: 'chatScreen',
builder: (context, state) {
final data = state.extra as Map;
- final chatId = data['chatId'] as String;
+ final uuid = data['uuid'] as String;
final sendInitialMessage = data['sendInitialMessage'] as bool?;
return ChatScreen(
- chatId: chatId,
+ uuid: uuid,
sendInitialMessage: sendInitialMessage,
);
},
diff --git a/lib/core/locator_service.dart b/lib/core/locator_service.dart
index 4d4a0712..edfc8db0 100644
--- a/lib/core/locator_service.dart
+++ b/lib/core/locator_service.dart
@@ -250,7 +250,6 @@ Future init() async {
'accept': 'application/json',
'content-type': 'application/json',
},
- validateStatus: (status) => status != null && status < 500,
),
)..interceptors.addAll(
[
diff --git a/lib/core/permission_handler/permission_handler.dart b/lib/core/permission_handler/permission_handler.dart
index a311e84d..f107c2c0 100644
--- a/lib/core/permission_handler/permission_handler.dart
+++ b/lib/core/permission_handler/permission_handler.dart
@@ -1,3 +1,5 @@
+import 'dart:io';
+
import 'package:eatvio_app/core/widgets/show_error_dialog.dart';
import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/cupertino.dart';
@@ -11,6 +13,10 @@ class PermissionHandler {
required Future Function() onGranted,
required BuildContext context,
}) async {
+ if (Platform.isAndroid) {
+ await onGranted();
+ return;
+ }
final permissionState = await permission.request();
if (permissionState.isGranted) {
await onGranted();
diff --git a/lib/core/token_storage.dart b/lib/core/token_storage.dart
index cbfb8abb..30906264 100644
--- a/lib/core/token_storage.dart
+++ b/lib/core/token_storage.dart
@@ -21,3 +21,25 @@ abstract class TokenStorage {
static Future removeTokenInStorage() async => (await const FlutterSecureStorage().delete(key: 'token'));
}
+
+abstract class SocketIdStorage {
+ static Future haveSocketIdInStorage() async {
+ try {
+ if (await const FlutterSecureStorage().read(key: 'socketId') == null) {
+ return false;
+ } else {
+ return true;
+ }
+ } catch (e) {
+ return false;
+ }
+ }
+
+ static Future getSocketIdFromStorage() async => await const FlutterSecureStorage().read(key: 'socketId');
+
+ static Future saveSocketIdInStorage(String socketId) async {
+ await const FlutterSecureStorage().write(key: 'socketId', value: socketId);
+ }
+
+ static Future removeSocketIdInStorage() async => (await const FlutterSecureStorage().delete(key: 'socketId'));
+}
diff --git a/lib/core/websockets/ws_manager.dart b/lib/core/websockets/ws_manager.dart
index 73431542..528f2ae9 100644
--- a/lib/core/websockets/ws_manager.dart
+++ b/lib/core/websockets/ws_manager.dart
@@ -1,3 +1,4 @@
+import 'dart:convert';
import 'dart:developer';
import 'package:dart_pusher_channels/dart_pusher_channels.dart';
@@ -59,6 +60,24 @@ class WsManager {
),
);
+ String? extractSocketId(String? data) {
+ if (data == null) return null;
+ try {
+ final decoded = jsonDecode(data);
+ return decoded['socket_id'] as String?;
+ } catch (_) {
+ return null;
+ }
+ }
+
+ client?.eventStream.listen((event) async {
+ if (event.name == 'pusher:connection_established') {
+ final data = event.data;
+ final socketId = extractSocketId(data);
+ await SocketIdStorage.saveSocketIdInStorage(socketId!);
+ }
+ });
+
await client?.connect();
client = client;
@@ -77,9 +96,8 @@ class WsManager {
EasyDebounce.debounce(
'searchChatRoom',
const Duration(milliseconds: 300),
- () => sl().getChatRooms(),
+ () => sl().getChatRooms(),
);
- log(event.rootObject.toString());
});
_subscribe();
} catch (e, st) {
diff --git a/lib/features/auth/presentation/pages/auth_screen.dart b/lib/features/auth/presentation/pages/auth_screen.dart
index 6b4ec260..10fb4172 100644
--- a/lib/features/auth/presentation/pages/auth_screen.dart
+++ b/lib/features/auth/presentation/pages/auth_screen.dart
@@ -79,6 +79,9 @@ class _AuthScreenState extends State {
@override
Widget build(BuildContext context) {
+ var shortestSide = MediaQuery.sizeOf(context).shortestSide;
+ final bool useMobileLayout = shortestSide < 600;
+ if (!useMobileLayout) isFocused = true;
final s = S.of(context);
FlutterNativeSplash.remove();
return BlocProvider(
diff --git a/lib/features/chat/models/chat_room_model.dart b/lib/features/chat/models/chat_room_model.dart
index d7bf450a..dc091ea6 100644
--- a/lib/features/chat/models/chat_room_model.dart
+++ b/lib/features/chat/models/chat_room_model.dart
@@ -9,7 +9,7 @@ part 'chat_room_model.g.dart';
@freezed
abstract class ChatRoomModel with _$ChatRoomModel {
const factory ChatRoomModel({
- required String id,
+ required String id,
@JsonKey(name: 'chat_room_setting') required ChatRoomSettingsModel chatRoomSettings,
required Users users,
@JsonKey(name: 'chosen_plan_id') required int? chosenPlanId,
diff --git a/lib/features/chat/models/chat_room_pagination_model.dart b/lib/features/chat/models/chat_room_pagination_model.dart
index 7bb8ceb5..19de28c3 100644
--- a/lib/features/chat/models/chat_room_pagination_model.dart
+++ b/lib/features/chat/models/chat_room_pagination_model.dart
@@ -1,3 +1,4 @@
+import 'package:eatvio_app/core/models/pagination_model.dart';
import 'package:eatvio_app/features/chat/models/chat_message_model.dart';
import 'package:eatvio_app/features/plans/models/chosen_plan_model.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
@@ -8,29 +9,18 @@ part 'chat_room_pagination_model.g.dart';
@freezed
abstract class ChatRoomPaginationModel with _$ChatRoomPaginationModel {
const factory ChatRoomPaginationModel({
- @JsonKey(name: "chatRooms") required ChatRooms chatRooms,
+ @JsonKey(name: "data") required List data,
@JsonKey(name: "number_of_unread_chat_rooms") required int unreadChatsCount,
+ required Meta meta,
}) = _ChatRoomPreviewModel;
factory ChatRoomPaginationModel.fromJson(Map json) => _$ChatRoomPaginationModelFromJson(json);
}
-@freezed
-abstract class ChatRooms with _$ChatRooms {
- const factory ChatRooms({
- @JsonKey(name: "data") required List data,
- @JsonKey(name: "last_page") required int lastPage,
- @JsonKey(name: "current_page") required int currentPage,
- }) = _ChatRooms;
-
- factory ChatRooms.fromJson(Map json) => _$ChatRoomsFromJson(json);
-}
-
@freezed
abstract class ChatRoom with _$ChatRoom {
const factory ChatRoom({
@JsonKey(name: "id") required String id,
- @JsonKey(name: "room_name") required String roomName,
@JsonKey(name: "last_message", fromJson: parseLastMessage) required ChatMessageModel? lastMessage,
@JsonKey(name: "users") required Users users,
@JsonKey(name: "unread_messages_count") required int unreadMessagesCount,
diff --git a/lib/features/chat/models/chat_room_settings_model.dart b/lib/features/chat/models/chat_room_settings_model.dart
index 5298d3d9..fa332843 100644
--- a/lib/features/chat/models/chat_room_settings_model.dart
+++ b/lib/features/chat/models/chat_room_settings_model.dart
@@ -6,11 +6,8 @@ part 'chat_room_settings_model.g.dart';
@freezed
abstract class ChatRoomSettingsModel with _$ChatRoomSettingsModel {
const factory ChatRoomSettingsModel({
- required int id,
- @JsonKey(name: 'room_name') required String roomName,
+ required String name,
required String state,
- @JsonKey(name: 'access_level') required String accessLevel,
- @JsonKey(name: 'updated_at') required String updatedAt,
}) = _ChatRoomSettingsModel;
factory ChatRoomSettingsModel.fromJson(Map json) => _$ChatRoomSettingsModelFromJson(json);
diff --git a/lib/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart b/lib/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart
index 63bf9e19..f4c95d12 100644
--- a/lib/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart
+++ b/lib/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart
@@ -47,14 +47,14 @@ class ChatRoomCubit extends Cubit {
_timer?.cancel();
}
- Future loadNextPage(String chatId) async {
+ Future loadNextPage(String uuid) async {
if (currentPage < lastPage && !isLoading) {
isLoading = true;
emit((state as ChatRoomStateLoaded).copyWith(isLoading: isLoading));
try {
- final chatMessages = await chatRepository.getChatMessages(chatId, currentPage + 1);
+ final chatMessages = await chatRepository.getChatMessages(uuid, currentPage + 1);
isLoading = false;
emit(
@@ -89,17 +89,19 @@ class ChatRoomCubit extends Cubit {
}
}
- Future initChat(String chatId, {bool sendInitialMessage = false}) async {
+ Future initChat(
+ String uuid, {
+ bool sendInitialMessage = false,
+ }) async {
try {
- final chatRoom = await chatRepository.getChatRoom(chatId);
+ final chatRoom = await chatRepository.getChatRoom(uuid);
ChosenPlanModel? chosenPlan;
if (chatRoom.chosenPlanId != null) {
chosenPlan = await chatRepository.getChosenPlan(id: chatRoom.chosenPlanId!);
}
- final chatMessages = await chatRepository.getChatMessages(chatId, currentPage);
+ final chatMessages = await chatRepository.getChatMessages(uuid, currentPage);
lastPage = chatMessages.meta.lastPage;
-
- await _subscribeToChatChannel(chatId: chatId);
+ await _subscribeToChatChannel(uuid: uuid, chatId: chatRoom.id);
emit(
ChatRoomState.loaded(
chatRoom: chatRoom.copyWith(chosenPlan: chosenPlan),
@@ -158,14 +160,14 @@ class ChatRoomCubit extends Cubit {
}
}
- Future _subscribeToChatChannel({required String chatId}) async {
+ Future _subscribeToChatChannel({required String uuid, required String chatId}) async {
final client = wsManager.client;
if (client == null) return;
await wsManager.initPrivateDirectChatChannel(chatId);
wsManager.subscribeDirectChatChannel();
messagesSubscription = wsManager.directChatStream?.listen((event) {
AudioPlayer().play((AssetSource('audio/recive_message.wav')));
- final message = ChatMessageModel.fromJson(jsonDecode(event.data)['message']);
+ final message = ChatMessageModel.fromJson(jsonDecode(event.data));
List messagesList = [message, ...(state as ChatRoomStateLoaded).chatMessages];
chatRepository.emitNewMessageToChats(message);
emit((state as ChatRoomStateLoaded).copyWith(chatMessages: messagesList, isLoading: isLoading));
@@ -179,7 +181,15 @@ class ChatRoomCubit extends Cubit {
typingSubscription = wsManager.clientTypingStream?.listen((event) {
emit((state as ChatRoomStateLoaded).copyWith(isTyping: true, isLoading: isLoading));
EasyDebounce.debounce(
- 'client-typing', const Duration(seconds: 3), () => emit((state as ChatRoomStateLoaded).copyWith(isTyping: false, isLoading: isLoading)));
+ 'client-typing',
+ const Duration(seconds: 3),
+ () => emit(
+ (state as ChatRoomStateLoaded).copyWith(
+ isTyping: false,
+ isLoading: isLoading,
+ ),
+ ),
+ );
});
}
@@ -189,12 +199,30 @@ class ChatRoomCubit extends Cubit {
required String userSlug,
}) async {
try {
+ final compressedFiles = files != null ? await ImageCompressUtility.compressFilesList(List.from(files)) : null;
+ AudioPlayer().play((AssetSource('audio/send_message.wav')));
+ emit(
+ (state as ChatRoomStateLoaded).copyWith(
+ chatMessages: [
+ ChatMessageModel(
+ id: 1,
+ data: data ?? '',
+ mediaData: compressedFiles,
+ authorId: 1,
+ updatedAt: DateTime.now(),
+ isRead: true,
+ isCurrentUserAuthor: true,
+ roomId: '',
+ ),
+ ...(state as ChatRoomStateLoaded).chatMessages,
+ ],
+ ),
+ );
await chatRepository.sendMessage(
data: data,
- files: files != null ? await ImageCompressUtility.compressFilesList(List.from(files)) : null,
+ files: compressedFiles,
slug: userSlug,
);
- AudioPlayer().play((AssetSource('audio/send_message.wav')));
return true;
} catch (e, st) {
log(e.toString(), stackTrace: st);
diff --git a/lib/features/chat/presentation/bloc/chats_cubit/chats_cubit.dart b/lib/features/chat/presentation/bloc/chats_cubit/chats_cubit.dart
index 3b50c995..174108b3 100644
--- a/lib/features/chat/presentation/bloc/chats_cubit/chats_cubit.dart
+++ b/lib/features/chat/presentation/bloc/chats_cubit/chats_cubit.dart
@@ -21,7 +21,7 @@ class ChatsCubit extends Cubit {
required this.chatRepository,
required this.wsManager,
required this.profileRepository,
- }) : super(ChatsState()) {
+ }) : super(ChatsState()) {
newLastMessageSubscription = chatRepository.newUserMessagesStream.listen((message) {
_setNewLastMessage(message);
});
@@ -29,6 +29,7 @@ class ChatsCubit extends Cubit {
String? _query;
int page = 1;
late int lastPage;
+
Future connectToWebSocket() async {
await newIncomingMessagesSubscription?.cancel();
newIncomingMessagesSubscription = wsManager.newMessagesStream?.listen((event) {
@@ -43,10 +44,10 @@ class ChatsCubit extends Cubit {
try {
final chatRoomsPaginationModel = await chatRepository.getChatRooms(query: query);
final unreadChats = chatRoomsPaginationModel.unreadChatsCount;
- lastPage = chatRoomsPaginationModel.chatRooms.lastPage + 1;
+ lastPage = chatRoomsPaginationModel.meta.lastPage + 1;
emit(
state.copyWith(
- chatRooms: chatRoomsPaginationModel.chatRooms.data,
+ chatRooms: chatRoomsPaginationModel.data,
chatsWithUnreadMessagesCount: unreadChats,
state: BaseState.success,
),
@@ -65,10 +66,10 @@ class ChatsCubit extends Cubit {
try {
final chatRoomsPaginationModel = await chatRepository.getChatRooms(query: query);
final unreadChats = chatRoomsPaginationModel.unreadChatsCount;
- lastPage = chatRoomsPaginationModel.chatRooms.lastPage + 1;
+ lastPage = chatRoomsPaginationModel.meta.lastPage + 1;
emit(
state.copyWith(
- chatRooms: chatRoomsPaginationModel.chatRooms.data,
+ chatRooms: chatRoomsPaginationModel.data,
chatsWithUnreadMessagesCount: unreadChats,
state: BaseState.success,
),
@@ -90,7 +91,7 @@ class ChatsCubit extends Cubit {
final unreadChats = chatRoomsPaginationModel.unreadChatsCount;
emit(
state.copyWith(
- chatRooms: [...state.chatRooms, ...chatRoomsPaginationModel.chatRooms.data],
+ chatRooms: [...state.chatRooms, ...chatRoomsPaginationModel.data],
chatsWithUnreadMessagesCount: unreadChats,
state: BaseState.success,
isLoadingMoreChats: false,
diff --git a/lib/features/chat/presentation/pages/chat_screen.dart b/lib/features/chat/presentation/pages/chat_screen.dart
index e3a042a7..e8029471 100644
--- a/lib/features/chat/presentation/pages/chat_screen.dart
+++ b/lib/features/chat/presentation/pages/chat_screen.dart
@@ -32,10 +32,10 @@ import 'package:intl/intl.dart';
import 'package:visibility_detector/visibility_detector.dart';
class ChatScreen extends StatefulWidget {
- final String chatId;
+ final String uuid;
final bool? sendInitialMessage;
- const ChatScreen({required this.chatId, super.key, required this.sendInitialMessage});
+ const ChatScreen({required this.uuid, super.key, required this.sendInitialMessage});
@override
State createState() => _ChatScreenState();
@@ -64,14 +64,14 @@ class _ChatScreenState extends State {
void initState() {
super.initState();
scrollController.addListener(_onScroll);
- chatRoomCubit.initChat(widget.chatId, sendInitialMessage: widget.sendInitialMessage ?? false);
+ chatRoomCubit.initChat(widget.uuid, sendInitialMessage: widget.sendInitialMessage ?? false);
chatRoomCubit.setTimer();
_listener = AppLifecycleListener(onHide: _onHide, onResume: _onResume);
}
void _onScroll() {
if (scrollController.offset >= scrollController.position.maxScrollExtent && !scrollController.position.outOfRange) {
- chatRoomCubit.loadNextPage(widget.chatId);
+ chatRoomCubit.loadNextPage(widget.uuid);
}
}
@@ -93,7 +93,7 @@ class _ChatScreenState extends State {
if (state is ChatRoomStateLoaded) {
return _buildChat(context, state);
} else if (state is ChatRoomStateError) {
- return Scaffold(appBar: AppBar(), body: DataErrorWidget(onReload: () => chatRoomCubit.initChat(widget.chatId)));
+ return Scaffold(appBar: AppBar(), body: DataErrorWidget(onReload: () => chatRoomCubit.initChat(widget.uuid)));
} else {
return const Scaffold(body: Loader());
}
diff --git a/lib/features/chat/presentation/pages/empty_chat_screen.dart b/lib/features/chat/presentation/pages/empty_chat_screen.dart
index 3195888c..7b543f86 100644
--- a/lib/features/chat/presentation/pages/empty_chat_screen.dart
+++ b/lib/features/chat/presentation/pages/empty_chat_screen.dart
@@ -145,7 +145,7 @@ class _EmptyChatScreenState extends State {
AppRouter.navigatorKey.currentContext?.pushReplacementNamed(
'chatScreen',
extra: {
- 'chatId': chatIdOrError,
+ 'uuid': chatIdOrError,
},
);
}
@@ -186,7 +186,7 @@ class _EmptyChatScreenState extends State {
AppRouter.navigatorKey.currentContext?.pushReplacementNamed(
'chatScreen',
extra: {
- 'chatId': chatIdOrError,
+ 'uuid': chatIdOrError,
},
);
}
@@ -214,7 +214,7 @@ class _EmptyChatScreenState extends State {
AppRouter.navigatorKey.currentContext?.pushReplacementNamed(
'chatScreen',
extra: {
- 'chatId': chatIdOrError,
+ 'uuid': chatIdOrError,
},
);
}
@@ -264,7 +264,7 @@ class _EmptyChatScreenState extends State {
AppRouter.navigatorKey.currentContext?.pushReplacementNamed(
'chatScreen',
extra: {
- 'chatId': chatIdOrError,
+ 'uuid': chatIdOrError,
},
);
}
diff --git a/lib/features/chat/presentation/widgets/chat_bubble_widget.dart b/lib/features/chat/presentation/widgets/chat_bubble_widget.dart
index 74e6f6a6..d2f5f1bd 100644
--- a/lib/features/chat/presentation/widgets/chat_bubble_widget.dart
+++ b/lib/features/chat/presentation/widgets/chat_bubble_widget.dart
@@ -1,3 +1,5 @@
+import 'dart:io';
+
import 'package:cached_network_image/cached_network_image.dart';
import 'package:dismissible_page/dismissible_page.dart';
import 'package:eatvio_app/core/theme/custom_text_style.dart';
@@ -59,8 +61,9 @@ class ChatBubbleWidget extends StatelessWidget {
),
),
child: Padding(
- padding:
- mediaData.isNotEmpty ? const EdgeInsets.all(8) : EdgeInsets.only(top: 8, bottom: 8, left: isCurrentUser ? 16 : 8, right: isCurrentUser ? 8 : 16),
+ padding: mediaData.isNotEmpty
+ ? const EdgeInsets.all(8)
+ : EdgeInsets.only(top: 8, bottom: 8, left: isCurrentUser ? 16 : 8, right: isCurrentUser ? 8 : 16),
child: Column(
crossAxisAlignment: isCurrentUser ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: [
@@ -86,17 +89,17 @@ class ChatBubbleWidget extends StatelessWidget {
},
leading: const Icon(
Icons.file_copy_outlined,
- color: Colors.white,
+ color: Colors.black,
),
trailing: const Icon(
Icons.download_outlined,
- color: Colors.white,
+ color: Colors.black,
),
title: Text(
mediaData[index].toString().replaceAll('chat_files/', ''),
maxLines: 2,
style: const TextStyle(
- color: Colors.white,
+ color: Colors.black,
fontSize: 12,
overflow: TextOverflow.ellipsis,
),
@@ -109,6 +112,7 @@ class ChatBubbleWidget extends StatelessWidget {
PhotoViewScreen(
imageUrls: mediaData.map((e) => '$e').toList(),
index: index,
+ isLocal: mediaData[index] is File ? true : false,
),
);
},
@@ -117,9 +121,11 @@ class ChatBubbleWidget extends StatelessWidget {
transitionOnUserGestures: true,
child: ClipRRect(
borderRadius: BorderRadius.circular(16),
- child: CachedNetworkImage(
- imageUrl: '${mediaData[index]}',
- ),
+ child: mediaData[index] is File
+ ? Image.file(mediaData[index])
+ : CachedNetworkImage(
+ imageUrl: '${mediaData[index]}',
+ ),
),
),
);
diff --git a/lib/features/chat/presentation/widgets/chat_entry_widget.dart b/lib/features/chat/presentation/widgets/chat_entry_widget.dart
index 44cc67f9..dacff9cb 100644
--- a/lib/features/chat/presentation/widgets/chat_entry_widget.dart
+++ b/lib/features/chat/presentation/widgets/chat_entry_widget.dart
@@ -24,7 +24,7 @@ class _ChatEntryWidgetState extends State {
onTap: () => GoRouter.of(context).pushNamed(
'chatScreen',
extra: {
- 'chatId': widget.chatRoom.id.toString(),
+ 'uuid': widget.chatRoom.id.toString(),
},
),
child: Container(
diff --git a/lib/features/chat/repositories/chat_repository.dart b/lib/features/chat/repositories/chat_repository.dart
index 54924fcd..d682c9a0 100644
--- a/lib/features/chat/repositories/chat_repository.dart
+++ b/lib/features/chat/repositories/chat_repository.dart
@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:developer';
import 'dart:io';
import 'package:dio/dio.dart';
+import 'package:eatvio_app/core/token_storage.dart';
import 'package:eatvio_app/features/chat/models/chat_message_model.dart';
import 'package:eatvio_app/features/chat/models/chat_messages_model.dart';
import 'package:eatvio_app/features/chat/models/chat_room_model.dart';
@@ -47,10 +48,11 @@ class ChatRepository {
}
}
- await chatService.sendMessageByUserSlug(
- userSlug: slug,
+ await chatService.sendMessage(
+ slug: slug,
data: data,
mediaData: multipartFiles.isEmpty ? null : multipartFiles,
+ socketId: (await SocketIdStorage.getSocketIdFromStorage())!,
);
} catch (e, st) {
log(e.toString(), stackTrace: st);
@@ -58,9 +60,9 @@ class ChatRepository {
}
}
- Future getChatRoom(String chatId) async {
+ Future getChatRoom(String uuid) async {
try {
- return (await chatService.getChatRoom(id: chatId))['chatRoom']!;
+ return (await chatService.getChatRoom(uuid: uuid));
} catch (e) {
rethrow;
}
@@ -74,9 +76,9 @@ class ChatRepository {
}
}
- Future getChatMessages(String chatId, int page) async {
+ Future getChatMessages(String id, int page) async {
try {
- return (await chatService.getChatMessages(id: chatId, page: page));
+ return (await chatService.getChatMessages(id: id, page: page));
} catch (e) {
rethrow;
}
@@ -90,9 +92,9 @@ class ChatRepository {
}
}
- Future markMessagesAsRead(String chatId, List messageIds) async {
+ Future markMessagesAsRead(String id, List messageIds) async {
try {
- await chatService.markMessagesAsRead(id: chatId, body: {'messages_ids': messageIds});
+ await chatService.markMessagesAsRead(id: id, body: {'messages_ids': messageIds});
} catch (e) {
rethrow;
}
diff --git a/lib/features/chat/services/chat_service.dart b/lib/features/chat/services/chat_service.dart
index dcdab395..dee63eab 100644
--- a/lib/features/chat/services/chat_service.dart
+++ b/lib/features/chat/services/chat_service.dart
@@ -19,15 +19,16 @@ abstract class ChatService {
@Query('find') String? query,
});
- @GET('/api/chat/show/{id}')
- Future