Merge remote-tracking branch 'upstream/master'

This commit is contained in:
tzw
2021-09-13 08:14:07 +06:30
32 changed files with 125 additions and 93 deletions

View File

@@ -24,12 +24,16 @@ if (flutterVersionName == null) {
apply plugin: 'com.android.application'
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 {
compileSdkVersion 30
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.mokkon.fcs.fcs"
minSdkVersion 21
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()

View File

@@ -1,5 +1,5 @@
<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"/>
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
@@ -15,7 +15,6 @@
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- This keeps the window background of the activity showing

View File

@@ -1,7 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mokkon.fcs.fcs">
<application
android:label="fcs"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"

View File

@@ -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();
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">FCS</string>
</resources>

View File

@@ -0,0 +1 @@
include ':app'

View File

@@ -32,9 +32,6 @@ class AuthFb {
try {
_authResult = await _fb.signInWithCredential(credential);
print("PhoneVerificationCompleted :$_authResult");
if (_authResult == null) {
throw SigninException("Sigin error!");
}
} catch (e) {
print("Exception:$e");
// throw e;
@@ -61,6 +58,7 @@ class AuthFb {
_verificationId = verificationId;
print("codeSent " + phoneNumber);
codeSentCompleted = true;
if (!completer.isCompleted)
completer.complete(fcs.AuthResult(authStatus: AuthStatus.SMS_SENT));
};
@@ -70,6 +68,7 @@ class AuthFb {
_verificationId = verificationId;
if (codeSentCompleted) {
if (!completer.isCompleted)
completer.complete(fcs.AuthResult(authStatus: AuthStatus.SMS_SENT));
} else {
completer.completeError(SigninException("SMS code failed"));
@@ -92,11 +91,7 @@ class AuthFb {
final fb.AuthCredential credential = fb.PhoneAuthProvider.credential(
verificationId: _verificationId, smsCode: smsCode);
fb.UserCredential _authResult =
await _fb.signInWithCredential(credential);
if (_authResult == null) {
throw SigninException("Sigin error!");
}
await _addUserToStream(refreshIdToken: true);
} on Exception catch (e) {
return Future.error(SigninException(e.toString()));
@@ -118,7 +113,7 @@ class AuthFb {
log.info("Claims:$claims");
if (claims == null) return;
String cid = claims["cid"];
String? cid = claims["cid"];
User? user;
if (cid != null && cid != "") {
user = await _getUserFromFirestore(cid);
@@ -129,7 +124,7 @@ class AuthFb {
}
// add privileges
String privileges = claims["pr"];
String? privileges = claims["pr"];
if (privileges != null && privileges != "") {
user.privileges = privileges.split(":").toList();
} else {
@@ -238,7 +233,7 @@ class AuthFb {
// get privilege from claim
fb.IdTokenResult idToken = await firebaseUser.getIdTokenResult(true);
String privileges = idToken.claims?["pr"] ?? '';
String? privileges = idToken.claims?["pr"] ?? '';
if (privileges != null && privileges != "") {
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);
return controller.stream;

View File

@@ -45,9 +45,13 @@ class MessagingFCM {
}
});
try {
String? token = await _firebaseMessaging.getToken();
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) {

View File

@@ -1,3 +1,4 @@
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
@@ -6,8 +7,9 @@ import 'app.dart';
import 'config.dart';
import 'data/provider/messaging_fcm.dart';
void main() {
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler);
Config(

View File

@@ -12,7 +12,7 @@ import 'package:logging/logging.dart';
class CartonModel extends BaseModel {
List<Carton> _boxes = [];
late PaginatorListener<Carton> cartonsByFilter;
PaginatorListener<Carton>? cartonsByFilter;
final log = Logger('CartonModel');
List<Carton> get boxes => _selectedIndex == 1
@@ -165,8 +165,8 @@ class CartonModel extends BaseModel {
.where("status", isEqualTo: carton_packed_status)
.orderBy(orderName, descending: true);
cartonsByFilter.refresh(
listeningQuery: listenerQuery, pageQuery: pageQuery);
cartonsByFilter!
.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery);
} catch (e) {
log.warning("Error!! $e");
}
@@ -211,7 +211,7 @@ class CartonModel extends BaseModel {
if (listener != null) await listener!.cancel();
if (cartonListener != null) await cartonListener!.cancel();
if (_delivered != null) _delivered!.close();
if (cartonsByFilter != null) cartonsByFilter.close();
if (cartonsByFilter != null) cartonsByFilter!.close();
_boxes = [];
}

View File

@@ -146,7 +146,7 @@ class PartSearchDelegate extends SearchDelegate<Carton> {
return Container(
padding: EdgeInsets.only(top: 5),
child: PaginatorListView<Carton>(
paginatorListener: cartonModel.cartonsByFilter,
paginatorListener: cartonModel.cartonsByFilter!,
rowBuilder: (c) => CartonListRow(
key: ValueKey(c.id),
carton: c,

View File

@@ -13,11 +13,11 @@ class DeliveryAddressModel extends BaseModel {
StreamSubscription<QuerySnapshot>? listener;
DeliveryAddress get defalutAddress =>
deliveryAddresses.firstWhere((e) => e.isDefault, orElse: () => DeliveryAddress());
DeliveryAddress get defalutAddress => deliveryAddresses
.firstWhere((e) => e.isDefault, orElse: () => DeliveryAddress());
DeliveryAddress getLocalDeliveryAddress(String id) =>
deliveryAddresses.firstWhere((e) => e.id == id, orElse: () => DeliveryAddress());
DeliveryAddress getLocalDeliveryAddress(String id) => deliveryAddresses
.firstWhere((e) => e.id == id, orElse: () => DeliveryAddress());
@override
void privilegeChanged() {
@@ -46,7 +46,8 @@ class DeliveryAddressModel extends BaseModel {
deliveryAddresses.clear();
deliveryAddresses = snapshot.docs.map((documentSnapshot) {
var s = DeliveryAddress.fromMap(
documentSnapshot.data as Map<String,dynamic>, documentSnapshot.id);
documentSnapshot.data() as Map<String, dynamic>,
documentSnapshot.id);
return s;
}).toList();
notifyListeners();
@@ -95,7 +96,8 @@ class DeliveryAddressModel extends BaseModel {
.orderBy("full_name")
.get();
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();
}
}

View File

@@ -49,7 +49,8 @@ class DiscountModel extends BaseModel {
.listen((snaps) {
_discounts.clear();
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();
});

View File

@@ -27,7 +27,7 @@ class FAQModel extends BaseModel {
.listen((snaps) {
faqs.clear();
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();
});

View File

@@ -58,7 +58,7 @@ class FcsShipmentModel extends BaseModel {
_fcsShipments.clear();
_fcsShipments = snapshot.docs.map((documentSnapshot) {
var s = FcsShipment.fromMap(
documentSnapshot.data as Map<String,dynamic>, documentSnapshot.id);
documentSnapshot.data() as Map<String,dynamic>, documentSnapshot.id);
return s;
}).toList();
notifyListeners();

View File

@@ -20,9 +20,9 @@ class InvoiceModel extends BaseModel {
List<Invoice> _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 isLoading = false;
@@ -43,9 +43,9 @@ class InvoiceModel extends BaseModel {
initData(bool forCustomer, bool isCanceled, bool isPaid) {
_loadInvoices(forCustomer);
if (_paginator != null) _paginator.close();
if (_paginator != null) _paginator!.close();
_paginator = _getPaginator(forCustomer, isCanceled, isPaid);
_paginator.load(onFinished: () {
_paginator!.load(onFinished: () {
notifyListeners();
});
}
@@ -70,7 +70,8 @@ class InvoiceModel extends BaseModel {
listener = q.snapshots().listen((QuerySnapshot snapshot) {
_invoices.clear();
_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);
return s;
}).toList();
@@ -106,11 +107,11 @@ class InvoiceModel extends BaseModel {
}
Future<void> loadMore({bool? isCustomer}) async {
if (_paginator.ended || _selectedIndex == 1)
if (_paginator!.ended || _selectedIndex == 1)
return; // when paid menu is not selected return
isLoading = true;
notifyListeners();
await _paginator.load(onFinished: () {
await _paginator!.load(onFinished: () {
isLoading = false;
notifyListeners();
});
@@ -118,7 +119,7 @@ class InvoiceModel extends BaseModel {
Future<void> refresh({bool? isCustomer}) async {
if (_selectedIndex == 1) return; // when paid menu is not selected return
await _paginator.refresh(onFinished: () {
await _paginator!.refresh(onFinished: () {
notifyListeners();
});
}
@@ -128,7 +129,7 @@ class InvoiceModel extends BaseModel {
}
logout() async {
if (_paginator != null) _paginator.close();
if (_paginator != null) _paginator!.close();
if (listener != null) await listener!.cancel();
_invoices = [];
}

View File

@@ -27,7 +27,8 @@ class MarketModel extends BaseModel {
markets.clear();
markets = snapshot.docs.map((documentSnapshot) {
var user = Market.fromMap(
documentSnapshot.data as Map<String, dynamic>, documentSnapshot.id);
documentSnapshot.data() as Map<String, dynamic>,
documentSnapshot.id);
return user;
}).toList();
notifyListeners();

View File

@@ -16,9 +16,9 @@ import 'package:path/path.dart' as Path;
class PackageModel extends BaseModel {
final log = Logger('PackageModel');
late PaginatorListener<Package> packages;
late PaginatorListener<Package> customerPackages;
late PaginatorListener<Package> activePackages;
PaginatorListener<Package>? packages;
PaginatorListener<Package>? customerPackages;
PaginatorListener<Package>? activePackages;
bool isLoading = false;
int _menuSelectedIndex = 1;
@@ -63,9 +63,9 @@ class PackageModel extends BaseModel {
@override
logout() async {
if (customerPackages != null) customerPackages.close();
if (packages != null) packages.close();
if (activePackages != null) activePackages.close();
if (customerPackages != null) customerPackages!.close();
if (packages != null) packages!.close();
if (activePackages != null) activePackages!.close();
}
Future<void> _loadPackages(bool isDelivered) async {
@@ -84,7 +84,7 @@ class PackageModel extends BaseModel {
.where("is_delivered", isEqualTo: isDelivered);
pageQuery = pageQuery.orderBy("update_time", descending: true);
packages.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery);
packages!.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery);
} catch (e) {
log.warning("Error!! $e");
}
@@ -105,8 +105,8 @@ class PackageModel extends BaseModel {
.where("user_id", isEqualTo: user!.id)
.orderBy("update_time", descending: true);
customerPackages.refresh(
listeningQuery: listenerQuery, pageQuery: pageQuery);
customerPackages!
.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery);
} catch (e) {
log.warning("Error!! $e");
}
@@ -128,8 +128,8 @@ class PackageModel extends BaseModel {
.where("is_delivered", isEqualTo: false);
pageQuery = pageQuery.orderBy("update_time", descending: true);
activePackages.refresh(
listeningQuery: listenerQuery, pageQuery: pageQuery);
activePackages!
.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery);
} catch (e) {
log.warning("Error!! $e");
}
@@ -163,8 +163,7 @@ class PackageModel extends BaseModel {
.get(const GetOptions(source: Source.server));
if (snaps.docs.length == 1) {
var snap = snaps.docs[0];
var package =
Package.fromMap(snap.data as Map<String, dynamic>, snap.id);
var package = Package.fromMap(snap.data(), snap.id);
return package;
}
} catch (e) {

View File

@@ -38,7 +38,7 @@ class PackageInfo extends StatefulWidget {
class _PackageInfoState extends State<PackageInfo> {
var dateFormatter = new DateFormat('dd MMM yyyy');
Package? _package;
Package? _package = Package();
bool _isLoading = false;
MultiImgController multiImgController = MultiImgController();
@@ -48,13 +48,19 @@ class _PackageInfoState extends State<PackageInfo> {
initPackage(widget.package!);
}
initPackage(Package pkg) async {
initPackage(Package? pkg) async {
setState(() {
_isLoading = true;
});
if (pkg == null) return;
PackageModel packageModel =
Provider.of<PackageModel>(context, listen: false);
Package? package = await packageModel.getPackageByTrackingID(pkg.trackingID!);
Package? package =
await packageModel.getPackageByTrackingID(pkg!.trackingID!);
setState(() {
_package = package;
multiImgController.setImageUrls = package!.photoUrls;
_isLoading = false;
});
}

View File

@@ -84,7 +84,7 @@ class _PackageListState extends State<PackageList> {
],
),
body: PaginatorListView<Package>(
paginatorListener: packages,
paginatorListener: packages!,
rowBuilder: (p) => PackageListRow(
key: ValueKey(p.id),
package: p,

View File

@@ -26,8 +26,7 @@ class PaymentMethodModel extends BaseModel {
.listen((snaps) {
paymentMethods.clear();
snaps.docs.forEach((d) {
paymentMethods
.add(PaymentMethod.fromMap(d.data as Map<String, dynamic>, d.id));
paymentMethods.add(PaymentMethod.fromMap(d.data(), d.id));
});
notifyListeners();
});

View File

@@ -73,7 +73,7 @@ class _ProcessingListState extends State<ProcessingList> {
backgroundColor: primaryColor,
),
body: PaginatorListView<Package>(
paginatorListener: packages,
paginatorListener: packages!,
rowBuilder: (p) => ProcessingListRow(
key: ValueKey(p.id),
package: p,

View File

@@ -65,7 +65,7 @@ class _ProcessingListState extends State<ProcessingList> {
],
),
body: PaginatorListView<Package>(
paginatorListener: packages,
paginatorListener: packages!,
rowBuilder: (p) => ProcessingListRow(
key: ValueKey(p.id),
package: p,

View File

@@ -75,7 +75,7 @@ class _ReceivingListState extends State<ReceivingList> {
backgroundColor: primaryColor,
),
body: PaginatorListView<Package>(
paginatorListener: packages,
paginatorListener: packages!,
rowBuilder: (p) => ReceivingListRow(
key: ValueKey(p.id),
package: p,

View File

@@ -15,11 +15,11 @@ class ShipmentModel extends BaseModel {
List<Shipment> get shipments => _menuSelectedIndex == 1
? _shipments
: List<Shipment>.from(_delivered.values);
: List<Shipment>.from(_delivered!.values);
List<Shipment> _shipments = [];
late Paginator _delivered;
Paginator? _delivered;
bool isLoading = false;
int _menuSelectedIndex = 1;
@@ -34,7 +34,7 @@ class ShipmentModel extends BaseModel {
logout();
_loadShipments(forCustomer, myPickup);
_delivered = _getDelivered(forCustomer);
_delivered.load(onFinished: () {
_delivered!.load(onFinished: () {
isLoading = false;
notifyListeners();
});
@@ -42,7 +42,7 @@ class ShipmentModel extends BaseModel {
@override
logout() async {
if (_delivered != null) _delivered.close();
if (_delivered != null) _delivered!.close();
if (listener != null) await listener!.cancel();
_shipments = [];
}
@@ -50,10 +50,10 @@ class ShipmentModel extends BaseModel {
Future<void> loadMore({bool? isCustomer}) async {
if (menuSelectedIndex == 1)
return; // when delivered menu is not selected return
if (_delivered.ended) return;
if (_delivered!.ended) return;
isLoading = true;
notifyListeners();
await _delivered.load(onFinished: () {
await _delivered!.load(onFinished: () {
isLoading = false;
notifyListeners();
});
@@ -62,7 +62,7 @@ class ShipmentModel extends BaseModel {
Future<void> refresh({bool? isCustomer}) async {
if (menuSelectedIndex == 1)
return; // when delivered menu is not selected return
await _delivered.refresh(onFinished: () {
await _delivered!.refresh(onFinished: () {
notifyListeners();
});
}

View File

@@ -46,8 +46,9 @@ class StaffModel extends BaseModel {
.listen((QuerySnapshot snapshot) {
employees.clear();
employees = snapshot.docs.map((documentSnapshot) {
var user =
User.fromMap(documentSnapshot.data as Map<String,dynamic>, documentSnapshot.id);
var user = User.fromMap(
documentSnapshot.data() as Map<String, dynamic>,
documentSnapshot.id);
return user;
}).toList();
notifyListeners();
@@ -66,7 +67,8 @@ class StaffModel extends BaseModel {
privileges.clear();
privileges = snapshot.docs.map((documentSnapshot) {
var privilege = Privilege.fromMap(
documentSnapshot.data as Map<String,dynamic>, documentSnapshot.id);
documentSnapshot.data() as Map<String, dynamic>,
documentSnapshot.id);
return privilege;
}).toList();
notifyListeners();
@@ -101,8 +103,8 @@ class StaffModel extends BaseModel {
.where("privileges", arrayContains: privilege)
.get(const GetOptions(source: Source.server));
users = snaps.docs.map((documentSnapshot) {
var user =
User.fromMap(documentSnapshot.data as Map<String,dynamic>, documentSnapshot.id);
var user = User.fromMap(
documentSnapshot.data as Map<String, dynamic>, documentSnapshot.id);
return user;
}).toList();
} catch (e) {

View File

@@ -7,9 +7,9 @@ import 'package:fcs/helpers/theme.dart';
class LocalText extends Text {
final BuildContext context;
LocalText(this.context, String translationKey,
{Color? color,
double? fontSize,
FontWeight? fontWeight,
{Color color = secondaryColor,
double fontSize = 13,
FontWeight fontWeight = FontWeight.w500,
List<String>? translationVariables,
String? text,
bool underline = false})
@@ -19,14 +19,14 @@ class LocalText extends Text {
translationVariables: translationVariables),
style: Provider.of<LanguageModel>(context, listen: false).isEng
? newLabelStyle(
color: color!,
fontSize: fontSize!,
fontWeight: fontWeight!,
color: color,
fontSize: fontSize,
fontWeight: fontWeight,
underline: underline)
: newLabelStyleMM(
color: color!,
fontSize: fontSize!,
fontWeight: fontWeight!,
color: color,
fontSize: fontSize,
fontWeight: fontWeight,
underline: underline));
}