Merge pull request #15 from SyncrowIOT/web_fix_bugs_3

Web fix bugs 3
This commit is contained in:
Abdullah
2024-09-05 09:44:50 +03:00
committed by GitHub
17 changed files with 257 additions and 229 deletions
+6 -2
View File
@@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart';
import 'package:syncrow_web/pages/home/bloc/home_bloc.dart';
import 'package:syncrow_web/pages/home/bloc/home_event.dart';
import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:syncrow_web/services/locator.dart';
@@ -13,7 +14,8 @@ import 'package:syncrow_web/utils/theme/theme.dart';
Future<void> main() async {
try {
const environment = String.fromEnvironment('FLAVOR', defaultValue: 'production');
const environment =
String.fromEnvironment('FLAVOR', defaultValue: 'development');
await dotenv.load(fileName: '.env.$environment');
WidgetsFlutterBinding.ensureInitialized();
initialSetup();
@@ -43,9 +45,11 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
//HomeBloc.fetchUserInfo();
return MultiBlocProvider(
providers: [
BlocProvider(create: (context) => HomeBloc()),
BlocProvider(
create: (context) => HomeBloc()..add(const FetchUserInfo())),
BlocProvider<VisitorPasswordBloc>(
create: (context) => VisitorPasswordBloc(),
)
@@ -59,7 +59,6 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout {
builder: (context, state) {
final accessBloc = BlocProvider.of<AccessBloc>(context);
final filteredData = accessBloc.filteredData;
return state is AccessLoaded
? const Center(child: CircularProgressIndicator())
: Container(
@@ -87,6 +86,7 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout {
const SizedBox(height: 20),
Expanded(
child: DynamicTable(
tableName: 'AccessManagement',
uuidIndex: 1,
withSelectAll: true,
isEmpty: filteredData.isEmpty,
+1 -2
View File
@@ -132,7 +132,6 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
void _login(LoginButtonPressed event, Emitter<AuthState> emit) async {
emit(AuthLoading());
if (isChecked) {
try {
if (event.username.isEmpty || event.password.isEmpty) {
@@ -149,7 +148,7 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
);
} catch (failure) {
validate = 'Invalid Credentials!';
emit(const LoginFailure(error: 'Invalid Credentials!'));
emit(LoginInitial());
return;
}
@@ -138,15 +138,6 @@ class ForgetPasswordWebPage extends StatelessWidget {
CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
"Country/Region",
style: Theme.of(context)
.textTheme
.bodySmall!
.copyWith(
fontSize: 14,
fontWeight: FontWeight.w400),
),
const SizedBox(height: 10),
SizedBox(
child: _buildDropdownField(context, forgetBloc, size)
@@ -171,6 +162,7 @@ class ForgetPasswordWebPage extends StatelessWidget {
const SizedBox(height: 10),
SizedBox(
child: TextFormField(
controller:forgetBloc.forgetEmailController ,
validator: forgetBloc.validateEmail,
decoration: textBoxDecoration()!
.copyWith(
+33 -32
View File
@@ -410,38 +410,39 @@ class _LoginWebPageState extends State<LoginWebPage>
},
),
),
SizedBox(
width: 220,
child: RichText(
text: TextSpan(
text: 'Agree to ',
style: const TextStyle(color: Colors.white),
children: [
TextSpan(
text: '(Terms of Service)',
style: const TextStyle(color: Colors.black),
recognizer: TapGestureRecognizer()
..onTap = () {
loginBloc.launchURL('https://example.com/terms');
},
),
TextSpan(
text: ' (Legal Statement)',
style: const TextStyle(color: Colors.black),
recognizer: TapGestureRecognizer()
..onTap = () {
loginBloc.launchURL('https://example.com/legal');
},
),
TextSpan(
text: ' (Privacy Statement)',
style: const TextStyle(color: Colors.black),
recognizer: TapGestureRecognizer()
..onTap = () {
loginBloc.launchURL('https://example.com/privacy');
},
),
],
Expanded(
child: SizedBox(
child: RichText(
text: TextSpan(
text: 'Agree to ',
style: const TextStyle(color: Colors.white),
children: [
TextSpan(
text: '(Terms of Service)',
style: const TextStyle(color: Colors.black),
recognizer: TapGestureRecognizer()
..onTap = () {
loginBloc.launchURL('https://example.com/terms');
},
),
TextSpan(
text: ' (Legal Statement)',
style: const TextStyle(color: Colors.black),
recognizer: TapGestureRecognizer()
..onTap = () {
loginBloc.launchURL('https://example.com/legal');
},
),
TextSpan(
text: ' (Privacy Statement)',
style: const TextStyle(color: Colors.black),
recognizer: TapGestureRecognizer()
..onTap = () {
loginBloc.launchURL('https://example.com/privacy');
},
),
],
),
),
),
),
@@ -134,11 +134,27 @@ class DeviceManagementBloc
void _onSearchDevices(
SearchDevices event, Emitter<DeviceManagementState> emit) {
if (_devices.isNotEmpty) {
_selectedDevices.clear();
_selectedIndex = 0;
// If the search fields are all empty, restore the last filtered devices
if ((event.community == null || event.community!.isEmpty) &&
(event.unitName == null || event.unitName!.isEmpty) &&
(event.productName == null || event.productName!.isEmpty)) {
// If the current state is filtered, re-emit the filtered state
if (state is DeviceManagementFiltered) {
add(FilterDevices(_getFilterFromIndex(_selectedIndex)));
}
}
final filteredDevices = _devices.where((device) {
List<AllDevicesModel> devicesToSearch = _devices;
if (state is DeviceManagementFiltered) {
devicesToSearch = (state as DeviceManagementFiltered).filteredDevices;
}
if (devicesToSearch.isNotEmpty) {
_selectedDevices.clear();
_selectedIndex = _selectedIndex;
final filteredDevices = devicesToSearch.where((device) {
final matchesCommunity = event.community == null ||
event.community!.isEmpty ||
(device.room?.name
@@ -157,11 +173,21 @@ class DeviceManagementBloc
?.toLowerCase()
.contains(event.productName!.toLowerCase()) ??
false);
return matchesCommunity && matchesUnit && matchesProductName;
final matchesDeviceName = event.productName == null ||
event.productName!.isEmpty ||
(device.categoryName
?.toLowerCase()
.contains(event.productName!.toLowerCase()) ??
false);
return matchesCommunity &&
matchesUnit &&
(matchesProductName || matchesDeviceName);
}).toList();
emit(DeviceManagementFiltered(
filteredDevices: filteredDevices,
selectedIndex: 0,
selectedIndex: _selectedIndex,
onlineCount: _onlineCount,
offlineCount: _offlineCount,
lowBatteryCount: _lowBatteryCount,
@@ -119,7 +119,7 @@ class AllDevicesModel {
timeZone = json['timeZone']?.toString();
updateTime = int.tryParse(json['updateTime']?.toString() ?? '');
uuid = json['uuid']?.toString();
batteryLevel = int.tryParse(json['batteryLevel']?.toString() ?? '');
batteryLevel = int.tryParse(json['battery']?.toString() ?? '');
}
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
@@ -151,7 +151,7 @@ class AllDevicesModel {
data['timeZone'] = timeZone;
data['updateTime'] = updateTime;
data['uuid'] = uuid;
data['batteryLevel'] = batteryLevel;
data['battery'] = batteryLevel;
return data;
}
}
@@ -53,18 +53,19 @@ class PresenceSpaceType extends StatelessWidget {
return GestureDetector(
onTap: () => action(spaceType.name),
child: Container(
width: 40,
height: 40,
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(100),
border: Border.all(
color: value == spaceType
? ColorsManager.blueColor
: Colors.transparent,
),
color: value == spaceType
? ColorsManager.primaryColorWithOpacity
: ColorsManager.textGray,
),
child: SvgPicture.asset(
icon,
width: 40,
height: 40,
width: 25,
height: 22,
),
),
);
+10
View File
@@ -50,6 +50,16 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
}
}
// static Future fetchUserInfo() async {
// try {
// var uuid =
// await const FlutterSecureStorage().read(key: UserModel.userUuidKey);
// user = await HomeApi().fetchUserInfo(uuid);
// } catch (e) {
// return;
// }
// }
List<HomeItemModel> homeItems = [
HomeItemModel(
title: 'Access',
+1 -15
View File
@@ -1,25 +1,11 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/home/bloc/home_bloc.dart';
import 'package:syncrow_web/pages/home/bloc/home_event.dart';
import 'package:syncrow_web/pages/home/view/home_page_mobile.dart';
import 'package:syncrow_web/pages/home/view/home_page_web.dart';
import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart';
class HomePage extends StatefulWidget {
class HomePage extends StatelessWidget with HelperResponsiveLayout {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> with HelperResponsiveLayout {
@override
void initState() {
super.initState();
context.read<HomeBloc>().add(const FetchUserInfo());
}
@override
Widget build(BuildContext context) {
final isSmallScreen = isSmallScreenSize(context);
+5 -1
View File
@@ -37,13 +37,17 @@ class AuthenticationAPI {
expectedResponseModel: (json) {
return json['data']['cooldown'];
});
return response;
} on DioException catch (e) {
final errorData = e.response!.data;
String errorMessage = errorData['message'];
print('sendOtp=$errorMessage');
if (e.response != null) {
if (e.response!.statusCode == 400) {
final errorData = e.response!.data;
String errorMessage = errorData['message'];
print('sendOtp=$errorMessage');
if (errorMessage == 'User not found') {
return 1;
} else {
+22 -12
View File
@@ -5,13 +5,23 @@ import 'package:syncrow_web/pages/home/bloc/home_state.dart';
import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart';
class WebAppBar extends StatelessWidget with HelperResponsiveLayout {
class WebAppBar extends StatefulWidget {
final Widget? title;
final Widget? centerBody;
final Widget? rightBody;
const WebAppBar({super.key, this.title, this.centerBody, this.rightBody});
@override
State<WebAppBar> createState() => _WebAppBarState();
}
class _WebAppBarState extends State<WebAppBar> with HelperResponsiveLayout {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
bool isSmallScreen = isSmallScreenSize(context);
@@ -26,21 +36,21 @@ class WebAppBar extends StatelessWidget with HelperResponsiveLayout {
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (title != null)
if (widget.title != null)
Align(
alignment: Alignment.centerLeft,
child: title!,
child: widget.title!,
),
if (centerBody != null)
if (widget.centerBody != null)
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: centerBody,
child: widget.centerBody,
),
if (rightBody != null || user != null)
if (widget.rightBody != null || user != null)
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (rightBody != null) rightBody!,
if (widget.rightBody != null) widget.rightBody!,
Row(
children: [
const SizedBox.square(
@@ -77,11 +87,11 @@ class WebAppBar extends StatelessWidget with HelperResponsiveLayout {
Expanded(
child: Row(
children: [
title!,
if (centerBody != null)
widget.title!,
if (widget.centerBody != null)
Padding(
padding: const EdgeInsets.only(left: 80),
child: centerBody!,
child: widget.centerBody!,
),
],
),
@@ -89,10 +99,10 @@ class WebAppBar extends StatelessWidget with HelperResponsiveLayout {
Row(
mainAxisSize: MainAxisSize.min,
children: [
if (rightBody != null)
if (widget.rightBody != null)
Align(
alignment: Alignment.centerRight,
child: rightBody,
child: widget.rightBody,
),
const SizedBox(
width: 10,