| { | { | ||||
| "name": "mobile-app", | "name": "mobile-app", | ||||
| "request": "launch", | "request": "launch", | ||||
| "type": "dart" | |||||
| "type": "dart", | |||||
| "args": [ | |||||
| "--no-sound-null-safety" | |||||
| ] | |||||
| } | } | ||||
| ] | ] | ||||
| } | } |
| PODS: | PODS: | ||||
| - camera (0.0.1): | |||||
| - camera_avfoundation (0.0.1): | |||||
| - Flutter | - Flutter | ||||
| - DKImagePickerController/Core (4.3.4): | - DKImagePickerController/Core (4.3.4): | ||||
| - DKImagePickerController/ImageDataManager | - DKImagePickerController/ImageDataManager | ||||
| - GoogleUtilities/UserDefaults (~> 7.8) | - GoogleUtilities/UserDefaults (~> 7.8) | ||||
| - nanopb (< 2.30910.0, >= 2.30908.0) | - nanopb (< 2.30910.0, >= 2.30908.0) | ||||
| - Flutter (1.0.0) | - Flutter (1.0.0) | ||||
| - flutter_image_compress (0.0.1): | |||||
| - flutter_image_compress_common (1.0.0): | |||||
| - Flutter | - Flutter | ||||
| - Mantle | - Mantle | ||||
| - SDWebImage | |||||
| - SDWebImageWebPCoder | - SDWebImageWebPCoder | ||||
| - FMDB (2.7.5): | - FMDB (2.7.5): | ||||
| - FMDB/standard (= 2.7.5) | - FMDB/standard (= 2.7.5) | ||||
| - nanopb/encode (= 2.30909.0) | - nanopb/encode (= 2.30909.0) | ||||
| - nanopb/decode (2.30909.0) | - nanopb/decode (2.30909.0) | ||||
| - nanopb/encode (2.30909.0) | - nanopb/encode (2.30909.0) | ||||
| - package_info (0.0.1): | |||||
| - package_info_plus (0.4.5): | |||||
| - Flutter | - Flutter | ||||
| - path_provider (0.0.1): | |||||
| - path_provider_foundation (0.0.1): | |||||
| - Flutter | - Flutter | ||||
| - FlutterMacOS | |||||
| - PromisesObjC (2.3.1) | - PromisesObjC (2.3.1) | ||||
| - qr_code_scanner (0.2.0): | - qr_code_scanner (0.2.0): | ||||
| - Flutter | - Flutter | ||||
| - SDWebImage/Core (~> 5.17) | - SDWebImage/Core (~> 5.17) | ||||
| - shared_preferences (0.0.1): | - shared_preferences (0.0.1): | ||||
| - Flutter | - Flutter | ||||
| - sqflite (0.0.2): | |||||
| - sqflite (0.0.3): | |||||
| - Flutter | - Flutter | ||||
| - FMDB (>= 2.7.5) | - FMDB (>= 2.7.5) | ||||
| - SwiftyGif (5.4.4) | - SwiftyGif (5.4.4) | ||||
| DEPENDENCIES: | DEPENDENCIES: | ||||
| - camera (from `.symlinks/plugins/camera/ios`) | |||||
| - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) | |||||
| - file_picker (from `.symlinks/plugins/file_picker/ios`) | - file_picker (from `.symlinks/plugins/file_picker/ios`) | ||||
| - firebase_core (from `.symlinks/plugins/firebase_core/ios`) | - firebase_core (from `.symlinks/plugins/firebase_core/ios`) | ||||
| - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) | - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) | ||||
| - Flutter (from `Flutter`) | - Flutter (from `Flutter`) | ||||
| - flutter_image_compress (from `.symlinks/plugins/flutter_image_compress/ios`) | |||||
| - package_info (from `.symlinks/plugins/package_info/ios`) | |||||
| - path_provider (from `.symlinks/plugins/path_provider/ios`) | |||||
| - flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`) | |||||
| - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) | |||||
| - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`) | |||||
| - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`) | - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`) | ||||
| - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) | - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) | ||||
| - sqflite (from `.symlinks/plugins/sqflite/ios`) | - sqflite (from `.symlinks/plugins/sqflite/ios`) | ||||
| - SwiftyGif | - SwiftyGif | ||||
| EXTERNAL SOURCES: | EXTERNAL SOURCES: | ||||
| camera: | |||||
| :path: ".symlinks/plugins/camera/ios" | |||||
| camera_avfoundation: | |||||
| :path: ".symlinks/plugins/camera_avfoundation/ios" | |||||
| file_picker: | file_picker: | ||||
| :path: ".symlinks/plugins/file_picker/ios" | :path: ".symlinks/plugins/file_picker/ios" | ||||
| firebase_core: | firebase_core: | ||||
| :path: ".symlinks/plugins/firebase_messaging/ios" | :path: ".symlinks/plugins/firebase_messaging/ios" | ||||
| Flutter: | Flutter: | ||||
| :path: Flutter | :path: Flutter | ||||
| flutter_image_compress: | |||||
| :path: ".symlinks/plugins/flutter_image_compress/ios" | |||||
| package_info: | |||||
| :path: ".symlinks/plugins/package_info/ios" | |||||
| path_provider: | |||||
| :path: ".symlinks/plugins/path_provider/ios" | |||||
| flutter_image_compress_common: | |||||
| :path: ".symlinks/plugins/flutter_image_compress_common/ios" | |||||
| package_info_plus: | |||||
| :path: ".symlinks/plugins/package_info_plus/ios" | |||||
| path_provider_foundation: | |||||
| :path: ".symlinks/plugins/path_provider_foundation/ios" | |||||
| qr_code_scanner: | qr_code_scanner: | ||||
| :path: ".symlinks/plugins/qr_code_scanner/ios" | :path: ".symlinks/plugins/qr_code_scanner/ios" | ||||
| shared_preferences: | shared_preferences: | ||||
| :path: ".symlinks/plugins/sqflite/ios" | :path: ".symlinks/plugins/sqflite/ios" | ||||
| SPEC CHECKSUMS: | SPEC CHECKSUMS: | ||||
| camera: a0ca5080336f7af47b88436e5e26da3dee5568f0 | |||||
| camera_avfoundation: 3125e8cd1a4387f6f31c6c63abb8a55892a9eeeb | |||||
| DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac | DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac | ||||
| DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 | DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 | ||||
| file_picker: ce3938a0df3cc1ef404671531facef740d03f920 | file_picker: ce3938a0df3cc1ef404671531facef740d03f920 | ||||
| FirebaseInstallations: b822f91a61f7d1ba763e5ccc9d4f2e6f2ed3b3ee | FirebaseInstallations: b822f91a61f7d1ba763e5ccc9d4f2e6f2ed3b3ee | ||||
| FirebaseMessaging: 0c0ae1eb722ef0c07f7801e5ded8dccd1357d6d4 | FirebaseMessaging: 0c0ae1eb722ef0c07f7801e5ded8dccd1357d6d4 | ||||
| Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 | Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 | ||||
| flutter_image_compress: 082f8daaf6c1b0c9fe798251c750ef0ecd98d7ae | |||||
| flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e | |||||
| FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a | FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a | ||||
| GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2 | GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2 | ||||
| GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084 | GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084 | ||||
| Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d | Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d | ||||
| MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb | MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb | ||||
| nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 | nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 | ||||
| package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 | |||||
| path_provider: fb74bd0465e96b594bb3b5088ee4a4e7bb1f2a9d | |||||
| package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 | |||||
| path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 | |||||
| PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 | PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 | ||||
| qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e | qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e | ||||
| SDWebImage: 96e0c18ef14010b7485210e92fac888587ebb958 | SDWebImage: 96e0c18ef14010b7485210e92fac888587ebb958 | ||||
| SDWebImageWebPCoder: 3027af94522d94df79c21c070894c8a2128927ff | SDWebImageWebPCoder: 3027af94522d94df79c21c070894c8a2128927ff | ||||
| shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d | shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d | ||||
| sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 | |||||
| sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a | |||||
| SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f | SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f | ||||
| PODFILE CHECKSUM: f08360d062df7ffa8ee251115991830e526d3068 | PODFILE CHECKSUM: f08360d062df7ffa8ee251115991830e526d3068 |
| import 'package:farm_tpf/utils/const_enum.dart'; | import 'package:farm_tpf/utils/const_enum.dart'; | ||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_bloc/flutter_bloc.dart'; | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
| import 'package:flutter_screenutil/flutter_screenutil.dart'; | |||||
| import 'package:get/get.dart'; | import 'package:get/get.dart'; | ||||
| import 'authentication/bloc/authentication_bloc.dart'; | import 'authentication/bloc/authentication_bloc.dart'; | ||||
| @override | @override | ||||
| Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
| return GetMaterialApp( | |||||
| debugShowCheckedModeBanner: false, | |||||
| theme: ThemeData( | |||||
| backgroundColor: Colors.white, | |||||
| brightness: Brightness.light, | |||||
| primaryColor: AppColors.DEFAULT, | |||||
| accentColor: AppColors.DEFAULT, | |||||
| hoverColor: AppColors.GREEN, | |||||
| // textTheme: GoogleFonts.sairaTextTheme( | |||||
| // Theme.of(context).textTheme, | |||||
| // ), | |||||
| ), | |||||
| navigatorKey: _navigatorKey, | |||||
| builder: (context, child) { | |||||
| return BlocListener<AuthenticationBloc, AuthenticationState>( | |||||
| listener: (context, state) { | |||||
| switch (state.status) { | |||||
| case AuthenticationStatus.authenticated: | |||||
| // _navigator!.pushAndRemoveUntil<void>( | |||||
| // TabbarScreen.route(), | |||||
| // (route) => false, | |||||
| // ); | |||||
| Get.offAll(() => TabbarScreen()); | |||||
| break; | |||||
| case AuthenticationStatus.unauthenticated: | |||||
| // _navigator!.pushAndRemoveUntil<void>( | |||||
| // LoginPage.route(), | |||||
| // (route) => false, | |||||
| // ); | |||||
| Get.offAll(() => const LoginPage()); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| return ScreenUtilInit( | |||||
| designSize: const Size(375, 812), | |||||
| minTextAdapt: true, | |||||
| splitScreenMode: true, | |||||
| builder: (BuildContext context, Widget? child) { | |||||
| return GetMaterialApp( | |||||
| debugShowCheckedModeBanner: false, | |||||
| theme: ThemeData( | |||||
| backgroundColor: Colors.white, | |||||
| brightness: Brightness.light, | |||||
| primaryColor: AppColors.DEFAULT, | |||||
| accentColor: AppColors.DEFAULT, | |||||
| hoverColor: AppColors.GREEN, | |||||
| // textTheme: GoogleFonts.sairaTextTheme( | |||||
| // Theme.of(context).textTheme, | |||||
| // ), | |||||
| ), | |||||
| navigatorKey: _navigatorKey, | |||||
| builder: (context, child) { | |||||
| return BlocListener<AuthenticationBloc, AuthenticationState>( | |||||
| listener: (context, state) { | |||||
| switch (state.status) { | |||||
| case AuthenticationStatus.authenticated: | |||||
| // _navigator!.pushAndRemoveUntil<void>( | |||||
| // TabbarScreen.route(), | |||||
| // (route) => false, | |||||
| // ); | |||||
| Get.offAll(() => TabbarScreen()); | |||||
| break; | |||||
| case AuthenticationStatus.unauthenticated: | |||||
| // _navigator!.pushAndRemoveUntil<void>( | |||||
| // LoginPage.route(), | |||||
| // (route) => false, | |||||
| // ); | |||||
| Get.offAll(() => const LoginPage()); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| }, | |||||
| child: child, | |||||
| ); | |||||
| }, | }, | ||||
| child: child, | |||||
| onGenerateRoute: (_) => SplashPage.route(), | |||||
| ); | ); | ||||
| }, | }, | ||||
| onGenerateRoute: (_) => SplashPage.route(), | |||||
| ); | ); | ||||
| } | } | ||||
| } | } |
| // ************************************************************************** | // ************************************************************************** | ||||
| class _RestClient implements RestClient { | class _RestClient implements RestClient { | ||||
| _RestClient(this._dio) { | |||||
| _RestClient(this._dio, {this.baseUrl}) { | |||||
| ArgumentError.checkNotNull(_dio, '_dio'); | ArgumentError.checkNotNull(_dio, '_dio'); | ||||
| baseUrl ??= 'https://tpf.aztrace.vn/'; | |||||
| } | } | ||||
| final Dio _dio; | final Dio _dio; | ||||
| String baseUrl = 'https://tpf.aztrace.vn'; | |||||
| String? baseUrl; | |||||
| @override | @override | ||||
| Future<User> login(userRequest) async { | |||||
| login(userRequest) async { | |||||
| ArgumentError.checkNotNull(userRequest, 'userRequest'); | ArgumentError.checkNotNull(userRequest, 'userRequest'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| _data.addAll(userRequest?.toJson() ?? <String, dynamic>{}); | _data.addAll(userRequest?.toJson() ?? <String, dynamic>{}); | ||||
| final _result = await _dio.request<Map<String, dynamic>>('/api/authenticate', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'POST', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| final value = User.fromJson(_result.data); | |||||
| final Response<Map<String, dynamic>> _result = await _dio.post('/api/authenticate', queryParameters: queryParameters, data: _data); | |||||
| final value = User.fromJson(_result.data!); | |||||
| return value; | return value; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<Account> getMe() async { | |||||
| getMe() async { | |||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final _result = await _dio.request<Map<String, dynamic>>('/api/account', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'GET', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| final value = Account.fromJson(_result.data); | |||||
| final Response<Map<String, dynamic>> _result = await _dio.request('/api/account', queryParameters: queryParameters, data: _data); | |||||
| final value = Account.fromJson(_result.data ?? Map<String, dynamic>()); | |||||
| return value; | return value; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<void> forgotPassword(email) async { | |||||
| forgotPassword(email) async { | |||||
| ArgumentError.checkNotNull(email, 'email'); | ArgumentError.checkNotNull(email, 'email'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = email; | final _data = email; | ||||
| await _dio.request<void>('/api/account/reset-password/init', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'POST', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| await _dio.post<void>( | |||||
| '/api/account/reset-password/init', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| return null; | return null; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<void> resetPassword(password) async { | |||||
| resetPassword(password) async { | |||||
| ArgumentError.checkNotNull(password, 'password'); | ArgumentError.checkNotNull(password, 'password'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| _data.addAll(password?.toJson() ?? <String, dynamic>{}); | |||||
| await _dio.request<void>('/api/account/reset-password/finish', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'POST', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| _data.addAll(password.toJson() ?? <String, dynamic>{}); | |||||
| await _dio.post<void>('/api/account/reset-password/finish', queryParameters: queryParameters, data: _data); | |||||
| return null; | return null; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<void> changePassword(password) async { | |||||
| changePassword(password) async { | |||||
| ArgumentError.checkNotNull(password, 'password'); | ArgumentError.checkNotNull(password, 'password'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| _data.addAll(password?.toJson() ?? <String, dynamic>{}); | _data.addAll(password?.toJson() ?? <String, dynamic>{}); | ||||
| await _dio.request<void>('/api/account/change-password', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'POST', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| await _dio.post<void>( | |||||
| '/api/account/change-password', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| return null; | return null; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<Account> updateProfile(account) async { | |||||
| updateProfile(account) async { | |||||
| ArgumentError.checkNotNull(account, 'account'); | ArgumentError.checkNotNull(account, 'account'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| _data.addAll(account?.toJson() ?? <String, dynamic>{}); | _data.addAll(account?.toJson() ?? <String, dynamic>{}); | ||||
| final _result = await _dio.request<Map<String, dynamic>>('/api/update-my-profile', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'PUT', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| final value = Account.fromJson(_result.data); | |||||
| final Response<Map<String, dynamic>> _result = await _dio.put('/api/update-my-profile', queryParameters: queryParameters, data: _data); | |||||
| final value = Account.fromJson(_result.data ?? Map<String, dynamic>()); | |||||
| return value; | return value; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<List<Supply>> getSupplies(type, {options, query = ""}) async { | |||||
| getSupplies(type, {Options? options, query = ""}) async { | |||||
| ArgumentError.checkNotNull(type, 'type'); | ArgumentError.checkNotNull(type, 'type'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final newOptions = newRequestOptions(options!); | |||||
| final newOptions = newRequestOptions(options ?? Options()); | |||||
| newOptions.extra.addAll(_extra); | newOptions.extra.addAll(_extra); | ||||
| newOptions.headers.addAll(<String, dynamic>{}); | newOptions.headers.addAll(<String, dynamic>{}); | ||||
| final _result = await _dio.request<List<dynamic>>('/api/list-supplies-in-warehouses/$type?q=$query', | |||||
| queryParameters: queryParameters, options: newOptions.merge(method: 'GET', baseUrl: baseUrl), data: _data); | |||||
| var value = _result.data.map((dynamic i) => Supply.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/list-supplies-in-warehouses/$type?q=$query', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => Supply.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<void> updateFcmToken(token) async { | |||||
| updateFcmToken(token) async { | |||||
| ArgumentError.checkNotNull(token, 'token'); | ArgumentError.checkNotNull(token, 'token'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = token; | final _data = token; | ||||
| await _dio.request<void>('/api/update-fcmToken', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'PUT', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| await _dio.put<void>( | |||||
| '/api/update-fcmToken', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| return null; | return null; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<void> deleteFcmToken(token) async { | |||||
| deleteFcmToken(token) async { | |||||
| ArgumentError.checkNotNull(token, 'token'); | ArgumentError.checkNotNull(token, 'token'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = token; | final _data = token; | ||||
| await _dio.request<void>('/api/delete-fcmToken', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'PUT', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| await _dio.put<void>( | |||||
| '/api/delete-fcmToken', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| return null; | return null; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<List<TbCropDTO>> getPlots({page = 0, size = 20, query = ""}) async { | |||||
| getPlots({page = 0, size = 20, query = ""}) async { | |||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final _result = await _dio.request<List<dynamic>>('/api/_search/tb-crops?page=$page&size=$size&sort=id,asc&query=$query', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'GET', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| var value = _result.data.map((dynamic i) => TbCropDTO.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/_search/tb-crops?page=$page&size=$size&sort=id,asc&query=$query', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => TbCropDTO.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<List<ActionType>> getActionTypes({options}) async { | |||||
| getActionTypes({Options? options}) async { | |||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final newOptions = newRequestOptions(options!); | |||||
| final newOptions = newRequestOptions(options ?? Options()); | |||||
| newOptions.extra.addAll(_extra); | newOptions.extra.addAll(_extra); | ||||
| newOptions.headers.addAll(<String, dynamic>{}); | newOptions.headers.addAll(<String, dynamic>{}); | ||||
| final _result = await _dio.request<List<dynamic>>('/api/listActivityTypesOther', | |||||
| queryParameters: queryParameters, options: newOptions.merge(method: 'GET', baseUrl: baseUrl), data: _data); | |||||
| var value = _result.data.map((dynamic i) => ActionType.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/listActivityTypesOther', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => ActionType.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<List<WaterType>> getWaterTypes({options}) async { | |||||
| getWaterTypes({Options? options}) async { | |||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final newOptions = newRequestOptions(options!); | |||||
| final newOptions = newRequestOptions(options ?? Options()); | |||||
| newOptions.extra.addAll(_extra); | newOptions.extra.addAll(_extra); | ||||
| newOptions.headers.addAll(<String, dynamic>{}); | newOptions.headers.addAll(<String, dynamic>{}); | ||||
| final _result = await _dio.request<List<dynamic>>('/api/water-types', | |||||
| queryParameters: queryParameters, options: newOptions.merge(method: 'GET', baseUrl: baseUrl), data: _data); | |||||
| var value = _result.data.map((dynamic i) => WaterType.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/water-types', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => WaterType.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<List<Harvest>> getHarvests({options}) async { | |||||
| getHarvests({Options? options}) async { | |||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final newOptions = newRequestOptions(options!); | |||||
| final newOptions = newRequestOptions(options ?? Options()); | |||||
| newOptions.extra.addAll(_extra); | newOptions.extra.addAll(_extra); | ||||
| newOptions.headers.addAll(<String, dynamic>{}); | newOptions.headers.addAll(<String, dynamic>{}); | ||||
| final _result = await _dio.request<List<dynamic>>('/api/tb-harvests', | |||||
| queryParameters: queryParameters, options: newOptions.merge(method: 'GET', baseUrl: baseUrl), data: _data); | |||||
| var value = _result.data.map((dynamic i) => Harvest.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/tb-harvests', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => Harvest.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<List<Device>> getDeviceForActivity({options}) async { | |||||
| getDeviceForActivity({Options? options}) async { | |||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final newOptions = newRequestOptions(options!); | |||||
| final newOptions = newRequestOptions(options ?? Options()); | |||||
| newOptions.extra.addAll(_extra); | newOptions.extra.addAll(_extra); | ||||
| newOptions.headers.addAll(<String, dynamic>{}); | newOptions.headers.addAll(<String, dynamic>{}); | ||||
| final _result = await _dio.request<List<dynamic>>('/api/listDeviceForActivity', | |||||
| queryParameters: queryParameters, options: newOptions.merge(method: 'GET', baseUrl: baseUrl), data: _data); | |||||
| var value = _result.data.map((dynamic i) => Device.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/listDeviceForActivity', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => Device.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<void> updateAllNotification(status) async { | |||||
| updateAllNotification(status) async { | |||||
| ArgumentError.checkNotNull(status, 'status'); | ArgumentError.checkNotNull(status, 'status'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = status; | final _data = status; | ||||
| await _dio.request<void>('/api/notifications/update-all', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'PUT', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| await _dio.put<void>( | |||||
| '/api/notifications/update-all', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| return null; | return null; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<void> updateNoti(updateNoti) async { | |||||
| updateNoti(updateNoti) async { | |||||
| ArgumentError.checkNotNull(updateNoti, 'updateNoti'); | ArgumentError.checkNotNull(updateNoti, 'updateNoti'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| _data.addAll(updateNoti?.toJson() ?? <String, dynamic>{}); | _data.addAll(updateNoti?.toJson() ?? <String, dynamic>{}); | ||||
| await _dio.request<void>('/api/notifications/update', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'PUT', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| await _dio.put<void>( | |||||
| '/api/notifications/update', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| return null; | return null; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<List<LocationUnit>> getCountries({page = 0, size = 400, query = '', options}) async { | |||||
| getCountries({page = 0, size = 400, query = '', Options? options}) async { | |||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final newOptions = newRequestOptions(options!); | |||||
| final newOptions = newRequestOptions(options ?? Options()); | |||||
| newOptions.extra.addAll(_extra); | newOptions.extra.addAll(_extra); | ||||
| newOptions.headers.addAll(<String, dynamic>{}); | newOptions.headers.addAll(<String, dynamic>{}); | ||||
| final _result = await _dio.request<List<dynamic>>('/api/tb-countries?page=$page&size=$size&query=$query&&sort=name,ASC', | |||||
| queryParameters: queryParameters, options: newOptions.merge(method: 'GET', baseUrl: baseUrl), data: _data); | |||||
| var value = _result.data.map((dynamic i) => LocationUnit.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/tb-countries?page=$page&size=$size&query=$query&&sort=name,ASC', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => LocationUnit.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<List<LocationUnit>> getProvinces(countryId, {page = 0, size = 20, query = '', options}) async { | |||||
| getProvinces(countryId, {page = 0, size = 20, query = '', Options? options}) async { | |||||
| ArgumentError.checkNotNull(countryId, 'countryId'); | ArgumentError.checkNotNull(countryId, 'countryId'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final newOptions = newRequestOptions(options!); | |||||
| final newOptions = newRequestOptions(options ?? Options()); | |||||
| newOptions.extra.addAll(_extra); | newOptions.extra.addAll(_extra); | ||||
| newOptions.headers.addAll(<String, dynamic>{}); | newOptions.headers.addAll(<String, dynamic>{}); | ||||
| final _result = await _dio.request<List<dynamic>>('/api/tb-cities-by-country/$countryId?page=$page&size=$size&query=$query&&sort=name,ASC', | |||||
| queryParameters: queryParameters, options: newOptions.merge(method: 'GET', baseUrl: baseUrl), data: _data); | |||||
| var value = _result.data.map((dynamic i) => LocationUnit.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/tb-cities-by-country/$countryId?page=$page&size=$size&query=$query&&sort=name,ASC', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => LocationUnit.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<List<LocationUnit>> getDistricts(provinceId, {page = 0, size = 20, query = '', options}) async { | |||||
| getDistricts(provinceId, {page = 0, size = 20, query = '', Options? options}) async { | |||||
| ArgumentError.checkNotNull(provinceId, 'provinceId'); | ArgumentError.checkNotNull(provinceId, 'provinceId'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final newOptions = newRequestOptions(options!); | |||||
| final newOptions = newRequestOptions(options ?? Options()); | |||||
| newOptions.extra.addAll(_extra); | newOptions.extra.addAll(_extra); | ||||
| newOptions.headers.addAll(<String, dynamic>{}); | newOptions.headers.addAll(<String, dynamic>{}); | ||||
| final _result = await _dio.request<List<dynamic>>('/api/tb-districts-by-city/$provinceId?page=$page&size=$size&query=$query&&sort=name,ASC', | |||||
| queryParameters: queryParameters, options: newOptions.merge(method: 'GET', baseUrl: baseUrl), data: _data); | |||||
| var value = _result.data.map((dynamic i) => LocationUnit.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/tb-districts-by-city/$provinceId?page=$page&size=$size&query=$query&&sort=name,ASC', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => LocationUnit.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<List<LocationUnit>> getWards(districtId, {page = 0, size = 20, query = '', options}) async { | |||||
| getWards(districtId, {page = 0, size = 20, query = '', Options? options}) async { | |||||
| ArgumentError.checkNotNull(districtId, 'districtId'); | ArgumentError.checkNotNull(districtId, 'districtId'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final newOptions = newRequestOptions(options!); | |||||
| final newOptions = newRequestOptions(options ?? Options()); | |||||
| newOptions.extra.addAll(_extra); | newOptions.extra.addAll(_extra); | ||||
| newOptions.headers.addAll(<String, dynamic>{}); | newOptions.headers.addAll(<String, dynamic>{}); | ||||
| final _result = await _dio.request<List<dynamic>>('/api/tb-wards-by-district/$districtId?page=$page&size=$size&query=$query&&sort=name,ASC', | |||||
| queryParameters: queryParameters, options: newOptions.merge(method: 'GET', baseUrl: baseUrl), data: _data); | |||||
| var value = _result.data.map((dynamic i) => LocationUnit.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/tb-wards-by-district/$districtId?page=$page&size=$size&query=$query&&sort=name,ASC', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => LocationUnit.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<CropPlot> getCropDetail(cropId, {page = 0, size = 20}) async { | |||||
| getCropDetail(cropId, {page = 0, size = 20}) async { | |||||
| ArgumentError.checkNotNull(cropId, 'cropId'); | ArgumentError.checkNotNull(cropId, 'cropId'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final _result = await _dio.request<Map<String, dynamic>>('/api/tb-crops-detail-for-app/$cropId?page=$page&size=$size&sort=executeDate,DESC', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'GET', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| final value = CropPlot.fromJson(_result.data); | |||||
| final Response<Map<String, dynamic>> _result = await _dio.request( | |||||
| '/api/tb-crops-detail-for-app/$cropId?page=$page&size=$size&sort=executeDate,DESC', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| final value = CropPlot.fromJson(_result.data ?? Map<String, dynamic>()); | |||||
| return value; | return value; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<CropPlot> getCropDetailByCode(cropCode) async { | |||||
| getCropDetailByCode(cropCode, {page = 0, size = 20}) async { | |||||
| ArgumentError.checkNotNull(cropCode, 'cropCode'); | ArgumentError.checkNotNull(cropCode, 'cropCode'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final _result = await _dio.request<Map<String, dynamic>>('/api/tb-crops-scan-qrCode/$cropCode', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'GET', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| final value = CropPlot.fromJson(_result.data); | |||||
| final Response<Map<String, dynamic>> _result = await _dio.request( | |||||
| '/api/tb-crops-scan-qrCode/$cropCode', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| final value = CropPlot.fromJson(_result.data ?? Map<String, dynamic>()); | |||||
| return value; | return value; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<void> updateCrop(crop) async { | |||||
| updateCrop(crop) async { | |||||
| ArgumentError.checkNotNull(crop, 'crop'); | ArgumentError.checkNotNull(crop, 'crop'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| _data.addAll(crop?.toJson() ?? <String, dynamic>{}); | _data.addAll(crop?.toJson() ?? <String, dynamic>{}); | ||||
| await _dio.request<void>('/api/tb-crops', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'PUT', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| await _dio.put<void>( | |||||
| '/api/tb-crops', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| return null; | return null; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<List<Device>> getDevices(query) async { | |||||
| getDevices(String? query) async { | |||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | |||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final _result = await _dio.request<List<dynamic>>('/api/listDeviceOfUserCustomers?query=$query', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'GET', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| var value = _result.data.map((dynamic i) => Device.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = | |||||
| await _dio.request('/api/listDeviceOfUserCustomers?query=$query', queryParameters: queryParameters, data: _data); | |||||
| var value = _result.data?.map((dynamic i) => Device.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | } | ||||
| @override | @override | ||||
| Future<List<EnvironmentParameter>> getEnvironmentParameters(cropId, {page = 0, size = 20}) async { | |||||
| getEnvironmentParameters(cropId, {page = 0, size = 20}) async { | |||||
| ArgumentError.checkNotNull(cropId, 'cropId'); | ArgumentError.checkNotNull(cropId, 'cropId'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final queryParameters = <String, dynamic>{}; | final queryParameters = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final _result = await _dio.request<List<dynamic>>('/api/list-environment-updates-display/$cropId?page=$page&size=$size', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'GET', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| var value = _result.data.map((dynamic i) => EnvironmentParameter.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/list-environment-updates-display/$cropId?page=$page&size=$size', | |||||
| queryParameters: queryParameters, | |||||
| data: _data, | |||||
| ); | |||||
| var value = _result.data?.map((dynamic i) => EnvironmentParameter.fromJson(i as Map<String, dynamic>)).toList(); | |||||
| return value ?? []; | |||||
| } | |||||
| RequestOptions newRequestOptions(Options? options) { | |||||
| // if (options is RequestOptions) { | |||||
| // // return options ?? RequestOptions(path: ''); | |||||
| // return RequestOptions!; | |||||
| // } | |||||
| if (options == null) { | |||||
| return RequestOptions(path: ''); | |||||
| } | |||||
| return RequestOptions( | |||||
| method: options.method, | |||||
| sendTimeout: options.sendTimeout, | |||||
| receiveTimeout: options.receiveTimeout, | |||||
| extra: options.extra, | |||||
| headers: options.headers, | |||||
| responseType: options.responseType, | |||||
| contentType: options.contentType.toString(), | |||||
| validateStatus: options.validateStatus, | |||||
| receiveDataWhenStatusError: options.receiveDataWhenStatusError, | |||||
| followRedirects: options.followRedirects, | |||||
| maxRedirects: options.maxRedirects, | |||||
| requestEncoder: options.requestEncoder, | |||||
| responseDecoder: options.responseDecoder, | |||||
| path: '', | |||||
| ); | |||||
| } | } | ||||
| @override | @override | ||||
| Future<ActionUIForm> getActionUIForm(idAction, options) async { | |||||
| getActionUIForm(idAction, options) async { | |||||
| ArgumentError.checkNotNull(idAction, 'idAction'); | ArgumentError.checkNotNull(idAction, 'idAction'); | ||||
| ArgumentError.checkNotNull(options, 'options'); | ArgumentError.checkNotNull(options, 'options'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| final newOptions = newRequestOptions(options!); | final newOptions = newRequestOptions(options!); | ||||
| newOptions.extra.addAll(_extra); | newOptions.extra.addAll(_extra); | ||||
| newOptions.headers.addAll(<String, dynamic>{}); | newOptions.headers.addAll(<String, dynamic>{}); | ||||
| final _result = await _dio.request<Map<String, dynamic>>('/api/display-object-param-dynamic-form/$idAction', | |||||
| queryParameters: queryParameters, options: newOptions.merge(method: 'GET', baseUrl: baseUrl), data: _data); | |||||
| final value = ActionUIForm.fromJson(_result.data); | |||||
| final _result = | |||||
| await _dio.request<Map<String, dynamic>>('/api/display-object-param-dynamic-form/$idAction', queryParameters: queryParameters, data: _data); | |||||
| final value = ActionUIForm.fromJson(_result.data ?? Map<String, dynamic>()); | |||||
| return value; | return value; | ||||
| } | } | ||||
| @override | @override | ||||
| Future<RequestActivity> getDetailActivityCommon(actionType, activityId) async { | |||||
| getDetailActivityCommon(actionType, activityId) async { | |||||
| ArgumentError.checkNotNull(actionType, 'actionType'); | ArgumentError.checkNotNull(actionType, 'actionType'); | ||||
| ArgumentError.checkNotNull(activityId, 'activityId'); | ArgumentError.checkNotNull(activityId, 'activityId'); | ||||
| const _extra = <String, dynamic>{}; | const _extra = <String, dynamic>{}; | ||||
| queryParameters.removeWhere((k, v) => v == null); | queryParameters.removeWhere((k, v) => v == null); | ||||
| final _data = <String, dynamic>{}; | final _data = <String, dynamic>{}; | ||||
| final _result = await _dio.request<Map<String, dynamic>>('/api/get-detail-common-activity/$actionType/$activityId', | final _result = await _dio.request<Map<String, dynamic>>('/api/get-detail-common-activity/$actionType/$activityId', | ||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions(method: 'GET', headers: <String, dynamic>{}, extra: _extra, baseUrl: baseUrl), | |||||
| data: _data); | |||||
| final value = RequestActivity.fromJson(_result.data); | |||||
| queryParameters: queryParameters, data: _data); | |||||
| final value = RequestActivity.fromJson(_result.data ?? Map<String, dynamic>()); | |||||
| return value; | return value; | ||||
| } | } | ||||
| RequestOptions newRequestOptions(Options? options) { | |||||
| if (options == null) { | |||||
| return RequestOptions(); | |||||
| } | |||||
| return RequestOptions( | |||||
| method: options.method, | |||||
| sendTimeout: options.sendTimeout, | |||||
| receiveTimeout: options.receiveTimeout, | |||||
| extra: options.extra, | |||||
| headers: options.headers, | |||||
| responseType: options.responseType, | |||||
| contentType: options.contentType.toString(), | |||||
| validateStatus: options.validateStatus, | |||||
| receiveDataWhenStatusError: options.receiveDataWhenStatusError, | |||||
| followRedirects: options.followRedirects, | |||||
| maxRedirects: options.maxRedirects, | |||||
| requestEncoder: options.requestEncoder, | |||||
| responseDecoder: options.responseDecoder, | |||||
| ); | |||||
| } | |||||
| } | } |
| required RequestUser requestUser, | required RequestUser requestUser, | ||||
| }) async { | }) async { | ||||
| try { | try { | ||||
| var url = ConstCommon.baseUrl + '/account/token'; | |||||
| var url = ConstCommon.baseUrl + '/api/authenticate'; | |||||
| await dio.post( | await dio.post( | ||||
| url, | url, | ||||
| data: { | data: { |
| AppEnvironment.DEV, | AppEnvironment.DEV, | ||||
| FlavorValues( | FlavorValues( | ||||
| appName: '[DEV] Thaco Agri', | appName: '[DEV] Thaco Agri', | ||||
| server: 'https://dev-trangtraibo.aristqnu.com/', | |||||
| baseUrl: 'https://dev-trangtraibo.aristqnu.com/', | |||||
| server: 'https://tpf.aztrace.vn', | |||||
| baseUrl: 'https://tpf.aztrace.vn', | |||||
| LocalDBName: 'AppLocalStorage-DEV', | LocalDBName: 'AppLocalStorage-DEV', | ||||
| ), | ), | ||||
| ); | ); | ||||
| AppEnvironment.TEST, | AppEnvironment.TEST, | ||||
| FlavorValues( | FlavorValues( | ||||
| appName: 'Thaco Agri', | appName: 'Thaco Agri', | ||||
| server: 'https://test-trangtraibo.aristqnu.com/', | |||||
| baseUrl: 'https://test-trangtraibo.aristqnu.com/', | |||||
| server: 'https://tpf.aztrace.vn', | |||||
| baseUrl: 'https://tpf.aztrace.vn', | |||||
| LocalDBName: 'AppLocalStorage-TEST', | LocalDBName: 'AppLocalStorage-TEST', | ||||
| ), | ), | ||||
| ); | ); | ||||
| AppEnvironment.PROD, | AppEnvironment.PROD, | ||||
| FlavorValues( | FlavorValues( | ||||
| appName: 'Trang Trai Bo', | appName: 'Trang Trai Bo', | ||||
| server: 'https://trangtraibo.thacoagri.com.vn/', | |||||
| baseUrl: 'https://trangtraibo.thacoagri.com.vn/', | |||||
| server: 'https://tpf.aztrace.vn', | |||||
| baseUrl: 'https://tpf.aztrace.vn', | |||||
| LocalDBName: 'AppLocalStorage', | LocalDBName: 'AppLocalStorage', | ||||
| ), | ), | ||||
| ); | ); |
| import 'package:camera/camera.dart'; | |||||
| import 'package:farm_tpf/presentation/screens/plot_detail/sc_plot_detail.dart'; | |||||
| // import 'package:barcode_scan/barcode_scan.dart'; | |||||
| import 'dart:io'; | |||||
| import 'package:firebase_core/firebase_core.dart'; | |||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||
| import 'package:get/route_manager.dart'; | |||||
| import 'package:hive/hive.dart'; | |||||
| import 'package:path_provider/path_provider.dart'; | |||||
| import 'app.dart'; | import 'app.dart'; | ||||
| // import 'data/repository/auth_repository.dart'; | |||||
| import 'data/repository/authentication_repository.dart'; | import 'data/repository/authentication_repository.dart'; | ||||
| import 'data/repository/repository.dart'; | |||||
| import 'presentation/custom_widgets/widget_utils.dart'; | |||||
| import 'environment/app_config.dart'; | |||||
| List<CameraDescription> cameras = []; | |||||
| final GlobalKey<NavigatorState> globalNavigator = GlobalKey<NavigatorState>(); | |||||
| Future<void> main() async { | Future<void> main() async { | ||||
| // Fetch the available cameras before initializing the app. | |||||
| try { | |||||
| WidgetsFlutterBinding.ensureInitialized(); | |||||
| cameras = await availableCameras(); | |||||
| } on CameraException catch (e) { | |||||
| print(e.description); | |||||
| } | |||||
| runApp(App(authenticationRepository: AuthenticationRepository())); | |||||
| } | |||||
| Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) { | |||||
| if (message.containsKey('data')) { | |||||
| // Handle data message | |||||
| final dynamic data = message['data']; | |||||
| } | |||||
| if (message.containsKey('notification')) { | |||||
| // Handle notification message | |||||
| final dynamic notification = message['notification']; | |||||
| } | |||||
| return Future(() => true); | |||||
| // Or do other work. | |||||
| } | |||||
| // Future scan(BuildContext context) async { | |||||
| // var _aspectTolerance = 0.00; | |||||
| // var _selectedCamera = -1; | |||||
| // var _useAutoFocus = true; | |||||
| // var _autoEnableFlash = false; | |||||
| // var repository = Repository(); | |||||
| // try { | |||||
| // var options = ScanOptions( | |||||
| // strings: { | |||||
| // "cancel": "Huỷ", | |||||
| // "flash_on": "Bật flash", | |||||
| // "flash_off": "Tắt flash", | |||||
| // }, | |||||
| // useCamera: _selectedCamera, | |||||
| // autoEnableFlash: _autoEnableFlash, | |||||
| // android: AndroidOptions( | |||||
| // aspectTolerance: _aspectTolerance, | |||||
| // useAutoFocus: _useAutoFocus, | |||||
| // ), | |||||
| // ); | |||||
| // var result = await BarcodeScanner.scan(options: options); | |||||
| // print(result.toString()); | |||||
| // if (result.type == ResultType.Cancelled) { | |||||
| // print("canncel"); | |||||
| // } else if (result.type == ResultType.Error) { | |||||
| // print("error"); | |||||
| // } else { | |||||
| // print("show check crop"); | |||||
| // _showAlertCheckCropCode(context, result.rawContent, repository); | |||||
| // } | |||||
| // } on PlatformException catch (e) { | |||||
| // print("error: ${e.message}"); | |||||
| // } | |||||
| // } | |||||
| WidgetsFlutterBinding.ensureInitialized(); | |||||
| Firebase.initializeApp(); | |||||
| // if (Platform.isAndroid) { | |||||
| // await Firebase.initializeApp( | |||||
| // options: DefaultFirebaseOptions.currentPlatform, | |||||
| // ); | |||||
| // } else { | |||||
| // await Firebase.initializeApp(); | |||||
| // } | |||||
| // await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(alert: true, badge: true, sound: true); | |||||
| // FirebaseMessaging.onBackgroundMessage(FirebaseMessages.firebaseMessagingBackgroundHandler); | |||||
| // FirebaseMessaging.onMessageOpenedApp.listen(FirebaseMessages.firebaseMessagingBackgroundHandler); | |||||
| _showAlertCheckCropCode(String cropCode) async { | |||||
| var repository = Repository(); | |||||
| Get.defaultDialog(title: "Kiểm tra thông tin lô ....", middleText: "", content: CircularProgressIndicator()); | |||||
| try { | |||||
| await repository.getPlotDetailByCode(cropCode).then((value) { | |||||
| print("ok"); | |||||
| if (Get.isDialogOpen) Get.back(); | |||||
| Get.to(PlotDetailScreen(cropId: value.tbCropDTO?.id ?? -1, cropType: value.tbCropDTO?.tbCropTypeId ?? -1, initialIndex: 0)); | |||||
| }).catchError((onError) { | |||||
| Utils.showDialog( | |||||
| title: "Không tìm thấy lô", | |||||
| message: "Thử lại với mã tem khác?", | |||||
| textConfirm: "Thử lại", | |||||
| textCancel: "Huỷ", | |||||
| onConfirm: () { | |||||
| Get.back(); | |||||
| // scan(context); | |||||
| }); | |||||
| }); | |||||
| } catch (e) { | |||||
| Utils.showDialog( | |||||
| title: "Không tìm thấy lô", | |||||
| message: "Thử lại với mã tem khác?", | |||||
| textConfirm: "Thử lại", | |||||
| textCancel: "Huỷ", | |||||
| onConfirm: () { | |||||
| Get.back(); | |||||
| // scan(context); | |||||
| }); | |||||
| } | |||||
| await SystemChrome.setPreferredOrientations([ | |||||
| DeviceOrientation.portraitDown, | |||||
| DeviceOrientation.portraitUp, | |||||
| ]); | |||||
| setFlavorDevelopment(); | |||||
| final appDocumentDirectory = await getApplicationDocumentsDirectory(); | |||||
| Hive..init(appDocumentDirectory.path); | |||||
| await Hive.openBox('LocalDBName'); | |||||
| runApp(App( | |||||
| authenticationRepository: AuthenticationRepository(), | |||||
| )); | |||||
| } | } |
| class GhostButtonWidget extends StatelessWidget { | class GhostButtonWidget extends StatelessWidget { | ||||
| final String title; | final String title; | ||||
| final Function() onPressed; | final Function() onPressed; | ||||
| final Color? color; | |||||
| const GhostButtonWidget({ | const GhostButtonWidget({ | ||||
| required this.title, | required this.title, | ||||
| required this.onPressed, | required this.onPressed, | ||||
| this.color, | |||||
| }); | }); | ||||
| @override | @override | ||||
| Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
| onTap: onPressed, | onTap: onPressed, | ||||
| child: Text( | child: Text( | ||||
| title, | title, | ||||
| style: StylesText.body3.copyWith( | |||||
| color: color ?? AppColors.black, | |||||
| decoration: TextDecoration.underline, | |||||
| style: StylesText.caption2.copyWith( | |||||
| color: AppColors.primary1, | |||||
| ), | ), | ||||
| ), | ), | ||||
| ); | ); |
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_svg/flutter_svg.dart'; | import 'package:flutter_svg/flutter_svg.dart'; | ||||
| import '../../themes/styles_text.dart'; | |||||
| class ButtonIconWidget extends StatelessWidget { | class ButtonIconWidget extends StatelessWidget { | ||||
| final String? title; | final String? title; | ||||
| final TextStyle? titleStyle; | final TextStyle? titleStyle; | ||||
| child: Container( | child: Container( | ||||
| padding: EdgeInsets.all(12), | padding: EdgeInsets.all(12), | ||||
| decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
| border: Border( | |||||
| top: isTopBorder ? BorderSide(color: AppColors.GRAY1, width: 0.35) : BorderSide.none, | |||||
| bottom: isBottomBorder ? BorderSide(color: AppColors.GRAY1, width: 0.35) : BorderSide.none)), | |||||
| border: Border( | |||||
| top: isTopBorder ? BorderSide(color: AppColors.GRAY1, width: 0.35) : BorderSide.none, | |||||
| bottom: isBottomBorder ? BorderSide(color: AppColors.GRAY1, width: 0.35) : BorderSide.none, | |||||
| ), | |||||
| ), | |||||
| width: double.infinity, | width: double.infinity, | ||||
| child: Row( | child: Row( | ||||
| mainAxisSize: MainAxisSize.max, | mainAxisSize: MainAxisSize.max, | ||||
| children: [ | children: [ | ||||
| Text( | Text( | ||||
| title ?? '', | title ?? '', | ||||
| style: titleStyle ?? TextStyle(fontSize: 16, fontWeight: FontWeight.w100), | |||||
| style: StylesText.body3, | |||||
| ), | ), | ||||
| subTitle == null | subTitle == null | ||||
| ? SizedBox() | ? SizedBox() | ||||
| : Text( | : Text( | ||||
| subTitle ?? '', | subTitle ?? '', | ||||
| style: TextStyle(fontSize: 14), | |||||
| style: StylesText.body6, | |||||
| ) | ) | ||||
| ], | ], | ||||
| ), | ), |
| @override | @override | ||||
| void initState() { | void initState() { | ||||
| super.initState(); | super.initState(); | ||||
| controller = CameraController(cameras[indexCamera], ResolutionPreset.medium); | |||||
| // controller = CameraController(cameras[indexCamera], ResolutionPreset.medium); | |||||
| controller?.initialize().then((_) { | controller?.initialize().then((_) { | ||||
| if (!mounted) { | if (!mounted) { | ||||
| return; | return; | ||||
| /// Display a row of toggle to select the camera (or a message if no camera is available). | /// Display a row of toggle to select the camera (or a message if no camera is available). | ||||
| Widget _cameraTogglesRowWidget() { | Widget _cameraTogglesRowWidget() { | ||||
| if (cameras.isEmpty) { | |||||
| return const Text('Không có camera'); | |||||
| } else { | |||||
| bool disableSwitch = controller != null && controller!.value.isRecordingVideo; | |||||
| if (indexCamera == cameras.length - 1) { | |||||
| indexCamera = 0; | |||||
| } else { | |||||
| indexCamera++; | |||||
| } | |||||
| return IconButton( | |||||
| icon: Icon( | |||||
| Icons.switch_camera, | |||||
| color: Colors.green, | |||||
| ), | |||||
| onPressed: disableSwitch == true | |||||
| ? null | |||||
| : () { | |||||
| onNewCameraSelected(cameras[indexCamera]); | |||||
| }); | |||||
| } | |||||
| // if (cameras.isEmpty) { | |||||
| // return const Text('Không có camera'); | |||||
| // } else { | |||||
| // bool disableSwitch = controller != null && controller!.value.isRecordingVideo; | |||||
| // if (indexCamera == cameras.length - 1) { | |||||
| // indexCamera = 0; | |||||
| // } else { | |||||
| // indexCamera++; | |||||
| // } | |||||
| // return IconButton( | |||||
| // icon: Icon( | |||||
| // Icons.switch_camera, | |||||
| // color: Colors.green, | |||||
| // ), | |||||
| // onPressed: disableSwitch == true | |||||
| // ? null | |||||
| // : () { | |||||
| // onNewCameraSelected(cameras[indexCamera]); | |||||
| // }); | |||||
| // } | |||||
| return Container(); | |||||
| } | } | ||||
| String timestamp() => DateTime.now().millisecondsSinceEpoch.toString(); | String timestamp() => DateTime.now().millisecondsSinceEpoch.toString(); |
| children: <Widget>[ | children: <Widget>[ | ||||
| Expanded( | Expanded( | ||||
| child: Shimmer.fromColors( | child: Shimmer.fromColors( | ||||
| baseColor: Colors.grey, | |||||
| highlightColor: Colors.grey, | |||||
| baseColor: Colors.grey.shade200, | |||||
| highlightColor: Colors.grey.shade200, | |||||
| enabled: _enabled, | enabled: _enabled, | ||||
| child: ListView.builder( | child: ListView.builder( | ||||
| itemBuilder: (_, __) => Padding( | itemBuilder: (_, __) => Padding( |
| Get.to(UpdateProfileScreen()); | Get.to(UpdateProfileScreen()); | ||||
| }), | }), | ||||
| ButtonIconWidget( | ButtonIconWidget( | ||||
| title: 'Bảo mật', | |||||
| leadingIcon: AppIcons.icSecurity, | |||||
| trailingIcon: AppIcons.icArrowRight, | |||||
| isTopBorder: false, | |||||
| isBottomBorder: false, | |||||
| onTap: () { | |||||
| Get.to(ChangePasswordScreen()); | |||||
| }), | |||||
| title: 'Bảo mật', | |||||
| leadingIcon: AppIcons.icSecurity, | |||||
| trailingIcon: AppIcons.icArrowRight, | |||||
| isTopBorder: false, | |||||
| isBottomBorder: false, | |||||
| onTap: () { | |||||
| Get.to(ChangePasswordScreen()); | |||||
| }, | |||||
| ), | |||||
| Container( | Container( | ||||
| width: double.infinity, | width: double.infinity, | ||||
| height: 20, | height: 20, | ||||
| title: 'Đăng xuất', | title: 'Đăng xuất', | ||||
| titleStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.w100, color: Colors.red), | titleStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.w100, color: Colors.red), | ||||
| leadingIcon: AppIcons.icLogout, | leadingIcon: AppIcons.icLogout, | ||||
| trailingIcon: AppIcons.icArrowRight, | |||||
| // trailingIcon: AppIcons.icArrowRight, | |||||
| isTopBorder: false, | |||||
| onTap: () { | onTap: () { | ||||
| _clickSignOut(); | _clickSignOut(); | ||||
| }), | }), |
| import 'package:farm_tpf/data/repository/user_repository.dart'; | import 'package:farm_tpf/data/repository/user_repository.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/app_bar_widget.dart'; | import 'package:farm_tpf/presentation/custom_widgets/app_bar_widget.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/button_widget.dart'; | |||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart'; | import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart'; | import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart'; | ||||
| import 'package:farm_tpf/utils/const_color.dart'; | import 'package:farm_tpf/utils/const_color.dart'; | ||||
| } | } | ||||
| Widget _btnSubmit() { | Widget _btnSubmit() { | ||||
| return SizedBox( | |||||
| width: double.infinity, | |||||
| height: 55, | |||||
| child: TextButton( | |||||
| onPressed: () { | |||||
| FocusScopeNode currentFocus = FocusScope.of(context); | |||||
| if (!currentFocus.hasPrimaryFocus) { | |||||
| currentFocus.unfocus(); | |||||
| } | |||||
| _validateInputs(); | |||||
| }, | |||||
| // color: AppColors.DEFAULT, | |||||
| // shape: RoundedRectangleBorder( | |||||
| // borderRadius: new BorderRadius.circular(7.0), | |||||
| // ), | |||||
| child: Text( | |||||
| 'Gửi'.toUpperCase(), | |||||
| style: TextStyle(fontWeight: FontWeight.bold, color: AppColors.WHITE), | |||||
| ), | |||||
| ), | |||||
| return ButtonWidget( | |||||
| title: 'Gửi', | |||||
| onPressed: () { | |||||
| FocusScopeNode currentFocus = FocusScope.of(context); | |||||
| if (!currentFocus.hasPrimaryFocus) { | |||||
| currentFocus.unfocus(); | |||||
| } | |||||
| _validateInputs(); | |||||
| }, | |||||
| ); | ); | ||||
| } | } | ||||
| import 'package:bloc/bloc.dart'; | import 'package:bloc/bloc.dart'; | ||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:get/get.dart'; | import 'package:get/get.dart'; | ||||
| import '../../../../data/repository/repository.dart'; | import '../../../../data/repository/repository.dart'; | ||||
| import '../../../../utils/local_storage.dart'; | import '../../../../utils/local_storage.dart'; | ||||
| import '../../../../utils/validators.dart'; | import '../../../../utils/validators.dart'; | ||||
| var isRemember = ValueNotifier(true); | var isRemember = ValueNotifier(true); | ||||
| Future<void> loginWithCredential() async { | Future<void> loginWithCredential() async { | ||||
| if (!formKey.currentState!.validate()) { | |||||
| return; | |||||
| } | |||||
| // if (!formKey.currentState!.validate()) { | |||||
| // return; | |||||
| // } | |||||
| emit(LoginLoading()); | emit(LoginLoading()); | ||||
| var userLoginRequest = RequestUser() | var userLoginRequest = RequestUser() | ||||
| ); | ); | ||||
| }, | }, | ||||
| (error) { | (error) { | ||||
| emit(LoginFailure(error)); | |||||
| emit(LoginFailure('Tên đăng nhập hoặc mật khẩu không đúng')); | |||||
| }, | }, | ||||
| requestUser: userLoginRequest, | requestUser: userLoginRequest, | ||||
| ); | ); | ||||
| }) async { | }) async { | ||||
| try { | try { | ||||
| LocalStorage.saveUserInfo(responseUser, username); | LocalStorage.saveUserInfo(responseUser, username); | ||||
| // // var dsTrai = await _repository.getdanhSachTrais(LocalStorage.getString(LocalStorageKey.user_id)); | |||||
| // // if (dsTrai.isNotEmpty) { | |||||
| // // LocalStorage.save(LocalStorageKey.trai_hien_tai, dsTrai[0].maTrai ?? '0'); | |||||
| // // LocalStorage.save(LocalStorageKey.ten_hien_tai, dsTrai[0].tenTrai ?? '0'); | |||||
| // // LocalStorage.save(LocalStorageKey.ma_trais, dsTrai.map((e) => e.maTrai).toList()); | |||||
| // // LocalStorage.save(LocalStorageKey.ten_trais, dsTrai.map((e) => e.tenTrai).toList()); | |||||
| // // } else { | |||||
| // // LocalStorage.save(LocalStorageKey.trai_hien_tai, '0'); | |||||
| // // LocalStorage.save(LocalStorageKey.ten_hien_tai, 'IAPUCH'); | |||||
| // // LocalStorage.save(LocalStorageKey.ma_trais, ['0']); | |||||
| // // LocalStorage.save(LocalStorageKey.ten_trais, ['IAPUCH']); | |||||
| // // } | |||||
| } catch (_) { | |||||
| // LocalStorage.save(LocalStorageKey.trai_hien_tai, '0'); | |||||
| // LocalStorage.save(LocalStorageKey.ten_hien_tai, 'IAPUCH'); | |||||
| // LocalStorage.save(LocalStorageKey.ma_trais, ['0']); | |||||
| // LocalStorage.save(LocalStorageKey.ten_trais, ['IAPUCH']); | |||||
| } | |||||
| } catch (_) {} | |||||
| emit( | emit( | ||||
| LoginSuccess( | LoginSuccess( | ||||
| routeName: '', | routeName: '', | ||||
| String? validateEmail(String value) { | String? validateEmail(String value) { | ||||
| if (!Validators.stringNotNullOrEmpty(value)) { | if (!Validators.stringNotNullOrEmpty(value)) { | ||||
| return 'Vui lòng nhập tên đăng nhập'; | |||||
| return 'Nhập email'; | |||||
| } | |||||
| if (!Validators.isValidEmail(value)) { | |||||
| return 'Nhập email'; | |||||
| } | } | ||||
| return null; | return null; | ||||
| } | } | ||||
| String? validatePassword(String value) { | String? validatePassword(String value) { | ||||
| if (!Validators.stringNotNullOrEmpty(value)) { | if (!Validators.stringNotNullOrEmpty(value)) { | ||||
| return 'Vui lòng nhập mật khẩu'; | |||||
| return 'Nhập mật khẩu'; | |||||
| } | } | ||||
| return null; | return null; | ||||
| } | } |
| import 'package:farm_tpf/presentation/custom_widgets/button/ghost_button_widget.dart'; | |||||
| import 'package:farm_tpf/presentation/screens/forgot_password/sc_forgot_password.dart'; | |||||
| import 'package:farm_tpf/themes/app_dimension.dart'; | import 'package:farm_tpf/themes/app_dimension.dart'; | ||||
| import 'package:flutter/foundation.dart'; | import 'package:flutter/foundation.dart'; | ||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_bloc/flutter_bloc.dart'; | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
| import 'package:flutter_svg/svg.dart'; | import 'package:flutter_svg/svg.dart'; | ||||
| import 'package:flutter_switch/flutter_switch.dart'; | import 'package:flutter_switch/flutter_switch.dart'; | ||||
| import 'package:get/get.dart'; | |||||
| import 'package:keyboard_dismisser/keyboard_dismisser.dart'; | import 'package:keyboard_dismisser/keyboard_dismisser.dart'; | ||||
| import '../../../authentication/bloc/authentication_bloc.dart'; | import '../../../authentication/bloc/authentication_bloc.dart'; | ||||
| import '../../../themes/app_colors.dart'; | import '../../../themes/app_colors.dart'; | ||||
| void initState() { | void initState() { | ||||
| super.initState(); | super.initState(); | ||||
| if (kDebugMode) { | if (kDebugMode) { | ||||
| loginBloc.usernameCtl.text = 'admin'; | |||||
| loginBloc.passwordCtl.text = 'admintest'; | |||||
| loginBloc.usernameCtl.text = 'lecaoanhquoc'; | |||||
| loginBloc.passwordCtl.text = '123456'; | |||||
| } | } | ||||
| } | } | ||||
| body: KeyboardDismisser( | body: KeyboardDismisser( | ||||
| child: Container( | child: Container( | ||||
| decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
| //color: AppColors.primary1.withOpacity(0.2), | |||||
| color: AppColors.primary1, | color: AppColors.primary1, | ||||
| gradient: LinearGradient( | |||||
| colors: [ | |||||
| AppColors.primary1, | |||||
| AppColors.primary1.withOpacity(0), | |||||
| ], | |||||
| begin: Alignment.bottomCenter, | |||||
| end: Alignment.topCenter, | |||||
| ), | |||||
| ), | ), | ||||
| child: Stack( | child: Stack( | ||||
| children: <Widget>[ | children: <Widget>[ | ||||
| Positioned( | |||||
| top: 0, | |||||
| right: 0, | |||||
| left: 0, | |||||
| child: Container( | |||||
| height: 370.h, | |||||
| decoration: BoxDecoration( | |||||
| color: AppColors.background1, | |||||
| image: const DecorationImage( | |||||
| image: AssetImage(AssetPNG.backgroundLogin), | |||||
| fit: BoxFit.cover, | |||||
| ), | |||||
| ), | |||||
| ), | |||||
| ), | |||||
| Positioned( | |||||
| top: 0, | |||||
| right: 0, | |||||
| left: 0, | |||||
| child: Container( | |||||
| height: 371.h, | |||||
| decoration: BoxDecoration( | |||||
| color: AppColors.primary1, | |||||
| gradient: LinearGradient( | |||||
| colors: [ | |||||
| AppColors.primary1, | |||||
| AppColors.primary1.withOpacity(0), | |||||
| ], | |||||
| begin: Alignment.bottomCenter, | |||||
| end: Alignment.topCenter, | |||||
| ), | |||||
| ), | |||||
| ), | |||||
| ), | |||||
| // Positioned( | |||||
| // top: 0, | |||||
| // right: 0, | |||||
| // left: 0, | |||||
| // child: Container( | |||||
| // height: 370.h, | |||||
| // decoration: BoxDecoration( | |||||
| // color: AppColors.background1, | |||||
| // image: const DecorationImage( | |||||
| // image: AssetImage(AssetPNG.backgroundLogin), | |||||
| // fit: BoxFit.cover, | |||||
| // ), | |||||
| // ), | |||||
| // ), | |||||
| // ), | |||||
| // Positioned( | |||||
| // top: 0, | |||||
| // right: 0, | |||||
| // left: 0, | |||||
| // child: Container( | |||||
| // height: 371.h, | |||||
| // decoration: BoxDecoration( | |||||
| // color: AppColors.primary1, | |||||
| // gradient: LinearGradient( | |||||
| // colors: [ | |||||
| // AppColors.primary1, | |||||
| // AppColors.primary1.withOpacity(0), | |||||
| // ], | |||||
| // begin: Alignment.bottomCenter, | |||||
| // end: Alignment.topCenter, | |||||
| // ), | |||||
| // ), | |||||
| // ), | |||||
| // ), | |||||
| Positioned( | Positioned( | ||||
| top: 140.h, | top: 140.h, | ||||
| right: 40.w, | right: 40.w, | ||||
| style: StylesText.caption3, | style: StylesText.caption3, | ||||
| ), | ), | ||||
| ), | ), | ||||
| Text( | |||||
| 'Quên Mật Khẩu', | |||||
| style: StylesText.caption2.copyWith( | |||||
| color: AppColors.primary1, | |||||
| ), | |||||
| GhostButtonWidget( | |||||
| title: 'Quên Mật Khẩu', | |||||
| onPressed: () { | |||||
| Get.to( | |||||
| () => ForgotPasswordScreen(), | |||||
| ); | |||||
| }, | |||||
| ), | ), | ||||
| ], | ], | ||||
| ), | ), |
| class ResponseUser { | class ResponseUser { | ||||
| String? accessToken; | String? accessToken; | ||||
| String? refreshToken; | |||||
| int? expiresIn; | |||||
| ResponseUser({this.accessToken, this.refreshToken, this.expiresIn}); | |||||
| ResponseUser({this.accessToken}); | |||||
| ResponseUser.fromJson(Map<String, dynamic> json) { | ResponseUser.fromJson(Map<String, dynamic> json) { | ||||
| accessToken = json['accessToken']; | |||||
| refreshToken = json['refresh_token']; | |||||
| expiresIn = json['expires_in']; | |||||
| accessToken = json['id_token']; | |||||
| } | } | ||||
| } | } |
| PlotInformationScreen( | PlotInformationScreen( | ||||
| cropId: widget.cropId ?? -1, | cropId: widget.cropId ?? -1, | ||||
| ), | ), | ||||
| PlotActionScreen(cropId: widget.cropId ?? -1, cropCode: widget.cropCode ?? '', cropType: widget.cropType ?? -1), | |||||
| PlotActionScreen( | |||||
| cropId: widget.cropId ?? -1, | |||||
| cropCode: widget.cropCode ?? '', | |||||
| cropType: widget.cropType ?? -1, | |||||
| ), | |||||
| PlotHistoryScreen( | PlotHistoryScreen( | ||||
| cropId: widget.cropId ?? -1, | cropId: widget.cropId ?? -1, | ||||
| cropCode: widget.cropCode ?? '', | cropCode: widget.cropCode ?? '', |
| import 'package:farm_tpf/data/api/app_exception.dart'; | import 'package:farm_tpf/data/api/app_exception.dart'; | ||||
| import 'package:farm_tpf/data/repository/user_repository.dart'; | import 'package:farm_tpf/data/repository/user_repository.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/app_bar_widget.dart'; | import 'package:farm_tpf/presentation/custom_widgets/app_bar_widget.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/button/primary_button_widget.dart'; | |||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart'; | import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart'; | import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart'; | ||||
| import 'package:farm_tpf/utils/const_color.dart'; | import 'package:farm_tpf/utils/const_color.dart'; | ||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:keyboard_dismisser/keyboard_dismisser.dart'; | import 'package:keyboard_dismisser/keyboard_dismisser.dart'; | ||||
| import '../../custom_widgets/button_widget.dart'; | |||||
| class ChangePasswordScreen extends StatefulWidget { | class ChangePasswordScreen extends StatefulWidget { | ||||
| @override | @override | ||||
| _ChangePasswordScreenState createState() => _ChangePasswordScreenState(); | _ChangePasswordScreenState createState() => _ChangePasswordScreenState(); | ||||
| return SizedBox( | return SizedBox( | ||||
| width: double.infinity, | width: double.infinity, | ||||
| height: 55, | height: 55, | ||||
| child: TextButton( | |||||
| child: ButtonWidget( | |||||
| title: 'Cập nhật', | |||||
| onPressed: () { | onPressed: () { | ||||
| FocusScopeNode currentFocus = FocusScope.of(context); | FocusScopeNode currentFocus = FocusScope.of(context); | ||||
| if (!currentFocus.hasPrimaryFocus) { | if (!currentFocus.hasPrimaryFocus) { | ||||
| } | } | ||||
| _validateInputs(); | _validateInputs(); | ||||
| }, | }, | ||||
| child: Text( | |||||
| 'Cập nhật'.toUpperCase(), | |||||
| style: TextStyle(fontWeight: FontWeight.bold, color: AppColors.WHITE), | |||||
| ), | |||||
| ), | ), | ||||
| ); | ); | ||||
| } | } |
| import 'package:farm_tpf/presentation/custom_widgets/app_bar_widget.dart'; | import 'package:farm_tpf/presentation/custom_widgets/app_bar_widget.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/button_widget.dart'; | import 'package:farm_tpf/presentation/custom_widgets/button_widget.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart'; | import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_toast.dart'; | |||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart'; | import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart'; | ||||
| import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_supply.dart'; | import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_supply.dart'; | ||||
| import 'package:farm_tpf/presentation/screens/location_unit/sc_location.dart'; | import 'package:farm_tpf/presentation/screens/location_unit/sc_location.dart'; | ||||
| import 'package:farm_tpf/presentation/screens/profile/controller/check_change_another_dropdown.dart'; | import 'package:farm_tpf/presentation/screens/profile/controller/check_change_another_dropdown.dart'; | ||||
| import 'package:farm_tpf/presentation/screens/profile/sc_change_password.dart'; | |||||
| import 'package:farm_tpf/utils/const_color.dart'; | |||||
| import 'package:farm_tpf/utils/const_common.dart'; | import 'package:farm_tpf/utils/const_common.dart'; | ||||
| import 'package:farm_tpf/utils/const_string.dart'; | import 'package:farm_tpf/utils/const_string.dart'; | ||||
| import 'package:farm_tpf/utils/const_style.dart'; | import 'package:farm_tpf/utils/const_style.dart'; |
| }); | }); | ||||
| controller.scannedDataStream.listen((scanData) { | controller.scannedDataStream.listen((scanData) { | ||||
| if (scanData != null) { | if (scanData != null) { | ||||
| Get.back(result: scanData); | |||||
| Get.back(result: scanData.code); | |||||
| } | } | ||||
| }); | }); | ||||
| } | } |
| if (index == 2) { | if (index == 2) { | ||||
| changeTabbar.changeIndex(changeTabbar.index ?? TabBarIndex.plot); | changeTabbar.changeIndex(changeTabbar.index ?? TabBarIndex.plot); | ||||
| // scan(context); | // scan(context); | ||||
| Get.to(QrCodeScannerScreen()).then((value) { | |||||
| Get.to( | |||||
| QrCodeScannerScreen(), | |||||
| ).then((value) { | |||||
| if (value != null) { | if (value != null) { | ||||
| _showAlertCheckCropCode(value); | _showAlertCheckCropCode(value); | ||||
| } | } |
| static const backgroundLogin = baseAssets + 'background_login.png'; | static const backgroundLogin = baseAssets + 'background_login.png'; | ||||
| static const chart = baseAssets + 'chart.png'; | static const chart = baseAssets + 'chart.png'; | ||||
| static const icNoData = baseAssets + 'ic_no_data.png'; | static const icNoData = baseAssets + 'ic_no_data.png'; | ||||
| static const icActionCropStatus = baseAssets + 'icActionCropStatus.png'; | |||||
| static const icActionDisease = baseAssets + 'icActionDisease.png'; | |||||
| static const icActionDung = baseAssets + 'icActionDung.png'; | |||||
| static const icActionEnd = baseAssets + 'icActionEnd.png'; | |||||
| static const icActionEnvironment = baseAssets + 'icActionEnvironment.png'; | |||||
| static const icActionNursery = baseAssets + 'icActionNursery.png'; | |||||
| static const icActionHarvest = baseAssets + 'icActionHarvest.png'; | |||||
| static const icActionOther = baseAssets + 'icActionOther.png'; | |||||
| static const icActionPlant = baseAssets + 'icActionPlant.png'; | |||||
| static const icActionSpraying = baseAssets + 'icActionSpraying.png'; | |||||
| static const icActionUseWater = baseAssets + 'icActionUseWater.png'; | |||||
| } | } | ||||
| class AssetSVG { | class AssetSVG { | ||||
| static const icVeterinaryMedicine = baseAssets + 'ic_veterinary_medicine.svg'; | static const icVeterinaryMedicine = baseAssets + 'ic_veterinary_medicine.svg'; | ||||
| static const icMeadow = baseAssets + 'ic_meadow.svg'; | static const icMeadow = baseAssets + 'ic_meadow.svg'; | ||||
| static const icFoodProcessing = baseAssets + 'ic_food_processing.svg'; | static const icFoodProcessing = baseAssets + 'ic_food_processing.svg'; | ||||
| static const icFertilizerProduction = | |||||
| baseAssets + 'ic_fertilizer_production.svg'; | |||||
| static const icFertilizerProduction = baseAssets + 'ic_fertilizer_production.svg'; | |||||
| static const icLogout = baseAssets + 'ic_logout.svg'; | static const icLogout = baseAssets + 'ic_logout.svg'; | ||||
| static const icCart = baseAssets + 'ic_cart.svg'; | static const icCart = baseAssets + 'ic_cart.svg'; | ||||
| static const icCartChecked = baseAssets + 'ic_cart_checked.svg'; | static const icCartChecked = baseAssets + 'ic_cart_checked.svg'; |
| import 'dart:developer'; | import 'dart:developer'; | ||||
| import 'package:hive/hive.dart'; | import 'package:hive/hive.dart'; | ||||
| import '../environment/app_config.dart'; | |||||
| import '../presentation/screens/login/models/response_user.dart'; | import '../presentation/screens/login/models/response_user.dart'; | ||||
| final LocalStorage = HiveLocalStorage(); | final LocalStorage = HiveLocalStorage(); | ||||
| class HiveLocalStorage { | class HiveLocalStorage { | ||||
| final box = Hive.box(FlavorConfig.values.LocalDBName); | |||||
| final box = Hive.box('LocalDBName'); | |||||
| void open() { | void open() { | ||||
| Hive.openBox(FlavorConfig.values.LocalDBName); | |||||
| Hive.openBox('LocalDBName'); | |||||
| } | } | ||||
| String getString(String key, {String? defaultValue}) { | String getString(String key, {String? defaultValue}) { | ||||
| // var userId = decodedToken['userid'] ?? ''; | // var userId = decodedToken['userid'] ?? ''; | ||||
| // var roles = decodedToken['http://schemas.microsoft.com/ws/2008/06/identity/claims/role'] as List; | // var roles = decodedToken['http://schemas.microsoft.com/ws/2008/06/identity/claims/role'] as List; | ||||
| // // var roles = decodedToken['resource_access']['uca']['roles'] as List; | |||||
| // // var userRoles = roles.join('|'); | |||||
| // // LocalStorage.save(LocalStorageKey.user_permission, userRoles); | |||||
| // var roles = decodedToken['resource_access']['uca']['roles'] as List; | |||||
| // var userRoles = roles.join('|'); | |||||
| // LocalStorage.save(LocalStorageKey.user_permission, userRoles); | |||||
| // LocalStorage.save(LocalStorageKey.is_logged, true); | |||||
| // LocalStorage.save(LocalStorageKey.username, username); | |||||
| // LocalStorage.save(LocalStorageKey.access_token, data.accessToken); | |||||
| // LocalStorage.save(LocalStorageKey.refresh_token, ''); | |||||
| LocalStorage.save(LocalStorageKey.is_logged, true); | |||||
| LocalStorage.save(LocalStorageKey.username, username); | |||||
| LocalStorage.save(LocalStorageKey.access_token, data.accessToken); | |||||
| LocalStorage.save(LocalStorageKey.refresh_token, ''); | |||||
| // LocalStorage.save(LocalStorageKey.given_name, givenName); | // LocalStorage.save(LocalStorageKey.given_name, givenName); | ||||
| // LocalStorage.save(LocalStorageKey.full_name, fullName); | // LocalStorage.save(LocalStorageKey.full_name, fullName); | ||||
| // LocalStorage.save(LocalStorageKey.user_id, userId); | // LocalStorage.save(LocalStorageKey.user_id, userId); |