fix null safety
@@ -24,12 +24,16 @@ if (flutterVersionName == null) {
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||||
|
|
||||||
|
def keystoreProperties = new Properties()
|
||||||
|
def keystorePropertiesFile = rootProject.file('key.properties')
|
||||||
|
if (keystorePropertiesFile.exists()) {
|
||||||
|
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||||
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 30
|
compileSdkVersion 30
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
|
||||||
applicationId "com.mokkon.fcs.fcs"
|
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 30
|
targetSdkVersion 30
|
||||||
versionCode flutterVersionCode.toInteger()
|
versionCode flutterVersionCode.toInteger()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.mokkon.fcs_dev.fcs">
|
package="com.mokkon.fcs.fcs">
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||||
|
|
||||||
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
|
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
|
||||||
@@ -15,7 +15,6 @@
|
|||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop"
|
||||||
android:theme="@style/LaunchTheme"
|
android:theme="@style/LaunchTheme"
|
||||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
|
||||||
android:hardwareAccelerated="true"
|
android:hardwareAccelerated="true"
|
||||||
android:windowSoftInputMode="adjustResize">
|
android:windowSoftInputMode="adjustResize">
|
||||||
<!-- This keeps the window background of the activity showing
|
<!-- This keeps the window background of the activity showing
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.mokkon.fcs.fcs">
|
package="com.mokkon.fcs.fcs">
|
||||||
<application
|
<application
|
||||||
android:label="fcs"
|
|
||||||
android:icon="@mipmap/ic_launcher">
|
android:icon="@mipmap/ic_launcher">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.mokkon.fcs.fcs;
|
||||||
|
|
||||||
|
import io.flutter.app.FlutterApplication;
|
||||||
|
import io.flutter.plugin.common.PluginRegistry;
|
||||||
|
import io.flutter.plugins.GeneratedPluginRegistrant;
|
||||||
|
|
||||||
|
|
||||||
|
public class Application extends FlutterApplication {
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 544 B After Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 36 KiB |
4
android/app/src/main/res/values/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">FCS</string>
|
||||||
|
</resources>
|
||||||
1
android/settings_aar.gradle
Normal file
@@ -0,0 +1 @@
|
|||||||
|
include ':app'
|
||||||
@@ -32,9 +32,6 @@ class AuthFb {
|
|||||||
try {
|
try {
|
||||||
_authResult = await _fb.signInWithCredential(credential);
|
_authResult = await _fb.signInWithCredential(credential);
|
||||||
print("PhoneVerificationCompleted :$_authResult");
|
print("PhoneVerificationCompleted :$_authResult");
|
||||||
if (_authResult == null) {
|
|
||||||
throw SigninException("Sigin error!");
|
|
||||||
}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print("Exception:$e");
|
print("Exception:$e");
|
||||||
// throw e;
|
// throw e;
|
||||||
@@ -61,7 +58,8 @@ class AuthFb {
|
|||||||
_verificationId = verificationId;
|
_verificationId = verificationId;
|
||||||
print("codeSent " + phoneNumber);
|
print("codeSent " + phoneNumber);
|
||||||
codeSentCompleted = true;
|
codeSentCompleted = true;
|
||||||
completer.complete(fcs.AuthResult(authStatus: AuthStatus.SMS_SENT));
|
if (!completer.isCompleted)
|
||||||
|
completer.complete(fcs.AuthResult(authStatus: AuthStatus.SMS_SENT));
|
||||||
};
|
};
|
||||||
|
|
||||||
final fb.PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout =
|
final fb.PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout =
|
||||||
@@ -70,7 +68,8 @@ class AuthFb {
|
|||||||
|
|
||||||
_verificationId = verificationId;
|
_verificationId = verificationId;
|
||||||
if (codeSentCompleted) {
|
if (codeSentCompleted) {
|
||||||
completer.complete(fcs.AuthResult(authStatus: AuthStatus.SMS_SENT));
|
if (!completer.isCompleted)
|
||||||
|
completer.complete(fcs.AuthResult(authStatus: AuthStatus.SMS_SENT));
|
||||||
} else {
|
} else {
|
||||||
completer.completeError(SigninException("SMS code failed"));
|
completer.completeError(SigninException("SMS code failed"));
|
||||||
}
|
}
|
||||||
@@ -92,11 +91,7 @@ class AuthFb {
|
|||||||
final fb.AuthCredential credential = fb.PhoneAuthProvider.credential(
|
final fb.AuthCredential credential = fb.PhoneAuthProvider.credential(
|
||||||
verificationId: _verificationId, smsCode: smsCode);
|
verificationId: _verificationId, smsCode: smsCode);
|
||||||
|
|
||||||
fb.UserCredential _authResult =
|
await _fb.signInWithCredential(credential);
|
||||||
await _fb.signInWithCredential(credential);
|
|
||||||
if (_authResult == null) {
|
|
||||||
throw SigninException("Sigin error!");
|
|
||||||
}
|
|
||||||
await _addUserToStream(refreshIdToken: true);
|
await _addUserToStream(refreshIdToken: true);
|
||||||
} on Exception catch (e) {
|
} on Exception catch (e) {
|
||||||
return Future.error(SigninException(e.toString()));
|
return Future.error(SigninException(e.toString()));
|
||||||
@@ -118,7 +113,7 @@ class AuthFb {
|
|||||||
log.info("Claims:$claims");
|
log.info("Claims:$claims");
|
||||||
if (claims == null) return;
|
if (claims == null) return;
|
||||||
|
|
||||||
String cid = claims["cid"];
|
String? cid = claims["cid"];
|
||||||
User? user;
|
User? user;
|
||||||
if (cid != null && cid != "") {
|
if (cid != null && cid != "") {
|
||||||
user = await _getUserFromFirestore(cid);
|
user = await _getUserFromFirestore(cid);
|
||||||
@@ -129,7 +124,7 @@ class AuthFb {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// add privileges
|
// add privileges
|
||||||
String privileges = claims["pr"];
|
String? privileges = claims["pr"];
|
||||||
if (privileges != null && privileges != "") {
|
if (privileges != null && privileges != "") {
|
||||||
user.privileges = privileges.split(":").toList();
|
user.privileges = privileges.split(":").toList();
|
||||||
} else {
|
} else {
|
||||||
@@ -238,7 +233,7 @@ class AuthFb {
|
|||||||
// get privilege from claim
|
// get privilege from claim
|
||||||
fb.IdTokenResult idToken = await firebaseUser.getIdTokenResult(true);
|
fb.IdTokenResult idToken = await firebaseUser.getIdTokenResult(true);
|
||||||
|
|
||||||
String privileges = idToken.claims?["pr"] ?? '';
|
String? privileges = idToken.claims?["pr"] ?? '';
|
||||||
if (privileges != null && privileges != "") {
|
if (privileges != null && privileges != "") {
|
||||||
user.privileges = privileges.split(":").toList();
|
user.privileges = privileges.split(":").toList();
|
||||||
}
|
}
|
||||||
@@ -274,7 +269,7 @@ class AuthFb {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
controller = StreamController<User>(
|
controller = StreamController<User?>(
|
||||||
onListen: _start, onPause: _stop, onResume: _start, onCancel: _stop);
|
onListen: _start, onPause: _stop, onResume: _start, onCancel: _stop);
|
||||||
|
|
||||||
return controller.stream;
|
return controller.stream;
|
||||||
|
|||||||
@@ -45,9 +45,13 @@ class MessagingFCM {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
String? token = await _firebaseMessaging.getToken();
|
try {
|
||||||
if (onSetupComplete != null && token != null) onSetupComplete(token);
|
String? token = await _firebaseMessaging.getToken();
|
||||||
log.info("Messaging Token:$token");
|
if (onSetupComplete != null && token != null) onSetupComplete(token);
|
||||||
|
log.info("Messaging Token:$token");
|
||||||
|
} on Exception catch (e) {
|
||||||
|
log.shout("Unable to get messing token:$e");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> subscribeToTopic(String topic) {
|
Future<void> subscribeToTopic(String topic) {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
@@ -6,8 +7,9 @@ import 'app.dart';
|
|||||||
import 'config.dart';
|
import 'config.dart';
|
||||||
import 'data/provider/messaging_fcm.dart';
|
import 'data/provider/messaging_fcm.dart';
|
||||||
|
|
||||||
void main() {
|
Future<void> main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
await Firebase.initializeApp();
|
||||||
FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler);
|
FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler);
|
||||||
|
|
||||||
Config(
|
Config(
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import 'package:logging/logging.dart';
|
|||||||
|
|
||||||
class CartonModel extends BaseModel {
|
class CartonModel extends BaseModel {
|
||||||
List<Carton> _boxes = [];
|
List<Carton> _boxes = [];
|
||||||
late PaginatorListener<Carton> cartonsByFilter;
|
PaginatorListener<Carton>? cartonsByFilter;
|
||||||
|
|
||||||
final log = Logger('CartonModel');
|
final log = Logger('CartonModel');
|
||||||
List<Carton> get boxes => _selectedIndex == 1
|
List<Carton> get boxes => _selectedIndex == 1
|
||||||
@@ -165,8 +165,8 @@ class CartonModel extends BaseModel {
|
|||||||
.where("status", isEqualTo: carton_packed_status)
|
.where("status", isEqualTo: carton_packed_status)
|
||||||
.orderBy(orderName, descending: true);
|
.orderBy(orderName, descending: true);
|
||||||
|
|
||||||
cartonsByFilter.refresh(
|
cartonsByFilter!
|
||||||
listeningQuery: listenerQuery, pageQuery: pageQuery);
|
.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log.warning("Error!! $e");
|
log.warning("Error!! $e");
|
||||||
}
|
}
|
||||||
@@ -211,7 +211,7 @@ class CartonModel extends BaseModel {
|
|||||||
if (listener != null) await listener!.cancel();
|
if (listener != null) await listener!.cancel();
|
||||||
if (cartonListener != null) await cartonListener!.cancel();
|
if (cartonListener != null) await cartonListener!.cancel();
|
||||||
if (_delivered != null) _delivered!.close();
|
if (_delivered != null) _delivered!.close();
|
||||||
if (cartonsByFilter != null) cartonsByFilter.close();
|
if (cartonsByFilter != null) cartonsByFilter!.close();
|
||||||
_boxes = [];
|
_boxes = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ class PartSearchDelegate extends SearchDelegate<Carton> {
|
|||||||
return Container(
|
return Container(
|
||||||
padding: EdgeInsets.only(top: 5),
|
padding: EdgeInsets.only(top: 5),
|
||||||
child: PaginatorListView<Carton>(
|
child: PaginatorListView<Carton>(
|
||||||
paginatorListener: cartonModel.cartonsByFilter,
|
paginatorListener: cartonModel.cartonsByFilter!,
|
||||||
rowBuilder: (c) => CartonListRow(
|
rowBuilder: (c) => CartonListRow(
|
||||||
key: ValueKey(c.id),
|
key: ValueKey(c.id),
|
||||||
carton: c,
|
carton: c,
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ class DeliveryAddressModel extends BaseModel {
|
|||||||
|
|
||||||
StreamSubscription<QuerySnapshot>? listener;
|
StreamSubscription<QuerySnapshot>? listener;
|
||||||
|
|
||||||
DeliveryAddress get defalutAddress =>
|
DeliveryAddress get defalutAddress => deliveryAddresses
|
||||||
deliveryAddresses.firstWhere((e) => e.isDefault, orElse: () => DeliveryAddress());
|
.firstWhere((e) => e.isDefault, orElse: () => DeliveryAddress());
|
||||||
|
|
||||||
DeliveryAddress getLocalDeliveryAddress(String id) =>
|
DeliveryAddress getLocalDeliveryAddress(String id) => deliveryAddresses
|
||||||
deliveryAddresses.firstWhere((e) => e.id == id, orElse: () => DeliveryAddress());
|
.firstWhere((e) => e.id == id, orElse: () => DeliveryAddress());
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void privilegeChanged() {
|
void privilegeChanged() {
|
||||||
@@ -46,7 +46,8 @@ class DeliveryAddressModel extends BaseModel {
|
|||||||
deliveryAddresses.clear();
|
deliveryAddresses.clear();
|
||||||
deliveryAddresses = snapshot.docs.map((documentSnapshot) {
|
deliveryAddresses = snapshot.docs.map((documentSnapshot) {
|
||||||
var s = DeliveryAddress.fromMap(
|
var s = DeliveryAddress.fromMap(
|
||||||
documentSnapshot.data as Map<String,dynamic>, documentSnapshot.id);
|
documentSnapshot.data() as Map<String, dynamic>,
|
||||||
|
documentSnapshot.id);
|
||||||
return s;
|
return s;
|
||||||
}).toList();
|
}).toList();
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
@@ -59,7 +60,7 @@ class DeliveryAddressModel extends BaseModel {
|
|||||||
Future<DeliveryAddress> getDeliveryAddress(String id) async {
|
Future<DeliveryAddress> getDeliveryAddress(String id) async {
|
||||||
String path = "/$user_collection/${user!.id}/$delivery_address_collection";
|
String path = "/$user_collection/${user!.id}/$delivery_address_collection";
|
||||||
var snap = await FirebaseFirestore.instance.collection(path).doc(id).get();
|
var snap = await FirebaseFirestore.instance.collection(path).doc(id).get();
|
||||||
return DeliveryAddress.fromMap(snap.data as Map<String,dynamic>, snap.id);
|
return DeliveryAddress.fromMap(snap.data as Map<String, dynamic>, snap.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initUser(user) {
|
void initUser(user) {
|
||||||
@@ -95,7 +96,8 @@ class DeliveryAddressModel extends BaseModel {
|
|||||||
.orderBy("full_name")
|
.orderBy("full_name")
|
||||||
.get();
|
.get();
|
||||||
return querySnap.docs
|
return querySnap.docs
|
||||||
.map((e) => DeliveryAddress.fromMap(e.data as Map<String,dynamic>, e.id))
|
.map((e) =>
|
||||||
|
DeliveryAddress.fromMap(e.data as Map<String, dynamic>, e.id))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ class DiscountModel extends BaseModel {
|
|||||||
.listen((snaps) {
|
.listen((snaps) {
|
||||||
_discounts.clear();
|
_discounts.clear();
|
||||||
snaps.docs.forEach((d) {
|
snaps.docs.forEach((d) {
|
||||||
_discounts.add(Discount.fromMap(d.data as Map<String,dynamic>, d.id));
|
_discounts
|
||||||
|
.add(Discount.fromMap(d.data() as Map<String, dynamic>, d.id));
|
||||||
});
|
});
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
});
|
});
|
||||||
@@ -79,9 +80,9 @@ class DiscountModel extends BaseModel {
|
|||||||
.where("customer_id", isEqualTo: userID)
|
.where("customer_id", isEqualTo: userID)
|
||||||
.where("status", isEqualTo: "available");
|
.where("status", isEqualTo: "available");
|
||||||
var snaps = await q.get(const GetOptions(source: Source.server));
|
var snaps = await q.get(const GetOptions(source: Source.server));
|
||||||
var discounts = snaps.docs.map((snap) {
|
var discounts = snaps.docs.map((snap) {
|
||||||
if (snap.exists) {
|
if (snap.exists) {
|
||||||
var s = Discount.fromMap(snap.data as Map<String,dynamic>, snap.id);
|
var s = Discount.fromMap(snap.data as Map<String, dynamic>, snap.id);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class FAQModel extends BaseModel {
|
|||||||
.listen((snaps) {
|
.listen((snaps) {
|
||||||
faqs.clear();
|
faqs.clear();
|
||||||
snaps.docs.forEach((d) {
|
snaps.docs.forEach((d) {
|
||||||
faqs.add(FAQ.fromMap(d.data as Map<String,dynamic>, d.id));
|
faqs.add(FAQ.fromMap(d.data(), d.id));
|
||||||
});
|
});
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ class FcsShipmentModel extends BaseModel {
|
|||||||
_fcsShipments.clear();
|
_fcsShipments.clear();
|
||||||
_fcsShipments = snapshot.docs.map((documentSnapshot) {
|
_fcsShipments = snapshot.docs.map((documentSnapshot) {
|
||||||
var s = FcsShipment.fromMap(
|
var s = FcsShipment.fromMap(
|
||||||
documentSnapshot.data as Map<String,dynamic>, documentSnapshot.id);
|
documentSnapshot.data() as Map<String,dynamic>, documentSnapshot.id);
|
||||||
return s;
|
return s;
|
||||||
}).toList();
|
}).toList();
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ class InvoiceModel extends BaseModel {
|
|||||||
List<Invoice> _invoices = [];
|
List<Invoice> _invoices = [];
|
||||||
|
|
||||||
List<Invoice> get invoices =>
|
List<Invoice> get invoices =>
|
||||||
_selectedIndex == 1 ? _invoices : List<Invoice>.from(_paginator.values);
|
_selectedIndex == 1 ? _invoices : List<Invoice>.from(_paginator!.values);
|
||||||
|
|
||||||
late Paginator _paginator;
|
Paginator? _paginator;
|
||||||
|
|
||||||
bool endOfPaidInvoices = false;
|
bool endOfPaidInvoices = false;
|
||||||
bool isLoading = false;
|
bool isLoading = false;
|
||||||
@@ -43,9 +43,9 @@ class InvoiceModel extends BaseModel {
|
|||||||
initData(bool forCustomer, bool isCanceled, bool isPaid) {
|
initData(bool forCustomer, bool isCanceled, bool isPaid) {
|
||||||
_loadInvoices(forCustomer);
|
_loadInvoices(forCustomer);
|
||||||
|
|
||||||
if (_paginator != null) _paginator.close();
|
if (_paginator != null) _paginator!.close();
|
||||||
_paginator = _getPaginator(forCustomer, isCanceled, isPaid);
|
_paginator = _getPaginator(forCustomer, isCanceled, isPaid);
|
||||||
_paginator.load(onFinished: () {
|
_paginator!.load(onFinished: () {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -70,7 +70,8 @@ class InvoiceModel extends BaseModel {
|
|||||||
listener = q.snapshots().listen((QuerySnapshot snapshot) {
|
listener = q.snapshots().listen((QuerySnapshot snapshot) {
|
||||||
_invoices.clear();
|
_invoices.clear();
|
||||||
_invoices = snapshot.docs.map((documentSnapshot) {
|
_invoices = snapshot.docs.map((documentSnapshot) {
|
||||||
var s = Invoice.fromMap(documentSnapshot.data as Map<String, dynamic>,
|
var s = Invoice.fromMap(
|
||||||
|
documentSnapshot.data() as Map<String, dynamic>,
|
||||||
documentSnapshot.id);
|
documentSnapshot.id);
|
||||||
return s;
|
return s;
|
||||||
}).toList();
|
}).toList();
|
||||||
@@ -106,11 +107,11 @@ class InvoiceModel extends BaseModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> loadMore({bool? isCustomer}) async {
|
Future<void> loadMore({bool? isCustomer}) async {
|
||||||
if (_paginator.ended || _selectedIndex == 1)
|
if (_paginator!.ended || _selectedIndex == 1)
|
||||||
return; // when paid menu is not selected return
|
return; // when paid menu is not selected return
|
||||||
isLoading = true;
|
isLoading = true;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
await _paginator.load(onFinished: () {
|
await _paginator!.load(onFinished: () {
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
});
|
});
|
||||||
@@ -118,7 +119,7 @@ class InvoiceModel extends BaseModel {
|
|||||||
|
|
||||||
Future<void> refresh({bool? isCustomer}) async {
|
Future<void> refresh({bool? isCustomer}) async {
|
||||||
if (_selectedIndex == 1) return; // when paid menu is not selected return
|
if (_selectedIndex == 1) return; // when paid menu is not selected return
|
||||||
await _paginator.refresh(onFinished: () {
|
await _paginator!.refresh(onFinished: () {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -128,7 +129,7 @@ class InvoiceModel extends BaseModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logout() async {
|
logout() async {
|
||||||
if (_paginator != null) _paginator.close();
|
if (_paginator != null) _paginator!.close();
|
||||||
if (listener != null) await listener!.cancel();
|
if (listener != null) await listener!.cancel();
|
||||||
_invoices = [];
|
_invoices = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ class MarketModel extends BaseModel {
|
|||||||
markets.clear();
|
markets.clear();
|
||||||
markets = snapshot.docs.map((documentSnapshot) {
|
markets = snapshot.docs.map((documentSnapshot) {
|
||||||
var user = Market.fromMap(
|
var user = Market.fromMap(
|
||||||
documentSnapshot.data as Map<String, dynamic>, documentSnapshot.id);
|
documentSnapshot.data() as Map<String, dynamic>,
|
||||||
|
documentSnapshot.id);
|
||||||
return user;
|
return user;
|
||||||
}).toList();
|
}).toList();
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ import 'package:path/path.dart' as Path;
|
|||||||
class PackageModel extends BaseModel {
|
class PackageModel extends BaseModel {
|
||||||
final log = Logger('PackageModel');
|
final log = Logger('PackageModel');
|
||||||
|
|
||||||
late PaginatorListener<Package> packages;
|
PaginatorListener<Package>? packages;
|
||||||
late PaginatorListener<Package> customerPackages;
|
PaginatorListener<Package>? customerPackages;
|
||||||
late PaginatorListener<Package> activePackages;
|
PaginatorListener<Package>? activePackages;
|
||||||
|
|
||||||
bool isLoading = false;
|
bool isLoading = false;
|
||||||
int _menuSelectedIndex = 1;
|
int _menuSelectedIndex = 1;
|
||||||
@@ -63,9 +63,9 @@ class PackageModel extends BaseModel {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
logout() async {
|
logout() async {
|
||||||
if (customerPackages != null) customerPackages.close();
|
if (customerPackages != null) customerPackages!.close();
|
||||||
if (packages != null) packages.close();
|
if (packages != null) packages!.close();
|
||||||
if (activePackages != null) activePackages.close();
|
if (activePackages != null) activePackages!.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _loadPackages(bool isDelivered) async {
|
Future<void> _loadPackages(bool isDelivered) async {
|
||||||
@@ -84,7 +84,7 @@ class PackageModel extends BaseModel {
|
|||||||
.where("is_delivered", isEqualTo: isDelivered);
|
.where("is_delivered", isEqualTo: isDelivered);
|
||||||
|
|
||||||
pageQuery = pageQuery.orderBy("update_time", descending: true);
|
pageQuery = pageQuery.orderBy("update_time", descending: true);
|
||||||
packages.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery);
|
packages!.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log.warning("Error!! $e");
|
log.warning("Error!! $e");
|
||||||
}
|
}
|
||||||
@@ -105,8 +105,8 @@ class PackageModel extends BaseModel {
|
|||||||
.where("user_id", isEqualTo: user!.id)
|
.where("user_id", isEqualTo: user!.id)
|
||||||
.orderBy("update_time", descending: true);
|
.orderBy("update_time", descending: true);
|
||||||
|
|
||||||
customerPackages.refresh(
|
customerPackages!
|
||||||
listeningQuery: listenerQuery, pageQuery: pageQuery);
|
.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log.warning("Error!! $e");
|
log.warning("Error!! $e");
|
||||||
}
|
}
|
||||||
@@ -128,8 +128,8 @@ class PackageModel extends BaseModel {
|
|||||||
.where("is_delivered", isEqualTo: false);
|
.where("is_delivered", isEqualTo: false);
|
||||||
|
|
||||||
pageQuery = pageQuery.orderBy("update_time", descending: true);
|
pageQuery = pageQuery.orderBy("update_time", descending: true);
|
||||||
activePackages.refresh(
|
activePackages!
|
||||||
listeningQuery: listenerQuery, pageQuery: pageQuery);
|
.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log.warning("Error!! $e");
|
log.warning("Error!! $e");
|
||||||
}
|
}
|
||||||
@@ -163,8 +163,7 @@ class PackageModel extends BaseModel {
|
|||||||
.get(const GetOptions(source: Source.server));
|
.get(const GetOptions(source: Source.server));
|
||||||
if (snaps.docs.length == 1) {
|
if (snaps.docs.length == 1) {
|
||||||
var snap = snaps.docs[0];
|
var snap = snaps.docs[0];
|
||||||
var package =
|
var package = Package.fromMap(snap.data(), snap.id);
|
||||||
Package.fromMap(snap.data as Map<String, dynamic>, snap.id);
|
|
||||||
return package;
|
return package;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class PackageInfo extends StatefulWidget {
|
|||||||
|
|
||||||
class _PackageInfoState extends State<PackageInfo> {
|
class _PackageInfoState extends State<PackageInfo> {
|
||||||
var dateFormatter = new DateFormat('dd MMM yyyy');
|
var dateFormatter = new DateFormat('dd MMM yyyy');
|
||||||
Package? _package;
|
Package? _package = Package();
|
||||||
bool _isLoading = false;
|
bool _isLoading = false;
|
||||||
MultiImgController multiImgController = MultiImgController();
|
MultiImgController multiImgController = MultiImgController();
|
||||||
|
|
||||||
@@ -48,13 +48,19 @@ class _PackageInfoState extends State<PackageInfo> {
|
|||||||
initPackage(widget.package!);
|
initPackage(widget.package!);
|
||||||
}
|
}
|
||||||
|
|
||||||
initPackage(Package pkg) async {
|
initPackage(Package? pkg) async {
|
||||||
|
setState(() {
|
||||||
|
_isLoading = true;
|
||||||
|
});
|
||||||
|
if (pkg == null) return;
|
||||||
PackageModel packageModel =
|
PackageModel packageModel =
|
||||||
Provider.of<PackageModel>(context, listen: false);
|
Provider.of<PackageModel>(context, listen: false);
|
||||||
Package? package = await packageModel.getPackageByTrackingID(pkg.trackingID!);
|
Package? package =
|
||||||
|
await packageModel.getPackageByTrackingID(pkg!.trackingID!);
|
||||||
setState(() {
|
setState(() {
|
||||||
_package = package;
|
_package = package;
|
||||||
multiImgController.setImageUrls = package!.photoUrls;
|
multiImgController.setImageUrls = package!.photoUrls;
|
||||||
|
_isLoading = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ class _PackageListState extends State<PackageList> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
body: PaginatorListView<Package>(
|
body: PaginatorListView<Package>(
|
||||||
paginatorListener: packages,
|
paginatorListener: packages!,
|
||||||
rowBuilder: (p) => PackageListRow(
|
rowBuilder: (p) => PackageListRow(
|
||||||
key: ValueKey(p.id),
|
key: ValueKey(p.id),
|
||||||
package: p,
|
package: p,
|
||||||
|
|||||||
@@ -26,8 +26,7 @@ class PaymentMethodModel extends BaseModel {
|
|||||||
.listen((snaps) {
|
.listen((snaps) {
|
||||||
paymentMethods.clear();
|
paymentMethods.clear();
|
||||||
snaps.docs.forEach((d) {
|
snaps.docs.forEach((d) {
|
||||||
paymentMethods
|
paymentMethods.add(PaymentMethod.fromMap(d.data(), d.id));
|
||||||
.add(PaymentMethod.fromMap(d.data as Map<String, dynamic>, d.id));
|
|
||||||
});
|
});
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ class _ProcessingListState extends State<ProcessingList> {
|
|||||||
backgroundColor: primaryColor,
|
backgroundColor: primaryColor,
|
||||||
),
|
),
|
||||||
body: PaginatorListView<Package>(
|
body: PaginatorListView<Package>(
|
||||||
paginatorListener: packages,
|
paginatorListener: packages!,
|
||||||
rowBuilder: (p) => ProcessingListRow(
|
rowBuilder: (p) => ProcessingListRow(
|
||||||
key: ValueKey(p.id),
|
key: ValueKey(p.id),
|
||||||
package: p,
|
package: p,
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class _ProcessingListState extends State<ProcessingList> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
body: PaginatorListView<Package>(
|
body: PaginatorListView<Package>(
|
||||||
paginatorListener: packages,
|
paginatorListener: packages!,
|
||||||
rowBuilder: (p) => ProcessingListRow(
|
rowBuilder: (p) => ProcessingListRow(
|
||||||
key: ValueKey(p.id),
|
key: ValueKey(p.id),
|
||||||
package: p,
|
package: p,
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class _ReceivingListState extends State<ReceivingList> {
|
|||||||
backgroundColor: primaryColor,
|
backgroundColor: primaryColor,
|
||||||
),
|
),
|
||||||
body: PaginatorListView<Package>(
|
body: PaginatorListView<Package>(
|
||||||
paginatorListener: packages,
|
paginatorListener: packages!,
|
||||||
rowBuilder: (p) => ReceivingListRow(
|
rowBuilder: (p) => ReceivingListRow(
|
||||||
key: ValueKey(p.id),
|
key: ValueKey(p.id),
|
||||||
package: p,
|
package: p,
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ class ShipmentModel extends BaseModel {
|
|||||||
|
|
||||||
List<Shipment> get shipments => _menuSelectedIndex == 1
|
List<Shipment> get shipments => _menuSelectedIndex == 1
|
||||||
? _shipments
|
? _shipments
|
||||||
: List<Shipment>.from(_delivered.values);
|
: List<Shipment>.from(_delivered!.values);
|
||||||
|
|
||||||
List<Shipment> _shipments = [];
|
List<Shipment> _shipments = [];
|
||||||
|
|
||||||
late Paginator _delivered;
|
Paginator? _delivered;
|
||||||
bool isLoading = false;
|
bool isLoading = false;
|
||||||
int _menuSelectedIndex = 1;
|
int _menuSelectedIndex = 1;
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ class ShipmentModel extends BaseModel {
|
|||||||
logout();
|
logout();
|
||||||
_loadShipments(forCustomer, myPickup);
|
_loadShipments(forCustomer, myPickup);
|
||||||
_delivered = _getDelivered(forCustomer);
|
_delivered = _getDelivered(forCustomer);
|
||||||
_delivered.load(onFinished: () {
|
_delivered!.load(onFinished: () {
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
});
|
});
|
||||||
@@ -42,7 +42,7 @@ class ShipmentModel extends BaseModel {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
logout() async {
|
logout() async {
|
||||||
if (_delivered != null) _delivered.close();
|
if (_delivered != null) _delivered!.close();
|
||||||
if (listener != null) await listener!.cancel();
|
if (listener != null) await listener!.cancel();
|
||||||
_shipments = [];
|
_shipments = [];
|
||||||
}
|
}
|
||||||
@@ -50,10 +50,10 @@ class ShipmentModel extends BaseModel {
|
|||||||
Future<void> loadMore({bool? isCustomer}) async {
|
Future<void> loadMore({bool? isCustomer}) async {
|
||||||
if (menuSelectedIndex == 1)
|
if (menuSelectedIndex == 1)
|
||||||
return; // when delivered menu is not selected return
|
return; // when delivered menu is not selected return
|
||||||
if (_delivered.ended) return;
|
if (_delivered!.ended) return;
|
||||||
isLoading = true;
|
isLoading = true;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
await _delivered.load(onFinished: () {
|
await _delivered!.load(onFinished: () {
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
});
|
});
|
||||||
@@ -62,7 +62,7 @@ class ShipmentModel extends BaseModel {
|
|||||||
Future<void> refresh({bool? isCustomer}) async {
|
Future<void> refresh({bool? isCustomer}) async {
|
||||||
if (menuSelectedIndex == 1)
|
if (menuSelectedIndex == 1)
|
||||||
return; // when delivered menu is not selected return
|
return; // when delivered menu is not selected return
|
||||||
await _delivered.refresh(onFinished: () {
|
await _delivered!.refresh(onFinished: () {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,8 +46,9 @@ class StaffModel extends BaseModel {
|
|||||||
.listen((QuerySnapshot snapshot) {
|
.listen((QuerySnapshot snapshot) {
|
||||||
employees.clear();
|
employees.clear();
|
||||||
employees = snapshot.docs.map((documentSnapshot) {
|
employees = snapshot.docs.map((documentSnapshot) {
|
||||||
var user =
|
var user = User.fromMap(
|
||||||
User.fromMap(documentSnapshot.data as Map<String,dynamic>, documentSnapshot.id);
|
documentSnapshot.data() as Map<String, dynamic>,
|
||||||
|
documentSnapshot.id);
|
||||||
return user;
|
return user;
|
||||||
}).toList();
|
}).toList();
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
@@ -66,7 +67,8 @@ class StaffModel extends BaseModel {
|
|||||||
privileges.clear();
|
privileges.clear();
|
||||||
privileges = snapshot.docs.map((documentSnapshot) {
|
privileges = snapshot.docs.map((documentSnapshot) {
|
||||||
var privilege = Privilege.fromMap(
|
var privilege = Privilege.fromMap(
|
||||||
documentSnapshot.data as Map<String,dynamic>, documentSnapshot.id);
|
documentSnapshot.data() as Map<String, dynamic>,
|
||||||
|
documentSnapshot.id);
|
||||||
return privilege;
|
return privilege;
|
||||||
}).toList();
|
}).toList();
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
@@ -101,8 +103,8 @@ class StaffModel extends BaseModel {
|
|||||||
.where("privileges", arrayContains: privilege)
|
.where("privileges", arrayContains: privilege)
|
||||||
.get(const GetOptions(source: Source.server));
|
.get(const GetOptions(source: Source.server));
|
||||||
users = snaps.docs.map((documentSnapshot) {
|
users = snaps.docs.map((documentSnapshot) {
|
||||||
var user =
|
var user = User.fromMap(
|
||||||
User.fromMap(documentSnapshot.data as Map<String,dynamic>, documentSnapshot.id);
|
documentSnapshot.data as Map<String, dynamic>, documentSnapshot.id);
|
||||||
return user;
|
return user;
|
||||||
}).toList();
|
}).toList();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ import 'package:fcs/helpers/theme.dart';
|
|||||||
class LocalText extends Text {
|
class LocalText extends Text {
|
||||||
final BuildContext context;
|
final BuildContext context;
|
||||||
LocalText(this.context, String translationKey,
|
LocalText(this.context, String translationKey,
|
||||||
{Color? color,
|
{Color color = secondaryColor,
|
||||||
double? fontSize,
|
double fontSize = 13,
|
||||||
FontWeight? fontWeight,
|
FontWeight fontWeight = FontWeight.w500,
|
||||||
List<String>? translationVariables,
|
List<String>? translationVariables,
|
||||||
String? text,
|
String? text,
|
||||||
bool underline = false})
|
bool underline = false})
|
||||||
@@ -19,14 +19,14 @@ class LocalText extends Text {
|
|||||||
translationVariables: translationVariables),
|
translationVariables: translationVariables),
|
||||||
style: Provider.of<LanguageModel>(context, listen: false).isEng
|
style: Provider.of<LanguageModel>(context, listen: false).isEng
|
||||||
? newLabelStyle(
|
? newLabelStyle(
|
||||||
color: color!,
|
color: color,
|
||||||
fontSize: fontSize!,
|
fontSize: fontSize,
|
||||||
fontWeight: fontWeight!,
|
fontWeight: fontWeight,
|
||||||
underline: underline)
|
underline: underline)
|
||||||
: newLabelStyleMM(
|
: newLabelStyleMM(
|
||||||
color: color!,
|
color: color,
|
||||||
fontSize: fontSize!,
|
fontSize: fontSize,
|
||||||
fontWeight: fontWeight!,
|
fontWeight: fontWeight,
|
||||||
underline: underline));
|
underline: underline));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||