Untitled

 avatar
unknown
dart
a year ago
10 kB
4
Indexable
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:takamol_user/app/modules/home/controllers/home_controller.dart';
import 'package:takamol_user/app/modules/hospitality/current_order/bindings/hospitality_current_order_binding.dart';
import 'package:takamol_user/app/modules/hospitality/current_order/views/hospitality_current_order_view.dart';
import 'package:takamol_user/app/modules/hospitality/model/location_model.dart';
import 'package:takamol_user/app/server/models/buildings.dart';
import 'package:takamol_user/app/server/models/floors.dart';
import 'package:takamol_user/app/server/models/restaurants_orders.dart';
import 'package:takamol_user/app/server/models/rooms.dart';
import 'package:takamol_user/app/server/models/users.dart';
import 'package:takamol_user/app/server/server_handlers.dart';
import 'package:takamol_user/app/utils/functions/log.dart';
import 'package:takamol_user/app/widgets/alert_widget.dart';
import 'package:takamol_user/app/widgets/custom_input.dart';
import 'package:takamol_user/app/widgets/toast_widget.dart';
import 'package:takamol_user/main.dart';
import 'package:takamol_user/resources/strings_generated.dart';

import '../../../server/models/request_for_guest_model.dart';

class RequestForGuestController extends GetxController {
  final requestType = [
    RequestTypeModel(
      requestTypeId: 1,
      requestTypeData: 'Food',
    ),
    RequestTypeModel(
      requestTypeId: 2,
      requestTypeData: 'Drinks',
    ),
  ];
  RequestTypeModel? selectedRequestModel;
  Rx<LocationModel>? selectedLocation;
  List<CustomDropDownItem<Room>> roomsMeetingRoom = [];
  // List<CustomDropDownItem<Room>> roomsOffice = [];

  RxBool isFood = false.obs;
  RxBool isDrink = false.obs;
  RxBool isMeetingRoom = false.obs;
  RxBool isOffice = false.obs;

  Building? building;
  Floor? floor;
  String? direction;
  Room? room;
  bool _isLoading = false;
  User? get user => currentUser;

  List<CustomDropDownItem<Building>> buildings = [];
  List<CustomDropDownItem<Floor>> floors = [];
  List<CustomDropDownItem<String>> directions = [];
  List<CustomDropDownItem<Room>> rooms = [];
  List<LocationModel> locationList = [];
  bool gettingBuildings = false,
      gettingFloors = false,
      gettingRooms = false,
      submitting = false;
  Rx<String> selectedRoomId = ''.obs;

  set isLoading(bool value) {
    _isLoading = value;
    update();
  }

  void initLocationList() {
    locationList = [
      LocationModel(
        locationId: 1,
        locationTitle: 'مكتبي',
        locationIcon: 'assets/svgs/icons/office_chair.svg',
        isOffice: true,
        popupTitle: AppStrings.addOfficeData,
      ),
      LocationModel(
        locationId: 2,
        locationTitle: 'غرفة الاجتماعات',
        locationIcon: 'assets/svgs/icons/meeting.svg',
        popupTitle: 'اضافة قاعة الاجتماعات',
      ),
    ];
  }

  @override
  void onReady() {
    initializeBuilding();
    initLocationList();
    super.onReady();
  }

  initializeBuilding() async {
    buildings = [];
    gettingBuildings = true;
    update();
    var response = await server.buildings.get(
      query: UrlQuery(isActive: true, isGetAll: true),
    );
    response.quickPrint();
    if (response.dataErrorsOnlyCheck) {
      for (var building in response.data!) {
        buildings.add(CustomDropDownItem(
          title: building.name,
          value: building,
        ));
      }
    }
    //
    gettingBuildings = false;
    update();
  }

  buildingSetter(Building? value) {
    building = value;

    if (value != null) {
      initializeFloors(buildingId: value.id);
    }
  }

  floorSetter(Floor? value) {
    floor = value;

    directions.addAll([
      CustomDropDownItem(title: 'R', value: 'R'),
      CustomDropDownItem(title: 'L', value: 'L'),
    ]);

    if (value != null) {
      initializeRooms(floorId: value.id ?? '');
    }
  }

  directionSetter(String? value) => direction = value;

  roomNumberSetter(Room? value) => room = value;

  initializeFloors({required String buildingId}) async {
    //... call after getting the buildings
    floors = [];
    gettingFloors = true;
    floor = null;
    update();
    var response = await server.floors.get(
      query: UrlQuery(
        isActive: true,
        buildingId: buildingId,
      ),
    );
    response.quickPrint();
    if (response.dataErrorsOnlyCheck) {
      for (var floor in response.data!) {
        floors.add(CustomDropDownItem(title: floor.name ?? '', value: floor));
      }
    }
    //
    gettingRooms = false;
    update();
  }

