push gatway devices

This commit is contained in:
ashrafzarkanisala
2024-08-26 21:23:32 +03:00
parent 2777dc1a5f
commit 191801d9a8
17 changed files with 424 additions and 22 deletions

View File

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:syncrow_web/pages/device_managment/ac/view/ac_device_control.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart';
import 'package:syncrow_web/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart';
import 'package:syncrow_web/pages/device_managment/gateway/view/gateway_view.dart';
import 'package:syncrow_web/pages/device_managment/living_room_switch/view/living_room_device_control.dart';
import 'package:syncrow_web/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart';
@ -14,7 +15,9 @@ mixin RouteControlsBasedCode {
device: device,
);
case 'GW':
return const SizedBox();
return GateWayControls(
gatewayId: device.uuid!,
);
case 'DL':
return const SizedBox();
case 'WPS':

View File

@ -0,0 +1,30 @@
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:syncrow_web/pages/visitor_password/model/device_model.dart';
import 'package:syncrow_web/services/devices_mang_api.dart';
part 'gate_way_event.dart';
part 'gate_way_state.dart';
class GateWayBloc extends Bloc<GateWayEvent, GateWayState> {
GateWayBloc() : super(GateWayInitial()) {
on<GateWayFetch>((event, emit) {});
on<GatWayById>(_getGatWayById);
}
FutureOr<void> _getGatWayById(
GatWayById event, Emitter<GateWayState> emit) async {
emit(GatewayLoadingState());
try {
List<DeviceModel> devicesList =
await DevicesManagementApi.getDevicesByGatewayId(event.getWayId);
emit(UpdateGatewayState(list: devicesList));
} catch (e) {
emit(ErrorState(message: e.toString()));
return;
}
}
}

View File

@ -0,0 +1,20 @@
part of 'gate_way_bloc.dart';
sealed class GateWayEvent extends Equatable {
const GateWayEvent();
@override
List<Object> get props => [];
}
class GateWayLoading extends GateWayEvent {}
class GateWayFetch extends GateWayEvent {
final String deviceId;
const GateWayFetch(this.deviceId);
}
class GatWayById extends GateWayEvent {
final String getWayId;
const GatWayById(this.getWayId);
}

View File

@ -0,0 +1,26 @@
part of 'gate_way_bloc.dart';
sealed class GateWayState extends Equatable {
const GateWayState();
@override
List<Object> get props => [];
}
final class GateWayInitial extends GateWayState {}
class GatewayLoadingState extends GateWayState {}
class UpdateGatewayState extends GateWayState {
final List<DeviceModel> list;
const UpdateGatewayState({required this.list});
@override
List<Object> get props => [list];
}
class ErrorState extends GateWayState {
final String message;
const ErrorState({required this.message});
@override
List<Object> get props => [message];
}

View File

@ -0,0 +1,98 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_web/pages/device_managment/gateway/bloc/gate_way_bloc.dart';
import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart';
import 'package:syncrow_web/pages/visitor_password/model/device_model.dart';
import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart';
class GateWayControls extends StatelessWidget with HelperResponsiveLayout {
const GateWayControls({super.key, required this.gatewayId});
final String gatewayId;
@override
Widget build(BuildContext context) {
final isLarge = isLargeScreenSize(context);
final isMedium = isMediumScreenSize(context);
return BlocProvider(
create: (context) => GateWayBloc()..add(GatWayById(gatewayId)),
child: BlocBuilder<GateWayBloc, GateWayState>(
builder: (context, state) {
if (state is GatewayLoadingState) {
return const Center(child: CircularProgressIndicator());
} else if (state is UpdateGatewayState) {
return GridView.builder(
padding: const EdgeInsets.symmetric(horizontal: 50),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: isLarge
? 3
: isMedium
? 2
: 1,
mainAxisExtent: 150,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
),
itemCount: state.list.length,
itemBuilder: (context, index) {
final device = state.list[index];
return _DeviceItem(device: device);
},
);
} else {
return const Center(child: Text('Error fetching devices'));
}
},
),
);
}
}
class _DeviceItem extends StatelessWidget {
const _DeviceItem({
required this.device,
});
final DeviceModel device;
@override
Widget build(BuildContext context) {
return DeviceControlsContainer(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 60,
height: 60,
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: ColorsManager.whiteColors,
),
margin: const EdgeInsets.symmetric(horizontal: 4),
padding: const EdgeInsets.all(4),
child: ClipOval(
child: SvgPicture.asset(
device.icon,
fit: BoxFit.fill,
),
),
),
const Spacer(),
Text(
device.name ?? 'Unknown Device',
textAlign: TextAlign.center,
style: const TextStyle(
fontWeight: FontWeight.bold,
fontSize: 14,
),
),
],
),
);
}
}

View File

@ -1,4 +1,6 @@
import 'package:syncrow_web/utils/constants/assets.dart';
import 'package:syncrow_web/utils/constants/const.dart';
import 'package:syncrow_web/utils/enum/device_types.dart';
class DeviceModel {
dynamic productUuid;
@ -47,6 +49,27 @@ class DeviceModel {
// Deserialize from JSON
factory DeviceModel.fromJson(Map<String, dynamic> json) {
String tempIcon = '';
DeviceType type = devicesTypesMap[json['productType']] ?? DeviceType.Other;
if (type == DeviceType.LightBulb) {
tempIcon = Assets.lightBulb;
} else if (type == DeviceType.CeilingSensor ||
type == DeviceType.WallSensor) {
tempIcon = Assets.sensors;
} else if (type == DeviceType.AC) {
tempIcon = Assets.ac;
} else if (type == DeviceType.DoorLock) {
tempIcon = Assets.doorLock;
} else if (type == DeviceType.Curtain) {
tempIcon = Assets.curtain;
} else if (type == DeviceType.ThreeGang) {
tempIcon = Assets.gangSwitch;
} else if (type == DeviceType.Gateway) {
tempIcon = Assets.gateway;
} else {
tempIcon = Assets.logo;
}
return DeviceModel(
productUuid: json['productUuid'],
productType: json['productType'],
@ -55,7 +78,7 @@ class DeviceModel {
categoryName: json['categoryName'],
createTime: json['createTime'],
gatewayId: json['gatewayId'],
icon: json['icon'],
icon: tempIcon,
ip: json['ip'],
lat: json['lat'],
localKey: json['localKey'],