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,36 +13,44 @@ class DefaultNavBar extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<HomeCubit, HomeState>( return BlocProvider(
builder: (context, state) { create: (context) => DevicesCubit(),
var cubit = HomeCubit.getInstance(); child: BlocBuilder<DevicesCubit, DevicesState>(
return SizedBox( builder: (context, state) {
height: Constants.bottomNavBarHeight, return BlocBuilder<HomeCubit, HomeState>(
child: BottomNavigationBar( builder: (context, state) {
backgroundColor: Colors.transparent, var cubit = HomeCubit.getInstance();
onTap: (int index) { return SizedBox(
cubit.updatePageIndex(index); height: Constants.bottomNavBarHeight,
if (DevicesCubit.get(context).chosenCategoryView != null) { child: BottomNavigationBar(
DevicesCubit.getInstance().clearCategoriesSelection(context); backgroundColor: Colors.transparent,
} onTap: (int index) {
if (HomeCubit.getInstance().selectedRoom != null) { cubit.updatePageIndex(index);
HomeCubit.getInstance().unselectRoom(); if (DevicesCubit.get(context).chosenCategoryView != null) {
} DevicesCubit.get(context)
.clearCategoriesSelection(context);
}
if (HomeCubit.getInstance().selectedRoom != null) {
HomeCubit.getInstance().unselectRoom();
}
},
currentIndex: HomeCubit.pageIndex,
selectedItemColor: ColorsManager.primaryColor,
selectedLabelStyle: const TextStyle(
color: ColorsManager.primaryColor,
fontSize: 10,
),
showUnselectedLabels: true,
unselectedItemColor: Colors.grey,
type: BottomNavigationBarType.fixed,
elevation: 0,
items: HomeCubit.bottomNavItems,
),
);
}, },
currentIndex: HomeCubit.pageIndex, );
selectedItemColor: ColorsManager.primaryColor, },
selectedLabelStyle: const TextStyle( ),
color: ColorsManager.primaryColor,
fontSize: 10,
),
showUnselectedLabels: true,
unselectedItemColor: Colors.grey,
type: BottomNavigationBarType.fixed,
elevation: 0,
items: HomeCubit.bottomNavItems,
),
);
},
); );
} }
} }

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,80 +18,95 @@ 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(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: Constants.appBarHeight, top: Constants.appBarHeight,
bottom: Constants.bottomNavBarHeight, bottom: Constants.bottomNavBarHeight,
),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const DevicesViewHeader(),
const RoomsSlider(),
const SizedBox(
height: 10,
), ),
child: Column( Expanded(
mainAxisAlignment: MainAxisAlignment.spaceBetween, child: PageView(
children: [ controller: HomeCubit.getInstance().devicesPageController,
const DevicesViewHeader(), onPageChanged: (index) {
const RoomsSlider(), HomeCubit.getInstance().devicesPageChanged(index);
const SizedBox( },
height: 10, children: [
), const WizardPage(),
Expanded( if (HomeCubit.getInstance().selectedSpace != null)
child: PageView( if (HomeCubit.getInstance().selectedSpace!.rooms !=
controller: null)
HomeCubit.getInstance().devicesPageController, ...HomeCubit.getInstance().selectedSpace!.rooms!.map(
onPageChanged: (index) { (room) {
HomeCubit.getInstance().devicesPageChanged(index); return RoomPage(
}, room: room,
children: [ );
const WizardPage(), },
if (HomeCubit.getInstance().selectedSpace != null) )
if (HomeCubit.getInstance().selectedSpace!.rooms != ],
null) ),
...HomeCubit.getInstance() ),
HomeCubit.getInstance().selectedSpace != null
? Padding(
padding: const EdgeInsets.symmetric(
vertical: 7,
),
child: SmoothPageIndicator(
controller:
HomeCubit.getInstance().devicesPageController,
count: HomeCubit.getInstance()
.selectedSpace! .selectedSpace!
.rooms! .rooms!
.map( .length +
(room) { 1,
return RoomPage( effect: const WormEffect(
room: room, paintStyle: PaintingStyle.stroke,
); dotHeight: 8,
}, dotWidth: 8,
)
],
),
),
HomeCubit.getInstance().selectedSpace != null
? Padding(
padding: const EdgeInsets.symmetric(
vertical: 7,
),
child: SmoothPageIndicator(
controller:
HomeCubit.getInstance().devicesPageController,
count: HomeCubit.getInstance()
.selectedSpace!
.rooms!
.length +
1,
effect: const WormEffect(
paintStyle: PaintingStyle.stroke,
dotHeight: 8,
dotWidth: 8,
),
),
)
: const Center(
child: BodyLarge(text: 'No Home Found'),
), ),
], ),
), )
); : const Center(
} child: BodyLarge(text: 'No Home Found'),
}, ),
); ],
),
);
}
}, },
); );
} }

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,16 +19,38 @@ 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(
padding: const EdgeInsets.only(top: 70, right: 20, left: 20), value: SystemUiOverlayStyle(
child: SingleChildScrollView( statusBarColor: ColorsManager.primaryColor.withOpacity(0.5),
child: Column( statusBarIconBrightness: Brightness.light,
crossAxisAlignment: CrossAxisAlignment.stretch, ),
children: [ child: SafeArea(
LightInterfaceSwitch(light: light), child: Scaffold(
LightInterfaceContols(light: light), backgroundColor: ColorsManager.backgroundColor,
const LightInterfaceTimer(), 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),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
LightInterfaceSwitch(light: light),
LightInterfaceContols(light: light),
const LightInterfaceTimer(),
],
),
),
),
), ),
), ),
); );

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,15 +56,21 @@ 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(
gangSwitch: device, create: (context) => DevicesCubit(),
child: ThreeGangInterface(
gangSwitch: device,
),
), ),
), ),
); );

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});
@ -23,38 +25,43 @@ class ThreeGangInterface extends StatelessWidget {
), ),
child: SafeArea( child: SafeArea(
child: Scaffold( child: Scaffold(
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(
width: MediaQuery.sizeOf(context).width, text: gangSwitch.name ?? "",
height: MediaQuery.sizeOf(context).height, fontColor: ColorsManager.primaryColor,
decoration: const BoxDecoration( fontWeight: FontsManager.bold,
image: DecorationImage( ),
image: AssetImage( ),
Assets.imagesBackground, body: Container(
), width: MediaQuery.sizeOf(context).width,
fit: BoxFit.cover, height: MediaQuery.sizeOf(context).height,
opacity: 0.4, decoration: const BoxDecoration(
), image: DecorationImage(
), image: AssetImage(
child: Padding( Assets.imagesBackground,
padding: EdgeInsets.only( ),
top: Constants.appBarHeight, fit: BoxFit.cover,
left: Constants.defaultPadding, opacity: 0.4,
right: Constants.defaultPadding, ),
bottom: Constants.bottomNavBarHeight, ),
), child: Padding(
child: ThreeGangInterfaceBody( padding: EdgeInsets.only(
device: gangSwitch, top: Constants.appBarHeight,
), left: Constants.defaultPadding,
), right: Constants.defaultPadding,
); bottom: Constants.bottomNavBarHeight,
}, ),
)), child: ThreeGangInterfaceBody(
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: [ create: (context) => AuthCubit(),
BlocProvider(
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");