Refactor code structure and update dependencies

Clean up code structure, remove unused imports, and update dependencies.
No functional changes made, only code organization improvements.
This commit is contained in:
Mohammad Salameh
2024-04-03 01:55:50 +03:00
parent 9cc479ba17
commit 127d3a0295
13 changed files with 258 additions and 194 deletions

View File

@ -5,6 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart'; import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/app_layout/view/widgets/app_bar_home_dropdown.dart'; import 'package:syncrow_app/features/app_layout/view/widgets/app_bar_home_dropdown.dart';
import 'package:syncrow_app/features/dashboard/view/dashboard_view.dart'; import 'package:syncrow_app/features/dashboard/view/dashboard_view.dart';
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
import 'package:syncrow_app/features/devices/model/room_model.dart'; import 'package:syncrow_app/features/devices/model/room_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart'; import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart';
import 'package:syncrow_app/features/menu/view/menu_view.dart'; import 'package:syncrow_app/features/menu/view/menu_view.dart';
@ -260,7 +261,10 @@ class HomeCubit extends Cubit<HomeState> {
final List<Widget> pages = [ final List<Widget> pages = [
const DashboardView(), const DashboardView(),
// const LayoutPage(), // const LayoutPage(),
const DevicesViewBody(), BlocProvider(
create: (context) => DevicesCubit(),
child: const DevicesViewBody(),
),
const SceneView(), const SceneView(),
const MenuView(), const MenuView(),
]; ];

View File

@ -13,6 +13,10 @@ class DefaultNavBar extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider(
create: (context) => DevicesCubit(),
child: BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
return BlocBuilder<HomeCubit, HomeState>( return BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) { builder: (context, state) {
var cubit = HomeCubit.getInstance(); var cubit = HomeCubit.getInstance();
@ -23,7 +27,8 @@ class DefaultNavBar extends StatelessWidget {
onTap: (int index) { onTap: (int index) {
cubit.updatePageIndex(index); cubit.updatePageIndex(index);
if (DevicesCubit.get(context).chosenCategoryView != null) { if (DevicesCubit.get(context).chosenCategoryView != null) {
DevicesCubit.getInstance().clearCategoriesSelection(context); DevicesCubit.get(context)
.clearCategoriesSelection(context);
} }
if (HomeCubit.getInstance().selectedRoom != null) { if (HomeCubit.getInstance().selectedRoom != null) {
HomeCubit.getInstance().unselectRoom(); HomeCubit.getInstance().unselectRoom();
@ -44,5 +49,8 @@ class DefaultNavBar extends StatelessWidget {
); );
}, },
); );
},
),
);
} }
} }

View File

