Complete refactoring SFM App Source Code
This commit is contained in:
37
lib/feature/settings/profile/profile_model.dart
Normal file
37
lib/feature/settings/profile/profile_model.dart
Normal file
@@ -0,0 +1,37 @@
|
||||
class User {
|
||||
String? id;
|
||||
String? username;
|
||||
String? role;
|
||||
String? name;
|
||||
String? email;
|
||||
String? phone;
|
||||
String? address;
|
||||
String? notes;
|
||||
String? latitude;
|
||||
String? longitude;
|
||||
|
||||
User(
|
||||
{this.address,
|
||||
this.email,
|
||||
this.id,
|
||||
this.name,
|
||||
this.notes,
|
||||
this.phone,
|
||||
this.role,
|
||||
this.username,
|
||||
this.latitude,
|
||||
this.longitude});
|
||||
|
||||
User.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
username = json['username'];
|
||||
role = json['role'];
|
||||
name = json['name'];
|
||||
email = json['email'];
|
||||
phone = json['phone'];
|
||||
address = json['address'];
|
||||
notes = json['notes'];
|
||||
latitude = json['latitude'];
|
||||
longitude = json['longitude'];
|
||||
}
|
||||
}
|
||||
440
lib/feature/settings/profile/profile_screen.dart
Normal file
440
lib/feature/settings/profile/profile_screen.dart
Normal file
@@ -0,0 +1,440 @@
|
||||
// ignore_for_file: use_build_context_synchronously
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../../product/shared/shared_snack_bar.dart';
|
||||
import '../../../product/constant/icon/icon_constants.dart';
|
||||
import '../../../product/services/api_services.dart';
|
||||
import '../settings_bloc.dart';
|
||||
import '../../../product/shared/shared_input_decoration.dart';
|
||||
import '../../../product/extention/context_extention.dart';
|
||||
import '../../../product/services/language_services.dart';
|
||||
|
||||
import 'profile_model.dart';
|
||||
|
||||
changeUserInfomation(
|
||||
BuildContext context, User user, SettingsBloc settingsBloc) {
|
||||
final formKey = GlobalKey<FormState>();
|
||||
String username = user.name ?? "";
|
||||
String email = user.email ?? "";
|
||||
String tel = user.phone ?? "";
|
||||
String address = user.address ?? "";
|
||||
bool isChange = false;
|
||||
APIServices apiServices = APIServices();
|
||||
showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
useSafeArea: true,
|
||||
context: context,
|
||||
builder: (modalBottomSheetContext) {
|
||||
return StreamBuilder<bool>(
|
||||
stream: settingsBloc.streamIsChangeProfileInfomation,
|
||||
initialData: isChange,
|
||||
builder: (context, isChangeSnapshot) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(appLocalization(context).change_profile_title),
|
||||
centerTitle: true,
|
||||
actions: [
|
||||
isChangeSnapshot.data ?? isChange
|
||||
? IconButton(
|
||||
onPressed: () async {
|
||||
if (formKey.currentState!.validate()) {
|
||||
formKey.currentState!.save();
|
||||
String latitude = user.latitude ?? "";
|
||||
String longitude = user.longitude ?? "";
|
||||
Map<String, dynamic> body = {
|
||||
"name": username,
|
||||
"email": email,
|
||||
"phone": tel,
|
||||
"address": address,
|
||||
"latitude": latitude,
|
||||
"longitude": longitude
|
||||
};
|
||||
int statusCode =
|
||||
await apiServices.updateUserProfile(body);
|
||||
if (statusCode == 200) {
|
||||
showNoIconTopSnackBar(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(context)
|
||||
.notification_update_profile_success,
|
||||
Colors.green,
|
||||
Colors.white);
|
||||
} else {
|
||||
showNoIconTopSnackBar(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(context)
|
||||
.notification_update_profile_failed,
|
||||
Colors.redAccent,
|
||||
Colors.white);
|
||||
}
|
||||
Navigator.pop(modalBottomSheetContext);
|
||||
}
|
||||
},
|
||||
icon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.check),
|
||||
)
|
||||
: const SizedBox.shrink()
|
||||
],
|
||||
),
|
||||
body: SingleChildScrollView(
|
||||
child: Form(
|
||||
key: formKey,
|
||||
child: Padding(
|
||||
padding: context.paddingLow,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
appLocalization(context).change_profile_username,
|
||||
style: context.titleMediumTextStyle,
|
||||
),
|
||||
Padding(
|
||||
padding: context.paddingLowVertical,
|
||||
child: TextFormField(
|
||||
initialValue: username,
|
||||
textInputAction: TextInputAction.next,
|
||||
validator: (usernameValue) {
|
||||
if (usernameValue == "null" ||
|
||||
usernameValue!.isEmpty) {
|
||||
return appLocalization(modalBottomSheetContext)
|
||||
.login_account_not_empty;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
onChanged: (value) {
|
||||
isChange = true;
|
||||
settingsBloc.sinkIsChangeProfileInfomation
|
||||
.add(isChange);
|
||||
},
|
||||
onSaved: (newUsername) {
|
||||
username = newUsername!;
|
||||
},
|
||||
decoration: borderRadiusTopLeftAndBottomRight(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(modalBottomSheetContext)
|
||||
.change_profile_username_hint),
|
||||
),
|
||||
),
|
||||
Text(
|
||||
appLocalization(context).change_profile_email,
|
||||
style: context.titleMediumTextStyle,
|
||||
),
|
||||
Padding(
|
||||
padding: context.paddingLowVertical,
|
||||
child: TextFormField(
|
||||
initialValue: email,
|
||||
textInputAction: TextInputAction.next,
|
||||
validator: (emailValue) {
|
||||
if (emailValue == "null" || emailValue!.isEmpty) {
|
||||
return appLocalization(modalBottomSheetContext)
|
||||
.change_profile_email_not_empty;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
onChanged: (value) {
|
||||
isChange = true;
|
||||
settingsBloc.sinkIsChangeProfileInfomation
|
||||
.add(isChange);
|
||||
},
|
||||
onSaved: (newEmail) {
|
||||
email = newEmail!;
|
||||
},
|
||||
decoration: borderRadiusTopLeftAndBottomRight(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(modalBottomSheetContext)
|
||||
.change_profile_email_hint),
|
||||
),
|
||||
),
|
||||
Text(
|
||||
appLocalization(context).change_profile_tel,
|
||||
style: context.titleMediumTextStyle,
|
||||
),
|
||||
Padding(
|
||||
padding: context.paddingLowVertical,
|
||||
child: TextFormField(
|
||||
initialValue: tel,
|
||||
textInputAction: TextInputAction.next,
|
||||
keyboardType: TextInputType.phone,
|
||||
validator: (telValue) {
|
||||
if (telValue == "null" || telValue!.isEmpty) {
|
||||
return appLocalization(modalBottomSheetContext)
|
||||
.change_profile_tel_not_empty;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
onChanged: (value) {
|
||||
isChange = true;
|
||||
settingsBloc.sinkIsChangeProfileInfomation
|
||||
.add(isChange);
|
||||
},
|
||||
onSaved: (newTel) {
|
||||
tel = newTel!;
|
||||
},
|
||||
decoration: borderRadiusTopLeftAndBottomRight(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(modalBottomSheetContext)
|
||||
.change_profile_tel_hint),
|
||||
),
|
||||
),
|
||||
Text(
|
||||
appLocalization(context).change_profile_address,
|
||||
style: context.titleMediumTextStyle,
|
||||
),
|
||||
Padding(
|
||||
padding: context.paddingLowVertical,
|
||||
child: TextFormField(
|
||||
initialValue: address,
|
||||
textInputAction: TextInputAction.done,
|
||||
onSaved: (newAddress) {
|
||||
address = newAddress!;
|
||||
},
|
||||
onChanged: (value) {
|
||||
isChange = true;
|
||||
settingsBloc.sinkIsChangeProfileInfomation
|
||||
.add(isChange);
|
||||
},
|
||||
decoration: borderRadiusTopLeftAndBottomRight(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(modalBottomSheetContext)
|
||||
.change_profile_address_hint),
|
||||
),
|
||||
),
|
||||
SizedBox(height: context.mediumValue),
|
||||
isChangeSnapshot.data ?? isChange
|
||||
? Center(
|
||||
child: TextButton(
|
||||
onPressed: () async {
|
||||
if (formKey.currentState!.validate()) {
|
||||
formKey.currentState!.save();
|
||||
String latitude = user.latitude ?? "";
|
||||
String longitude = user.longitude ?? "";
|
||||
Map<String, dynamic> body = {
|
||||
"name": username,
|
||||
"email": email,
|
||||
"phone": tel,
|
||||
"address": address,
|
||||
"latitude": latitude,
|
||||
"longitude": longitude
|
||||
};
|
||||
int statusCode = await apiServices
|
||||
.updateUserProfile(body);
|
||||
if (statusCode == 200) {
|
||||
showNoIconTopSnackBar(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(context)
|
||||
.notification_update_profile_success,
|
||||
Colors.green,
|
||||
Colors.white);
|
||||
} else {
|
||||
showNoIconTopSnackBar(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(context)
|
||||
.notification_update_profile_failed,
|
||||
Colors.redAccent,
|
||||
Colors.white);
|
||||
}
|
||||
Navigator.pop(modalBottomSheetContext);
|
||||
}
|
||||
},
|
||||
style: const ButtonStyle(
|
||||
backgroundColor:
|
||||
MaterialStatePropertyAll(Colors.blue),
|
||||
foregroundColor:
|
||||
MaterialStatePropertyAll(Colors.white),
|
||||
),
|
||||
child: Text(appLocalization(context)
|
||||
.update_button_content),
|
||||
),
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
changeUserPassword(BuildContext context, SettingsBloc settingsBloc) {
|
||||
final formKey = GlobalKey<FormState>();
|
||||
String oldPass = "";
|
||||
String newPass = "";
|
||||
APIServices apiServices = APIServices();
|
||||
bool isChange = false;
|
||||
showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
useSafeArea: true,
|
||||
context: context,
|
||||
builder: (modalBottomSheetContext) {
|
||||
return StreamBuilder<bool>(
|
||||
stream: settingsBloc.streamIsChangeProfileInfomation,
|
||||
initialData: isChange,
|
||||
builder: (context, isChangeSnapshot) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(appLocalization(context).change_profile_title),
|
||||
centerTitle: true,
|
||||
actions: [
|
||||
isChangeSnapshot.data ?? isChange
|
||||
? IconButton(
|
||||
onPressed: () async {
|
||||
if (formKey.currentState!.validate()) {
|
||||
formKey.currentState!.save();
|
||||
Map<String, dynamic> body = {
|
||||
"password_old": oldPass,
|
||||
"password_new": newPass,
|
||||
};
|
||||
int statusCode =
|
||||
await apiServices.updateUserPassword(body);
|
||||
if (statusCode == 200) {
|
||||
showNoIconTopSnackBar(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(context)
|
||||
.notification_update_password_success,
|
||||
Colors.green,
|
||||
Colors.white);
|
||||
} else {
|
||||
showNoIconTopSnackBar(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(context)
|
||||
.notification_update_password_failed,
|
||||
Colors.redAccent,
|
||||
Colors.white);
|
||||
}
|
||||
Navigator.pop(modalBottomSheetContext);
|
||||
}
|
||||
},
|
||||
icon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.check),
|
||||
)
|
||||
: const SizedBox.shrink()
|
||||
],
|
||||
),
|
||||
body: SingleChildScrollView(
|
||||
child: Form(
|
||||
key: formKey,
|
||||
child: Padding(
|
||||
padding: context.paddingLow,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
appLocalization(context).change_profile_old_pass,
|
||||
style: context.titleMediumTextStyle,
|
||||
),
|
||||
Padding(
|
||||
padding: context.paddingLowVertical,
|
||||
child: TextFormField(
|
||||
initialValue: oldPass,
|
||||
textInputAction: TextInputAction.next,
|
||||
validator: (oldPassValue) {
|
||||
if (oldPassValue == "null" ||
|
||||
oldPassValue!.isEmpty) {
|
||||
return appLocalization(modalBottomSheetContext)
|
||||
.change_profile_old_pass_not_empty;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
onChanged: (value) {
|
||||
isChange = true;
|
||||
settingsBloc.sinkIsChangeProfileInfomation
|
||||
.add(isChange);
|
||||
},
|
||||
onSaved: (newOldPass) {
|
||||
oldPass = newOldPass!;
|
||||
},
|
||||
decoration: borderRadiusTopLeftAndBottomRight(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(modalBottomSheetContext)
|
||||
.change_profile_old_pass_hint),
|
||||
),
|
||||
),
|
||||
Text(
|
||||
appLocalization(context).change_profile_new_pass,
|
||||
style: context.titleMediumTextStyle,
|
||||
),
|
||||
Padding(
|
||||
padding: context.paddingLowVertical,
|
||||
child: TextFormField(
|
||||
initialValue: newPass,
|
||||
textInputAction: TextInputAction.done,
|
||||
validator: (newPassValue) {
|
||||
if (newPassValue == "null" ||
|
||||
newPassValue!.isEmpty) {
|
||||
return appLocalization(modalBottomSheetContext)
|
||||
.change_profile_new_pass_not_empty;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
onChanged: (value) {
|
||||
isChange = true;
|
||||
settingsBloc.sinkIsChangeProfileInfomation
|
||||
.add(isChange);
|
||||
},
|
||||
onSaved: (newnewPass) {
|
||||
newPass = newnewPass!;
|
||||
},
|
||||
decoration: borderRadiusTopLeftAndBottomRight(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(modalBottomSheetContext)
|
||||
.change_profile_new_pass_hint),
|
||||
),
|
||||
),
|
||||
SizedBox(height: context.mediumValue),
|
||||
isChangeSnapshot.data ?? isChange
|
||||
? Center(
|
||||
child: TextButton(
|
||||
onPressed: () async {
|
||||
if (formKey.currentState!.validate()) {
|
||||
formKey.currentState!.save();
|
||||
Map<String, dynamic> body = {
|
||||
"password_old": oldPass,
|
||||
"password_new": newPass,
|
||||
};
|
||||
int statusCode = await apiServices
|
||||
.updateUserPassword(body);
|
||||
if (statusCode == 200) {
|
||||
showNoIconTopSnackBar(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(context)
|
||||
.notification_update_password_success,
|
||||
Colors.green,
|
||||
Colors.white);
|
||||
} else {
|
||||
showNoIconTopSnackBar(
|
||||
modalBottomSheetContext,
|
||||
appLocalization(context)
|
||||
.notification_update_password_failed,
|
||||
Colors.redAccent,
|
||||
Colors.white);
|
||||
}
|
||||
Navigator.pop(modalBottomSheetContext);
|
||||
}
|
||||
},
|
||||
style: const ButtonStyle(
|
||||
backgroundColor:
|
||||
MaterialStatePropertyAll(Colors.blue),
|
||||
foregroundColor:
|
||||
MaterialStatePropertyAll(Colors.white),
|
||||
),
|
||||
child: Text(appLocalization(context)
|
||||
.update_button_content),
|
||||
),
|
||||
)
|
||||
: const SizedBox.shrink()
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user