mirror of
https://github.com/SyncrowIOT/syncrow-app.git
synced 2025-07-15 09:45:22 +00:00
Refactor device status handling and update UI components
- Update device status handling from 'status' to 'isOnline' for consistency - Remove unused imports and redundant code related to light switches - Refactor UI components to use 'isOnline' instead of 'status' for device status
This commit is contained in:
@ -1,5 +1,8 @@
|
|||||||
|
import 'dart:ffi';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.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/bloc/home_cubit.dart';
|
||||||
@ -7,7 +10,9 @@ import 'package:syncrow_app/features/app_layout/view/widgets/app_body.dart';
|
|||||||
import 'package:syncrow_app/features/app_layout/view/widgets/default_app_bar.dart';
|
import 'package:syncrow_app/features/app_layout/view/widgets/default_app_bar.dart';
|
||||||
import 'package:syncrow_app/features/app_layout/view/widgets/default_nav_bar.dart';
|
import 'package:syncrow_app/features/app_layout/view/widgets/default_nav_bar.dart';
|
||||||
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/view/widgets/three_gang/three_gang_switches.dart';
|
||||||
import 'package:syncrow_app/navigation/routing_constants.dart';
|
import 'package:syncrow_app/navigation/routing_constants.dart';
|
||||||
|
import 'package:syncrow_app/utils/helpers/custom_page_route.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||||
|
|
||||||
class AppLayout extends StatelessWidget {
|
class AppLayout extends StatelessWidget {
|
||||||
@ -53,6 +58,18 @@ class AppLayout extends StatelessWidget {
|
|||||||
appBar: DefaultAppBar(),
|
appBar: DefaultAppBar(),
|
||||||
body: AppBody(),
|
body: AppBody(),
|
||||||
bottomNavigationBar: DefaultNavBar(),
|
bottomNavigationBar: DefaultNavBar(),
|
||||||
|
// floatingActionButton: FloatingActionButton(
|
||||||
|
// onPressed: () {
|
||||||
|
// Navigator.push(
|
||||||
|
// context,
|
||||||
|
// CustomPageRoute(
|
||||||
|
// builder: (context) =>
|
||||||
|
// const ThreeGangSwitchesView(),
|
||||||
|
// ),
|
||||||
|
// );
|
||||||
|
// },
|
||||||
|
// child: const Icon(Icons.arrow_forward_ios_sharp),
|
||||||
|
// ),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -12,7 +12,7 @@ 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/curtains/curtain_view.dart';
|
||||||
import 'package:syncrow_app/features/devices/view/widgets/gateway/gateway_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/lights_view.dart';
|
||||||
import 'package:syncrow_app/features/devices/view/widgets/lights_switches/light_switches.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/features/devices/view/widgets/smart_door/door_view.dart';
|
||||||
import 'package:syncrow_app/services/api/devices_api.dart';
|
import 'package:syncrow_app/services/api/devices_api.dart';
|
||||||
import 'package:syncrow_app/services/api/network_exception.dart';
|
import 'package:syncrow_app/services/api/network_exception.dart';
|
||||||
@ -63,14 +63,14 @@ class DevicesCubit extends Cubit<DevicesState> {
|
|||||||
switch (category.type) {
|
switch (category.type) {
|
||||||
case DeviceType.AC:
|
case DeviceType.AC:
|
||||||
return const ACsView();
|
return const ACsView();
|
||||||
case DeviceType.Lights:
|
case DeviceType.LightBulb:
|
||||||
return const LightsView();
|
return const LightsView();
|
||||||
case DeviceType.DoorLock:
|
case DeviceType.DoorLock:
|
||||||
return const DoorView();
|
return const DoorView();
|
||||||
case DeviceType.Curtain:
|
case DeviceType.Curtain:
|
||||||
return const CurtainView();
|
return const CurtainView();
|
||||||
case DeviceType.ThreeGang:
|
case DeviceType.ThreeGang:
|
||||||
return const LightSwitchesView();
|
return const ThreeGangSwitchesView();
|
||||||
case DeviceType.Gateway:
|
case DeviceType.Gateway:
|
||||||
return const GateWayView();
|
return const GateWayView();
|
||||||
default:
|
default:
|
||||||
@ -125,14 +125,14 @@ class DevicesCubit extends Cubit<DevicesState> {
|
|||||||
category.devicesStatus = !category.devicesStatus!;
|
category.devicesStatus = !category.devicesStatus!;
|
||||||
if (category.devices != null) {
|
if (category.devices != null) {
|
||||||
for (var device in category.devices!) {
|
for (var device in category.devices!) {
|
||||||
device.status = category.devicesStatus;
|
device.isOnline = category.devicesStatus;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
category.devicesStatus = true;
|
category.devicesStatus = true;
|
||||||
if (category.devices != null) {
|
if (category.devices != null) {
|
||||||
for (var device in category.devices!) {
|
for (var device in category.devices!) {
|
||||||
device.status = true;
|
device.isOnline = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,7 +142,7 @@ class DevicesCubit extends Cubit<DevicesState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
turnOnOffDevice(DeviceModel device) {
|
turnOnOffDevice(DeviceModel device) {
|
||||||
device.status = !device.status!;
|
device.isOnline = !device.isOnline!;
|
||||||
DevicesCategoryModel category = allCategories!.firstWhere((category) {
|
DevicesCategoryModel category = allCategories!.firstWhere((category) {
|
||||||
if (category.devices != null) {
|
if (category.devices != null) {
|
||||||
return category.devices!.contains(device);
|
return category.devices!.contains(device);
|
||||||
@ -157,10 +157,10 @@ class DevicesCubit extends Cubit<DevicesState> {
|
|||||||
updateDevicesStatus(DevicesCategoryModel category) {
|
updateDevicesStatus(DevicesCategoryModel category) {
|
||||||
if (category.devices != null) {
|
if (category.devices != null) {
|
||||||
if (category.devices!.isNotEmpty) {
|
if (category.devices!.isNotEmpty) {
|
||||||
bool? tempStatus = category.devices![0].status;
|
bool? tempStatus = category.devices![0].isOnline;
|
||||||
for (var ac in category.devices!) {
|
for (var ac in category.devices!) {
|
||||||
//check if there any ac have a different status than the initial ==> turn off the universal switch
|
//check if there any ac have a different status than the initial ==> turn off the universal switch
|
||||||
if (ac.status != tempStatus) {
|
if (ac.isOnline != tempStatus) {
|
||||||
category.devicesStatus = null;
|
category.devicesStatus = null;
|
||||||
emit(DeviceSwitchChanged());
|
emit(DeviceSwitchChanged());
|
||||||
return;
|
return;
|
||||||
@ -179,7 +179,7 @@ class DevicesCubit extends Cubit<DevicesState> {
|
|||||||
if (category.devices != null) {
|
if (category.devices != null) {
|
||||||
if (category.devices!.isNotEmpty) {
|
if (category.devices!.isNotEmpty) {
|
||||||
for (var device in category.devices!) {
|
for (var device in category.devices!) {
|
||||||
device.status = false;
|
device.isOnline = false;
|
||||||
}
|
}
|
||||||
changeCategorySwitchValue(category);
|
changeCategorySwitchValue(category);
|
||||||
updateDevicesStatus(category);
|
updateDevicesStatus(category);
|
||||||
@ -192,7 +192,7 @@ class DevicesCubit extends Cubit<DevicesState> {
|
|||||||
if (category.devices != null) {
|
if (category.devices != null) {
|
||||||
if (category.devices!.isNotEmpty) {
|
if (category.devices!.isNotEmpty) {
|
||||||
for (var device in category.devices!) {
|
for (var device in category.devices!) {
|
||||||
device.status = true;
|
device.isOnline = true;
|
||||||
}
|
}
|
||||||
changeCategorySwitchValue(category);
|
changeCategorySwitchValue(category);
|
||||||
updateDevicesStatus(category);
|
updateDevicesStatus(category);
|
||||||
@ -204,7 +204,7 @@ class DevicesCubit extends Cubit<DevicesState> {
|
|||||||
areAllDevicesOff(DevicesCategoryModel category) {
|
areAllDevicesOff(DevicesCategoryModel category) {
|
||||||
if (category.devices != null) {
|
if (category.devices != null) {
|
||||||
for (var device in category.devices!) {
|
for (var device in category.devices!) {
|
||||||
if (device.status ?? false) {
|
if (device.isOnline ?? false) {
|
||||||
category.devicesStatus = false;
|
category.devicesStatus = false;
|
||||||
emit(CategorySwitchChanged());
|
emit(CategorySwitchChanged());
|
||||||
return;
|
return;
|
||||||
@ -276,7 +276,7 @@ class DevicesCubit extends Cubit<DevicesState> {
|
|||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// toggleLight(DeviceModel light) {
|
// toggleLight(DeviceModel light) {
|
||||||
// light.status != null ? light.status = !light.status! : light.status = true;
|
// light.isOnline != null ? light.isOnline = !light.isOnline! : light.isOnline = true;
|
||||||
// emit(LightToggled(light));
|
// emit(LightToggled(light));
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
@ -296,45 +296,6 @@ class DevicesCubit extends Cubit<DevicesState> {
|
|||||||
// emit(LightBrightnessChanged(value));
|
// emit(LightBrightnessChanged(value));
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
///ACs
|
|
||||||
// DeviceModel? getSelectedAC() {
|
|
||||||
// for (var ac in category.devices) {
|
|
||||||
// if (ac is DeviceModel && ac.isSelected) {
|
|
||||||
// return ac;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// void setTempToAll(double temperature) {
|
|
||||||
// for (DeviceModel ac in category.devices) {
|
|
||||||
// if (ac is DeviceModel) {
|
|
||||||
// if (ac.temperature != temperature &&
|
|
||||||
// ac.bounds.min <= temperature &&
|
|
||||||
// temperature <= ac.bounds.max) {
|
|
||||||
// setACTemp(ac, temperature);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// universalACTemp = temperature;
|
|
||||||
// emit(ACsTempChanged(temperature));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// void setACTemp(DeviceModel model, double temp) {
|
|
||||||
// if (model.bounds.min <= temp && temp <= model.bounds.max) {
|
|
||||||
// model.temperature = temp;
|
|
||||||
// }
|
|
||||||
// emit(ACsTempChanged(temp));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// double getTemp(int index) {
|
|
||||||
// var device = category.devices[index];
|
|
||||||
// if (device is DeviceModel) {
|
|
||||||
// return device.temperature;
|
|
||||||
// }
|
|
||||||
// return 0.0; // or any default value you prefer
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum LightMode {
|
enum LightMode {
|
||||||
|
@ -24,9 +24,9 @@ class DevicesCategoryModel {
|
|||||||
//sets the initial status of the devices
|
//sets the initial status of the devices
|
||||||
if (devices != null) {
|
if (devices != null) {
|
||||||
if (devices!.isNotEmpty) {
|
if (devices!.isNotEmpty) {
|
||||||
bool tempStatus = devices!.first.status ?? false;
|
bool tempStatus = devices!.first.isOnline ?? false;
|
||||||
for (var device in devices!) {
|
for (var device in devices!) {
|
||||||
if (device.status != tempStatus) {
|
if (device.isOnline != tempStatus) {
|
||||||
devicesStatus = false;
|
devicesStatus = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -41,9 +41,9 @@ class DevicesCategoryModel {
|
|||||||
DevicesCategoryModel.fromJson(Map<String, dynamic> json)
|
DevicesCategoryModel.fromJson(Map<String, dynamic> json)
|
||||||
: name = json['groupName'],
|
: name = json['groupName'],
|
||||||
id = json['groupId'],
|
id = json['groupId'],
|
||||||
type = deviceTypeMap[json['groupName']] ?? DeviceType.Other,
|
type = devicesTypesMap[json['productType']] ?? DeviceType.Other,
|
||||||
icon = deviceTypeIconMap[
|
icon = deviceTypeIconMap[
|
||||||
deviceTypeMap[json['groupName']] ?? DeviceType.Other] ??
|
devicesTypesMap[json['productType']] ?? DeviceType.Other] ??
|
||||||
'',
|
'',
|
||||||
devices = [],
|
devices = [],
|
||||||
isSelected = false;
|
isSelected = false;
|
||||||
@ -53,22 +53,14 @@ class DevicesCategoryModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, DeviceType> deviceTypeMap = {
|
|
||||||
'Ceiling Presence Sensors': DeviceType.Sensors,
|
|
||||||
'Wall presence sensor': DeviceType.Sensors,
|
|
||||||
'Door Locks': DeviceType.DoorLock,
|
|
||||||
'Gateways': DeviceType.Gateway,
|
|
||||||
'ACs': DeviceType.AC,
|
|
||||||
'3Gang': DeviceType.Gang,
|
|
||||||
};
|
|
||||||
|
|
||||||
Map<DeviceType, String> deviceTypeIconMap = {
|
Map<DeviceType, String> deviceTypeIconMap = {
|
||||||
DeviceType.AC: Assets.iconsAC,
|
DeviceType.AC: Assets.iconsAC,
|
||||||
DeviceType.Lights: Assets.iconsLight,
|
DeviceType.LightBulb: Assets.iconsLight,
|
||||||
DeviceType.DoorLock: Assets.iconsDoorLock,
|
DeviceType.DoorLock: Assets.iconsDoorLock,
|
||||||
DeviceType.Curtain: Assets.iconsCurtain,
|
DeviceType.Curtain: Assets.iconsCurtain,
|
||||||
DeviceType.Gateway: Assets.iconsGateway,
|
DeviceType.Gateway: Assets.iconsGateway,
|
||||||
DeviceType.Sensors: Assets.iconsSensors,
|
DeviceType.CeilingSensor: Assets.iconsSensors,
|
||||||
DeviceType.Gang: Assets.iconsGang,
|
DeviceType.WallSensor: Assets.iconsSensors,
|
||||||
|
DeviceType.ThreeGang: Assets.iconsGang,
|
||||||
DeviceType.Other: Assets.iconsAC,
|
DeviceType.Other: Assets.iconsAC,
|
||||||
};
|
};
|
||||||
|
@ -1,46 +1,116 @@
|
|||||||
import 'package:syncrow_app/features/devices/model/function_model.dart';
|
import 'package:syncrow_app/features/devices/model/function_model.dart';
|
||||||
import 'package:syncrow_app/generated/assets.dart';
|
|
||||||
import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
||||||
|
|
||||||
class DeviceModel {
|
class DeviceModel {
|
||||||
final int? id;
|
int? activeTime;
|
||||||
final String? name;
|
String? category;
|
||||||
final DeviceType? type;
|
String? categoryName;
|
||||||
bool? status;
|
int? createTime;
|
||||||
final String? image;
|
String? gatewayId;
|
||||||
final double? timer;
|
String? icon;
|
||||||
late final String icon;
|
String? id;
|
||||||
|
String? ip;
|
||||||
|
double? lat;
|
||||||
|
String? localKey;
|
||||||
|
double? lon;
|
||||||
|
String? model;
|
||||||
|
String? name;
|
||||||
|
String? nodeId; //rmeove
|
||||||
|
bool? isOnline;
|
||||||
|
String? ownerId; //remove
|
||||||
|
String? productId; //remove
|
||||||
|
String? productName;
|
||||||
|
bool? isSub;
|
||||||
|
String? timeZone;
|
||||||
|
int? updateTime;
|
||||||
|
String? uuid;
|
||||||
|
DeviceType? productType;
|
||||||
bool isSelected = false;
|
bool isSelected = false;
|
||||||
|
|
||||||
late List<FunctionModel> functions;
|
late List<FunctionModel> functions;
|
||||||
|
|
||||||
DeviceModel({
|
DeviceModel({
|
||||||
required this.id,
|
this.activeTime,
|
||||||
required this.name,
|
this.category,
|
||||||
required this.type,
|
this.categoryName,
|
||||||
required this.status,
|
this.createTime,
|
||||||
required this.image,
|
this.gatewayId,
|
||||||
required this.timer,
|
this.icon,
|
||||||
required this.functions,
|
this.id,
|
||||||
|
this.ip,
|
||||||
|
this.lat,
|
||||||
|
this.localKey,
|
||||||
|
this.lon,
|
||||||
|
this.model,
|
||||||
|
this.name,
|
||||||
|
this.nodeId,
|
||||||
|
this.isOnline,
|
||||||
|
this.ownerId,
|
||||||
|
this.productId,
|
||||||
|
this.productName,
|
||||||
|
this.isSub,
|
||||||
|
this.timeZone,
|
||||||
|
this.updateTime,
|
||||||
|
this.uuid,
|
||||||
|
this.productType,
|
||||||
}) {
|
}) {
|
||||||
switch (type) {
|
functions = getFunctions(productType!);
|
||||||
case DeviceType.AC:
|
|
||||||
icon = Assets.iconsAC;
|
|
||||||
break;
|
|
||||||
case DeviceType.Lights:
|
|
||||||
icon = Assets.iconsLight;
|
|
||||||
break;
|
|
||||||
case DeviceType.DoorLock:
|
|
||||||
icon = Assets.iconsDoorLock;
|
|
||||||
break;
|
|
||||||
case DeviceType.Curtain:
|
|
||||||
icon = Assets.iconsCurtain;
|
|
||||||
break;
|
|
||||||
case DeviceType.Gateway:
|
|
||||||
icon = Assets.iconsGateway;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
icon = '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
factory DeviceModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
return DeviceModel(
|
||||||
|
activeTime: json['activeTime'],
|
||||||
|
category: json['category'],
|
||||||
|
categoryName: json['categoryName'],
|
||||||
|
createTime: json['createTime'],
|
||||||
|
gatewayId: json['gatewayId'],
|
||||||
|
icon: json['icon'],
|
||||||
|
id: json['id'],
|
||||||
|
ip: json['ip'],
|
||||||
|
lat: double.tryParse(json['lat']),
|
||||||
|
localKey: json['localKey'],
|
||||||
|
lon: double.tryParse(json['lon']),
|
||||||
|
model: json['model'],
|
||||||
|
name: json['name'],
|
||||||
|
nodeId: json['nodeId'],
|
||||||
|
isOnline: json['online'],
|
||||||
|
ownerId: json['ownerId'],
|
||||||
|
productId: json['productId'],
|
||||||
|
productName: json['productName'],
|
||||||
|
isSub: json['sub'],
|
||||||
|
timeZone: json['timeZone'],
|
||||||
|
updateTime: json['updateTime'],
|
||||||
|
uuid: json['uuid'],
|
||||||
|
productType: devicesTypesMap[json['productName']] ?? DeviceType.Other,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return {
|
||||||
|
'activeTime': activeTime,
|
||||||
|
'category': category,
|
||||||
|
'categoryName': categoryName,
|
||||||
|
'createTime': createTime,
|
||||||
|
'gatewayId': gatewayId,
|
||||||
|
'icon': icon,
|
||||||
|
'id': id,
|
||||||
|
'ip': ip,
|
||||||
|
'lat': lat,
|
||||||
|
'localKey': localKey,
|
||||||
|
'lon': lon,
|
||||||
|
'model': model,
|
||||||
|
'name': name,
|
||||||
|
'nodeId': nodeId,
|
||||||
|
'online': isOnline,
|
||||||
|
'ownerId': ownerId,
|
||||||
|
'productId': productId,
|
||||||
|
'productName': productName,
|
||||||
|
'sub': isSub,
|
||||||
|
'timeZone': timeZone,
|
||||||
|
'updateTime': updateTime,
|
||||||
|
'uuid': uuid,
|
||||||
|
'productType': productType,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
List<FunctionModel> getFunctions(DeviceType type) =>
|
||||||
|
devicesFunctionsMap[productType] ?? [];
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,10 @@
|
|||||||
//{
|
|
||||||
// "code": "switch_1",
|
|
||||||
// "desc": "switch 1",
|
|
||||||
// "name": "switch 1",
|
|
||||||
// "type": "Boolean",
|
|
||||||
// "values": "{}"
|
|
||||||
// }
|
|
||||||
class FunctionModel {
|
class FunctionModel {
|
||||||
String? code;
|
String? code;
|
||||||
String? desc;
|
|
||||||
String? name;
|
|
||||||
String? type;
|
String? type;
|
||||||
String? values;
|
String? values;
|
||||||
|
|
||||||
FunctionModel({
|
FunctionModel({
|
||||||
required this.code,
|
required this.code,
|
||||||
required this.desc,
|
|
||||||
required this.name,
|
|
||||||
required this.type,
|
required this.type,
|
||||||
required this.values,
|
required this.values,
|
||||||
});
|
});
|
||||||
@ -23,8 +12,6 @@ class FunctionModel {
|
|||||||
factory FunctionModel.fromJson(Map<String, dynamic> json) {
|
factory FunctionModel.fromJson(Map<String, dynamic> json) {
|
||||||
return FunctionModel(
|
return FunctionModel(
|
||||||
code: json['code'],
|
code: json['code'],
|
||||||
desc: json['desc'],
|
|
||||||
name: json['name'],
|
|
||||||
type: json['type'],
|
type: json['type'],
|
||||||
values: json['values'],
|
values: json['values'],
|
||||||
);
|
);
|
||||||
@ -33,8 +20,6 @@ class FunctionModel {
|
|||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
return {
|
return {
|
||||||
'code': code,
|
'code': code,
|
||||||
'desc': desc,
|
|
||||||
'name': name,
|
|
||||||
'type': type,
|
'type': type,
|
||||||
'values': values,
|
'values': values,
|
||||||
};
|
};
|
||||||
|
@ -28,7 +28,7 @@ class LightInterfaceSwitch extends StatelessWidget {
|
|||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
BodyLarge(
|
BodyLarge(
|
||||||
text: light.status ?? false
|
text: light.isOnline ?? false
|
||||||
? StringsManager.on
|
? StringsManager.on
|
||||||
: StringsManager.off,
|
: StringsManager.off,
|
||||||
style:
|
style:
|
||||||
@ -37,7 +37,7 @@ class LightInterfaceSwitch extends StatelessWidget {
|
|||||||
Container(
|
Container(
|
||||||
width: 35,
|
width: 35,
|
||||||
decoration: ShapeDecoration(
|
decoration: ShapeDecoration(
|
||||||
color: light.status ?? false
|
color: light.isOnline ?? false
|
||||||
? ColorsManager.primaryColorWithOpacity
|
? ColorsManager.primaryColorWithOpacity
|
||||||
: Colors.grey,
|
: Colors.grey,
|
||||||
shape: const CircleBorder(),
|
shape: const CircleBorder(),
|
||||||
|
@ -1,71 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
||||||
import 'package:flutter_svg/svg.dart';
|
|
||||||
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
|
||||||
import 'package:syncrow_app/features/devices/model/device_control_model.dart';
|
|
||||||
import 'package:syncrow_app/generated/assets.dart';
|
|
||||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
|
||||||
|
|
||||||
class LightSwitch extends StatelessWidget {
|
|
||||||
const LightSwitch({
|
|
||||||
super.key,
|
|
||||||
required this.control,
|
|
||||||
});
|
|
||||||
|
|
||||||
final DeviceControlModel control;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return BlocBuilder<DevicesCubit, DevicesState>(
|
|
||||||
builder: (context, state) {
|
|
||||||
return state is DeviceControlLoading
|
|
||||||
? const CircularProgressIndicator()
|
|
||||||
: InkWell(
|
|
||||||
overlayColor: MaterialStateProperty.all(Colors.transparent),
|
|
||||||
onTap: () {
|
|
||||||
DevicesCubit.get(context)
|
|
||||||
.deviceControl(control)
|
|
||||||
.then((value) {
|
|
||||||
print('Device control response: $value');
|
|
||||||
if (control.value ?? true) {
|
|
||||||
control.value = false;
|
|
||||||
} else {
|
|
||||||
control.value = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: Stack(
|
|
||||||
alignment: !control.value!
|
|
||||||
? Alignment.topCenter
|
|
||||||
: Alignment.bottomCenter,
|
|
||||||
children: [
|
|
||||||
Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius:
|
|
||||||
const BorderRadius.all(Radius.circular(100.0)),
|
|
||||||
color: !control.value!
|
|
||||||
? ColorsManager.primaryColorWithOpacity
|
|
||||||
: ColorsManager.switchOffColor,
|
|
||||||
),
|
|
||||||
width: 60,
|
|
||||||
height: 115,
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.all(5.0),
|
|
||||||
child: SizedBox.square(
|
|
||||||
dimension: 60,
|
|
||||||
child: SvgPicture.asset(
|
|
||||||
!control.value!
|
|
||||||
? Assets.iconsLightSwitchOn
|
|
||||||
: Assets.iconsLightSwitchOff,
|
|
||||||
fit: BoxFit.fill,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,87 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
||||||
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
|
|
||||||
|
|
||||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
|
||||||
import 'package:syncrow_app/features/devices/model/function_model.dart';
|
|
||||||
import 'package:syncrow_app/features/devices/view/widgets/ACs/category_view_app_bar.dart';
|
|
||||||
import 'package:syncrow_app/features/devices/view/widgets/lights_switches/light_switches_body.dart';
|
|
||||||
import 'package:syncrow_app/generated/assets.dart';
|
|
||||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
|
||||||
import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
|
||||||
|
|
||||||
class LightSwitchesView extends StatelessWidget {
|
|
||||||
const LightSwitchesView({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return AnnotatedRegion(
|
|
||||||
value: SystemUiOverlayStyle(
|
|
||||||
statusBarColor: ColorsManager.primaryColor.withOpacity(0.5),
|
|
||||||
statusBarIconBrightness: Brightness.light,
|
|
||||||
),
|
|
||||||
child: SafeArea(
|
|
||||||
child: Scaffold(
|
|
||||||
backgroundColor: ColorsManager.backgroundColor,
|
|
||||||
extendBodyBehindAppBar: true,
|
|
||||||
extendBody: true,
|
|
||||||
appBar: const CategoryViewAppBar(),
|
|
||||||
body: BlocBuilder<HomeCubit, HomeState>(
|
|
||||||
builder: (context, state) {
|
|
||||||
return Container(
|
|
||||||
width: MediaQuery.sizeOf(context).width,
|
|
||||||
height: MediaQuery.sizeOf(context).height,
|
|
||||||
decoration: const BoxDecoration(
|
|
||||||
image: DecorationImage(
|
|
||||||
image: AssetImage(
|
|
||||||
Assets.imagesBackground,
|
|
||||||
),
|
|
||||||
fit: BoxFit.cover,
|
|
||||||
opacity: 0.4,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
child: Padding(
|
|
||||||
padding: EdgeInsets.only(
|
|
||||||
top: Constants.appBarHeight,
|
|
||||||
left: Constants.defaultPadding,
|
|
||||||
right: Constants.defaultPadding,
|
|
||||||
bottom: Constants.bottomNavBarHeight,
|
|
||||||
),
|
|
||||||
child: LightSwitchesBody(
|
|
||||||
device: DeviceModel(
|
|
||||||
id: 2,
|
|
||||||
name: 'Bedroom Light',
|
|
||||||
type: DeviceType.Lights,
|
|
||||||
status: true,
|
|
||||||
timer: 0,
|
|
||||||
image: '',
|
|
||||||
functions: [
|
|
||||||
FunctionModel(
|
|
||||||
code: 'switch_1',
|
|
||||||
desc: 'switch 1',
|
|
||||||
name: 'switch 1',
|
|
||||||
type: 'Boolean',
|
|
||||||
values: '{}'),
|
|
||||||
FunctionModel(
|
|
||||||
code: 'switch_2',
|
|
||||||
desc: 'switch 2',
|
|
||||||
name: 'switch 2',
|
|
||||||
type: 'Boolean',
|
|
||||||
values: '{}'),
|
|
||||||
FunctionModel(
|
|
||||||
code: 'switch_3',
|
|
||||||
desc: 'switch 3',
|
|
||||||
name: 'switch 3',
|
|
||||||
type: 'Boolean',
|
|
||||||
values: '{}'),
|
|
||||||
]),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,260 +0,0 @@
|
|||||||
import 'package:flutter/material.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/lights_switches/light_switch.dart';
|
|
||||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
|
||||||
import 'package:syncrow_app/utils/context_extension.dart';
|
|
||||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
|
||||||
|
|
||||||
class LightSwitchesBody extends StatelessWidget {
|
|
||||||
const LightSwitchesBody({
|
|
||||||
super.key,
|
|
||||||
required this.device,
|
|
||||||
});
|
|
||||||
|
|
||||||
final DeviceModel device;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
||||||
children: [
|
|
||||||
const Expanded(child: SizedBox.shrink()),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
Column(
|
|
||||||
children: [
|
|
||||||
LightSwitch(
|
|
||||||
control: DeviceControlModel(
|
|
||||||
deviceId: 'bfe10693d4fd263206ocq9',
|
|
||||||
code: 'switch_1',
|
|
||||||
value: true,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 20),
|
|
||||||
const SizedBox(
|
|
||||||
width: 70,
|
|
||||||
child: BodySmall(
|
|
||||||
text: "Bedside Light",
|
|
||||||
fontColor: ColorsManager.textPrimaryColor,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Column(
|
|
||||||
children: [
|
|
||||||
LightSwitch(
|
|
||||||
control: DeviceControlModel(
|
|
||||||
deviceId: 'bfe10693d4fd263206ocq9',
|
|
||||||
code: 'switch_2',
|
|
||||||
value: true,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 20),
|
|
||||||
const SizedBox(
|
|
||||||
width: 70,
|
|
||||||
child: BodySmall(
|
|
||||||
text: "Ceiling Light",
|
|
||||||
fontColor: ColorsManager.textPrimaryColor,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Column(
|
|
||||||
children: [
|
|
||||||
LightSwitch(
|
|
||||||
control: DeviceControlModel(
|
|
||||||
deviceId: 'bfe10693d4fd263206ocq9',
|
|
||||||
code: 'switch_3',
|
|
||||||
value: true,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 20),
|
|
||||||
const SizedBox(
|
|
||||||
width: 70,
|
|
||||||
child: BodySmall(
|
|
||||||
text: "Spotlight",
|
|
||||||
fontColor: ColorsManager.textPrimaryColor,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Center(
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
Card(
|
|
||||||
elevation: 3,
|
|
||||||
shape: RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.circular(100),
|
|
||||||
),
|
|
||||||
child: InkWell(
|
|
||||||
onTap: () {},
|
|
||||||
child: Stack(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
children: [
|
|
||||||
Container(
|
|
||||||
width: 60,
|
|
||||||
height: 60,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.grey[300],
|
|
||||||
borderRadius: BorderRadius.circular(100),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Container(
|
|
||||||
width: 40,
|
|
||||||
height: 40,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: BorderRadius.circular(100),
|
|
||||||
),
|
|
||||||
child: Center(
|
|
||||||
child: BodySmall(
|
|
||||||
text: "On",
|
|
||||||
style: context.bodyMedium.copyWith(
|
|
||||||
color:
|
|
||||||
ColorsManager.primaryColorWithOpacity,
|
|
||||||
fontWeight: FontWeight.bold),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
BodySmall(
|
|
||||||
text: "All On",
|
|
||||||
style: context.bodyMedium.copyWith(
|
|
||||||
color: ColorsManager.textPrimaryColor,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
const SizedBox(
|
|
||||||
width: 20,
|
|
||||||
),
|
|
||||||
Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
Card(
|
|
||||||
elevation: 3,
|
|
||||||
shape: RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.circular(100),
|
|
||||||
),
|
|
||||||
child: InkWell(
|
|
||||||
onTap: () {},
|
|
||||||
child: Stack(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
children: [
|
|
||||||
Container(
|
|
||||||
width: 60,
|
|
||||||
height: 60,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.grey[300],
|
|
||||||
borderRadius: BorderRadius.circular(100),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Container(
|
|
||||||
width: 40,
|
|
||||||
height: 40,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: BorderRadius.circular(100),
|
|
||||||
),
|
|
||||||
child: Center(
|
|
||||||
child: Icon(
|
|
||||||
Icons.access_time,
|
|
||||||
color: ColorsManager.primaryColorWithOpacity,
|
|
||||||
size: 25,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
BodySmall(
|
|
||||||
text: "Timer",
|
|
||||||
style: context.bodyMedium.copyWith(
|
|
||||||
color: ColorsManager.textPrimaryColor,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
const SizedBox(
|
|
||||||
width: 20,
|
|
||||||
),
|
|
||||||
Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
Card(
|
|
||||||
elevation: 3,
|
|
||||||
shape: RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.circular(100),
|
|
||||||
),
|
|
||||||
child: InkWell(
|
|
||||||
onTap: () {},
|
|
||||||
child: Stack(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
children: [
|
|
||||||
Container(
|
|
||||||
width: 60,
|
|
||||||
height: 60,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.grey[300],
|
|
||||||
borderRadius: BorderRadius.circular(100),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Container(
|
|
||||||
width: 40,
|
|
||||||
height: 40,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: BorderRadius.circular(100),
|
|
||||||
),
|
|
||||||
child: Center(
|
|
||||||
child: BodySmall(
|
|
||||||
text: "Off",
|
|
||||||
style: context.bodyMedium.copyWith(
|
|
||||||
color:
|
|
||||||
ColorsManager.primaryColorWithOpacity,
|
|
||||||
fontWeight: FontWeight.bold),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
BodySmall(
|
|
||||||
text: "All Off",
|
|
||||||
style: context.bodyMedium.copyWith(
|
|
||||||
color: ColorsManager.textPrimaryColor,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -33,7 +33,7 @@ class RoomPageSwitch extends StatelessWidget {
|
|||||||
// ),
|
// ),
|
||||||
// );
|
// );
|
||||||
|
|
||||||
if (device.type == DeviceType.AC) {
|
if (device.productType == DeviceType.AC) {
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
CustomPageRoute(
|
CustomPageRoute(
|
||||||
@ -54,7 +54,7 @@ class RoomPageSwitch extends StatelessWidget {
|
|||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
SvgPicture.asset(
|
SvgPicture.asset(
|
||||||
device.icon,
|
device.icon!,
|
||||||
fit: BoxFit.contain,
|
fit: BoxFit.contain,
|
||||||
),
|
),
|
||||||
CustomSwitch(
|
CustomSwitch(
|
||||||
|
@ -19,7 +19,7 @@ class CustomSwitch extends StatelessWidget {
|
|||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
bool? status;
|
bool? status;
|
||||||
if (device != null) {
|
if (device != null) {
|
||||||
status = device!.status;
|
status = device!.isOnline;
|
||||||
} else if (category != null) {
|
} else if (category != null) {
|
||||||
status = category!.devicesStatus;
|
status = category!.devicesStatus;
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ class DevicesDefaultSwitch extends StatelessWidget {
|
|||||||
child: Container(
|
child: Container(
|
||||||
height: 60,
|
height: 60,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: model.status ?? false
|
color: model.isOnline ?? false
|
||||||
? ColorsManager.primaryColor
|
? ColorsManager.primaryColor
|
||||||
: Colors.white,
|
: Colors.white,
|
||||||
borderRadius: const BorderRadius.only(
|
borderRadius: const BorderRadius.only(
|
||||||
@ -39,7 +39,7 @@ class DevicesDefaultSwitch extends StatelessWidget {
|
|||||||
child: Center(
|
child: Center(
|
||||||
child: BodyMedium(
|
child: BodyMedium(
|
||||||
text: "ON",
|
text: "ON",
|
||||||
fontColor: model.status ?? false ? Colors.white : null,
|
fontColor: model.isOnline ?? false ? Colors.white : null,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -54,7 +54,7 @@ class DevicesDefaultSwitch extends StatelessWidget {
|
|||||||
child: Container(
|
child: Container(
|
||||||
height: 60,
|
height: 60,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: model.status ?? false
|
color: model.isOnline ?? false
|
||||||
? Colors.white
|
? Colors.white
|
||||||
: ColorsManager.primaryColor,
|
: ColorsManager.primaryColor,
|
||||||
borderRadius: const BorderRadius.only(
|
borderRadius: const BorderRadius.only(
|
||||||
@ -65,7 +65,7 @@ class DevicesDefaultSwitch extends StatelessWidget {
|
|||||||
child: Center(
|
child: Center(
|
||||||
child: BodyMedium(
|
child: BodyMedium(
|
||||||
text: "OFF",
|
text: "OFF",
|
||||||
fontColor: model.status ?? false ? null : Colors.white,
|
fontColor: model.isOnline ?? false ? null : Colors.white,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Reference in New Issue
Block a user