Files
fcs/lib/fcs/common/pages/model/main_model.dart

224 lines
5.9 KiB
Dart
Raw Normal View History

2020-09-04 01:42:58 +06:30
import 'dart:async';
2020-09-17 06:02:48 +06:30
import 'dart:developer';
2020-09-04 01:42:58 +06:30
import 'package:fcs/fcs/common/domain/entities/auth_result.dart';
import 'package:fcs/fcs/common/domain/entities/auth_status.dart';
import 'package:fcs/fcs/common/domain/entities/setting.dart';
import 'package:fcs/fcs/common/domain/entities/user.dart';
2020-09-04 15:30:10 +06:30
import 'package:fcs/fcs/common/helpers/network_connectivity.dart';
2020-09-12 03:34:52 +06:30
import 'package:fcs/fcs/common/helpers/shared_pref.dart';
2020-09-11 16:14:36 +06:30
import 'package:fcs/fcs/common/pages/model/base_model.dart';
2020-09-04 01:42:58 +06:30
import 'package:fcs/fcs/common/services/services.dart';
import 'package:flutter/foundation.dart';
import 'package:logging/logging.dart';
import 'package:package_info/package_info.dart';
class MainModel extends ChangeNotifier {
final log = Logger('MainModel');
2020-09-11 16:14:36 +06:30
List<BaseModel> models = [];
2020-09-04 01:42:58 +06:30
2020-09-20 05:34:49 +06:30
String messagingToken;
2020-09-04 01:42:58 +06:30
User user;
PackageInfo packageInfo;
2020-09-20 05:34:49 +06:30
set setMessaginToken(token) {
this.messagingToken = token;
uploadMsgToken();
}
2020-09-12 03:34:52 +06:30
Setting setting;
2020-09-04 01:42:58 +06:30
bool isLoaded = false;
bool isOnline = false;
2020-09-12 03:34:52 +06:30
bool isFirstLaunch = false;
2020-09-04 01:42:58 +06:30
MainModel() {
NetworkConnectivity.instance.statusStream.listen((data) {
bool _isOnline = data["isOnline"];
if (_isOnline && !this.isOnline) {
init();
}
this.isOnline = _isOnline;
notifyListeners();
});
2020-09-17 06:02:48 +06:30
Services.instance.authService.onAuthStatus().listen((event) async {
this.user =
await Services.instance.authService.getUser(refreshIdToken: true);
2020-09-13 21:49:39 +06:30
_initUser(user);
2020-09-20 05:34:49 +06:30
if (user != null) {
uploadMsgToken();
}
2020-09-11 16:14:36 +06:30
notifyListeners();
2020-09-04 01:42:58 +06:30
});
}
2020-09-12 03:34:52 +06:30
bool faqEditable() {
2020-09-13 21:49:39 +06:30
return this.user != null && this.user.hasSupport();
2020-09-04 01:42:58 +06:30
}
2020-09-12 03:34:52 +06:30
2020-09-18 21:33:41 +06:30
bool paymentMethodsEditable() {
return this.user != null && this.user.hasSupport();
}
2020-09-12 03:34:52 +06:30
bool termEditable() {
2020-09-13 21:49:39 +06:30
return this.user != null && this.user.hasSupport();
2020-09-04 01:42:58 +06:30
}
2020-09-12 03:34:52 +06:30
bool contactEditable() {
2020-09-13 21:49:39 +06:30
return this.user != null && this.user.hasSupport();
2020-09-04 01:42:58 +06:30
}
2020-09-11 16:14:36 +06:30
bool isLogin() {
return this.user != null;
2020-09-04 01:42:58 +06:30
}
2020-09-11 16:14:36 +06:30
bool isCustomer() {
return user != null && user.isCustomer();
2020-09-04 01:42:58 +06:30
}
2020-09-11 16:14:36 +06:30
bool isSysAdmin() {
return this.user != null && this.user.hasSysAdmin();
2020-09-04 01:42:58 +06:30
}
bool isAdmin() {
return this.user != null && this.user.hasAdmin();
}
init() async {
await _loadSetting();
2020-09-12 03:34:52 +06:30
this.isFirstLaunch = await SharedPref.isFirstLaunch();
this.isFirstLaunch = this.isFirstLaunch ?? true;
2020-09-17 06:02:48 +06:30
// _loadUser();
2020-09-04 01:42:58 +06:30
this.packageInfo = await PackageInfo.fromPlatform();
}
2020-09-11 16:14:36 +06:30
void addModel(BaseModel model) {
models.add(model);
}
2020-09-04 01:42:58 +06:30
2020-09-17 06:02:48 +06:30
StreamSubscription<User> userListener;
2020-09-04 01:42:58 +06:30
2020-09-17 06:02:48 +06:30
void _initUser(User user) {
if (user != null) {
if (user.id != null && user.id != "") {
if (userListener != null) userListener.cancel();
userListener = Services.instance.authService
.getUserStream(user.id)
.listen((event) {
this.user = event;
2020-09-20 05:34:49 +06:30
2020-09-17 06:02:48 +06:30
models.forEach((m) => m.initUser(user));
notifyListeners();
});
}
models.forEach((m) => m.initUser(user));
} else {
models.forEach((m) => m.logout());
}
isLoaded = true;
2020-09-13 21:49:39 +06:30
// if (firebaseMessaging != null) {
// firebaseMessaging.subscribeToTopic(user.docID);
// }
}
2020-09-04 01:42:58 +06:30
2020-09-11 16:14:36 +06:30
void _initSetting(Setting setting) {
models.forEach((m) => m.initSetting(setting));
}
2020-09-04 01:42:58 +06:30
Future<void> _loadSetting() async {
try {
2020-09-07 16:05:28 +06:30
Services.instance.authService.getSetting().listen((event) {
2020-09-10 02:13:22 +06:30
this.setting = event;
2020-09-11 16:14:36 +06:30
_initSetting(setting);
2020-09-10 02:13:22 +06:30
notifyListeners();
2020-09-07 16:05:28 +06:30
});
2020-09-04 01:42:58 +06:30
} finally {}
}
2020-09-17 06:02:48 +06:30
// void _loadUser() async {
// try {
// this.user = await Services.instance.authService.getUser();
// _initUser(user);
// } finally {
// this.isLoaded = true;
// notifyListeners();
// }
// }
2020-09-04 01:42:58 +06:30
@override
void dispose() {
super.dispose();
// if (this.userListener != null) {
// this.userListener.cancel();
// }
// SharedPref.removeUser();
// this.user = User();
}
bool isSupport() {
if (packageInfo == null || setting == null) return false;
return int.parse(packageInfo.buildNumber) >= setting.supportBuildNum;
}
Future<AuthResult> sendSms(String phoneNumber) {
return Services.instance.authService.sendSmsCodeToPhoneNumber(phoneNumber);
}
Future<AuthResult> signin(String smsCode) async {
AuthResult authResult =
await Services.instance.authService.signInWithSmsCode(smsCode);
if (authResult != null &&
authResult.authStatus == AuthStatus.AUTH_VERIFIED) {
this.user = await Services.instance.authService.getUser();
2020-09-20 08:06:14 +06:30
uploadMsgToken();
2020-09-04 01:42:58 +06:30
}
return authResult;
}
2020-09-20 05:34:49 +06:30
Future<void> uploadMsgToken() {
if (messagingToken == null || user == null) return null;
return Services.instance.userService.uploadMsgToken(messagingToken);
}
Future<void> removeMsgToken() {
if (messagingToken == null || user == null) return null;
return Services.instance.userService.removeMsgToken(messagingToken);
}
Future<void> signout() async {
2020-09-13 21:49:39 +06:30
// logout models
models.forEach((m) => m.logout());
2020-09-20 05:34:49 +06:30
await removeMsgToken();
this.user = null;
2020-09-04 01:42:58 +06:30
notifyListeners();
2020-09-20 05:34:49 +06:30
2020-09-04 01:42:58 +06:30
return Services.instance.authService.signout();
}
2020-09-13 21:49:39 +06:30
Future<bool> hasInvite() async {
return Services.instance.authService.hasInvite();
}
2020-09-04 01:42:58 +06:30
Future<void> signup(String userName) async {
await Services.instance.authService.signup(userName);
2020-09-13 21:49:39 +06:30
this.user =
await Services.instance.authService.getUser(refreshIdToken: true);
notifyListeners();
}
2020-09-17 06:02:48 +06:30
Future<void> joinInvite(String userName) async {
await Services.instance.authService.joinInvite(userName);
this.user =
await Services.instance.authService.getUser(refreshIdToken: true);
notifyListeners();
}
2020-09-13 21:49:39 +06:30
Future<void> updateProfile(String newUserName) async {
await Services.instance.authService.updateProfile(newUserName);
this.user =
await Services.instance.authService.getUser(refreshIdToken: true);
2020-09-04 01:42:58 +06:30
notifyListeners();
}
}