@ -22,7 +22,7 @@ import 'package:syncrow_app/utils/resource_manager/constants.dart';
part 'devices_state.dart'; part 'devices_state.dart';
class DevicesCubit extends Cubit<DevicesState> { class DevicesCubit extends Cubit<DevicesState> {
DevicesCubit._() : super(DevicesInitial()) { DevicesCubit() : super(DevicesInitial()) {
if (HomeCubit.getInstance().selectedSpace != null) { if (HomeCubit.getInstance().selectedSpace != null) {
fetchGroups(HomeCubit.getInstance().selectedSpace!.id!); fetchGroups(HomeCubit.getInstance().selectedSpace!.id!);
for (var room in HomeCubit.getInstance().selectedSpace!.rooms!) { for (var room in HomeCubit.getInstance().selectedSpace!.rooms!) {
@ -32,18 +32,18 @@ class DevicesCubit extends Cubit<DevicesState> {
} }
bool _isClosed = false; bool _isClosed = false;
static DevicesCubit? _instance; // static DevicesCubit? _instance;
static DevicesCubit getInstance() { // static DevicesCubit.get(context) {
// If an instance already exists, return it // // If an instance already exists, return it
_instance ??= DevicesCubit._(); // _instance ??= DevicesCubit._();
return _instance!; // return _instance!;
} // }
@override // @override
Future<void> close() { // Future<void> close() {
_isClosed = true; // _isClosed = true;
return super.close(); // return super.close();
} // }
static DevicesCubit get(context) => BlocProvider.of(context); static DevicesCubit get(context) => BlocProvider.of(context);

View File

@ -1,20 +1,17 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; // import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart';
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart';
class DevicesView extends StatelessWidget { // class DevicesView extends StatelessWidget {
const DevicesView({super.key}); // Fixing the syntax for super.key // const DevicesView({super.key});
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
return BlocBuilder<DevicesCubit, DevicesState>( // print('built DevicesView');
builder: (_, state) => Container( // return Container(
padding: const EdgeInsets.all(8), // padding: const EdgeInsets.all(8),
width: MediaQuery.of(context).size.width, // width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height, // height: MediaQuery.of(context).size.height,
child: const DevicesViewBody(), // child: const DevicesViewBody(),
), // );
); // }
} // }
}

View File

@ -1,5 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.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/model/device_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/ACs/ac_interface_controls.dart'; import 'package:syncrow_app/features/devices/view/widgets/ACs/ac_interface_controls.dart';
import 'package:syncrow_app/features/devices/view/widgets/ACs/ac_interface_temp_unit.dart'; import 'package:syncrow_app/features/devices/view/widgets/ACs/ac_interface_temp_unit.dart';

View File

@ -41,9 +41,8 @@ class ACsList extends StatelessWidget {
itemCount: itemCount:
DevicesCubit.get(context).chosenCategory!.devices!.length, DevicesCubit.get(context).chosenCategory!.devices!.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
DeviceModel ac = DevicesCubit.get(context) DeviceModel ac =
.chosenCategory! DevicesCubit.get(context).chosenCategory!.devices![index];
.devices![index];
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [

View File

@ -18,11 +18,32 @@ class DevicesViewBody extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<HomeCubit, HomeState>( return BlocConsumer<DevicesCubit, DevicesState>(
listener: (context, state) {
if (state is GetDevicesError) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(state.errorMsg),
),
);
} else if (state is DevicesCategoriesError) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(state.errorMsg),
),
);
} else if (state is DeviceControlError) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(state.errorMsg),
),
);
}
},
builder: (context, state) { builder: (context, state) {
return BlocBuilder<DevicesCubit, DevicesState>( if (state is DevicesLoading ||
builder: (context, state) { state is GetDevicesLoading ||
if (state is DevicesLoading) { state is DevicesCategoriesLoading) {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} else { } else {
return Padding( return Padding(
@ -40,8 +61,7 @@ class DevicesViewBody extends StatelessWidget {
), ),
Expanded( Expanded(
child: PageView( child: PageView(
controller: controller: HomeCubit.getInstance().devicesPageController,
HomeCubit.getInstance().devicesPageController,
onPageChanged: (index) { onPageChanged: (index) {
HomeCubit.getInstance().devicesPageChanged(index); HomeCubit.getInstance().devicesPageChanged(index);
}, },
@ -50,10 +70,7 @@ class DevicesViewBody extends StatelessWidget {
if (HomeCubit.getInstance().selectedSpace != null) if (HomeCubit.getInstance().selectedSpace != null)
if (HomeCubit.getInstance().selectedSpace!.rooms != if (HomeCubit.getInstance().selectedSpace!.rooms !=
null) null)
...HomeCubit.getInstance() ...HomeCubit.getInstance().selectedSpace!.rooms!.map(
.selectedSpace!
.rooms!
.map(
(room) { (room) {
return RoomPage( return RoomPage(
room: room, room: room,
@ -92,7 +109,5 @@ class DevicesViewBody extends StatelessWidget {
} }
}, },
); );
},
);
} }
} }

View File

@ -1,10 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.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/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/lights/light_interface_contols.dart'; import 'package:syncrow_app/features/devices/view/widgets/lights/light_interface_contols.dart';
import 'package:syncrow_app/features/devices/view/widgets/lights/light_interface_switch.dart'; import 'package:syncrow_app/features/devices/view/widgets/lights/light_interface_switch.dart';
import 'package:syncrow_app/features/devices/view/widgets/lights/light_interface_timer.dart'; import 'package:syncrow_app/features/devices/view/widgets/lights/light_interface_timer.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
import 'package:syncrow_app/utils/resource_manager/font_manager.dart';
class LightInterface extends StatelessWidget { class LightInterface extends StatelessWidget {
const LightInterface({super.key, required this.light}); const LightInterface({super.key, required this.light});
@ -15,7 +19,26 @@ class LightInterface extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<DevicesCubit, DevicesState>( return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) { builder: (context, state) {
return Padding( 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: AppBar(
backgroundColor: Colors.transparent,
centerTitle: true,
title: BodyLarge(
text: light.name ?? "",
fontColor: ColorsManager.primaryColor,
fontWeight: FontsManager.bold,
),
),
body: Padding(
padding: const EdgeInsets.only(top: 70, right: 20, left: 20), padding: const EdgeInsets.only(top: 70, right: 20, left: 20),
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
@ -27,6 +50,9 @@ class LightInterface extends StatelessWidget {
], ],
), ),
), ),
),
),
),
); );
}, },
); );

View File

