getting spaces and rooms from api {null checks}

This commit is contained in:
Mohammad Salameh
2024-03-13 13:52:22 +03:00
parent 0f3cc453ce
commit 024f15728b
26 changed files with 390 additions and 266 deletions
+8 -5
View File
@@ -3,6 +3,7 @@ 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/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';
@@ -20,7 +21,7 @@ class AuthCubit extends Cubit<AuthState> {
TextEditingController passwordController = TextEditingController();
bool isPasswordVisible = false;
GlobalKey<FormState> formKey = GlobalKey<FormState>();
static GlobalKey<FormState> formKey = GlobalKey<FormState>();
void changePasswordVisibility() {
isPasswordVisible = !isPasswordVisible;
@@ -54,15 +55,16 @@ class AuthCubit extends Cubit<AuthState> {
FlutterSecureStorage storage = const FlutterSecureStorage();
await storage.write(
key: Token.loginAccessTokenKey, value: token.accessToken);
const FlutterSecureStorage().write(
key: UserModel.userUuidKey,
value: Token.decodeToken(token.accessToken)['uuid'].toString());
user = UserModel.fromToken(token);
emit(AuthSuccess());
} else {
emit(AuthError('Something went wrong'));
}
} on DioException catch (e) {
emit(AuthError(e.message ?? "Something went wrong"));
throw ServerFailure.fromDioError(e);
emit(AuthError(ServerFailure.fromDioError(e).errMessage));
}
}
@@ -71,9 +73,10 @@ class AuthCubit extends Cubit<AuthState> {
try {
FlutterSecureStorage storage = const FlutterSecureStorage();
await storage.delete(key: Token.loginAccessTokenKey);
NavCubit.clear();
emit(AuthLoggedOut());
} on DioException catch (e) {
throw ServerFailure.fromDioError(e);
emit(AuthError(ServerFailure.fromDioError(e).errMessage));
}
}
}
+31 -6
View File
@@ -10,9 +10,26 @@ class Token {
final String accessToken;
final String refreshToken;
//{
// "email": "[email protected]",
// "userId": 3,
// "uuid": "563e22d2-cb30-46d3-8c48-fa7d762342f0",
// "sessionId": "f76aa067-c915-4921-b04d-9fbc71c4965a",
// "iat": 1710137435,
// "exp": 1710137735
// }
final String sessionId;
final int iat;
final int exp;
Token.emptyConstructor()
: accessToken = '',
refreshToken = '';
refreshToken = '',
sessionId = '',
iat = 0,
exp = 0;
bool get accessTokenIsNotEmpty => accessToken.isNotEmpty;
@@ -23,9 +40,16 @@ class Token {
Token(
this.accessToken,
this.refreshToken,
this.sessionId,
this.iat,
this.exp,
);
Token.refreshToken(this.refreshToken) : accessToken = '';
Token.refreshToken(this.refreshToken)
: accessToken = '',
sessionId = '',
iat = 0,
exp = 0;
factory Token.fromJson(Map<String, dynamic> json) {
//save token to secure storage
@@ -34,15 +58,16 @@ class Token {
key: loginAccessTokenKey, value: json[loginAccessTokenKey] ?? '');
//create token object ?
return Token(
json[loginAccessTokenKey] ?? '', json[loginRefreshTokenKey] ?? '');
return Token(json[loginAccessTokenKey] ?? '',
json[loginRefreshTokenKey] ?? '', '', 0, 0);
}
Map<String, String> toJson() => {loginRefreshTokenKey: refreshToken};
Map<String, String> refreshTokenToJson() =>
{loginRefreshTokenKey: refreshToken};
Map<String, String> accessTokenToJson() => {loginAccessTokenKey: accessToken};
Map<String, dynamic> decodeToken() {
static Map<String, dynamic> decodeToken(String accessToken) {
final parts = accessToken.split('.');
if (parts.length != 3) {
throw Exception('invalid access token');
+2 -5
View File
@@ -1,6 +1,7 @@
import 'package:syncrow_app/features/auth/model/token.dart';
class UserModel {
static String userUuidKey = 'userUuid';
final String? uuid;
final String? email;
final String? name;
@@ -36,13 +37,9 @@ class UserModel {
//uuid to json
Map<String, dynamic> uuIdAsJson() => {
'userUuid': uuid,
};
//from token
factory UserModel.fromToken(Token token) {
Map<String, dynamic> tempJson = token.decodeToken();
Map<String, dynamic> tempJson = Token.decodeToken(token.accessToken);
return UserModel(
uuid: tempJson['uuid'].toString(),
@@ -1,46 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart';
import 'package:syncrow_app/features/shared_widgets/default_button.dart';
class LoginButton extends StatelessWidget {
const LoginButton({
super.key,
});
@override
Widget build(BuildContext context) {
return BlocBuilder<AuthCubit, AuthState>(
builder: (context, state) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
child: DefaultButton(
isDone: state is AuthSuccess,
isLoading: state is AuthLoading,
customButtonStyle: ButtonStyle(
backgroundColor: MaterialStateProperty.all(
Colors.black.withOpacity(.25),
),
foregroundColor: MaterialStateProperty.all(
Colors.white,
),
),
child: const Text(
'Login',
),
onPressed: () {
if (AuthCubit.get(context).formKey.currentState!.validate()) {
AuthCubit.get(context).login();
FocusScope.of(context).unfocus();
}
},
),
),
],
);
},
);
}
}
@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart';
import 'package:syncrow_app/features/auth/view/widgets/login/forget_password.dart';
import 'package:syncrow_app/features/shared_widgets/default_button.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/utils/resource_manager/styles_manager.dart';
@@ -11,10 +13,11 @@ class LoginForm extends StatelessWidget {
@override
Widget build(BuildContext context) {
var formKey = GlobalKey<FormState>();
return BlocBuilder<AuthCubit, AuthState>(
builder: (context, state) {
return Form(
key: AuthCubit.get(context).formKey,
key: formKey,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -40,7 +43,7 @@ class LoginForm extends StatelessWidget {
return null;
},
onTapOutside: (event) {
AuthCubit.get(context).formKey.currentState!.validate();
formKey.currentState!.validate();
},
decoration: defaultInputDecoration(context,
hint: "[email protected]"),
@@ -65,12 +68,44 @@ class LoginForm extends StatelessWidget {
return null;
},
onTapOutside: (event) {
AuthCubit.get(context).formKey.currentState!.validate();
formKey.currentState!.validate();
},
obscureText: !AuthCubit.get(context).isPasswordVisible,
decoration: defaultInputDecoration(context,
hint: "At least 8 characters"),
),
const SizedBox(height: 10),
// const LoginUserAgreement(),
const ForgetPassword(),
const SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
child: DefaultButton(
isDone: state is AuthSuccess,
isLoading: state is AuthLoading,
customButtonStyle: ButtonStyle(
backgroundColor: MaterialStateProperty.all(
Colors.black.withOpacity(.25),
),
foregroundColor: MaterialStateProperty.all(
Colors.white,
),
),
child: const Text(
'Login',
),
onPressed: () {
if (formKey.currentState!.validate()) {
AuthCubit.get(context).login();
FocusScope.of(context).unfocus();
}
},
),
),
],
)
],
),
),
@@ -3,8 +3,6 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart';
import 'package:syncrow_app/features/auth/view/widgets/login/dont_have_an_account.dart';
import 'package:syncrow_app/features/auth/view/widgets/login/forget_password.dart';
import 'package:syncrow_app/features/auth/view/widgets/login/login_button.dart';
import 'package:syncrow_app/features/auth/view/widgets/login/login_divider.dart';
import 'package:syncrow_app/features/auth/view/widgets/login/login_form.dart';
import 'package:syncrow_app/features/auth/view/widgets/login/login_with_google_facebook.dart';
@@ -94,11 +92,6 @@ class LoginView extends StatelessWidget {
height: 20,
),
const LoginForm(),
const SizedBox(height: 10),
// const LoginUserAgreement(),
const ForgetPassword(),
const SizedBox(height: 10),
const LoginButton(),
const LoginDivider(),
const LoginWithGoogleFacebook(),
const DontHaveAnAccount(),