You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
8.8 KiB
Dart
254 lines
8.8 KiB
Dart
|
1 month ago
|
import 'dart:convert';
|
||
|
|
|
||
|
|
import 'package:flutter/material.dart';
|
||
|
|
import 'package:flutter/services.dart';
|
||
|
|
import 'package:get/get.dart';
|
||
|
|
import 'package:image/image.dart' as img;
|
||
|
|
// import 'package:image_picker/image_picker.dart';
|
||
|
|
|
||
|
|
|
||
|
|
import '../../../core/config/server_response.dart';
|
||
|
|
import '../../../core/constants/app_contants.dart';
|
||
|
|
import '../../../core/constants/form_field_constants.dart';
|
||
|
|
import '../../../core/constants/translation_keys.dart';
|
||
|
|
import '../../../core/data/repositories/app_repositories.dart';
|
||
|
|
import '../../../core/local_stoarge/app_storage.dart';
|
||
|
|
import '../../../core/utils/SessionCache.dart';
|
||
|
|
import '../../../core/utils/fields_utils.dart';
|
||
|
|
import '../../../core/utils/logs_utils.dart';
|
||
|
|
import '../../../custom_widgets/Fields/input_field.dart';
|
||
|
|
import '../../../custom_widgets/custom_button.dart';
|
||
|
|
import '../../../custom_widgets/custom_dropdown.dart';
|
||
|
|
import '../../../custom_widgets/custom_toasty.dart';
|
||
|
|
import '../../../models/DepositAccountResponse.dart';
|
||
|
|
import '../../../models/upload_user_profile_model.dart';
|
||
|
|
import '../../../res/app_colors.dart';
|
||
|
|
import '../../../routes/app_pages.dart';
|
||
|
|
import '../views/account_details_view.dart';
|
||
|
|
import '../views/profile_details_view.dart';
|
||
|
|
import '../views/user_profile_view.dart';
|
||
|
|
|
||
|
|
class UserProfileController extends GetxController {
|
||
|
|
final AppRepositories repository = Get.find<AppRepositories>();
|
||
|
|
|
||
|
|
static bool isDarkMode = false;
|
||
|
|
static RxString cmpCustImage = "".obs;
|
||
|
|
static RxString selectedLocale = "en".obs;
|
||
|
|
|
||
|
|
// ImagePicker imagePicker = ImagePicker();
|
||
|
|
|
||
|
|
late InputField firstNameField;
|
||
|
|
late InputField depositAccountField;
|
||
|
|
// static String? profilePic;
|
||
|
|
var profilePic = ''.obs;
|
||
|
|
List<String> listOfTitles = [
|
||
|
|
"Personal Details",
|
||
|
|
"Login Name",
|
||
|
|
"Mobile Number",
|
||
|
|
"Email Address",
|
||
|
|
];
|
||
|
|
RxList<DropDown> allDepositAccounts = RxList.empty();
|
||
|
|
|
||
|
|
Rx<DepositAccount> selectedDepositAccount = DepositAccount.empty().obs;
|
||
|
|
|
||
|
|
void updateSelectedDeposit(DropDown item) {
|
||
|
|
selectedDepositAccount.value = item.data as DepositAccount;
|
||
|
|
dp("Drop Down item View==========", item);
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
void onInit() {
|
||
|
|
loadProfilePic();
|
||
|
|
super.onInit();
|
||
|
|
|
||
|
|
/// Deposit accounts assign to Drop Down list
|
||
|
|
// for (int i = 0; i < SessionCache.instance.depositAccountList.length; i++) {
|
||
|
|
// DepositAccount depositAccount = SessionCache.instance.depositAccountList.elementAt(i);
|
||
|
|
// dp("=========Desposit All accounts============", depositAccount.toString());
|
||
|
|
// allDepositAccounts.add(
|
||
|
|
// DropDown(i.toString(), "${depositAccount.mbmBkmstitle} - ${depositAccount.mbmBkmsnumber}", depositAccount),
|
||
|
|
// );
|
||
|
|
// }
|
||
|
|
}
|
||
|
|
|
||
|
|
void uploadUserProfilePicture() async {
|
||
|
|
if (profilePic == null || profilePic!.isEmpty) {
|
||
|
|
Toasty.error("Please select an image to upload.");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
hideKeyBoard();
|
||
|
|
UploadUserProfileModel request = UploadUserProfileModel(
|
||
|
|
cmpCustcode: SessionCache.instance.userInfo.cmpCustcode,
|
||
|
|
porOrgacode: SessionCache.instance.userInfo.porOrgacode,
|
||
|
|
cmpCustImage: "",
|
||
|
|
);
|
||
|
|
|
||
|
|
ServerResponse response = await repository.uploadUserProfilePicture(request);
|
||
|
|
if (response.isError) {
|
||
|
|
Toasty.error(response.errorMsg);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
cmpCustImage.value = profilePic.value;
|
||
|
|
Toasty.success("Profile picture updated successfully.");
|
||
|
|
}
|
||
|
|
|
||
|
|
updateLanguage(Locale locale) async {
|
||
|
|
Get.updateLocale(locale);
|
||
|
|
// Get.find<LocaleController>().saveLocale(locale.toString());
|
||
|
|
// localeController.selectedLocale.value = locale.toString();
|
||
|
|
|
||
|
|
UserProfileController.selectedLocale.value = Get.locale!.languageCode;
|
||
|
|
await AppStorage.putString(AppConstants.SELECTED_LOCALE, UserProfileController.selectedLocale.value);
|
||
|
|
await AppStorage.putBoolean(AppConstants.IS_RTL, Directionality.of(Get.context!) == TextDirection.rtl);
|
||
|
|
Get.forceAppUpdate();
|
||
|
|
update();
|
||
|
|
}
|
||
|
|
|
||
|
|
void navigateTo(meuType title) {
|
||
|
|
if (title == meuType.personalDetails) {
|
||
|
|
Get.to(const ProfileDetailsView());
|
||
|
|
} else if (title == meuType.bankAccountDetails) {
|
||
|
|
Get.to(() => const AccountDetailsView());
|
||
|
|
} else if (title == meuType.inviteFriends) {
|
||
|
|
//
|
||
|
|
// Share.share("UCO Digital - Apps on Google Play");
|
||
|
|
} else if (title == meuType.changePass) {
|
||
|
|
Get.toNamed(Routes.changePassword);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// void updateProfilePic({required bool fromCamera}) async {
|
||
|
|
// XFile? imageResult;
|
||
|
|
//
|
||
|
|
// if (fromCamera) {
|
||
|
|
// imageResult = await imagePicker.pickImage(source: ImageSource.camera);
|
||
|
|
// } else {
|
||
|
|
// imageResult = await imagePicker.pickImage(source: ImageSource.gallery);
|
||
|
|
// }
|
||
|
|
//
|
||
|
|
// Get.back();
|
||
|
|
//
|
||
|
|
// if (imageResult != null) {
|
||
|
|
// // Read the image file as bytes
|
||
|
|
// Uint8List imageBytes = await imageResult.readAsBytes();
|
||
|
|
//
|
||
|
|
// // Check the image size
|
||
|
|
// // double sizeInMB = imageBytes.length / (1024 * 1024);
|
||
|
|
// // if (sizeInMB > 1) {
|
||
|
|
// // Toasty.error("Image is more than 1MB. Please select a smaller image.");
|
||
|
|
// // return;
|
||
|
|
// // }
|
||
|
|
//
|
||
|
|
// // Decode the image
|
||
|
|
// img.Image? image = img.decodeImage(imageBytes);
|
||
|
|
// if (image != null) {
|
||
|
|
// // Resize the image to reduce its size
|
||
|
|
// img.Image resizedImage = img.copyResize(image, width: 800); // Adjust the width as needed
|
||
|
|
//
|
||
|
|
// // Encode the resized image to base64
|
||
|
|
// profilePic.value = base64Encode(img.encodeJpg(resizedImage));
|
||
|
|
//
|
||
|
|
// AppStorage.putString(SessionCache.instance.userInfo.cmpUserId, profilePic.value);
|
||
|
|
// // uploadUserProfilePicture();
|
||
|
|
// update();
|
||
|
|
// } else {
|
||
|
|
// Toasty.error("Failed to decode image.");
|
||
|
|
// }
|
||
|
|
// }
|
||
|
|
// }
|
||
|
|
// void updateProfilePic({required bool fromCamera}) async {
|
||
|
|
// XFile? imageResult;
|
||
|
|
//
|
||
|
|
// if (fromCamera) {
|
||
|
|
// imageResult = await imagePicker.pickImage(source: ImageSource.camera);
|
||
|
|
// } else {
|
||
|
|
// imageResult = await imagePicker.pickImage(source: ImageSource.gallery);
|
||
|
|
// }
|
||
|
|
//
|
||
|
|
// Get.back();
|
||
|
|
//
|
||
|
|
// if (imageResult != null) {
|
||
|
|
// // Read the image file as bytes
|
||
|
|
// Uint8List imageBytes = await imageResult.readAsBytes();
|
||
|
|
//
|
||
|
|
// // Decode the image
|
||
|
|
// img.Image? image = img.decodeImage(imageBytes);
|
||
|
|
// if (image != null) {
|
||
|
|
// // Resize the image to reduce its size
|
||
|
|
// img.Image resizedImage = img.copyResize(image, width: 800); // Adjust the width as needed
|
||
|
|
//
|
||
|
|
// // Encode the resized image to base64
|
||
|
|
// profilePic = base64Encode(img.encodeJpg(resizedImage));
|
||
|
|
//
|
||
|
|
// AppStorage.putString("ProfileImage", profilePic!);
|
||
|
|
// uploadUserProfilePicture();
|
||
|
|
// update();
|
||
|
|
// } else {
|
||
|
|
// Toasty.error("Failed to decode image.");
|
||
|
|
// }
|
||
|
|
// }
|
||
|
|
// }
|
||
|
|
|
||
|
|
void removeProfilePic() {
|
||
|
|
AppStorage.delete(SessionCache.instance.userInfo.cmpUserId);
|
||
|
|
profilePic.value = '';
|
||
|
|
update();
|
||
|
|
Get.back();
|
||
|
|
}
|
||
|
|
|
||
|
|
void loadProfilePic() async {
|
||
|
|
// profilePic.value = await AppStorage.getString(SessionCache.instance.userInfo.cmpUserId);
|
||
|
|
// update();
|
||
|
|
String? pic = await AppStorage.getString(SessionCache.instance.userInfo.cmpUserId);
|
||
|
|
profilePic.value = pic;
|
||
|
|
}
|
||
|
|
|
||
|
|
void updateName() {
|
||
|
|
Get.defaultDialog(
|
||
|
|
title: "Update user name",
|
||
|
|
contentPadding: const EdgeInsets.only(left: 14, right: 14, bottom: 4),
|
||
|
|
content: Column(
|
||
|
|
children: [
|
||
|
|
const SizedBox(height: 8),
|
||
|
|
firstNameField = InputField(
|
||
|
|
refKey: FormFieldConstants.instance().getFormKey("nameFeils"),
|
||
|
|
controller: FormFieldConstants.instance().getController("firstNameField"),
|
||
|
|
hintText: "User Name",
|
||
|
|
labelText: TranslationKeys.makeTranslation("User Name"),
|
||
|
|
isTopMarginRequired: false,
|
||
|
|
showLabel: false,
|
||
|
|
inputFormatters: [LengthLimitingTextInputFormatter(FieldUtils.userNameFieldLength)],
|
||
|
|
),
|
||
|
|
const SizedBox(height: 8),
|
||
|
|
Row(
|
||
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
||
|
|
children: [
|
||
|
|
CustomButton(
|
||
|
|
onPressed: () {
|
||
|
|
if (firstNameField.getCustomText().isEmpty) {
|
||
|
|
firstNameField.setError("Enter user name");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
var newUserDetails = SessionCache.instance.depositAccountList.first.copyWith(mbmBkmstitle: firstNameField.getCustomText());
|
||
|
|
|
||
|
|
SessionCache.instance.setDepositAccountList([newUserDetails].obs);
|
||
|
|
|
||
|
|
update();
|
||
|
|
|
||
|
|
Get.back();
|
||
|
|
},
|
||
|
|
buttonText: "Update",
|
||
|
|
buttonPadding: const EdgeInsets.symmetric(vertical: 5, horizontal: 30),
|
||
|
|
textStyle: const TextStyle(fontWeight: FontWeight.w600, fontSize: 16, color: AppColors.black),
|
||
|
|
buttonColor: AppColors.colorSkipBtn,
|
||
|
|
)
|
||
|
|
],
|
||
|
|
),
|
||
|
|
],
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|