Untitled

 avatar
unknown
dart
5 months ago
16 kB
4
Indexable
import 'dart:convert';

import 'package:get/get.dart';
import 'package:takamol_user/app/enums/enums.dart';
import 'package:takamol_user/app/modules/bus_shuttle/modules/bus_active_trip/controllers/bus_active_trip_controller.dart';
import 'package:takamol_user/app/modules/home/controllers/home_controller.dart';
import 'package:takamol_user/app/modules/hospitality/current_order/controllers/hospitality_current_order_controller.dart';
import 'package:takamol_user/app/modules/hospitality/order_history/controller/order_history_controller.dart';
import 'package:takamol_user/app/modules/hospitality/restaurant/kitchen/controllers/kitchen_controller.dart';
import 'package:takamol_user/app/modules/hospitality/restaurant/orders/controllers/orders_controller.dart';
import 'package:takamol_user/app/modules/notifications/controllers/notifications_controller.dart';
import 'package:takamol_user/app/modules/user_controller.dart';
import 'package:takamol_user/app/modules/vip/modules/vip_active_trip/controllers/vip_active_trip_controller.dart';
import 'package:takamol_user/app/modules/vip/widgets/rate_vip_trip_bottom_sheet/view/rate_vip_trip_view.dart';
import 'package:takamol_user/app/modules/visitors/calendar/controllers/calendar_controller.dart';
import 'package:takamol_user/app/modules/visitors/requests/my_requests_visits/controllers/my_requests_controller.dart';
import 'package:takamol_user/app/routes/app_pages.dart';
import 'package:takamol_user/app/server/models/lat_lng_pair.dart';
import 'package:takamol_user/main.dart';

import '../../../resources/strings_generated.dart';
import '../../data/models/signalr_notification.dart';
import '../../modules/bus_shuttle/modules/request_bus_trip/controllers/request_bus_trip_controller.dart';
import '../../modules/bus_shuttle/widgets/rate_bus_trip_bottom_sheet/view/rate_bus_trip_view.dart';
import '../../modules/drawer/view/hidden_drawer.dart';
import '../../modules/home/bindings/home_binding.dart';
import '../../utils/functions/app_functions.dart';
import '../models/users.dart';
import 'signalr_client.dart';

class EntityHub {
  static SignalRClient? signalR;

