import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/models/chat_models/buyers_chat_for_ads_model.dart'; import 'package:mc_common_app/models/requests_models/request_model.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; /// Service for handling navigation to different chat types in the app /// Provides centralized navigation logic for Request, Advertisement, and General chats abstract class ChatNavigationService { /// Navigate to Request Offer Chat screen Future navigateToRequestOfferChat({ required BuildContext context, required int requestId, required String receiverId, required String senderId, required int requestIndex, required int providerIndex, required RequestModel requestModel, }); /// Navigate to Advertisement Chat screen Future navigateToAdChat({ required BuildContext context, required int adsId, required String receiverUserId, }); /// Navigate to General Chat screen Future navigateToGeneralChat({ required BuildContext context, required String receiverUserId, Map? additionalData, }); /// Navigate to Chat List screen based on chat type Future navigateToChatList({ required BuildContext context, required ChatTypeEnum chatType, Map? arguments, }); } class ChatNavigationServiceImp implements ChatNavigationService { @override Future navigateToRequestOfferChat({ required BuildContext context, required int requestId, required String receiverId, required String senderId, required int requestIndex, required int providerIndex, required RequestModel requestModel, }) async { try { log("Navigating to Request Offer Chat: requestId=$requestId"); ChatViewArgumentsForRequest args = ChatViewArgumentsForRequest( chatTypeEnum: ChatTypeEnum.requestOffer, requestId: requestId, receiverId: receiverId, senderId: senderId, requestIndex: requestIndex, providerIndex: providerIndex, requestModel: requestModel, ); ChatViewArguments chatViewArguments = ChatViewArguments( chatTypeEnum: ChatTypeEnum.requestOffer, chatViewArgumentsForRequest: args, ); navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments); } catch (e) { log("Error navigating to request offer chat: $e"); } } @override Future navigateToAdChat({ required BuildContext context, required int adsId, required String receiverUserId, }) async { try { log("Navigating to Ad Chat: adsId=$adsId, receiverId=$receiverUserId"); ChatViewArgumentsForAd args = ChatViewArgumentsForAd( adsID: adsId, receiverUserID: receiverUserId, ); ChatViewArguments chatViewArguments = ChatViewArguments( chatTypeEnum: ChatTypeEnum.ads, chatViewArgumentsForAd: args, ); navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments); } catch (e) { log("Error navigating to ad chat: $e"); } } @override Future navigateToGeneralChat({ required BuildContext context, required String receiverUserId, Map? additionalData, }) async { try { log("Navigating to General Chat: receiverId=$receiverUserId"); // General chat implementation // You can extend this based on your general chat requirements ChatViewArguments chatViewArguments = ChatViewArguments( chatTypeEnum: ChatTypeEnum.general, ); navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments); } catch (e) { log("Error navigating to general chat: $e"); } } @override Future navigateToChatList({ required BuildContext context, required ChatTypeEnum chatType, Map? arguments, }) async { try { log("Navigating to Chat List: type=$chatType"); switch (chatType) { case ChatTypeEnum.requestOffer: // Navigate to Providers Chat List (for customer side) // or Requests list (for provider side) if (AppState().currentAppType == AppType.customer) { navigateWithName(context, AppRoutes.providersChatListPage); } else { // For provider, navigate to requests page navigateWithName(context, AppRoutes.dashboard); } break; case ChatTypeEnum.ads: // Navigate to Ads Buyers Chat List if (arguments != null && arguments['buyers'] != null) { navigateWithName( context, AppRoutes.adsBuyerChatsListView, arguments: arguments['buyers'] as List, ); } else { // Navigate to ads list if buyers not provided navigateWithName(context, AppRoutes.dashboard); } break; case ChatTypeEnum.general: // Navigate to General Chats List if (arguments != null && arguments['requestId'] != null) { navigateWithName( context, AppRoutes.generalChatsListForProvider, arguments: arguments['requestId'] as int, ); } else { navigateWithName(context, AppRoutes.dashboard); } break; } } catch (e) { log("Error navigating to chat list: $e"); } } }