Files
syncrow-app/lib/features/devices/bloc/devices_cubit.dart
2024-03-14 00:38:00 +03:00

399 lines
10 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/model/ac_model.dart';
import 'package:syncrow_app/features/devices/model/curtain_model.dart';
import 'package:syncrow_app/features/devices/model/device_category_model.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/light_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/lights_switches/light_switches.dart';
import 'package:syncrow_app/features/devices/view/widgets/smart_door/door_view.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/constants.dart';
part 'devices_state.dart';
class DevicesCubit extends Cubit<DevicesState> {
DevicesCubit() : super(DevicesInitial());
static DevicesCubit get(context) => BlocProvider.of(context);
static List<DevicesCategoryModel> allCategories = [
DevicesCategoryModel(
devices: [
ACModel(
name: "Living Room AC",
id: 0,
functions: [],
status: false,
temperature: 20,
fanSpeed: 0,
tempMode: 0,
coolTo: 20,
type: DeviceType.AC,
image: '',
timer: null,
bounds: Bounds(
min: 20,
max: 30,
),
),
ACModel(
name: "Master Bedroom AC",
id: 1,
functions: [],
status: false,
temperature: 20,
fanSpeed: 0,
tempMode: 0,
coolTo: 20,
type: DeviceType.AC,
image: '',
timer: null,
bounds: Bounds(
min: 20,
max: 30,
),
),
ACModel(
name: "Kitchen AC",
id: 2,
functions: [],
status: false,
temperature: 20,
fanSpeed: 0,
tempMode: 0,
coolTo: 20,
type: DeviceType.AC,
image: '',
timer: null,
bounds: Bounds(
min: 20,
max: 30,
),
),
ACModel(
name: "Bathroom AC",
id: 3,
functions: [],
status: false,
temperature: 20,
fanSpeed: 0,
tempMode: 0,
coolTo: 20,
type: DeviceType.AC,
image: '',
timer: null,
bounds: Bounds(
min: 20,
max: 30,
),
),
],
icon: Assets.iconsAC,
name: 'ACs',
type: DeviceType.AC,
page: const ACsView(),
),
DevicesCategoryModel(
devices: [
LightModel(
name: "Living Room Light",
id: 0,
functions: [],
status: false,
color: 0,
brightness: 20,
lightingMode: 1,
timer: null,
type: DeviceType.Lights,
image: '',
recentColors: [
0xFF83D9FF,
0xFFFC3E81,
0xFFC0FF66,
0xFFFDC242,
],
),
LightModel(
name: "Master Bedroom Light",
id: 1,
functions: [],
status: false,
color: 2,
brightness: 40,
lightingMode: 1,
timer: null,
type: DeviceType.Lights,
image: '',
recentColors: [
0xFF83D9FF,
0xFFFC3E81,
0xFFC0FF66,
0xFFFDC242,
],
),
LightModel(
name: "Kitchen Light",
id: 2,
functions: [],
status: false,
color: 1,
brightness: 60,
lightingMode: 1,
timer: null,
type: DeviceType.Lights,
image: '',
recentColors: [
0xFF83D9FF,
0xFFFC3E81,
0xFFC0FF66,
0xFFFDC242,
],
),
LightModel(
name: "Bathroom Light",
id: 3,
functions: [],
status: false,
color: 3,
brightness: 80,
lightingMode: 1,
timer: null,
type: DeviceType.Lights,
image: '',
recentColors: [
0xFF83D9FF,
0xFFFC3E81,
0xFFC0FF66,
0xFFFDC242,
],
),
LightModel(
name: "Balcony Light",
id: 4,
functions: [],
status: false,
color: 4,
brightness: 100,
lightingMode: 1,
timer: null,
type: DeviceType.Lights,
image: '',
recentColors: [
0xFF83D9FF,
0xFFFC3E81,
0xFFC0FF66,
0xFFFDC242,
],
),
],
icon: Assets.iconsLight,
name: 'Lights',
type: DeviceType.Lights,
page: const LightsView(),
),
DevicesCategoryModel(
devices: [],
icon: Assets.iconsDoorLock,
name: 'Doors',
type: DeviceType.Door,
page: const DoorView(),
),
DevicesCategoryModel(
devices: [
CurtainModel(
openPercentage: 10,
id: 1,
functions: [],
name: "Living Room Curtain",
status: false,
type: DeviceType.Curtain,
image: '',
timer: null,
),
CurtainModel(
openPercentage: 20,
id: 2,
functions: [],
name: "Master Bedroom Curtain",
status: false,
type: DeviceType.Curtain,
image: '',
timer: null,
),
],
icon: Assets.iconsCurtain,
name: 'Curtains',
type: DeviceType.Curtain,
page: const CurtainView(),
),
DevicesCategoryModel(
devices: [],
icon: Assets.icons3GangSwitch,
name: 'Bedroom Lights',
type: DeviceType.ThreeGang,
page: const LightSwitchesView(),
),
DevicesCategoryModel(
devices: [],
icon: Assets.iconsGateway,
name: 'Gateway',
type: DeviceType.Gateway,
page: const GateWayView(),
),
];
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 {
for (var category in allCategories) {
if (category.isSelected) {
return category.page;
}
}
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) {
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) {
for (var device in category.devices) {
if (device.isSelected) {
return device;
}
}
}
return null;
}
changeCategorySwitchValue(DevicesCategoryModel category) {
if (category.devicesStatus != null) {
category.devicesStatus = !category.devicesStatus!;
for (var device in category.devices) {
device.status = category.devicesStatus;
}
} else {
category.devicesStatus = true;
for (var device in category.devices) {
device.status = true;
}
}
updateDevicesStatus(category);
emit(CategorySwitchChanged());
}
turnOnOffDevice(DeviceModel device) {
device.status = !device.status!;
DevicesCategoryModel category = allCategories
.firstWhere((category) => category.devices.contains(device));
updateDevicesStatus(category);
emit(DeviceSwitchChanged());
}
updateDevicesStatus(DevicesCategoryModel category) {
if (category.devices.isNotEmpty) {
bool? tempStatus = category.devices[0].status;
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.status != tempStatus) {
category.devicesStatus = null;
emit(DeviceSwitchChanged());
return;
}
category.devicesStatus = tempStatus;
emit(DeviceSwitchChanged());
}
} else {
category.devicesStatus = null;
emit(DeviceSwitchChanged());
}
}
turnAllDevicesOff(DevicesCategoryModel category) {
if (category.devices.isNotEmpty) {
for (var device in category.devices) {
device.status = false;
}
changeCategorySwitchValue(category);
updateDevicesStatus(category);
emit(CategorySwitchChanged());
}
}
turnAllDevicesOn(DevicesCategoryModel category) {
if (category.devices.isNotEmpty) {
for (var device in category.devices) {
device.status = true;
}
changeCategorySwitchValue(category);
updateDevicesStatus(category);
emit(CategorySwitchChanged());
}
}
areAllDevicesOff(DevicesCategoryModel category) {
for (var device in category.devices) {
if (device.status ?? false) {
category.devicesStatus = false;
emit(CategorySwitchChanged());
return;
}
}
}
clearCategoriesSelection(BuildContext context) {
for (var category in allCategories) {
category.isSelected = false;
for (var device in category.devices) {
device.isSelected = false;
}
}
Navigator.popUntil(context, (route) => route.isFirst);
emit(DevicesCategoryChanged());
}
}