mirror of
https://github.com/SyncrowIOT/syncrow-app.git
synced 2026-10-25 13:47:55 +00:00
all_devices and Restrict_user
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/acs_bloc/acs_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/acs_bloc/acs_event.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/acs_bloc/acs_state.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
||||
import 'package:syncrow_app/features/devices/model/ac_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/ACs/ac_interface_controls.dart';
|
||||
@@ -71,6 +73,7 @@ class AcInterface extends StatelessWidget {
|
||||
onTap: () {
|
||||
BlocProvider.of<ACsBloc>(context)
|
||||
.add(AcSwitch(acSwitch: statusModel.acSwitch));
|
||||
|
||||
},
|
||||
child: SvgPicture.asset(Assets.acSwitchIcon))
|
||||
],
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/acs_bloc/acs_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/acs_bloc/acs_event.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/acs_bloc/acs_state.dart';
|
||||
import 'package:syncrow_app/features/devices/model/ac_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/ACs/ac_interface.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/ACs/acs_list.dart';
|
||||
@@ -40,6 +41,8 @@ class ACsView extends StatelessWidget {
|
||||
extendBody: true,
|
||||
appBar: deviceModel != null
|
||||
? DeviceAppbar(
|
||||
//BlocProvider.of<ACsBloc>(context).deviceStatus.acSwitch.toString()
|
||||
value: true,
|
||||
deviceName: deviceModel!.name!,
|
||||
deviceUuid: deviceModel!.uuid!,
|
||||
)
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/room_page_switch.dart';
|
||||
import 'package:syncrow_app/generated/assets.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||
|
||||
class AllDevices extends StatefulWidget {
|
||||
const AllDevices({super.key, required this.allDevices});
|
||||
|
||||
final List<DeviceModel> allDevices;
|
||||
|
||||
@override
|
||||
_AllDevicesState createState() => _AllDevicesState();
|
||||
}
|
||||
|
||||
class _AllDevicesState extends State<AllDevices> {
|
||||
final TextEditingController _searchController = TextEditingController();
|
||||
List<DeviceModel> _filteredDevices = [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_filteredDevices = widget.allDevices ?? [];
|
||||
_searchController.addListener(_filterDevices);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_searchController.removeListener(_filterDevices);
|
||||
_searchController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _filterDevices() {
|
||||
final query = _searchController.text.toLowerCase();
|
||||
setState(() {
|
||||
_filteredDevices = widget.allDevices!
|
||||
.where((device) => device.name!.toLowerCase().contains(query))
|
||||
.toList();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
children: [
|
||||
if (widget.allDevices.isNotEmpty)
|
||||
TextFormField(
|
||||
controller: _searchController,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Search',
|
||||
hintStyle: const TextStyle(
|
||||
color: ColorsManager.textGray,
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w400),
|
||||
prefixIcon: Container(
|
||||
padding: const EdgeInsets.all(5.0),
|
||||
margin: const EdgeInsets.all(10.0),
|
||||
child: SvgPicture.asset(
|
||||
Assets.searchIcon,
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(8.0),
|
||||
),
|
||||
),
|
||||
),
|
||||
_filteredDevices.isNotEmpty
|
||||
? Expanded(
|
||||
child: GridView.builder(
|
||||
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: 2,
|
||||
crossAxisSpacing: 10,
|
||||
mainAxisSpacing: 10,
|
||||
childAspectRatio: 1.5,
|
||||
),
|
||||
padding: const EdgeInsets.only(top: 10),
|
||||
itemCount: _filteredDevices.length,
|
||||
itemBuilder: (context, index) {
|
||||
return RoomPageSwitch(
|
||||
allDevices: _filteredDevices,
|
||||
isAllDevices: true,
|
||||
device: _filteredDevices[index]);
|
||||
},
|
||||
),
|
||||
)
|
||||
: widget.allDevices.isNotEmpty
|
||||
? const Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Center(
|
||||
child: Text(
|
||||
'No Results Found',
|
||||
style: TextStyle(
|
||||
color: ColorsManager.grayColor,
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.w400),
|
||||
)),
|
||||
],
|
||||
),
|
||||
)
|
||||
: const SizedBox(),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -250,7 +250,9 @@ class CeilingSensorInterface extends StatelessWidget {
|
||||
),
|
||||
] else if (button['title'] == 'Space Type') ...[
|
||||
Text(
|
||||
model.spaceType.name.toString(),
|
||||
model.spaceType.name.toString() == "none"
|
||||
? "Office"
|
||||
: model.spaceType.name.toString(),
|
||||
style: const TextStyle(color: Colors.black),
|
||||
),
|
||||
] else ...[
|
||||
@@ -299,7 +301,13 @@ class CeilingSensorInterface extends StatelessWidget {
|
||||
);
|
||||
if (result != null) {
|
||||
bloc.add(ChangeValueEvent(
|
||||
type: title.toString(), value: result, code: 'nobody_time'));
|
||||
type: title.toString(),
|
||||
value: result
|
||||
.toString()
|
||||
.toLowerCase()
|
||||
.replaceAll('sec', 's')
|
||||
.replaceAll('1hr', '1hour'), // Replacing "sec" with "s"
|
||||
code: 'nobody_time'));
|
||||
}
|
||||
} else if (title == 'Maximum Distance') {
|
||||
final result = await _showDialog(
|
||||
|
||||
@@ -90,9 +90,7 @@ class PresenceRecord extends StatelessWidget {
|
||||
: Colors.grey,
|
||||
),
|
||||
title: Text(
|
||||
record.value == 'true'
|
||||
? "Opened"
|
||||
: "Closed",
|
||||
record.value.toString(),
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 18,
|
||||
|
||||
@@ -106,12 +106,11 @@ class _PresenceSpaceTypeDialogState extends State<PresenceSpaceTypeDialog> {
|
||||
padding: const EdgeInsets.all(10),
|
||||
child: SvgPicture.asset(
|
||||
icon,
|
||||
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
title,
|
||||
title == "None" ? "Office" : title,
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:syncrow_app/features/devices/bloc/curtain_bloc/curtain_event.dar
|
||||
import 'package:syncrow_app/features/devices/bloc/curtain_bloc/curtain_state.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/curtains/curtain_buttons.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/device_appbar.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart';
|
||||
import 'package:syncrow_app/generated/assets.dart';
|
||||
@@ -33,11 +34,17 @@ class CurtainView extends StatelessWidget {
|
||||
// blindHeight = state.blindHeight;
|
||||
}
|
||||
return DefaultScaffold(
|
||||
appBar: DeviceAppbar(
|
||||
deviceName: curtain!.name!,
|
||||
deviceUuid: curtain!.uuid!,
|
||||
),
|
||||
title: curtain.name,
|
||||
child: state is CurtainLoadingState
|
||||
? const Center(
|
||||
child:
|
||||
DefaultContainer(width: 50, height: 50, child: CircularProgressIndicator()),
|
||||
child: DefaultContainer(
|
||||
width: 50,
|
||||
height: 50,
|
||||
child: CircularProgressIndicator()),
|
||||
)
|
||||
: RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
@@ -62,37 +69,56 @@ class CurtainView extends StatelessWidget {
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
Assets.assetsIconsCurtainsIconCurtainHolder,
|
||||
width: MediaQuery.sizeOf(context).width * 0.75,
|
||||
width:
|
||||
MediaQuery.sizeOf(context).width * 0.75,
|
||||
),
|
||||
SizedBox(
|
||||
width: MediaQuery.sizeOf(context).width * 0.75,
|
||||
width:
|
||||
MediaQuery.sizeOf(context).width * 0.75,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: MediaQuery.sizeOf(context).width * 0.025,
|
||||
width:
|
||||
MediaQuery.sizeOf(context).width *
|
||||
0.025,
|
||||
),
|
||||
AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 200),
|
||||
duration:
|
||||
const Duration(milliseconds: 200),
|
||||
curve: Curves.linear,
|
||||
height: MediaQuery.sizeOf(context).height * 0.35,
|
||||
width: MediaQuery.sizeOf(context).width * 0.35,
|
||||
height: MediaQuery.sizeOf(context)
|
||||
.height *
|
||||
0.35,
|
||||
width:
|
||||
MediaQuery.sizeOf(context).width *
|
||||
0.35,
|
||||
child: Stack(
|
||||
children: List.generate(
|
||||
4,
|
||||
(index) {
|
||||
double spacing = curtainWidth / 7.5;
|
||||
double leftMostPosition = index * spacing;
|
||||
double spacing =
|
||||
curtainWidth / 7.5;
|
||||
double leftMostPosition =
|
||||
index * spacing;
|
||||
return AnimatedPositioned(
|
||||
duration: const Duration(milliseconds: 200),
|
||||
duration: const Duration(
|
||||
milliseconds: 200),
|
||||
curve: Curves.linear,
|
||||
left: leftMostPosition,
|
||||
child: SizedBox(
|
||||
height:
|
||||
MediaQuery.sizeOf(context).height * 0.35,
|
||||
width: MediaQuery.sizeOf(context).width * 0.08,
|
||||
height: MediaQuery.sizeOf(
|
||||
context)
|
||||
.height *
|
||||
0.35,
|
||||
width: MediaQuery.sizeOf(
|
||||
context)
|
||||
.width *
|
||||
0.08,
|
||||
child: SvgPicture.asset(
|
||||
Assets.assetsIconsCurtainsIconVerticalBlade,
|
||||
Assets
|
||||
.assetsIconsCurtainsIconVerticalBlade,
|
||||
fit: BoxFit.fill,
|
||||
),
|
||||
),
|
||||
@@ -102,23 +128,37 @@ class CurtainView extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 200),
|
||||
duration:
|
||||
const Duration(milliseconds: 200),
|
||||
curve: Curves.linear,
|
||||
height: MediaQuery.sizeOf(context).height * 0.35,
|
||||
width: MediaQuery.sizeOf(context).width * 0.35,
|
||||
height: MediaQuery.sizeOf(context)
|
||||
.height *
|
||||
0.35,
|
||||
width:
|
||||
MediaQuery.sizeOf(context).width *
|
||||
0.35,
|
||||
child: Stack(
|
||||
children: List.generate(
|
||||
4,
|
||||
(index) {
|
||||
double spacing = curtainWidth / 7.5;
|
||||
double rightMostPosition = index * spacing;
|
||||
double spacing =
|
||||
curtainWidth / 7.5;
|
||||
double rightMostPosition =
|
||||
index * spacing;
|
||||
return AnimatedPositioned(
|
||||
duration: const Duration(milliseconds: 200),
|
||||
duration: const Duration(
|
||||
milliseconds: 200),
|
||||
curve: Curves.linear,
|
||||
right: rightMostPosition,
|
||||
child: SizedBox(
|
||||
height: MediaQuery.sizeOf(context).height * 0.35,
|
||||
width: MediaQuery.sizeOf(context).width * 0.08,
|
||||
height: MediaQuery.sizeOf(
|
||||
context)
|
||||
.height *
|
||||
0.35,
|
||||
width: MediaQuery.sizeOf(
|
||||
context)
|
||||
.width *
|
||||
0.08,
|
||||
child: SvgPicture.asset(
|
||||
Assets.rightVerticalBlade,
|
||||
fit: BoxFit.fill,
|
||||
@@ -130,7 +170,9 @@ class CurtainView extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: MediaQuery.sizeOf(context).width * 0.025,
|
||||
width:
|
||||
MediaQuery.sizeOf(context).width *
|
||||
0.025,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||
@@ -6,14 +7,27 @@ import 'package:syncrow_app/utils/resource_manager/font_manager.dart';
|
||||
class DeviceAppbar extends StatelessWidget implements PreferredSizeWidget {
|
||||
final String deviceName;
|
||||
final String deviceUuid;
|
||||
final bool? value;
|
||||
|
||||
final double appBarHeight = 56.0;
|
||||
final void Function()? onPressed;
|
||||
const DeviceAppbar(
|
||||
{super.key, required this.deviceName, required this.deviceUuid, this.onPressed});
|
||||
{super.key,
|
||||
required this.deviceName,
|
||||
this.value,
|
||||
required this.deviceUuid,
|
||||
this.onPressed});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AppBar(
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop(value ?? true);
|
||||
},
|
||||
icon: Icon(
|
||||
Platform.isIOS ? Icons.arrow_back_ios : Icons.arrow_back,
|
||||
)),
|
||||
backgroundColor: Colors.transparent,
|
||||
centerTitle: true,
|
||||
title: BodyLarge(
|
||||
|
||||
@@ -1,12 +1,147 @@
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
// import 'package:smooth_page_indicator/smooth_page_indicator.dart';
|
||||
// import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
|
||||
// import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
||||
// import 'package:syncrow_app/features/devices/view/widgets/all_devices.dart';
|
||||
// import 'package:syncrow_app/features/devices/view/widgets/room_page.dart';
|
||||
// import 'package:syncrow_app/features/devices/view/widgets/rooms_slider.dart';
|
||||
// import 'package:syncrow_app/features/devices/view/widgets/wizard_page.dart';
|
||||
// import 'package:syncrow_app/features/scene/bloc/scene_bloc/scene_bloc.dart';
|
||||
// import 'package:syncrow_app/features/scene/view/scene_view.dart';
|
||||
// import 'package:syncrow_app/features/shared_widgets/create_unit.dart';
|
||||
// import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
|
||||
// import 'package:syncrow_app/features/shared_widgets/text_widgets/title_medium.dart';
|
||||
// import 'package:syncrow_app/utils/context_extension.dart';
|
||||
// import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
||||
|
||||
// class DevicesViewPage extends StatelessWidget {
|
||||
// const DevicesViewPage({super.key});
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return BlocProvider(
|
||||
// create: (context) => SceneBloc(), // Initialize your SceneBloc here
|
||||
// child: DevicesViewBody(),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
// class DevicesViewBody extends StatelessWidget {
|
||||
// const DevicesViewBody({
|
||||
// super.key,
|
||||
// });
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return BlocBuilder<DevicesCubit, DevicesState>(
|
||||
// builder: (context, state) {
|
||||
// if (state is DevicesLoading ||
|
||||
// state is GetDevicesLoading ||
|
||||
// state is DevicesCategoriesLoading) {
|
||||
// return const Center(child: CircularProgressIndicator());
|
||||
// } else {
|
||||
// return HomeCubit.getInstance().spaces?.isEmpty ?? true
|
||||
// ? const CreateUnitWidget()
|
||||
// : Column(
|
||||
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
// crossAxisAlignment: CrossAxisAlignment.center,
|
||||
// children: [
|
||||
// Row(
|
||||
// children: [
|
||||
// TitleMedium(
|
||||
// text: StringsManager.devices,
|
||||
// style: context.titleMedium.copyWith(
|
||||
// fontSize: 25,
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// SizedBox(
|
||||
// height: MediaQuery.of(context).size.height * 0.1,
|
||||
// child: const SceneView(
|
||||
// pageType: true,
|
||||
// )),
|
||||
// const SizedBox(
|
||||
// height: 20,
|
||||
// ),
|
||||
// const RoomsSlider(),
|
||||
// const SizedBox(
|
||||
// height: 10,
|
||||
// ),
|
||||
// Expanded(
|
||||
// child: PageView(
|
||||
// controller:
|
||||
// HomeCubit.getInstance().devicesPageController,
|
||||
// onPageChanged: (index) {
|
||||
// HomeCubit.getInstance().devicesPageChanged(index);
|
||||
// print(index);
|
||||
// if (index == 0) {
|
||||
// context.read<DevicesCubit>().fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
// }
|
||||
// },
|
||||
// children: [
|
||||
// AllDevices(
|
||||
// allDevices: context.read<DevicesCubit>().allDevices,
|
||||
// ),
|
||||
// WizardPage(
|
||||
// groupsList:
|
||||
// DevicesCubit.getInstance().allCategories ?? [],
|
||||
// ),
|
||||
// if (HomeCubit.getInstance().selectedSpace != null)
|
||||
// ...HomeCubit.getInstance()
|
||||
// .selectedSpace!
|
||||
// .subspaces
|
||||
// .map(
|
||||
// (room) {
|
||||
// return RoomPage(
|
||||
// room: room,
|
||||
// );
|
||||
// },
|
||||
// )
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// HomeCubit.getInstance().selectedSpace != null
|
||||
// ? Padding(
|
||||
// padding: const EdgeInsets.symmetric(
|
||||
// vertical: 7,
|
||||
// ),
|
||||
// child: SmoothPageIndicator(
|
||||
// controller:
|
||||
// HomeCubit.getInstance().devicesPageController,
|
||||
// count: HomeCubit.getInstance()
|
||||
// .selectedSpace!
|
||||
// .subspaces
|
||||
// .length +
|
||||
// 2,
|
||||
// effect: const WormEffect(
|
||||
// paintStyle: PaintingStyle.stroke,
|
||||
// dotHeight: 8,
|
||||
// dotWidth: 8,
|
||||
// ),
|
||||
// ),
|
||||
// )
|
||||
// : const Center(
|
||||
// child: BodyLarge(text: 'No Home Found'),
|
||||
// ),
|
||||
// ],
|
||||
// );
|
||||
// }
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:smooth_page_indicator/smooth_page_indicator.dart';
|
||||
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
||||
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/all_devices.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/room_page.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/rooms_slider.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/wizard_page.dart';
|
||||
import 'package:syncrow_app/features/scene/bloc/scene_bloc/scene_bloc.dart';
|
||||
import 'package:syncrow_app/features/scene/view/scene_view.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/create_unit.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
|
||||
@@ -14,35 +149,53 @@ import 'package:syncrow_app/features/shared_widgets/text_widgets/title_medium.da
|
||||
import 'package:syncrow_app/utils/context_extension.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
||||
|
||||
class DevicesViewPage extends StatelessWidget {
|
||||
const DevicesViewPage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocProvider(
|
||||
create: (context) => SceneBloc(), // Initialize your SceneBloc here
|
||||
child: DevicesViewBody(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class DevicesViewBody extends StatelessWidget {
|
||||
const DevicesViewBody({
|
||||
super.key,
|
||||
});
|
||||
const DevicesViewBody({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<DevicesCubit, DevicesState>(
|
||||
builder: (context, state) {
|
||||
if (state is DevicesLoading ||
|
||||
state is GetDevicesLoading ||
|
||||
state is DevicesCategoriesLoading) {
|
||||
return BlocBuilder<HomeCubit, HomeState>(
|
||||
builder: (context, homeState) {
|
||||
final homeCubit = HomeCubit.getInstance();
|
||||
if (homeState is GetSpacesLoading || homeState is HomeLoading) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
} else {
|
||||
return HomeCubit.getInstance().spaces?.isEmpty ?? true
|
||||
? const CreateUnitWidget()
|
||||
: Column(
|
||||
}
|
||||
final spaces = homeCubit.spaces;
|
||||
return BlocBuilder<DevicesCubit, DevicesState>(
|
||||
builder: (context, devicesState) {
|
||||
if (devicesState is DevicesLoading ||
|
||||
devicesState is DevicesCategoriesLoading ||
|
||||
devicesState is GetDevicesLoading) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
} else if (spaces.isEmpty) {
|
||||
return FutureBuilder(
|
||||
future: Future.delayed(
|
||||
const Duration(seconds: 1)),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.waiting) {
|
||||
return const Center(
|
||||
child:
|
||||
CircularProgressIndicator());
|
||||
}
|
||||
if (spaces.isEmpty) {
|
||||
return const CreateUnitWidget();
|
||||
}
|
||||
return Container();
|
||||
});
|
||||
}
|
||||
if (devicesState is GetDevicesError) {
|
||||
return const Center(child: Text('Error'));
|
||||
}
|
||||
if (devicesState is GetDevicesSuccess ||
|
||||
devicesState is SwitchControlLoading ||
|
||||
devicesState is DeviceControlSuccess ||
|
||||
devicesState is DeviceControlError) {
|
||||
if (spaces.isEmpty) {
|
||||
return const CreateUnitWidget();
|
||||
} else {
|
||||
final devicesCubit = context.read<DevicesCubit>();
|
||||
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
@@ -50,53 +203,50 @@ class DevicesViewBody extends StatelessWidget {
|
||||
children: [
|
||||
TitleMedium(
|
||||
text: StringsManager.devices,
|
||||
style: context.titleMedium.copyWith(
|
||||
fontSize: 25,
|
||||
),
|
||||
style: context.titleMedium.copyWith(fontSize: 25),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: MediaQuery.of(context).size.height * 0.1,
|
||||
child: const SceneView(
|
||||
pageType: true,
|
||||
)),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
height: MediaQuery.of(context).size.height * 0.1,
|
||||
child: const SceneView(pageType: true),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
const RoomsSlider(),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
Expanded(
|
||||
child: PageView(
|
||||
controller: HomeCubit.getInstance().devicesPageController,
|
||||
controller: homeCubit.devicesPageController,
|
||||
onPageChanged: (index) {
|
||||
HomeCubit.getInstance().devicesPageChanged(index);
|
||||
homeCubit.devicesPageChanged(index);
|
||||
if (index == 0) {
|
||||
devicesCubit.fetchAllDevices(
|
||||
homeCubit.selectedSpace,
|
||||
);
|
||||
}
|
||||
},
|
||||
children: [
|
||||
WizardPage(
|
||||
groupsList: DevicesCubit.getInstance().allCategories ?? [],
|
||||
AllDevices(
|
||||
allDevices: DevicesCubit.getInstance().allDevices,
|
||||
),
|
||||
if (HomeCubit.getInstance().selectedSpace != null)
|
||||
...HomeCubit.getInstance().selectedSpace!.subspaces.map(
|
||||
(room) {
|
||||
return RoomPage(
|
||||
room: room,
|
||||
);
|
||||
},
|
||||
)
|
||||
WizardPage(
|
||||
groupsList:
|
||||
DevicesCubit.getInstance().allCategories ?? [],
|
||||
),
|
||||
if (homeCubit.selectedSpace != null)
|
||||
...homeCubit.selectedSpace!.subspaces.map(
|
||||
(room) => RoomPage(room: room),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
HomeCubit.getInstance().selectedSpace != null
|
||||
homeCubit.selectedSpace != null
|
||||
? Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 7,
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(vertical: 7),
|
||||
child: SmoothPageIndicator(
|
||||
controller: HomeCubit.getInstance().devicesPageController,
|
||||
count: HomeCubit.getInstance().selectedSpace!.subspaces.length + 1,
|
||||
controller: homeCubit.devicesPageController,
|
||||
count:
|
||||
homeCubit.selectedSpace!.subspaces.length + 2,
|
||||
effect: const WormEffect(
|
||||
paintStyle: PaintingStyle.stroke,
|
||||
dotHeight: 8,
|
||||
@@ -109,7 +259,11 @@ class DevicesViewBody extends StatelessWidget {
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return const SizedBox.shrink();
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import 'package:syncrow_app/features/devices/bloc/garage_door_bloc/garage_door_b
|
||||
import 'package:syncrow_app/features/devices/bloc/garage_door_bloc/garage_door_event.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/garage_door_bloc/garage_door_state.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/device_appbar.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/garage_door/garage_preferences_settings.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/garage_door/garage_records_screen.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/garage_door/schedule_garage_screen.dart';
|
||||
@@ -22,6 +23,10 @@ class GarageDoorScreen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return DefaultScaffold(
|
||||
appBar: DeviceAppbar(
|
||||
deviceName: device!.name!,
|
||||
deviceUuid: device!.uuid!,
|
||||
),
|
||||
title: 'Garage Door Opener',
|
||||
child: BlocProvider(
|
||||
create: (context) => GarageDoorBloc(GDId: device?.uuid ?? '')
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/six_scene_screen.dart';
|
||||
@@ -28,23 +29,31 @@ import 'package:syncrow_app/features/devices/view/widgets/smart_door/door_interf
|
||||
import 'package:syncrow_app/features/devices/view/widgets/three_gang/three_gang_interface.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/water_heater/water_heater_page.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/water_leak/water_leak_screen.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/custom_switch.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
|
||||
import 'package:syncrow_app/utils/context_extension.dart';
|
||||
import 'package:syncrow_app/utils/helpers/custom_page_route.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
||||
|
||||
class RoomPageSwitch extends StatelessWidget {
|
||||
const RoomPageSwitch({
|
||||
super.key,
|
||||
required this.device,
|
||||
});
|
||||
const RoomPageSwitch(
|
||||
{super.key,
|
||||
required this.device,
|
||||
this.isAllDevices = false,
|
||||
this.allDevices});
|
||||
|
||||
final DeviceModel device;
|
||||
final List<DeviceModel>? allDevices;
|
||||
final bool isAllDevices;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
showDeviceInterface(device, context);
|
||||
showDeviceInterface(
|
||||
device: device,
|
||||
context: context,
|
||||
isAllDevices: isAllDevices,
|
||||
allDevices: allDevices);
|
||||
},
|
||||
child: DefaultContainer(
|
||||
padding: const EdgeInsets.all(15),
|
||||
@@ -60,22 +69,38 @@ class RoomPageSwitch extends StatelessWidget {
|
||||
device.icon!,
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
// CustomSwitch(
|
||||
// device: device,
|
||||
// ),
|
||||
isAllDevices
|
||||
? CustomSwitch(
|
||||
device: device,
|
||||
)
|
||||
: const SizedBox(),
|
||||
],
|
||||
),
|
||||
Flexible(
|
||||
child: FittedBox(
|
||||
child: Text(
|
||||
device.name ?? "",
|
||||
overflow: TextOverflow.ellipsis,
|
||||
maxLines: 2,
|
||||
style: context.bodyLarge.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 20,
|
||||
color: Colors.grey,
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
device.name ?? "",
|
||||
overflow: TextOverflow.ellipsis,
|
||||
maxLines: 2,
|
||||
style: context.bodyLarge.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 20,
|
||||
color: Colors.grey,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
device.subspace!.subspaceName ?? '',
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: context.bodySmall.copyWith(
|
||||
fontWeight: FontWeight.w400,
|
||||
fontSize: 10,
|
||||
color: Colors.grey,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -89,14 +114,23 @@ class RoomPageSwitch extends StatelessWidget {
|
||||
/// Shows the device interface based on the product type of the device.
|
||||
///
|
||||
/// The [device] parameter represents the device model.
|
||||
void showDeviceInterface(DeviceModel device, BuildContext context) {
|
||||
Future<void> showDeviceInterface(
|
||||
{required DeviceModel device,
|
||||
required BuildContext context,
|
||||
required isAllDevices,
|
||||
List<DeviceModel>? allDevices}) async {
|
||||
final devicesCubit = context.read<DevicesCubit>();
|
||||
|
||||
switch (device.productType) {
|
||||
case DeviceType.AC:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
ACsView(deviceModel: device)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
// navigateToInterface(ACsView(deviceModel: device), context);
|
||||
break;
|
||||
case DeviceType.WallSensor:
|
||||
@@ -116,12 +150,15 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
|
||||
// navigateToInterface(CeilingSensorInterface(ceilingSensor: device), context);
|
||||
break;
|
||||
case DeviceType.Curtain:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) => CurtainView(
|
||||
curtain: device,
|
||||
)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
break;
|
||||
case DeviceType.Blind:
|
||||
break;
|
||||
@@ -143,30 +180,43 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
|
||||
case DeviceType.LightBulb:
|
||||
navigateToInterface(LightInterface(light: device), context);
|
||||
case DeviceType.OneGang:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
OneGangInterface(gangSwitch: device)));
|
||||
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
case DeviceType.TwoGang:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
TwoGangInterface(gangSwitch: device)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
case DeviceType.ThreeGang:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
ThreeGangInterface(gangSwitch: device)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
|
||||
case DeviceType.WH:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
WaterHeaterPage(device: device)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
case DeviceType.DS:
|
||||
Navigator.push(
|
||||
context,
|
||||
@@ -182,31 +232,43 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
|
||||
PowerClampPage(device: device)));
|
||||
|
||||
case DeviceType.OneTouch:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
OneTouchScreen(device: device)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
|
||||
case DeviceType.TowTouch:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
TwoTouchInterface(touchSwitch: device)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
case DeviceType.ThreeTouch:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
ThreeTouchInterface(touchSwitch: device)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
|
||||
case DeviceType.GarageDoor:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
GarageDoorScreen(device: device)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
|
||||
case DeviceType.WaterLeak:
|
||||
Navigator.push(
|
||||
@@ -216,18 +278,24 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
|
||||
WaterLeakScreen(device: device)));
|
||||
|
||||
case DeviceType.SixScene:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
SixSceneScreen(device: device)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
|
||||
case DeviceType.FourScene:
|
||||
Navigator.push(
|
||||
var value = await Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
FourSceneScreen(device: device)));
|
||||
if (value && isAllDevices) {
|
||||
devicesCubit.fetchAllDevices(HomeCubit.getInstance().selectedSpace);
|
||||
}
|
||||
|
||||
case DeviceType.SOS:
|
||||
Navigator.push(
|
||||
|
||||
@@ -23,6 +23,21 @@ class RoomsSlider extends StatelessWidget {
|
||||
HomeCubit.getInstance().roomSliderPageChanged(index);
|
||||
},
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 15),
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
HomeCubit.getInstance().unselectRoom();
|
||||
},
|
||||
child: TitleMedium(
|
||||
text: 'All Devices',
|
||||
style: context.titleMedium.copyWith(
|
||||
fontSize: 25,
|
||||
color: ColorsManager.textPrimaryColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 15),
|
||||
child: InkWell(
|
||||
@@ -43,7 +58,10 @@ class RoomsSlider extends StatelessWidget {
|
||||
(room) => InkWell(
|
||||
onTap: () {
|
||||
HomeCubit.getInstance().roomSliderPageChanged(
|
||||
HomeCubit.getInstance().selectedSpace!.subspaces.indexOf(room));
|
||||
HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.subspaces
|
||||
.indexOf(room));
|
||||
},
|
||||
child: TitleMedium(
|
||||
text: room.name!,
|
||||
@@ -51,7 +69,8 @@ class RoomsSlider extends StatelessWidget {
|
||||
fontSize: 25,
|
||||
color: HomeCubit.getInstance().selectedRoom == room
|
||||
? ColorsManager.textPrimaryColor
|
||||
: ColorsManager.textPrimaryColor.withOpacity(.2),
|
||||
: ColorsManager.textPrimaryColor
|
||||
.withOpacity(.2),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/two_touch_bloc/two_touch_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/device_appbar.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/two_touch/two_touch_screen.dart';
|
||||
@@ -26,6 +28,7 @@ class TwoTouchInterface extends StatelessWidget {
|
||||
extendBody: true,
|
||||
appBar: touchSwitch != null
|
||||
? DeviceAppbar(
|
||||
value: true,
|
||||
deviceName: touchSwitch!.name!,
|
||||
deviceUuid: touchSwitch!.uuid!,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user