user module permission api added. asset inventory switch to user permissions.

design_3.0_asset_inventory_module
Sikander Saleem 5 days ago
parent 659f2029dc
commit ff7ee7f8bb

@ -41,7 +41,7 @@ class ApiManager {
} else {
if (jsonDecode(response.body) is Map<String, dynamic>) {
final message = jsonDecode(response.body)["message"];
if (message != null && message.toString().isNotEmpty) {
if (message != null && message.toString().isNotEmpty && enableToastMessage) {
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
}
}

@ -10,8 +10,8 @@ class URLs {
// static String _baseUrl = "$_host/mobile";
// static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
static final String _baseUrl = "$_host/v4/mobile"; // for asset inventory on UAT
static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
// static final String _baseUrl = "$_host/v4/mobile"; // for asset inventory on UAT
// static final String _baseUrl = "$_host/mobile"; // host local UAT
// static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM
// static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation
@ -30,6 +30,7 @@ class URLs {
static get userChangeAssetGroup => "$_baseUrl/MobileAuth/UserChangeAssetGroup";
static get getUserInfo => "$_baseUrl/MobileAuth/GetUserInfo";
static get getMobilePermissionByUser => "$_baseUrl/Permission/GetMobilePermissionByUser";
static get logout => "$_baseUrl/MobileAuth/Logout";

@ -142,9 +142,13 @@ class AllRequestsProvider extends ChangeNotifier {
if (context.settingProvider.isUserFlowMedical && context.userProvider.user!.type != UsersTypes.normal_user) {
list.add(7); // task mod
}
if (context.userProvider.user!.type != UsersTypes.normal_user) {
list.add(8); //
}
// switching asset inventory to users permissions
context.userProvider.modulesPermissionsList.forEach((module) {
if (module.module!.value! == 8) {
list.add(module.module!.value!);
}
});
return list;
}

@ -8,6 +8,7 @@ import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/module_permissions_model.dart';
import 'package:test_sa/models/new_models/general_response_model.dart';
import 'package:test_sa/models/new_models/update_password.dart';
import 'package:test_sa/models/new_models/verify_otp_model.dart';
@ -43,6 +44,7 @@ class UserProvider extends ChangeNotifier {
SwipeTransaction _swipeTransactionModel = SwipeTransaction();
List<SwipeHistory> _swipeHistory = [];
List<SiteContactInfoModel> _siteContactList = [];
List<ModulesPermissionsModel> _modulesPermissionsModel = [];
UserContactInfoModel userInfoModel = UserContactInfoModel();
SwipeTransaction get swipeTransactionModel => _swipeTransactionModel;
@ -51,6 +53,10 @@ class UserProvider extends ChangeNotifier {
List<SiteContactInfoModel> get siteContactList => _siteContactList;
List<ModulesPermissionsModel> get modulesPermissionsList => _modulesPermissionsModel;
ModulesPermissionsModel currentModelPermission(int moduleId) => ModulesPermissionsModel.fromJson(_modulesPermissionsModel.singleWhere((module) => module.module!.value == moduleId).toJson());
set swipeHistory(List<SwipeHistory> value) {
_swipeHistory = value;
notifyListeners();
@ -104,7 +110,7 @@ class UserProvider extends ChangeNotifier {
notifyListeners();
Response response;
try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
// showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
response = await ApiManager.instance.post(URLs.login, body: await user.toLoginJson());
_loading = false;
@ -114,16 +120,16 @@ class UserProvider extends ChangeNotifier {
_user!.profilePhotoName = URLs.getFileUrl(_user!.profilePhotoName);
ApiManager.instance.user = _user;
notifyListeners();
Navigator.pop(context);
// Navigator.pop(context);
return response.statusCode;
}
notifyListeners();
Navigator.pop(context);
// Navigator.pop(context);
return response.statusCode;
} catch (error) {
// debugPrint(error);
print('SSL or Network Error: $error');
Navigator.pop(context);
// Navigator.pop(context);
_loading = false;
notifyListeners();
return -1;
@ -164,6 +170,24 @@ class UserProvider extends ChangeNotifier {
}
}
Future<bool> getMobilePermissionByUser() async {
_modulesPermissionsModel = [];
Response response;
try {
response = await ApiManager.instance.get(URLs.getMobilePermissionByUser, enableToastMessage: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
List dataList = json.decode(response.body)["data"] ?? [];
_modulesPermissionsModel = List.generate(dataList.length, (index) => ModulesPermissionsModel.fromJson(dataList[index])).where((module) => module.canView!).toList();
if (response.statusCode == 200) {
return true;
}
}
return false;
} catch (error) {
return false;
}
}
Future<bool> logout(BuildContext context) async {
Response response;
try {

@ -95,6 +95,7 @@ class AppBarWidget extends StatelessWidget {
bool isSuccess = await context.userProvider.userChangeAssetGroup();
Utils.hideLoading(context);
if (isSuccess) {
await context.userProvider.getMobilePermissionByUser();
settingProvider.setAssetGroup(newValue);
WidgetsBinding.instance.addPostFrameCallback((_) {
context.settingProvider.setUser(ApiManager.instance.user!);

@ -0,0 +1,51 @@
class ModulesPermissionsModel {
bool? canAdd;
bool? canEdit;
bool? canView;
bool? canDelete;
Module? module;
ModulesPermissionsModel({this.canAdd, this.canEdit, this.canView, this.canDelete, this.module});
ModulesPermissionsModel.fromJson(Map<String, dynamic> json) {
canAdd = json['canAdd'];
canEdit = json['canEdit'];
canView = json['canView'];
canDelete = json['canDelete'];
module = json['module'] != null ? new Module.fromJson(json['module']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['canAdd'] = this.canAdd;
data['canEdit'] = this.canEdit;
data['canView'] = this.canView;
data['canDelete'] = this.canDelete;
if (this.module != null) {
data['module'] = this.module!.toJson();
}
return data;
}
}
class Module {
int? id;
String? name;
int? value;
Module({this.id, this.name, this.value});
Module.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
value = json['value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
data['value'] = this.value;
return data;
}
}

@ -44,6 +44,7 @@ class RecurrentWoData {
String? scheduleDate;
Status? status;
Site? site;
PlanRecurrent? planRecurrent;
Lookup? building;
Lookup? floor;
Lookup? department;
@ -64,6 +65,7 @@ class RecurrentWoData {
this.scheduleDate,
this.status,
this.site,
this.planRecurrent,
this.building,
this.recurrentWoTimerModel,
this.floor,
@ -72,7 +74,7 @@ class RecurrentWoData {
this.planRecurrentMedicalTaskRooms,
this.planRecurrentTaskTimers,
this.timerModelList,
this.recurrentWoTimePicker,
this.recurrentWoTimePicker,
this.comment,
this.totalWorkingHours});
@ -83,6 +85,7 @@ class RecurrentWoData {
engineer = json['engineer'] != null ? new Engineer.fromJson(json['engineer']) : null;
scheduleDate = json['scheduleDate'];
status = json['status'] != null ? Status.fromJson(json['status']) : null;
planRecurrent = json['status'] != null ? PlanRecurrent.fromJson(json['planRecurrent']) : null;
site = json['site'] != null ? Site.fromJson(json['site']) : null;
building = json["building"] == null ? null : Lookup.fromJson(json["building"]);
floor = json["floor"] == null ? null : Lookup.fromJson(json["floor"]);
@ -354,3 +357,124 @@ class PlanRecurrentTaskTimers {
return data;
}
}
class PlanRecurrent {
int? taskTypeId;
Lookup? taskType;
String? planNo;
String? planName;
int? planSequence;
int? frequencyId;
String? frequency;
bool? autoConverstion;
String? comment;
String? scheduleDateFrom1;
String? scheduleDateFrom2;
Site? site;
Lookup? building;
Lookup? floor;
Lookup? department;
Lookup? room;
// List<Null>? planRecurrentMedicalRooms;
bool? friday;
bool? saturday;
bool? sunday;
bool? monday;
bool? tuesday;
bool? wednesday;
bool? thursday;
PlanRecurrent(
{this.taskTypeId,
this.taskType,
this.planNo,
this.planName,
this.planSequence,
this.frequencyId,
this.frequency,
this.autoConverstion,
this.comment,
this.scheduleDateFrom1,
this.scheduleDateFrom2,
this.site,
this.building,
this.floor,
this.department,
this.room,
// this.planRecurrentMedicalRooms,
this.friday,
this.saturday,
this.sunday,
this.monday,
this.tuesday,
this.wednesday,
this.thursday});
PlanRecurrent.fromJson(Map<String, dynamic> json) {
taskTypeId = json['taskTypeId'];
taskType = json['taskType'] != null ? new Lookup.fromJson(json['taskType']) : null;
planNo = json['planNo'];
planName = json['planName'];
planSequence = json['planSequence'];
frequencyId = json['frequencyId'];
frequency = json['frequency'];
autoConverstion = json['autoConverstion'];
comment = json['comment'];
scheduleDateFrom1 = json['scheduleDateFrom1'];
scheduleDateFrom2 = json['scheduleDateFrom2'];
site = json['site'] != null ? Site.fromJson(json['site']) : null;
building = json["building"] == null ? null : Lookup.fromJson(json["building"]);
floor = json["floor"] == null ? null : Lookup.fromJson(json["floor"]);
department = json["department"] == null ? null : Lookup.fromJson(json["department"]);
room = json["room"] == null ? null : Lookup.fromJson(json["room"]);
// if (json['planRecurrentMedicalRooms'] != null) {
// planRecurrentMedicalRooms = <Null>[];
// json['planRecurrentMedicalRooms'].forEach((v) {
// planRecurrentMedicalRooms!.add(new Null.fromJson(v));
// });
// }
friday = json['friday'];
saturday = json['saturday'];
sunday = json['sunday'];
monday = json['monday'];
tuesday = json['tuesday'];
wednesday = json['wednesday'];
thursday = json['thursday'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['taskTypeId'] = this.taskTypeId;
if (this.taskType != null) {
data['lookUp'] = this.taskType!.toJson();
}
data['planNo'] = this.planNo;
data['planName'] = this.planName;
data['planSequence'] = this.planSequence;
data['frequencyId'] = this.frequencyId;
data['frequency'] = this.frequency;
data['autoConverstion'] = this.autoConverstion;
data['comment'] = this.comment;
data['scheduleDateFrom1'] = this.scheduleDateFrom1;
data['scheduleDateFrom2'] = this.scheduleDateFrom2;
if (this.site != null) {
data['site'] = this.site!.toJson();
}
data['building'] = this.building;
data['floor'] = this.floor;
data['department'] = this.department;
data['room'] = this.room;
// if (this.planRecurrentMedicalRooms != null) {
// data['planRecurrentMedicalRooms'] = this.planRecurrentMedicalRooms!.map((v) => v.toJson()).toList();
// }
data['friday'] = this.friday;
data['saturday'] = this.saturday;
data['sunday'] = this.sunday;
data['monday'] = this.monday;
data['tuesday'] = this.tuesday;
data['wednesday'] = this.wednesday;
data['thursday'] = this.thursday;
return data;
}
}

@ -14,11 +14,13 @@ import 'package:test_sa/views/widgets/loaders/image_loader.dart';
class AssetDetailCardView extends StatelessWidget {
AssetInventoryModel assetInventoryModel;
VoidCallback onDeletePress;
bool canDelete;
AssetDetailCardView({
super.key,
required this.assetInventoryModel,
required this.onDeletePress,
this.canDelete = false,
});
@override
@ -32,9 +34,10 @@ class AssetDetailCardView extends StatelessWidget {
context.translation.assetInformation,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
).expanded,
'delete_icon'.toSvgAsset().onPress(() {
onDeletePress();
}),
if (canDelete)
'delete_icon'.toSvgAsset().onPress(() {
onDeletePress();
}),
],
),
8.height,
@ -45,7 +48,8 @@ class AssetDetailCardView extends StatelessWidget {
Text(
'${context.translation.assetNumber}: ${assetInventoryModel.assetNumber ?? '-'}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
), Text(
),
Text(
'${context.translation.assetName}: ${assetInventoryModel.assetName ?? '-'}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),

@ -7,6 +7,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/module_permissions_model.dart';
import 'package:test_sa/modules/asset_inventory_module/models/session_model.dart';
import 'package:test_sa/modules/asset_inventory_module/pages/asset_inventory_detail_view.dart';
import 'package:test_sa/modules/asset_inventory_module/pages/asset_inventory_scan_assets_view.dart';
@ -19,8 +20,9 @@ import '../provider/asset_inventory_provider.dart';
class AssetInventoryPage extends StatefulWidget {
final int sessionId;
final int moduleId;
const AssetInventoryPage({Key? key, required this.sessionId}) : super(key: key);
const AssetInventoryPage({Key? key, required this.sessionId, required this.moduleId}) : super(key: key);
@override
_AssetInventoryPageState createState() {
@ -35,6 +37,7 @@ class _AssetInventoryPageState extends State<AssetInventoryPage> {
void initState() {
super.initState();
_assetInventoryProvider = Provider.of<AssetInventoryProvider>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((_) {
getInitialData();
});
@ -42,6 +45,7 @@ class _AssetInventoryPageState extends State<AssetInventoryPage> {
Future<void> getInitialData() async {
_assetInventoryProvider.reset();
_assetInventoryProvider.modelPermission = context.userProvider.currentModelPermission(widget.moduleId);
await _assetInventoryProvider.getSessionById(id: widget.sessionId);
await _assetInventoryProvider.getAssetsInSession(
sessionId: widget.sessionId,
@ -100,15 +104,16 @@ class _AssetInventoryPageState extends State<AssetInventoryPage> {
AssetInventoryScanAssetView(sessionId: provider.sessionModel?.id ?? 0),
],
).expanded,
FooterActionButton.footerContainer(
context: context,
child: AppFilledButton(
buttonColor: AppColor.primary10,
label: 'Scan Assets'.addTranslation,
onPressed: () => _scanAsset(provider: provider),
// buttonColor: AppColor.primary10,
),
)
if (provider.modelPermission?.canEdit ?? false)
FooterActionButton.footerContainer(
context: context,
child: AppFilledButton(
buttonColor: AppColor.primary10,
label: 'Scan Assets'.addTranslation,
onPressed: () => _scanAsset(provider: provider),
// buttonColor: AppColor.primary10,
),
)
],
),
);

@ -65,6 +65,7 @@ class _AssetInventoryScanAssetViewState extends State<AssetInventoryScanAssetVie
}
return AssetDetailCardView(
assetInventoryModel: assets[index],
canDelete: (provider.modelPermission?.canEdit ?? false),
onDeletePress: () async {
await provider.deleteAssetISession(id: assets[index].id ?? 0).then((success) async {
if (success) {

@ -161,6 +161,7 @@ class _SiteInformationPageState extends State<SiteInformationPage> {
itemCount: assets.length,
itemBuilder: (context, index) {
return AssetDetailCardView(
canDelete: (provider.modelPermission?.canEdit ?? false),
assetInventoryModel: assets[index],
onDeletePress: () async {
await provider.deleteAssetISession(id: assets[index].id ?? 0).then((success) async {

@ -58,7 +58,7 @@ class InventorySessionItemView extends StatelessWidget {
),
],
).toShadowContainer(context, withShadow: showShadow).onPress(() async {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => AssetInventoryPage(sessionId: requestData!.id!)));
Navigator.of(context).push(MaterialPageRoute(builder: (_) => AssetInventoryPage(sessionId: requestData!.id!, moduleId: requestData!.transactionNo!)));
});
}
return Column(
@ -99,7 +99,7 @@ class InventorySessionItemView extends StatelessWidget {
),
],
).toShadowContainer(context, withShadow: showShadow).onPress(() async {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => AssetInventoryPage(sessionId: requestDetails!.id!)));
Navigator.of(context).push(MaterialPageRoute(builder: (_) => AssetInventoryPage(sessionId: requestDetails!.id!, moduleId: requestDetails!.transactionType!)));
});
}

@ -11,6 +11,7 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/device/asset_search.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/module_permissions_model.dart';
import 'package:test_sa/models/service_request/pending_service_request_model.dart';
import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/models/service_request/service_request.dart';
@ -46,8 +47,11 @@ class AssetInventoryProvider extends ChangeNotifier {
List<AssetInventoryModel> sessionAssetList = [];
List<AssetInventoryModel> siteFilterAssetList = [];
ModulesPermissionsModel? modelPermission;
void reset() {
pageNo = 1;
modelPermission = null;
assetInventoryResponse = null;
sessionModel = null;
sessionAssetList = [];

@ -78,6 +78,7 @@ class _RecurrentTaskInfoWidgetState extends State<RecurrentTaskInfoWidget> {
widget.model!.title!.bodyText(context).custom(color: AppColor.textColor(context)),
2.height,
'${context.translation.taskNo}: ${widget.model!.taskNo!}'.bodyText2(context).custom(color: AppColor.neutral120),
'Plan Name: ${widget.model?.planRecurrent?.planName ?? "-"}'.bodyText2(context).custom(color: AppColor.neutral120),
'${context.translation.site}: ${widget.model!.site!.siteName!}'.bodyText2(context).custom(color: AppColor.neutral120),
'${context.translation.assignedEmployee}: ${widget.model!.engineer!.userName ?? ""}'.bodyText2(context).custom(color: AppColor.neutral120),
'${context.translation.scheduledDate}: ${widget.model!.scheduleDate!.toMonthYearFormat}'.bodyText2(context).custom(color: AppColor.neutral120),
@ -95,7 +96,7 @@ class _RecurrentTaskInfoWidgetState extends State<RecurrentTaskInfoWidget> {
8.height,
buildingInfoWidget(label: context.translation.room, value: widget.model!.room?.name?.cleanupWhitespace.capitalizeFirstOfEach, context: context),
8.height,
_timerWidget(context,totalWorkingHours),
_timerWidget(context, totalWorkingHours),
8.height,
_commentWidget(context: context, model: widget.model)
],

@ -89,6 +89,24 @@ class CreateRequestModel {
static List<CreateRequestModel> requestsList(BuildContext context, bool isEngineer) {
List<CreateRequestModel> list = [];
// switching to users permissions
// context.userProvider.modulesPermissionsList.where((module) => module.canAdd!).toList().forEach((module) {
// switch (module.module!.value) {
// case 1:
// list.add(CreateRequestModel(module.module!.name!, "add_icon", CreateNewRequest.id));
//
// case 2:
// list.add(CreateRequestModel(module.module!.name!, "add_icon", GasRefillRequestForm.routeName));
//
// case 3:
// list.add(CreateRequestModel(module.module!.name!, "add_icon", CreateDeviceTransferRequest.id));
//
// case 4:
// list.add(CreateRequestModel(module.module!.name!, "add_icon", CreateTaskView.id));
// }
// });
if (isEngineer) {
if (Provider.of<SettingProvider>(context, listen: false).engineerCanCreateCM) {
list.add(CreateRequestModel(context.translation.correctiveMaintenance, "add_icon", CreateNewRequest.id));

@ -61,7 +61,14 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
);
search!.searchBySelectedValue = search?.requestNumber;
}
final types = {
Map<String, int> types = {};
// switching to users permissions
// context.userProvider.modulesPermissionsList.forEach((module) {
// types[module.module!.name!] = module.module!.value!;
// });
types = {
context.translation.correctiveMaintenance: 1,
context.translation.gasRefill: 2,
context.translation.transferAsset: 3,
@ -76,6 +83,14 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
if (context.settingProvider.isUserFlowMedical && isEngineer) {
types['Recall and Alert'] = 7;
}
// switching asset inventory to users permissions
context.userProvider.modulesPermissionsList.forEach((module) {
if (module.module!.value! == 8) {
types[module.module!.name!] = module.module!.value!;
}
});
final statuses = {
"All WO": 0,
context.translation.open: 1,

@ -52,9 +52,15 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
if (context.settingProvider.isUserFlowMedical && Provider.of<UserProvider>(context, listen: false).user!.type != UsersTypes.normal_user) {
requestsList.add(Request(7, 'Recall and Alert'));
}
if (Provider.of<UserProvider>(context, listen: false).user!.type != UsersTypes.normal_user) {
requestsList.add(Request(8, 'Inventory Session'.addTranslation));
}
// switching asset inventory to users permissions
context.userProvider.modulesPermissionsList.forEach((module) {
if (module.module!.value! == 8) {
requestsList.add(Request(module.module!.value!, module.module!.name!.addTranslation));
}
});
if (Provider.of<UserProvider>(context, listen: false).user!.type != UsersTypes.normal_user) {}
_provider = Provider.of<AllRequestsProvider>(context, listen: false);
_provider!.reset();
WidgetsBinding.instance.addPostFrameCallback((_) {

@ -22,6 +22,7 @@ import '../../controllers/providers/settings/setting_provider.dart';
import '../../controllers/validator/validator.dart';
import '../../models/user.dart';
import '../common_widgets/app_filled_button.dart';
import '../common_widgets/app_lazy_loading.dart';
import '../common_widgets/app_text_form_field.dart';
class LoginPage extends StatefulWidget {
@ -232,10 +233,13 @@ class _LoginPageState extends State<LoginPage> {
return;
}
_formKey.currentState!.save();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int status = await _userProvider.login(context: context, user: _user);
if (status >= 200 && status < 300 && _userProvider.user!.isAuthenticated! ?? false) {
await _userProvider.getMobilePermissionByUser();
await _settingProvider!.setUser(_userProvider.user!);
Navigator.pop(context);
// (await SharedPreferences.getInstance()).remove(ASettings.localAuth);
await _settingProvider!.setRememberMe(_user.userName!, _user.password!, rememberMe);
//TODO need to verify this here...
@ -246,6 +250,7 @@ class _LoginPageState extends State<LoginPage> {
}
Navigator.pushReplacementNamed(context, LandPage.routeName);
} else {
Navigator.pop(context);
Fluttertoast.showToast(msg: _userProvider.user?.message ?? context.translation.failedToCompleteRequest);
}
}

@ -116,6 +116,7 @@ class _SplashPageState extends State<SplashPage> {
});
if (status && _userProvider.refreshedUser != null) {
_userProvider.refreshedUser!.token = _settingProvider.user?.token;
await _userProvider.getMobilePermissionByUser();
await _settingProvider.setUser(_userProvider.refreshedUser!);
_userProvider.setUser(_userProvider.refreshedUser!);
await _settingProvider.setAuth(_settingProvider.user?.isEnabledFaceId ?? false);

Loading…
Cancel
Save