  static Future init() async {
    final AppFunctions appFunctions = AppFunctions();
    // Channel
    signalR = SignalRClient("notificationHub");
    // Start

    // Close
    //signalR.connection.onclose((exception) => output(exception));
    if (signalR != null) {
      await signalR!.start();

      signalR!.on(
        "ReceiveMessage",
        (data) {
          Get.log(data.toString());
          // 14 => location
          // 17 boarding
          // 18 getoff
          if (data != null && data.isNotEmpty && data.first != null) {
            // Set notification
            SignalRNotification signalRNotification =
                SignalRNotification.fromJson(data.first);

            // Log
            // if (kDebugMode) {
            //   Get.log(signalRNotification.toJson().toString());
            // }

            // Get current route
            String currentRoute = Get.currentRoute.toString();

            // Check Auth
            if (currentUser is User) {
              // BusTripDriverUpdateGeo
              if (signalRNotification.notificationType == 14) {
                if (currentRoute.contains('RequestBusTripView'.toString())) {
                  final RequestBusTripController requestBusTripController =
                      Get.find();
                  requestBusTripController.requestBusTripMethods.getOnlineBuses(
                      isEvent: requestBusTripController.isEventsOnly.value);
                } else if (currentRoute
                    .contains('BusActiveTripView'.toString())) {
                  final BusActiveTripController busActiveTripController =
                      Get.find();
                  busActiveTripController.busActiveTripMethods
                      .getCurrentBusTrips(withLoading: false, addMarker: true);
                } else if (currentRoute.contains('VipActiveTripView')) {
                  final VipActiveTripController vipController = Get.find();

                  Map<String, dynamic> jsonMap =
                      jsonDecode(signalRNotification.messageParameters ?? "{}");
                  double? latitude = jsonMap['Latitude'];
                  double? longitude = jsonMap['Longitude'];
                  String? direction = jsonMap['Direction'];
                  LatLngPair p1 = LatLngPair(lat: latitude, lng: longitude);
                  vipController.methods.addUpdateDriverMarker(
                      driverId: signalRNotification.userId ?? '',
                      p1: p1,
                      direction: direction);
                }
                // Refresh
              }
              // BusTripHeadingDestination
              else if (signalRNotification.notificationType == 17) {
                if (currentRoute.contains('BusActiveTripView'.toString())) {
                  final BusActiveTripController busActiveTripController =
                      Get.find();
                  busActiveTripController.busActiveTripMethods
                      .getCurrentBusTrips(withLoading: false, addMarker: true);
                }
              }
              // BusTripArrivedDestination
              else if (signalRNotification.notificationType == 18) {
                if (currentRoute.contains('BusActiveTripView'.toString())) {
                  final BusActiveTripController busActiveTripController =
                      Get.find();
                  if (signalRNotification.transId != null) {
                    bool isEventTrip = busActiveTripController.busTrip.id ==
                        signalRNotification.transId;
                    appFunctions.startNotiSound();
                    AppFunctions().openAppBottomSheet(
                      title: isEventTrip
                          ? AppStrings.eventTrip
                          : AppStrings.busOrder,
                      body: RateBusTripView(
                        tripId: signalRNotification.transId!,
                        goToHome: true,
                      ),
                    );
                  } else {
                    Get.offAll(
                      () => const HiddenDrawerScreen(),
                      binding: HomeBinding(),
                    );
                  }
                }
              }

              // on going
              else if (signalRNotification.notificationType == 28) {
                if (currentRoute.contains('VipActiveTripView'.toString())) {
                  final VipActiveTripController vipController = Get.find();
                  vipController.methods.getCurrentTrip(withLoading: false);
                  appFunctions.startNotiSound();
                  appFunctions.showGetSnackbar(
                      message: AppStrings.driverVipOnGoing, duration: 6);
                }
              }

              // arrived
              else if (signalRNotification.notificationType == 29) {
                if (currentRoute.contains('VipActiveTripView'.toString())) {
                  final VipActiveTripController vipController = Get.find();
                  vipController.methods.getCurrentTrip(withLoading: false);
                  appFunctions.startNotiSound();
                  appFunctions.showGetSnackbar(
                      message: AppStrings.driverVipArrived, duration: 6);
                }
              }

              // trip start
              else if (signalRNotification.notificationType == 30) {
                if (currentRoute.contains('VipActiveTripView'.toString())) {
                  final VipActiveTripController vipController = Get.find();
                  appFunctions.startNotiSound();
                  vipController.methods.getCurrentTrip(withLoading: false);
                }
              }

              // trip finished
              else if (signalRNotification.notificationType == 31) {
                Get.find<HomeController>().getStatisticsOrders('22');

                if (signalRNotification.transId != null) {
                  appFunctions.startNotiSound();
                  AppFunctions().openAppBottomSheet(
                    title: AppStrings.privateCar,
                    body: RateVipTripView(
                      tripId: signalRNotification.transId!,
                      goToHome:
                          currentRoute.contains('VipActiveTripView'.toString()),
                    ),
                  );
                } else {
                  Get.offAll(
                    () => const HiddenDrawerScreen(),
                    binding: HomeBinding(),
                  );
                }
              }

              // new driver assigned
              else if (signalRNotification.notificationType == 33) {
                if (currentRoute.contains('VipActiveTripView'.toString())) {
                  final VipActiveTripController vipController = Get.find();
                  appFunctions.startNotiSound();
                  vipController.methods.getCurrentTrip(withLoading: false);
                  appFunctions.showGetSnackbar(
                      message: AppStrings.assignedVipDriver, duration: 6);
                }
              } else if (signalRNotification.notificationType == 53) {
                if (!currentRoute.contains(Routes.ORDER_HISTORY)) {
                  Get.put(OrderHistoryController());
                }
                Get.find<OrderHistoryController>().rateOrder(
                  orderId: signalRNotification.transId!,
                  orderNumber: 0,
                );
              }
              // Admin Accept Cancel Trip
              else if (signalRNotification.notificationType == 35) {
                if (currentRoute.contains('VipActiveTripView'.toString())) {
                  Get.offAll(
                    () => const HiddenDrawerScreen(),
                    binding: HomeBinding(),
                  );
                } else {
                  if (Get.isRegistered<HomeController>()) {
                    final HomeController hc = Get.find();
                    hc.removeVipOrder();
                  }
                }
                appFunctions.startNotiSound();
                appFunctions.showGetSnackbar(
                    message: AppStrings.vipTripCanceledByDriver, duration: 6);
              }

              // Admin Accept Cancel Trip
              else if (signalRNotification.notificationType == 38) {
                if (currentRoute.contains('VipActiveTripView'.toString())) {
                  Get.offAll(
                    () => const HiddenDrawerScreen(),
                    binding: HomeBinding(),
                  );
                } else {
                  if (Get.isRegistered<HomeController>()) {
                    final HomeController hc = Get.find();
                    hc.removeVipOrder();
                  }
                }
                appFunctions.startNotiSound();
                appFunctions.showGetSnackbar(
                    message: AppStrings.orderCanceledByAdmin, duration: 6);
              }

              // Users
              else if (signalRNotification.notificationType == 21) {
                // Update current user data
                if (signalRNotification.toUserId == currentUser!.id) {
                  Get.find<UserController>().getAndSetUserData();
                }
              }
              // Notifications
              else if (signalRNotification.notificationType == 22) {
                // Update notifications
                if (signalRNotification.toUserId == currentUser!.id) {
                  Get.find<NotificationsController>()
                      .getNotifications(replace: true);
                }
              }
              // Restaurants
              else if (signalRNotification.notificationType == 23) {
                if (currentRoute.contains('kitchen')) {
                  Get.find<KitchenController>().getCategories(replace: true);
                  Get.find<KitchenController>().getItems(replace: true);
                }
              }
              // RestaurantItemsCategories
              else if (signalRNotification.notificationType == 24) {
                if (currentRoute.contains(Routes.KITCHEN)) {
                  Get.find<KitchenController>().getCategories(replace: true);
                }
              }
              // RestaurantItems
              else if (signalRNotification.notificationType == 25) {
                if (currentRoute.contains(Routes.KITCHEN)) {
                  Get.find<KitchenController>().getItems(replace: true);
                }
              }
              // RestaurantOrders

              else if (signalRNotification.notificationType == 52) {
                // Get.find<HomeController>().getStatisticsOrders('11');

                print(Get.find<HospitalityCurrentOrderController>()
                    .restaurantOrder
                    .id);
                print(signalRNotification.transId);
                if ((currentRoute.contains(Routes.HOSPITALITY_CURRENT_ORDER) ||
                        currentRoute.contains("HospitalityCurrentOrder")) &&
                    Get.find<HospitalityCurrentOrderController>()
                            .restaurantOrder
                            .id ==
                        signalRNotification.transId) {
                  Get.find<HospitalityCurrentOrderController>()
                      .updateOrderData();
                }
              } else if (signalRNotification.notificationType == 26) {
                // Home
                Get.find<HomeController>().getStatisticsOrders('11');
                // Get.find<HomeController>().getLatestOrder();

                // Order history
                if (currentRoute.contains(Routes.ORDER_HISTORY)) {
                  Get.find<OrderHistoryController>().getAllOrders();
                  Get.find<OrdersController>().getOrders(replace: true);
                }

                // Rate order
                // if (signalRNotification.message == "RequestRate" &&
                //     signalRNotification.transId != null &&
                //     signalRNotification.messageParameters != null &&
                //     signalRNotification.toUserId == currentUser?.id) {
                //   if (!currentRoute.contains(Routes.ORDER_HISTORY)) {
                //     Get.put(OrderHistoryController());
                //   }
                //   Get.find<OrderHistoryController>().rateOrder(
                //     orderId: signalRNotification.transId!,
                //     orderNumber:
                //         int.parse(signalRNotification.messageParameters!),
                //   );
                // }

                // Current order
                if ((currentRoute.contains(Routes.HOSPITALITY_CURRENT_ORDER) ||
                        currentRoute.contains("HospitalityCurrentOrder")) &&
                    Get.find<HospitalityCurrentOrderController>()
                            .restaurantOrder
                            .id ==
                        signalRNotification.transId) {
                  Get.find<HospitalityCurrentOrderController>()
                      .updateOrderData();
                }

                // Teaboy
                if (currentUser?.type == UserType.restaurantWaiter) {
                  Get.find<HomeController>().getAllOrders();
                  Get.find<HomeController>()
                      .getStatusOrders(replace: true, getStatusByIndex: true);
                }
              }
              // Requests
              else if (signalRNotification.notificationType == 27) {
                if (signalRNotification.toUserId == currentUser!.id) {
                  Get.find<HomeController>().getRequests(replace: true);
                  Get.find<CalendarController>().getRequests(replace: true);
                  Get.find<MyRequestsController>().getRequests(replace: true);
                }
              }
            }
          }
        },
      );
    }
  }

  static void startSignalRService() async {
    if (signalR != null && currentUser?.id != null) {
      await signalR!.start();
    }
  }

  static void stopSignalRService() async {
    if (signalR != null && currentUser?.id != null) {
      await signalR!.stop();
    }
  }
}
Editor is loading...
Leave a Comment