// ignore_for_file: constant_identifier_names, unused_import import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart'; import 'package:syncrow_app/features/app_layout/model/space_model.dart'; import 'package:syncrow_app/features/devices/model/device_category_model.dart'; import 'package:syncrow_app/features/devices/model/device_control_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/view/widgets/ACs/acs_view.dart'; import 'package:syncrow_app/features/devices/view/widgets/curtains/curtain_view.dart'; import 'package:syncrow_app/features/devices/view/widgets/gateway/gateway_view.dart'; import 'package:syncrow_app/features/devices/view/widgets/lights/lights_view.dart'; import 'package:syncrow_app/features/devices/view/widgets/three_gang/three_gang_switches.dart'; import 'package:syncrow_app/features/devices/view/widgets/smart_door/door_view.dart'; import 'package:syncrow_app/services/api/devices_api.dart'; import 'package:syncrow_app/services/api/network_exception.dart'; import 'package:syncrow_app/utils/resource_manager/constants.dart'; part 'devices_state.dart'; class DevicesCubit extends Cubit { DevicesCubit() : super(DevicesInitial()) { if (HomeCubit.selectedSpace != null) { fetchGroups(HomeCubit.selectedSpace!.id!); } } bool _isClosed = false; @override Future close() { _isClosed = true; return super.close(); } static DevicesCubit get(context) => BlocProvider.of(context); static List? allCategories; selectCategory(int index) { for (var i = 0; i < allCategories!.length; i++) { if (i == index) { allCategories![i].isSelected = true; } else { allCategories![i].isSelected = false; } } emit(DevicesCategoryChanged()); } unselectAllCategories() { for (var category in allCategories!) { category.isSelected = false; } emit(DevicesCategoryChanged()); } Widget? get chosenCategoryView { if (allCategories != null) { for (var category in allCategories!) { if (category.isSelected) { switch (category.type) { case DeviceType.AC: return const ACsView(); case DeviceType.LightBulb: return const LightsView(); case DeviceType.DoorLock: return const DoorView(); case DeviceType.Curtain: return const CurtainView(); case DeviceType.ThreeGang: return const ThreeGangSwitchesView(); case DeviceType.Gateway: return const GateWayView(); default: return null; } } } } return null; } DevicesCategoryModel? get chosenCategory { for (var category in allCategories!) { if (category.isSelected) { return category; } } return null; } selectDevice(DeviceModel device) { for (var category in allCategories!) { if (category.devices != null) { for (var device in category.devices!) { if (device.isSelected) { category.isSelected = false; emit(DeviceSelected()); return; } } } } device.isSelected = !device.isSelected; emit(DeviceSelected()); } DeviceModel? getSelectedDevice() { for (var category in allCategories!) { if (category.devices != null) { for (var device in category.devices!) { if (device.isSelected) { return device; } } } } return null; } changeCategorySwitchValue(DevicesCategoryModel category) { if (category.devicesStatus != null) { category.devicesStatus = !category.devicesStatus!; if (category.devices != null) { for (var device in category.devices!) { device.isOnline = category.devicesStatus; } } } else { category.devicesStatus = true; if (category.devices != null) { for (var device in category.devices!) { device.isOnline = true; } } } updateDevicesStatus(category); emit(CategorySwitchChanged()); } turnOnOffDevice(DeviceModel device) { device.isOnline = !device.isOnline!; DevicesCategoryModel category = allCategories!.firstWhere((category) { if (category.devices != null) { return category.devices!.contains(device); } else { return false; } }); updateDevicesStatus(category); emit(DeviceSwitchChanged()); } updateDevicesStatus(DevicesCategoryModel category) { if (category.devices != null) { if (category.devices!.isNotEmpty) { bool? tempStatus = category.devices![0].isOnline; for (var ac in category.devices!) { //check if there any ac have a different status than the initial ==> turn off the universal switch if (ac.isOnline != tempStatus) { category.devicesStatus = null; emit(DeviceSwitchChanged()); return; } category.devicesStatus = tempStatus; emit(DeviceSwitchChanged()); } } else { category.devicesStatus = null; emit(DeviceSwitchChanged()); } } } turnAllDevicesOff(DevicesCategoryModel category) { if (category.devices != null) { if (category.devices!.isNotEmpty) { for (var device in category.devices!) { device.isOnline = false; } changeCategorySwitchValue(category); updateDevicesStatus(category); emit(CategorySwitchChanged()); } } } turnAllDevicesOn(DevicesCategoryModel category) { if (category.devices != null) { if (category.devices!.isNotEmpty) { for (var device in category.devices!) { device.isOnline = true; } changeCategorySwitchValue(category); updateDevicesStatus(category); emit(CategorySwitchChanged()); } } } areAllDevicesOff(DevicesCategoryModel category) { if (category.devices != null) { for (var device in category.devices!) { if (device.isOnline ?? false) { category.devicesStatus = false; emit(CategorySwitchChanged()); return; } } } } clearCategoriesSelection(BuildContext context) { for (var category in allCategories!) { category.isSelected = false; if (category.devices != null) { for (var device in category.devices!) { device.isSelected = false; } } } Navigator.popUntil(context, (route) => route.isFirst); emit(DevicesCategoryChanged()); } deviceControl(DeviceControlModel control) async { emit(DeviceControlLoading()); try { await DevicesAPI.controlDevice(control); emit(DeviceControlSuccess()); } on DioException catch (e) { emit(DeviceControlError(ServerFailure.fromDioError(e).errMessage)); } } fetchGroups(int spaceId) async { if (_isClosed) return; try { emit(DevicesCategoriesLoading()); allCategories = await DevicesAPI.fetchGroups(spaceId); emit(DevicesCategoriesSuccess()); } on DioException catch (error) { emit( DevicesCategoriesError(ServerFailure.fromDioError(error).errMessage), ); } } ///Lights onHorizontalDragUpdate(DeviceModel light, double dx, double screenWidth) { double newBrightness = (dx / (screenWidth - 15) * 100); if (newBrightness > 100) { newBrightness = 100; } else if (newBrightness < 0) { newBrightness = 0; } // setBrightness(light, newBrightness); } Map lightModes = { 0: LightMode.Doze, 1: LightMode.Relax, 2: LightMode.Reading, 3: LightMode.Energizing, }; // setLightingMode(DeviceModel light, LightMode mode) { // light.lightingMode = // lightModes.entries.firstWhere((element) => element.value == mode).key; // emit(LightModeChanged(mode)); // } // // toggleLight(DeviceModel light) { // light.isOnline != null ? light.isOnline = !light.isOnline! : light.isOnline = true; // emit(LightToggled(light)); // } // // setColor(DeviceModel light, int color) { // light.color = color; // emit(LightColorChanged(color)); // } // // int getBrightness(DeviceModel light) { // return light.brightness.toInt(); // } // setBrightness(DeviceModel light, double value) { // value = (value / 5).ceil() * 5; // if (value != light.brightness) { // light.brightness = value; // emit(LightBrightnessChanged(value)); // } // } } enum LightMode { Doze, Relax, Reading, Energizing, }