Merge pull request #8 from SyncrowIOT/bug_fixing

Bug fixing
This commit is contained in:
Mohammad Salameh
2024-03-25 11:42:55 +03:00
committed by GitHub
24 changed files with 601 additions and 630 deletions
@@ -1,21 +1,129 @@
import 'package:dio/dio.dart';
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/model/space_model.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/devices/model/room_model.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/scene/view/scene_view.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/services/api/network_exception.dart';
import 'package:syncrow_app/services/api/spaces_api.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
import '../../../generated/assets.dart';
part 'home_state.dart';
part 'nav_state.dart';
class HomeCubit extends Cubit<HomeState> {
HomeCubit() : super(SpacesInitial()) {
if (HomeCubit.spaces != null) {
if (selectedSpace == null) {
fetchSpaces().then((value) {
if (selectedSpace != null) {
print('selectedSpace: ${selectedSpace!.name}');
fetchRooms(selectedSpace!);
}
});
}
} else {
fetchSpaces(); // this is for the first time
}
}
class NavCubit extends Cubit<NavState> {
NavCubit() : super(NavInitial());
static HomeCubit get(context) => BlocProvider.of(context);
static NavCubit of(context) => BlocProvider.of<NavCubit>(context);
static List<SpaceModel>? spaces;
static SpaceModel? selectedSpace;
RoomModel? selectedRoom;
PageController devicesPageController = PageController();
PageController roomsPageController = PageController();
var duration = const Duration(milliseconds: 300);
selectSpace(SpaceModel space) {
selectedSpace = space;
emit(SpaceSelected(space));
}
roomSliderPageChanged(int index) {
devicesPageController.animateToPage(
index,
duration: duration,
curve: Curves.linear,
);
if (index == 0) {
unselectRoom();
} else {
selectedRoom = selectedSpace!.rooms![index - 1];
emit(RoomSelected(selectedRoom!));
}
}
devicesPageChanged(int index) {
roomsPageController.animateToPage(
index,
duration: const Duration(milliseconds: 300),
curve: Curves.linear,
);
if (index <= 0) {
unselectRoom();
} else {
selectedRoom = selectedSpace!.rooms![index - 1];
emit(RoomSelected(selectedRoom!));
}
}
unselectRoom() {
selectedRoom = null;
devicesPageController.animateToPage(
0,
duration: duration,
curve: Curves.linear,
);
roomsPageController.animateToPage(
0,
duration: duration,
curve: Curves.linear,
);
emit(RoomUnSelected());
}
fetchSpaces() async {
emit(GetSpacesLoading());
try {
spaces = await SpacesAPI.getSpaces();
selectedSpace = spaces!.isNotEmpty ? selectSpace(spaces!.first) : null;
emit(GetSpacesLoaded(spaces!));
} on DioException catch (e) {
emit(GetSpacesError(ServerFailure.fromDioError(e).errMessage));
}
}
fetchRooms(SpaceModel space) async {
emit(GetSpaceRoomsLoading());
try {
space.rooms = await SpacesAPI.getRooms(space.id!);
if (space.rooms != null) {
emit(GetSpaceRoomsLoaded(space.rooms!));
} else {
emit(GetSpaceRoomsError("No rooms found"));
}
} on DioException catch (e) {
emit(GetSpacesError(ServerFailure.fromDioError(e).errMessage));
}
}
////////////////////////////////////////Nav////////////////////////////////////////
static clear() {
pageIndex = 0;
@@ -128,7 +236,7 @@ class NavCubit extends Cubit<NavState> {
),
};
var bottomNavItems = [
static var bottomNavItems = [
defaultBottomNavBarItem(icon: Assets.iconsDashboard, label: 'Dashboard'),
// defaultBottomNavBarItem(icon: Assets.iconslayout, label: 'Layout'),
defaultBottomNavBarItem(icon: Assets.iconsDevices, label: 'Devices'),
@@ -0,0 +1,48 @@
part of 'home_cubit.dart';
abstract class HomeState {}
class SpacesInitial extends HomeState {}
class GetSpacesLoading extends HomeState {}
class GetSpacesLoaded extends HomeState {
final List<SpaceModel> spaces;
GetSpacesLoaded(this.spaces);
}
class GetSpacesError extends HomeState {
final String errMessage;
GetSpacesError(this.errMessage);
}
class GetSpaceRoomsLoading extends HomeState {}
class GetSpaceRoomsLoaded extends HomeState {
final List<RoomModel> rooms;
GetSpaceRoomsLoaded(this.rooms);
}
class GetSpaceRoomsError extends HomeState {
final String errMessage;
GetSpaceRoomsError(this.errMessage);
}
class SpaceSelected extends HomeState {
final SpaceModel space;
SpaceSelected(this.space);
}
class RoomSelected extends HomeState {
final RoomModel room;
RoomSelected(this.room);
}
class RoomUnSelected extends HomeState {}
class NavChangePage extends HomeState {}
@@ -1,7 +0,0 @@
part of 'nav_cubit.dart';
abstract class NavState {}
class NavInitial extends NavState {}
class NavChangePage extends NavState {}
@@ -1,110 +0,0 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/devices/model/room_model.dart';
import 'package:syncrow_app/services/api/network_exception.dart';
import 'package:syncrow_app/services/api/spaces_api.dart';
part 'spaces_state.dart';
class SpacesCubit extends Cubit<SpacesState> {
SpacesCubit() : super(SpacesInitial()) {
fetchSpaces().then((value) {
if (selectedSpace != null) {
fetchRooms(selectedSpace!);
}
});
}
static SpacesCubit get(context) => BlocProvider.of(context);
static List<SpaceModel> spaces = [];
static SpaceModel? selectedSpace = spaces.isNotEmpty ? spaces.first : null;
RoomModel? selectedRoom;
PageController devicesPageController = PageController();
PageController roomsPageController = PageController();
var duration = const Duration(milliseconds: 300);
selectSpace(SpaceModel space) {
selectedSpace = space;
emit(SpacesSelected(space));
}
roomSliderPageChanged(int index) {
devicesPageController.animateToPage(
index,
duration: duration,
curve: Curves.linear,
);
if (index == 0) {
unselectRoom();
} else {
selectedRoom = selectedSpace!.rooms![index - 1];
emit(RoomSelected(selectedRoom!));
}
}
devicesPageChanged(int index) {
roomsPageController.animateToPage(
index,
duration: const Duration(milliseconds: 300),
curve: Curves.linear,
);
if (index <= 0) {
unselectRoom();
} else {
selectedRoom = selectedSpace!.rooms![index - 1];
emit(RoomSelected(selectedRoom!));
}
}
unselectRoom() {
selectedRoom = null;
devicesPageController.animateToPage(
0,
duration: duration,
curve: Curves.linear,
);
roomsPageController.animateToPage(
0,
duration: duration,
curve: Curves.linear,
);
emit(RoomUnSelected());
}
fetchSpaces() async {
emit(SpacesLoading());
try {
spaces = await SpacesAPI.getSpaces();
spaces.isNotEmpty ? selectSpace(spaces.first) : null;
emit(SpacesLoaded(spaces));
} on DioException catch (e) {
emit(SpacesError(ServerFailure.fromDioError(e).errMessage));
}
}
fetchRooms(SpaceModel space) async {
emit(SpaceRoomsLoading());
try {
space.rooms = await SpacesAPI.getRooms(space.id!);
if (space.rooms != null) {
emit(SpaceRoomsLoaded(space.rooms!));
} else {
emit(SpaceRoomsError("No rooms found"));
}
} on DioException catch (e) {
emit(SpacesError(ServerFailure.fromDioError(e).errMessage));
}
}
}
@@ -1,45 +0,0 @@
part of 'spaces_cubit.dart';
abstract class SpacesState {}
class SpacesInitial extends SpacesState {}
class SpacesLoading extends SpacesState {}
class SpacesLoaded extends SpacesState {
final List<SpaceModel> spaces;
SpacesLoaded(this.spaces);
}
class SpacesError extends SpacesState {
final String errMessage;
SpacesError(this.errMessage);
}
class SpaceRoomsLoading extends SpacesLoading {}
class SpaceRoomsLoaded extends SpacesLoading {
final List<RoomModel> rooms;
SpaceRoomsLoaded(this.rooms);
}
class SpaceRoomsError extends SpacesError {
SpaceRoomsError(super.errMessage);
}
class SpacesSelected extends SpacesState {
final SpaceModel space;
SpacesSelected(this.space);
}
class RoomSelected extends SpacesState {
final RoomModel room;
RoomSelected(this.room);
}
class RoomUnSelected extends SpacesState {}
+11 -17
View File
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/spaces_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/app_layout/view/widgets/app_body.dart';
import 'package:syncrow_app/features/app_layout/view/widgets/default_app_bar.dart';
import 'package:syncrow_app/features/app_layout/view/widgets/default_nav_bar.dart';
@@ -18,15 +18,15 @@ class AppLayout extends StatelessWidget {
return MultiBlocProvider(
providers: [
BlocProvider(
create: (context) => SpacesCubit(),
create: (context) => HomeCubit(),
),
BlocProvider(
create: (context) => DevicesCubit(),
),
],
child: BlocListener<SpacesCubit, SpacesState>(
child: BlocListener<HomeCubit, HomeState>(
listener: (context, state) {
if (state is SpacesError) {
if (state is GetSpacesError) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(state.errMessage),
@@ -36,7 +36,7 @@ class AppLayout extends StatelessWidget {
.popUntil((route) => route.settings.name == Routes.authLogin);
}
},
child: BlocBuilder<NavCubit, NavState>(
child: BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) {
return AnnotatedRegion(
value: SystemUiOverlayStyle(
@@ -44,21 +44,15 @@ class AppLayout extends StatelessWidget {
statusBarIconBrightness: Brightness.light,
),
child: SafeArea(
child: BlocBuilder<SpacesCubit, SpacesState>(
child: BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) {
return Scaffold(
return const Scaffold(
backgroundColor: ColorsManager.backgroundColor,
extendBodyBehindAppBar: true,
extendBody: true,
appBar:
state is! SpacesLoading || state is! SpaceRoomsLoading
? const DefaultAppBar()
: null,
body: const AppBody(),
bottomNavigationBar:
state is! SpacesLoading || state is! SpaceRoomsLoading
? const DefaultNavBar()
: null,
appBar: DefaultAppBar(),
body: AppBody(),
bottomNavigationBar: DefaultNavBar(),
);
},
),
@@ -1,7 +1,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/spaces_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/utils/context_extension.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
@@ -15,62 +15,64 @@ class AppBarHomeDropdown extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<SpacesCubit, SpacesState>(
return BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) {
return Padding(
padding: const EdgeInsets.only(left: 10, right: 10),
child: DropdownButton(
icon: const Icon(
Icons.expand_more,
color: Colors.black,
size: 25,
),
underline: const SizedBox.shrink(),
padding: const EdgeInsets.all(0),
borderRadius: BorderRadius.circular(20),
value: SpacesCubit.selectedSpace!.id,
items: SpacesCubit.spaces.map((space) {
return DropdownMenuItem(
value: space.id,
child: SizedBox(
width: 100,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
SvgPicture.asset(
Assets.iconsHome,
width: 25,
height: 25,
colorFilter: const ColorFilter.mode(
ColorsManager.textPrimaryColor,
BlendMode.srcIn,
),
),
const SizedBox(width: 5),
Expanded(
child: BodyMedium(
text: space.name ?? "??",
style: context.bodyMedium.copyWith(
fontSize: 15,
color: ColorsManager.textPrimaryColor,
overflow: TextOverflow.ellipsis,
),
),
),
],
return HomeCubit.selectedSpace == null
? const Center(child: BodyMedium(text: 'No Home Selected'))
: Padding(
padding: const EdgeInsets.only(left: 10, right: 10),
child: DropdownButton(
icon: const Icon(
Icons.expand_more,
color: Colors.black,
size: 25,
),
underline: const SizedBox.shrink(),
padding: const EdgeInsets.all(0),
borderRadius: BorderRadius.circular(20),
value: HomeCubit.selectedSpace!.id,
items: HomeCubit.spaces!.map((space) {
return DropdownMenuItem(
value: space.id,
child: SizedBox(
width: 100,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
SvgPicture.asset(
Assets.iconsHome,
width: 25,
height: 25,
colorFilter: const ColorFilter.mode(
ColorsManager.textPrimaryColor,
BlendMode.srcIn,
),
),
const SizedBox(width: 5),
Expanded(
child: BodyMedium(
text: space.name ?? "??",
style: context.bodyMedium.copyWith(
fontSize: 15,
color: ColorsManager.textPrimaryColor,
overflow: TextOverflow.ellipsis,
),
),
),
],
),
),
);
}).toList(),
onChanged: (value) {
if (value != null) {
HomeCubit.get(context).selectSpace(HomeCubit.spaces!
.firstWhere((element) => element.id == value));
}
},
),
);
}).toList(),
onChanged: (value) {
if (value != null) {
SpacesCubit.get(context).selectSpace(SpacesCubit.spaces
.firstWhere((element) => element.id == value));
}
},
),
);
},
);
}
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/spaces_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import '../../../../generated/assets.dart';
@@ -12,7 +12,7 @@ class AppBody extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<NavCubit, NavState>(
return BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) {
return Container(
width: MediaQuery.sizeOf(context).width,
@@ -26,9 +26,9 @@ class AppBody extends StatelessWidget {
opacity: 0.4,
),
),
child: BlocConsumer<SpacesCubit, SpacesState>(
child: BlocConsumer<HomeCubit, HomeState>(
listener: (context, state) {
if (state is SpacesError) {
if (state is GetSpacesError) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(state.errMessage),
@@ -37,8 +37,9 @@ class AppBody extends StatelessWidget {
}
},
builder: (context, state) {
return state is! SpacesLoading || state is! SpaceRoomsLoading
? NavCubit.of(context).pages[NavCubit.pageIndex]
return state is! GetSpacesLoading ||
state is! GetSpaceRoomsLoading
? HomeCubit.get(context).pages[HomeCubit.pageIndex]
: const Center(child: CircularProgressIndicator());
},
),
@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/spaces_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/utils/resource_manager/constants.dart';
class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
@@ -9,28 +10,25 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<NavCubit, NavState>(
return BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) {
return BlocBuilder<SpacesCubit, SpacesState>(
builder: (context, state) {
return Padding(
padding: const EdgeInsets.only(
top: 20,
),
child: AppBar(
backgroundColor: Colors.transparent,
leadingWidth: 150,
toolbarHeight: Constants.appBarHeight,
leading: SpacesCubit.spaces.isNotEmpty
? NavCubit.appBarLeading[
NavCubit().bottomNavItems[NavCubit.pageIndex].label]
: null,
actions: NavCubit.appBarActions[
NavCubit().bottomNavItems[NavCubit.pageIndex].label],
),
);
},
);
return Padding(
padding: const EdgeInsets.only(
top: 20,
),
child: AppBar(
backgroundColor: Colors.transparent,
leadingWidth: 150,
toolbarHeight: Constants.appBarHeight,
leading: HomeCubit.spaces != null
? HomeCubit.spaces!.isNotEmpty
? HomeCubit.appBarLeading[
HomeCubit.bottomNavItems[HomeCubit.pageIndex].label]
: const Center(child: BodySmall(text: 'Create Home'))
: null,
actions: HomeCubit.appBarActions[
HomeCubit.bottomNavItems[HomeCubit.pageIndex].label],
));
},
);
}
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/spaces_cubit.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/utils/resource_manager/color_manager.dart';
import 'package:syncrow_app/utils/resource_manager/constants.dart';
@@ -13,9 +13,9 @@ class DefaultNavBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<NavCubit, NavState>(
return BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) {
var cubit = NavCubit.of(context);
var cubit = HomeCubit.get(context);
return SizedBox(
height: Constants.bottomNavBarHeight,
child: BottomNavigationBar(
@@ -25,11 +25,11 @@ class DefaultNavBar extends StatelessWidget {
if (DevicesCubit.get(context).chosenCategoryView != null) {
DevicesCubit().clearCategoriesSelection(context);
}
if (SpacesCubit.get(context).selectedRoom != null) {
SpacesCubit.get(context).unselectRoom();
if (HomeCubit.get(context).selectedRoom != null) {
HomeCubit.get(context).unselectRoom();
}
},
currentIndex: NavCubit.pageIndex,
currentIndex: HomeCubit.pageIndex,
selectedItemColor: ColorsManager.primaryColor,
selectedLabelStyle: const TextStyle(
color: ColorsManager.primaryColor,
@@ -39,7 +39,7 @@ class DefaultNavBar extends StatelessWidget {
unselectedItemColor: Colors.grey,
type: BottomNavigationBarType.fixed,
elevation: 0,
items: cubit.bottomNavItems,
items: HomeCubit.bottomNavItems,
),
);
},
+3 -4
View File
@@ -3,7 +3,8 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/auth/model/login_with_email_model.dart';
import 'package:syncrow_app/features/auth/model/token.dart';
import 'package:syncrow_app/features/auth/model/user_model.dart';
@@ -41,8 +42,6 @@ class AuthCubit extends Cubit<AuthState> {
static Token token = Token.emptyConstructor();
// (FlutterSecureStorage().read(key :'token'));
login() async {
emit(AuthLoading());
try {
@@ -75,7 +74,7 @@ class AuthCubit extends Cubit<AuthState> {
try {
FlutterSecureStorage storage = const FlutterSecureStorage();
await storage.delete(key: Token.loginAccessTokenKey);
NavCubit.clear();
HomeCubit.clear();
emit(AuthLoggedOut());
} on DioException catch (e) {
emit(AuthError(ServerFailure.fromDioError(e).errMessage));
+4 -2
View File
@@ -3,7 +3,7 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/spaces_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/devices/model/device_category_model.dart';
import 'package:syncrow_app/features/devices/model/device_control_model.dart';
@@ -22,7 +22,9 @@ part 'devices_state.dart';
class DevicesCubit extends Cubit<DevicesState> {
DevicesCubit() : super(DevicesInitial()) {
fetchGroups(SpacesCubit.selectedSpace!.id!);
if (HomeCubit.selectedSpace != null) {
fetchGroups(HomeCubit.selectedSpace!.id!);
}
}
bool _isClosed = false;
+6 -9
View File
@@ -8,15 +8,12 @@ class DevicesView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => DevicesCubit(),
child: BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) => Container(
padding: const EdgeInsets.all(8),
width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height,
child: const DevicesViewBody(),
),
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) => Container(
padding: const EdgeInsets.all(8),
width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height,
child: const DevicesViewBody(),
),
);
}
@@ -22,130 +22,127 @@ class AcInterfaceTempUnit extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => DevicesCubit(),
child: BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
return DefaultContainer(
child: Column(
children: [
Expanded(
flex: 8,
child: SizedBox(
width: 300,
child: SleekCircularSlider(
appearance: CircularSliderAppearance(
customWidths: CustomSliderWidths(
progressBarWidth: 15,
trackWidth: 15,
shadowWidth: 0,
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
return DefaultContainer(
child: Column(
children: [
Expanded(
flex: 8,
child: SizedBox(
width: 300,
child: SleekCircularSlider(
appearance: CircularSliderAppearance(
customWidths: CustomSliderWidths(
progressBarWidth: 15,
trackWidth: 15,
shadowWidth: 0,
),
customColors: CustomSliderColors(
progressBarColor:
ColorsManager.primaryColor.withOpacity(.6),
trackColor: ColorsManager.greyColor,
dotColor: Colors.transparent,
),
infoProperties: InfoProperties(
//TODO: move to strings manager
bottomLabelText: 'CURRENT TEMP',
bottomLabelStyle: context.bodyLarge.copyWith(
color: Colors.grey,
fontWeight: FontsManager.regular,
),
customColors: CustomSliderColors(
progressBarColor:
ColorsManager.primaryColor.withOpacity(.6),
trackColor: ColorsManager.greyColor,
dotColor: Colors.transparent,
),
infoProperties: InfoProperties(
//TODO: move to strings manager
bottomLabelText: 'CURRENT TEMP',
bottomLabelStyle: context.bodyLarge.copyWith(
color: Colors.grey,
fontWeight: FontsManager.regular,
),
modifier: (double value) {
// return '${DeviceModel.temperature.toStringAsFixed(1)}°C';
return '${value.toStringAsFixed(1)}°C';
},
mainLabelStyle: context.titleLarge.copyWith(
height: 0,
letterSpacing: -3,
color: Colors.black,
fontSize: 60,
shadows: [
Shadow(
color: Colors.black.withOpacity(0.5),
offset: const Offset(0, 3),
blurRadius: 6,
),
],
),
modifier: (double value) {
// return '${DeviceModel.temperature.toStringAsFixed(1)}°C';
return '${value.toStringAsFixed(1)}°C';
},
mainLabelStyle: context.titleLarge.copyWith(
height: 0,
letterSpacing: -3,
color: Colors.black,
fontSize: 60,
shadows: [
Shadow(
color: Colors.black.withOpacity(0.5),
offset: const Offset(0, 3),
blurRadius: 6,
),
],
),
),
// min: DeviceModel.bounds.min,
// max: DeviceModel.bounds.max,
// initialValue: DeviceModel.temperature,
onChange: (value) {
String valueAsString = value.toStringAsFixed(1);
if (valueAsString.endsWith(".0") ||
valueAsString.endsWith(".5")) {
value = double.parse(valueAsString);
// DevicesCubit.get(context)
// .setACTemp(DeviceModel, value);
}
},
),
// min: DeviceModel.bounds.min,
// max: DeviceModel.bounds.max,
// initialValue: DeviceModel.temperature,
onChange: (value) {
String valueAsString = value.toStringAsFixed(1);
if (valueAsString.endsWith(".0") ||
valueAsString.endsWith(".5")) {
value = double.parse(valueAsString);
// DevicesCubit.get(context)
// .setACTemp(DeviceModel, value);
}
},
),
),
Expanded(
flex: 2,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
SizedBox.square(
dimension: 24,
child: InkWell(
onTap: () {
// DevicesCubit.get(context)
// .setACTemp(DeviceModel, DeviceModel.coolTo);
// DeviceModel.coolTo -= .5;
},
child: SvgPicture.asset(
Assets.iconsMinus,
),
),
Expanded(
flex: 2,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
SizedBox.square(
dimension: 24,
child: InkWell(
onTap: () {
// DevicesCubit.get(context)
// .setACTemp(DeviceModel, DeviceModel.coolTo);
// DeviceModel.coolTo -= .5;
},
child: SvgPicture.asset(
Assets.iconsMinus,
),
),
Column(
children: [
BodyLarge(
// text: "${DeviceModel.coolTo}° C",
text: '24° C',
style: context.bodyLarge.copyWith(
color:
ColorsManager.primaryColor.withOpacity(0.6),
fontWeight: FontsManager.bold,
fontSize: 30,
height: 0),
),
const BodyMedium(
text: 'COOL TO',
fontSize: 18,
)
],
),
SizedBox.square(
dimension: 24,
child: InkWell(
onTap: () {
// DevicesCubit.get(context)
// .setACTemp(DeviceModel, DeviceModel.coolTo);
// DeviceModel.coolTo += .5;
},
child: SvgPicture.asset(
Assets.iconsPlus,
height: 24,
width: 24,
),
),
Column(
children: [
BodyLarge(
// text: "${DeviceModel.coolTo}° C",
text: '24° C',
style: context.bodyLarge.copyWith(
color:
ColorsManager.primaryColor.withOpacity(0.6),
fontWeight: FontsManager.bold,
fontSize: 30,
height: 0),
),
const BodyMedium(
text: 'COOL TO',
fontSize: 18,
)
],
),
SizedBox.square(
dimension: 24,
child: InkWell(
onTap: () {
// DevicesCubit.get(context)
// .setACTemp(DeviceModel, DeviceModel.coolTo);
// DeviceModel.coolTo += .5;
},
child: SvgPicture.asset(
Assets.iconsPlus,
height: 24,
width: 24,
),
),
],
),
)
],
),
);
},
),
),
],
),
)
],
),
);
},
);
}
}
@@ -43,7 +43,7 @@ class ACsList extends StatelessWidget {
itemBuilder: (context, index) {
DeviceModel ac = DevicesCubit.get(context)
.chosenCategory!
.devices![index] as DeviceModel;
.devices![index];
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -16,61 +16,57 @@ class ACsView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => DevicesCubit(),
child: BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
DeviceModel? selectedAC;
if (DevicesCubit.get(context).getSelectedDevice()
is DeviceModel) {
selectedAC = DevicesCubit.get(context).getSelectedDevice()
as DeviceModel;
}
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: const CategoryViewAppBar(),
body: Container(
width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage(
Assets.imagesBackground,
),
fit: BoxFit.cover,
opacity: 0.4,
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
DeviceModel? selectedAC;
if (DevicesCubit.get(context).getSelectedDevice() is DeviceModel) {
selectedAC =
DevicesCubit.get(context).getSelectedDevice() as DeviceModel;
}
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: const CategoryViewAppBar(),
body: Container(
width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage(
Assets.imagesBackground,
),
fit: BoxFit.cover,
opacity: 0.4,
),
child: Padding(
padding: EdgeInsets.only(
top: Constants.appBarHeight,
left: Constants.defaultPadding,
right: Constants.defaultPadding,
),
child: SizedBox.expand(
child: selectedAC != null
? AcInterface(deviceModel: selectedAC)
: const ACsList(),
),
),
child: Padding(
padding: EdgeInsets.only(
top: Constants.appBarHeight,
left: Constants.defaultPadding,
right: Constants.defaultPadding,
),
child: SizedBox.expand(
child: selectedAC != null
? AcInterface(deviceModel: selectedAC)
: const ACsList(),
),
),
),
),
);
},
);
},
),
),
);
},
);
},
);
}
}
@@ -13,47 +13,44 @@ class CurtainView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => DevicesCubit(),
child: BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
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: const CategoryViewAppBar(),
body: Container(
width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage(
Assets.imagesBackground,
),
fit: BoxFit.cover,
opacity: 0.4,
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
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: const CategoryViewAppBar(),
body: Container(
width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage(
Assets.imagesBackground,
),
fit: BoxFit.cover,
opacity: 0.4,
),
child: Padding(
padding: EdgeInsets.only(
top: Constants.appBarHeight,
left: Constants.defaultPadding,
right: Constants.defaultPadding,
),
child: const CurtainList(),
),
child: Padding(
padding: EdgeInsets.only(
top: Constants.appBarHeight,
left: Constants.defaultPadding,
right: Constants.defaultPadding,
),
child: const CurtainList(),
),
),
),
);
},
),
),
);
},
);
}
}
@@ -1,11 +1,12 @@
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/spaces_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/devices/view/widgets/devices_view_header.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/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/utils/resource_manager/constants.dart';
import '../../bloc/devices_cubit.dart';
@@ -17,73 +18,74 @@ class DevicesViewBody extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => DevicesCubit(),
child: BlocBuilder<SpacesCubit, SpacesState>(
builder: (context, state) {
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
//TODO : move to NavigationCubit
if (state is DevicesLoading) {
return const Center(child: CircularProgressIndicator());
} else {
return Padding(
padding: EdgeInsets.only(
top: Constants.appBarHeight,
bottom: Constants.bottomNavBarHeight,
),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const DevicesViewHeader(),
const RoomsSlider(),
const SizedBox(
height: 10,
return BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) {
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
//TODO : move to NavigationCubit
if (state is DevicesLoading) {
return const Center(child: CircularProgressIndicator());
} else {
return Padding(
padding: EdgeInsets.only(
top: Constants.appBarHeight,
bottom: Constants.bottomNavBarHeight,
),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const DevicesViewHeader(),
const RoomsSlider(),
const SizedBox(
height: 10,
),
Expanded(
child: PageView(
controller:
HomeCubit.get(context).devicesPageController,
onPageChanged: (index) {
HomeCubit.get(context).devicesPageChanged(index);
},
children: [
const WizardPage(),
if (HomeCubit.selectedSpace != null)
if (HomeCubit.selectedSpace!.rooms != null)
...HomeCubit.selectedSpace!.rooms!.map(
(room) {
return RoomPage(
room: room,
);
},
)
],
),
Expanded(
child: PageView(
controller:
SpacesCubit.get(context).devicesPageController,
onPageChanged: (index) {
SpacesCubit.get(context).devicesPageChanged(index);
},
children: [
const WizardPage(),
if (SpacesCubit.selectedSpace != null)
if (SpacesCubit.selectedSpace!.rooms != null)
...SpacesCubit.selectedSpace!.rooms!.map(
(room) {
return RoomPage(
room: room,
);
},
)
],
),
),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 7,
),
child: SmoothPageIndicator(
controller:
SpacesCubit.get(context).devicesPageController,
count: SpacesCubit.selectedSpace!.rooms!.length + 1,
effect: const WormEffect(
paintStyle: PaintingStyle.stroke,
dotHeight: 8,
dotWidth: 8,
),
HomeCubit.selectedSpace != null
? Padding(
padding: const EdgeInsets.symmetric(
vertical: 7,
),
child: SmoothPageIndicator(
controller:
HomeCubit.get(context).devicesPageController,
count: HomeCubit.selectedSpace!.rooms!.length + 1,
effect: const WormEffect(
paintStyle: PaintingStyle.stroke,
dotHeight: 8,
dotWidth: 8,
),
),
)
: const Center(
child: BodyLarge(text: 'No Home Found'),
),
),
),
],
),
);
}
},
);
},
),
],
),
);
}
},
);
},
);
}
}
@@ -41,8 +41,8 @@ class LightInterfaceRecentColor extends StatelessWidget {
margin: const EdgeInsets.only(right: 10),
width: 40,
height: 40,
decoration: ShapeDecoration(
shape: const CircleBorder(),
decoration: const ShapeDecoration(
shape: CircleBorder(),
// color: Color(light.recentColors[index]),
),
),
@@ -14,58 +14,54 @@ class LightsView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => DevicesCubit(),
child: BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
DeviceModel? selectedLight;
if (DevicesCubit.get(context).getSelectedDevice()
is DeviceModel) {
selectedLight = DevicesCubit.get(context).getSelectedDevice()
as DeviceModel;
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
return BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
DeviceModel? selectedLight;
if (DevicesCubit.get(context).getSelectedDevice() is DeviceModel) {
selectedLight =
DevicesCubit.get(context).getSelectedDevice() as DeviceModel;
}
List<DeviceModel> lights = [];
if (DevicesCubit.allCategories![1].devices != null) {
for (var device in DevicesCubit.allCategories![1].devices!) {
lights.add(device);
}
List<DeviceModel> lights = [];
if (DevicesCubit.allCategories![1].devices != null) {
for (var device in DevicesCubit.allCategories![1].devices!) {
lights.add(device);
}
}
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: const CategoryViewAppBar(),
body: Container(
width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage(
Assets.imagesBackground,
),
fit: BoxFit.cover,
opacity: 0.4,
}
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: const CategoryViewAppBar(),
body: Container(
width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage(
Assets.imagesBackground,
),
fit: BoxFit.cover,
opacity: 0.4,
),
child: selectedLight != null
? LightInterface(light: selectedLight)
: LightsViewList(lights: lights),
),
child: selectedLight != null
? LightInterface(light: selectedLight)
: LightsViewList(lights: lights),
),
),
);
},
);
},
),
),
);
},
);
},
);
}
}
@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
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/function_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/ACs/category_view_app_bar.dart';
@@ -26,7 +27,7 @@ class LightSwitchesView extends StatelessWidget {
extendBodyBehindAppBar: true,
extendBody: true,
appBar: const CategoryViewAppBar(),
body: BlocBuilder<NavCubit, NavState>(
body: BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) {
return Container(
width: MediaQuery.sizeOf(context).width,
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/spaces_cubit.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.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/color_manager.dart';
@@ -13,48 +13,48 @@ class RoomsSlider extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<SpacesCubit, SpacesState>(
return BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) {
return SizedBox(
height: 40,
child: PageView(
controller: SpacesCubit.get(context).roomsPageController,
controller: HomeCubit.get(context).roomsPageController,
onPageChanged: (index) {
SpacesCubit.get(context).roomSliderPageChanged(index);
HomeCubit.get(context).roomSliderPageChanged(index);
},
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: InkWell(
onTap: () {
SpacesCubit.get(context).unselectRoom();
HomeCubit.get(context).unselectRoom();
},
child: TitleMedium(
text: StringsManager.wizard,
style: context.titleMedium.copyWith(
fontSize: 25,
color: SpacesCubit.get(context).selectedRoom == null
color: HomeCubit.get(context).selectedRoom == null
? ColorsManager.textPrimaryColor
: ColorsManager.textPrimaryColor.withOpacity(.2),
),
),
),
),
if (SpacesCubit.selectedSpace != null)
if (SpacesCubit.selectedSpace!.rooms != null)
...SpacesCubit.selectedSpace!.rooms!.map(
if (HomeCubit.selectedSpace != null)
if (HomeCubit.selectedSpace!.rooms != null)
...HomeCubit.selectedSpace!.rooms!.map(
(room) => Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: InkWell(
onTap: () {
SpacesCubit.get(context).roomSliderPageChanged(
SpacesCubit.selectedSpace!.rooms!.indexOf(room));
HomeCubit.get(context).roomSliderPageChanged(
HomeCubit.selectedSpace!.rooms!.indexOf(room));
},
child: TitleMedium(
text: room.name!,
style: context.titleMedium.copyWith(
fontSize: 25,
color: SpacesCubit.get(context).selectedRoom == room
color: HomeCubit.get(context).selectedRoom == room
? ColorsManager.textPrimaryColor
: ColorsManager.textPrimaryColor
.withOpacity(.2),
+7 -7
View File
@@ -12,13 +12,12 @@ class SplashView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<AuthCubit, AuthState>(
builder: (context, state) {
return BlocConsumer<AuthCubit, AuthState>(
listener: (context, state) {
if (state is AuthTokenSuccess) {
Future.delayed(const Duration(seconds: 1), () {
Navigator.pushReplacementNamed(context, Routes.homeRoute);
});
} else {
Navigator.pushNamedAndRemoveUntil(
context, Routes.homeRoute, (route) => false);
} else if (state is AuthTokenError) {
Future.delayed(const Duration(seconds: 1), () {
Navigator.pushReplacement(
context,
@@ -26,7 +25,8 @@ class SplashView extends StatelessWidget {
);
});
}
},
builder: (context, state) {
return Scaffold(
body: Stack(
alignment: Alignment.center,
-5
View File
@@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
import 'package:syncrow_app/utils/resource_manager/constants.dart';
@@ -24,10 +23,6 @@ class MyApp extends StatelessWidget {
BlocProvider(
create: (context) => AuthCubit(),
),
BlocProvider(
lazy: false,
create: (context) => NavCubit(),
),
],
child: MaterialApp(
debugShowCheckedModeBanner: false,