You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
7.8KB

  1. import 'dart:io';
  2. import 'package:dio/dio.dart';
  3. import 'package:farm_tpf/data/repository/repository.dart';
  4. import 'package:farm_tpf/data/repository/user_repository.dart';
  5. import 'package:farm_tpf/main.dart';
  6. import 'package:farm_tpf/models/index.dart';
  7. import 'package:farm_tpf/presentation/custom_widgets/bottom_loader.dart';
  8. import 'package:farm_tpf/presentation/custom_widgets/loading_list_page.dart';
  9. import 'package:farm_tpf/presentation/screens/plot/widget_search.dart';
  10. import 'package:farm_tpf/presentation/screens/plot_detail/sc_plot_detail.dart';
  11. import 'package:farm_tpf/utils/const_color.dart';
  12. import 'package:farm_tpf/utils/const_common.dart';
  13. import 'package:farm_tpf/utils/pref.dart';
  14. import 'package:firebase_messaging/firebase_messaging.dart';
  15. import 'package:flutter/material.dart';
  16. import 'package:flutter_bloc/flutter_bloc.dart';
  17. import 'package:farm_tpf/utils/const_string.dart';
  18. import 'package:font_awesome_flutter/font_awesome_flutter.dart';
  19. import 'package:farm_tpf/utils/formatter.dart';
  20. import 'bloc/plot_bloc.dart';
  21. class PlotListScreen extends StatefulWidget {
  22. @override
  23. _PlotListScreenState createState() => _PlotListScreenState();
  24. }
  25. class _PlotListScreenState extends State<PlotListScreen> {
  26. UserRepository _userRepository = UserRepository();
  27. final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
  28. var pref = LocalPref();
  29. var token;
  30. var client;
  31. String pushkey = "";
  32. String currentFullName = "";
  33. Future<Null> getSharedPrefs() async {
  34. token = await pref.getString(DATA_CONST.TOKEN_KEY);
  35. pushkey = await pref.getString(DATA_CONST.PUSH_KEY);
  36. currentFullName = await pref.getString(DATA_CONST.CURRENT_FULL_NAME);
  37. var options = BaseOptions(baseUrl: ConstCommon.baseUrl);
  38. options.headers["Authorization"] = "Bearer $token";
  39. client = Dio(options);
  40. if (Platform.isIOS) {
  41. _firebaseMessaging
  42. .requestNotificationPermissions(IosNotificationSettings());
  43. }
  44. _firebaseMessaging.configure(
  45. onMessage: (Map<String, dynamic> message) async {
  46. print("onMessage: $message");
  47. },
  48. onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler,
  49. onLaunch: (Map<String, dynamic> message) async {
  50. print("onLaunch: $message");
  51. },
  52. onResume: (Map<String, dynamic> message) async {
  53. print("onResume: $message");
  54. },
  55. );
  56. _firebaseMessaging.requestNotificationPermissions(
  57. const IosNotificationSettings(
  58. sound: true, badge: true, alert: true, provisional: true));
  59. _firebaseMessaging.onIosSettingsRegistered
  60. .listen((IosNotificationSettings settings) {
  61. print("Settings registered: $settings");
  62. });
  63. if (pushkey?.isEmpty ?? true) {
  64. _firebaseMessaging.getToken().then((String token) {
  65. assert(token != null);
  66. print("Push Messaging token: $token");
  67. _userRepository.updateFcmToken(token).then((value) {
  68. print("send push key successful");
  69. pref.saveString(DATA_CONST.PUSH_KEY, token);
  70. });
  71. // client.put("");
  72. });
  73. } else {
  74. print("Don't need get push key");
  75. }
  76. if (currentFullName?.isEmpty ?? true) {
  77. try {
  78. var currentUser = await _userRepository.getUser();
  79. pref.saveString(DATA_CONST.CURRENT_FULL_NAME, currentUser.fullName);
  80. print("fullname: ${currentUser.fullName}");
  81. } catch (e) {
  82. print("error: ${e.toString()}");
  83. }
  84. }
  85. }
  86. @override
  87. void initState() {
  88. super.initState();
  89. getSharedPrefs();
  90. }
  91. @override
  92. Widget build(BuildContext context) {
  93. return BlocProvider(
  94. create: (context) =>
  95. PlotBloc(repository: Repository())..add(DataFetched()),
  96. child: HoldInfinityWidget(),
  97. );
  98. }
  99. }
  100. class HoldInfinityWidget extends StatelessWidget {
  101. final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  102. @override
  103. Widget build(BuildContext context) {
  104. return Scaffold(
  105. key: _scaffoldKey,
  106. appBar: AppBar(
  107. centerTitle: true,
  108. title: Text("Danh sách lô"),
  109. actions: <Widget>[
  110. IconButton(
  111. icon: Icon(FontAwesomeIcons.qrcode),
  112. onPressed: () {
  113. scan(context);
  114. })
  115. ],
  116. ),
  117. body: InfinityView());
  118. }
  119. }
  120. class InfinityView extends StatefulWidget {
  121. @override
  122. _InfinityViewState createState() => _InfinityViewState();
  123. }
  124. class _InfinityViewState extends State<InfinityView> {
  125. final _scrollController = ScrollController();
  126. final _scrollThreshold = 250.0;
  127. PlotBloc _plotBloc;
  128. @override
  129. void initState() {
  130. _scrollController.addListener(() {
  131. final maxScroll = _scrollController.position.maxScrollExtent;
  132. final currentScroll = _scrollController.position.pixels;
  133. if (maxScroll - currentScroll < _scrollThreshold) {
  134. _plotBloc.add(DataFetched());
  135. }
  136. });
  137. _plotBloc = BlocProvider.of<PlotBloc>(context);
  138. super.initState();
  139. }
  140. @override
  141. Widget build(BuildContext context) {
  142. return Column(
  143. children: <Widget>[
  144. WidgetSearch(),
  145. Expanded(child: BlocBuilder<PlotBloc, PlotState>(
  146. builder: (context, state) {
  147. if (state is PlotFailure) {
  148. return Center(child: Text(state.errorString));
  149. }
  150. if (state is PlotSuccess) {
  151. if (state.items.isEmpty) {
  152. return Center(child: Text(label_list_empty));
  153. }
  154. return RefreshIndicator(
  155. child: ListView.builder(
  156. physics: AlwaysScrollableScrollPhysics(),
  157. itemBuilder: (BuildContext context, int index) {
  158. return index >= state.items.length
  159. ? BottomLoader()
  160. : ItemInfinityWidget(item: state.items[index]);
  161. },
  162. itemCount: state.hasReachedMax
  163. ? state.items.length
  164. : state.items.length + 1,
  165. controller: _scrollController,
  166. ),
  167. onRefresh: () async {
  168. _plotBloc.add(OnRefresh());
  169. });
  170. }
  171. return Center(
  172. child: LoadingListPage(),
  173. );
  174. },
  175. ))
  176. ],
  177. );
  178. }
  179. @override
  180. void dispose() {
  181. _scrollController.dispose();
  182. super.dispose();
  183. }
  184. }
  185. class ItemInfinityWidget extends StatelessWidget {
  186. final Crop item;
  187. const ItemInfinityWidget({Key key, @required this.item}) : super(key: key);
  188. @override
  189. Widget build(BuildContext context) {
  190. var backgroundColor;
  191. var textColor;
  192. switch (item.status) {
  193. case "STATUS_ARE_ACTIVE":
  194. backgroundColor = Colors.white;
  195. textColor = COLOR_CONST.DEFAULT;
  196. break;
  197. case "STATUS_FINISHED":
  198. backgroundColor = COLOR_CONST.DEFAULT;
  199. textColor = Colors.white;
  200. break;
  201. default:
  202. backgroundColor = Colors.white;
  203. textColor = Colors.black;
  204. }
  205. return GestureDetector(
  206. child: Card(
  207. color: backgroundColor,
  208. child: ListTile(
  209. title: Text("${item.code ?? ''} - ${item.suppliesName ?? ''}",
  210. style: TextStyle(color: textColor)),
  211. subtitle: Text(item.startDate.format_DDMMYY_HHmm().toString(),
  212. style: TextStyle(color: textColor)),
  213. trailing: Text(
  214. item.areaM2.formatNumtoStringDecimal().toString() + " m\u00B2",
  215. style: TextStyle(color: textColor)),
  216. ),
  217. ),
  218. onTap: () {
  219. Navigator.push(
  220. context,
  221. MaterialPageRoute(
  222. builder: (BuildContext context) => PlotDetailScreen(
  223. cropId: item.id,
  224. initialIndex: 1,
  225. )));
  226. });
  227. }
  228. }