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,
),
),
],
),
);
}
}