@ -1,5 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.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/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/ac_interface.dart';
import 'package:syncrow_app/features/devices/view/widgets/lights/light_interface.dart'; import 'package:syncrow_app/features/devices/view/widgets/lights/light_interface.dart';
@ -30,7 +32,10 @@ class RoomPageSwitch extends StatelessWidget {
Navigator.push( Navigator.push(
context, context,
CustomPageRoute( CustomPageRoute(
builder: (context) => AcInterface(deviceModel: device), builder: (context) => BlocProvider(
create: (context) => DevicesCubit(),
child: AcInterface(deviceModel: device),
),
), ),
); );
break; break;
@ -51,17 +56,23 @@ class RoomPageSwitch extends StatelessWidget {
Navigator.push( Navigator.push(
context, context,
CustomPageRoute( CustomPageRoute(
builder: (context) => LightInterface(light: device), builder: (context) => BlocProvider(
create: (context) => DevicesCubit(),
child: LightInterface(light: device),
),
), ),
); );
case DeviceType.ThreeGang: case DeviceType.ThreeGang:
Navigator.push( Navigator.push(
context, context,
CustomPageRoute( CustomPageRoute(
builder: (context) => ThreeGangInterface( builder: (context) => BlocProvider(
create: (context) => DevicesCubit(),
child: ThreeGangInterface(
gangSwitch: device, gangSwitch: device,
), ),
), ),
),
); );
break; break;
default: default:

View File

@ -6,9 +6,11 @@ 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/device_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/ACs/category_view_app_bar.dart'; import 'package:syncrow_app/features/devices/view/widgets/ACs/category_view_app_bar.dart';
import 'package:syncrow_app/features/devices/view/widgets/three_gang/three_gang_interface_body.dart'; import 'package:syncrow_app/features/devices/view/widgets/three_gang/three_gang_interface_body.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/generated/assets.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/color_manager.dart';
import 'package:syncrow_app/utils/resource_manager/constants.dart'; import 'package:syncrow_app/utils/resource_manager/constants.dart';
import 'package:syncrow_app/utils/resource_manager/font_manager.dart';
class ThreeGangInterface extends StatelessWidget { class ThreeGangInterface extends StatelessWidget {
const ThreeGangInterface({super.key, required this.gangSwitch}); const ThreeGangInterface({super.key, required this.gangSwitch});
@ -26,10 +28,16 @@ class ThreeGangInterface extends StatelessWidget {
backgroundColor: ColorsManager.backgroundColor, backgroundColor: ColorsManager.backgroundColor,
extendBodyBehindAppBar: true, extendBodyBehindAppBar: true,
extendBody: true, extendBody: true,
appBar: const CategoryViewAppBar(), appBar: AppBar(
body: BlocBuilder<HomeCubit, HomeState>( backgroundColor: Colors.transparent,
builder: (context, state) { centerTitle: true,
return Container( title: BodyLarge(
text: gangSwitch.name ?? "",
fontColor: ColorsManager.primaryColor,
fontWeight: FontsManager.bold,
),
),
body: Container(
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height, height: MediaQuery.sizeOf(context).height,
decoration: const BoxDecoration( decoration: const BoxDecoration(
@ -52,9 +60,8 @@ class ThreeGangInterface extends StatelessWidget {
device: gangSwitch, device: gangSwitch,
), ),
), ),
); ),
}, ),
)),
), ),
); );
} }

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart'; import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart';
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
import 'package:syncrow_app/utils/resource_manager/constants.dart'; import 'package:syncrow_app/utils/resource_manager/constants.dart';
import 'package:syncrow_app/utils/resource_manager/theme_manager.dart'; import 'package:syncrow_app/utils/resource_manager/theme_manager.dart';
@ -18,12 +19,8 @@ class MyApp extends StatelessWidget {
MediaQuery.sizeOf(context).height * Constants.appBarHeightPercentage; MediaQuery.sizeOf(context).height * Constants.appBarHeightPercentage;
Constants.bottomNavBarHeight = MediaQuery.sizeOf(context).height * Constants.bottomNavBarHeight = MediaQuery.sizeOf(context).height *
Constants.bottomNavBarHeightPercentage; Constants.bottomNavBarHeightPercentage;
return MultiBlocProvider( return BlocProvider(
providers: [
BlocProvider(
create: (context) => AuthCubit(), create: (context) => AuthCubit(),
),
],
child: MaterialApp( child: MaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
color: ColorsManager.primaryColor, color: ColorsManager.primaryColor,

View File

@ -25,13 +25,9 @@ class Router {
return MaterialPageRoute( return MaterialPageRoute(
builder: (_) => const SplashView(), settings: settings); builder: (_) => const SplashView(), settings: settings);
case Routes.devicesRoute: // case Routes.devicesRoute:
return MaterialPageRoute( // return MaterialPageRoute(
builder: (_) => BlocProvider( // builder: (_) => const DevicesView(), settings: settings);
create: (_) => DevicesCubit.getInstance(),
child: const DevicesView(),
),
settings: settings);
case Routes.profileRoute: case Routes.profileRoute:
return MaterialPageRoute( return MaterialPageRoute(

View File

@ -30,10 +30,12 @@ class ServerFailure extends Failure {
case DioExceptionType.badResponse: case DioExceptionType.badResponse:
{ {
var document = parser.parse(dioError.response!.data.toString()); // var document = parser.parse(dioError.response!.data.toString());
var message = document.body!.text; // var message = document.body!.text;
return ServerFailure.fromResponse( return ServerFailure.fromResponse(
dioError.response!.statusCode!, message); dioError.response!.statusCode!, dioError.response!.data.toString()
// message
);
} }
case DioExceptionType.cancel: case DioExceptionType.cancel:
return ServerFailure("The request to ApiServer was canceled"); return ServerFailure("The request to ApiServer was canceled");