  initializeRooms({required String floorId}) async {
    //... call after getting the buildings
    rooms = [];
    gettingRooms = true;
    room = null;
    update();
    var response = await server.rooms.get(
      query: UrlQuery(
        isActive: true,
        floorId: floorId,
      ),
    );
    response.quickPrint();
    if (response.dataErrorsOnlyCheck) {
      for (var room in response.data!) {
        rooms.add(CustomDropDownItem(title: room.name, value: room));
      }
    }
    //
    gettingRooms = false;
    update();
  }

  void initializeRoomsMeeting({required String floorId}) async {
    //... call after getting the buildings
    roomsMeetingRoom = [];
    gettingRooms = true;
    room = null;
    update();
    var response = await server.rooms.get(
      query: UrlQuery(
        isActive: true,
        floorId: floorId,
        roomTypeId: 2,
      ),
    );
    response.quickPrint();
    if (response.dataErrorsOnlyCheck) {
      for (var room in response.data!) {
        roomsMeetingRoom.add(CustomDropDownItem(title: room.name, value: room));
      }
    }
    //
    gettingRooms = false;
    update();
  }

  void submit({
    Building? selectedBuild,
    Room? selectedRoom,
    Floor? selectedFloor,
    String? selectedDirection,
  }) async {
    final locationSelected = locationList.firstWhereOrNull((location) =>
        location.locationId == selectedLocation?.value.locationId);
    locationSelected?.selectedBuild = selectedBuild;
    locationSelected?.selectedRoom = selectedRoom;
    locationSelected?.selectedFloor = selectedFloor;
    locationSelected?.direction = selectedDirection;
    locationSelected?.locationSubTitle =
        '${selectedBuild?.name ?? ''} , ${selectedFloor?.name ?? ''} , ${selectedDirection ?? ''} , ${selectedRoom?.name ?? ''}';
    submitting = true;
    var response = await server.users.updateMe(roomId: room?.id);

    if (response.dataErrorsOnlyCheck) {
      response.quickPrint();
      Get.back();
    } else {
      String e =
          "${AppStrings.somethingWentWrong}\n\n${response.errors.join("\n\n")}";
      CustomAlert.instance.error(Get.context!, subtitleText: e);
      response.quickPrint();
      output(response.errors);
      output(response.dioError);
      output(response.dioError?.response);
    }

    submitting = false;
    update();
  }

  // Future<void> requestForVisitor({int? selectedRequestType}) async {
  //   var response = await server.restaurantsOrders.updateStatus(
  //     status: 1,
  //     id: '2',
  //   );
  // }

  void onUpdateLocation({required LocationModel location}) {
    selectedLocation = location.obs;
    update();
  }

  onChangeFloor({required Floor floor}) {
    directions.clear();
    directions.addAll([
      CustomDropDownItem(title: 'R', value: 'R'),
      CustomDropDownItem(title: 'L', value: 'L'),
    ]);

    initializeRooms(floorId: floor.id ?? '');
    initializeRoomsMeeting(floorId: floor.id ?? '');
  }

  Future requestForVisitor() async {
    if (selectedLocation == null ||
        selectedLocation?.value.selectedRoom == null) {
      ToastWidget().showToast(
        Get.context!,
        message: 'الرجاء اختيار الموقع بلتفصيل',
        type: ToastTypes.error,
      );
      return;
    }

    HapticFeedback.mediumImpact();

    if (_isLoading) return;

    isLoading = true;

    try {
      RestaurantOrder restaurantOrder = RestaurantOrder(
        requesterId: currentUser?.id ?? '',
        requester: currentUser,
        restaurantId: '',
        restaurant: null,
        guestId: '',
        roomId: selectedLocation?.value.selectedRoom?.id,
        buildingId: '',
        floorId: selectedLocation?.value.selectedFloor?.id,
        room: null,
        items: [],
        id: '',
      );

      var response = await RestaurantsOrdersHandler.instance.add(
        restaurantOrder: restaurantOrder,
        onReceiveProgress: (int count, int total) {},
      );

      if (response.dataErrorsOnlyCheck) {
        Get.back();
        if (response.data != null) {
          Get.to(
            () => HospitalityCurrentOrder(),
            binding: HospitalityCurrentOrderBinding(),
            arguments: {
              'restaurantOrder': response.data,
            },
          );
          //Get.find<HomeController>().getLatestOrder();
        }
        // CustomAlert.instance.success(
        //   Get.context!,
        //   subtitleText: AppStrings.yourOrderHasBeenSent,
        //   onWillPop: () async {
        //     Get.back();
        //
        //     return true;
        //   },
        // );

        // reheatOrderSuccessfulBottomSheet(
        //   // reheatItem: ReheatOrderItem(name: AppStrings.food),
        // );
      } else {
        String errorMessage =
            "${AppStrings.checkYourConnection}\n\n${response.errors.join("\n\n")}";
        CustomAlert.instance.error(Get.context!, subtitleText: errorMessage);
      }
    } catch (e) {
      CustomAlert.instance.error(
        Get.context!,
        subtitleText: AppStrings.somethingWentWrong,
      );
    }

    isLoading = false;
  }
}
Editor is loading...
Leave a Comment