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.

235 lines
7.4KB

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