book_confirm_page.dart 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. import 'package:cs_resources/generated/assets.dart';
  2. import 'package:cs_resources/generated/l10n.dart';
  3. import 'package:cs_resources/theme/app_colors_theme.dart';
  4. import 'package:domain/entity/facility_book_entity.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:auto_route/auto_route.dart';
  7. import 'package:hooks_riverpod/hooks_riverpod.dart';
  8. import 'package:router/ext/auto_router_extensions.dart';
  9. import 'package:shared/utils/date_time_utils.dart';
  10. import 'package:widgets/ext/ex_widget.dart';
  11. import 'package:widgets/my_appbar.dart';
  12. import 'package:widgets/my_button.dart';
  13. import 'package:widgets/my_load_image.dart';
  14. import 'package:widgets/my_text_view.dart';
  15. import 'package:widgets/utils/dark_theme_util.dart';
  16. import '../../router/page/facility_page_router.dart';
  17. import '../booking/facility_booking_view_model.dart';
  18. @RoutePage()
  19. class BookConfirmPage extends HookConsumerWidget {
  20. const BookConfirmPage({Key? key}) : super(key: key);
  21. //启动当前页面
  22. static void startInstance({BuildContext? context}) {
  23. if (context != null) {
  24. context.router.push(const BookConfirmPageRoute());
  25. } else {
  26. appRouter.push(const BookConfirmPageRoute());
  27. }
  28. }
  29. @override
  30. Widget build(BuildContext context, WidgetRef ref) {
  31. final viewModel = ref.watch(facilityBookingViewModelProvider.notifier);
  32. final state = ref.watch(facilityBookingViewModelProvider);
  33. return Scaffold(
  34. appBar: MyAppBar.appBar(
  35. context,
  36. state.facilityName ?? "",
  37. showBackButton: true,
  38. backgroundColor: context.appColors.backgroundWhite,
  39. ),
  40. backgroundColor: context.appColors.backgroundDark,
  41. body: Column(
  42. children: [
  43. Expanded(
  44. child: SingleChildScrollView(
  45. scrollDirection: Axis.vertical,
  46. physics: const BouncingScrollPhysics(),
  47. child: Column(
  48. mainAxisSize: MainAxisSize.max,
  49. crossAxisAlignment: CrossAxisAlignment.center,
  50. children: [
  51. const SizedBox(height: 7.5),
  52. // 预定
  53. _buildConfirmItem(
  54. context,
  55. ref,
  56. S.current.book,
  57. Assets.facilityConfirmDateIcon,
  58. 28.5,
  59. 29,
  60. "${DateTimeUtils.getWeekday(state.selectedDate, languageCode: 'en', short: true)}, ${DateTimeUtils.formatDate(state.selectedDate, format: 'dd MMM yyyy')}",
  61. null,
  62. "${state.data?.facilities?[state.index].periods?[state.innerIndex].start}-${state.data?.facilities?[state.index].periods?[state.innerIndex].end}",
  63. null,
  64. ),
  65. // 设施
  66. _buildConfirmItem(
  67. context,
  68. ref,
  69. S.current.facility,
  70. Assets.facilityConfirmFacilityIcon,
  71. 25.0,
  72. 30.5,
  73. state.facilityName ?? "",
  74. null,
  75. state.data?.facilities?[state.index].name ?? "",
  76. null,
  77. ),
  78. // 付款
  79. _buildConfirmItem(
  80. context,
  81. ref,
  82. S.current.payment,
  83. Assets.facilityConfirmPaymentIcon,
  84. 27.0,
  85. 22.0,
  86. S.current.booking_fee,
  87. state.data?.facilities?[state.index].periods?[state.innerIndex].price,
  88. S.current.total,
  89. "\$${state.data?.facilities?[state.index].periods?[state.innerIndex].price}",
  90. ),
  91. // 押金
  92. _buildConfirmItem(
  93. context,
  94. ref,
  95. S.current.deposit,
  96. Assets.facilityConfirmDepositIcon,
  97. 28.0,
  98. 26.5,
  99. S.current.deposit_hold,
  100. "\$${state.data?.facilities?[state.index].periods?[state.innerIndex].deposit}",
  101. null,
  102. null,
  103. ),
  104. // 添加间隔
  105. const SizedBox(height: 7.5),
  106. ],
  107. ),
  108. ),
  109. ),
  110. // 显示支付信息
  111. _paymentInfo(context, ref),
  112. // 底部按钮
  113. MyButton(
  114. onPressed: viewModel.doPayment,
  115. text: S.current.proceed_with_payment,
  116. textColor: Colors.white,
  117. backgroundColor: context.appColors.btnBgDefault,
  118. fontWeight: FontWeight.w500,
  119. type: ClickType.throttle,
  120. fontSize: 16,
  121. minHeight: 50,
  122. radius: 0,
  123. ).marginOnly(top: 15),
  124. ],
  125. ),
  126. );
  127. }
  128. //展示的Item
  129. Widget _buildConfirmItem(
  130. BuildContext context,
  131. WidgetRef ref,
  132. String title,
  133. String iconPath,
  134. double iconWidth,
  135. double iconHeight,
  136. String line1Txt,
  137. String? line1Content,
  138. String? line2Txt,
  139. String? line2Content,
  140. ) {
  141. return Container(
  142. width: double.infinity,
  143. height: 92.5,
  144. padding: const EdgeInsets.only(left: 20, right: 20),
  145. margin: const EdgeInsets.only(left: 15, right: 15, top: 7.5, bottom: 7.5),
  146. decoration: BoxDecoration(
  147. color: context.appColors.whiteBG,
  148. borderRadius: BorderRadius.circular(6.0), // 圆角
  149. boxShadow: [
  150. BoxShadow(
  151. color: context.appColors.itemBGShadow, // 阴影颜色
  152. offset: const Offset(0, 3), // 阴影的偏移量
  153. blurRadius: 8.0, // 模糊半径
  154. spreadRadius: 3.0, // 扩散半径
  155. ),
  156. ],
  157. ),
  158. child: Center(
  159. child: Column(
  160. crossAxisAlignment: CrossAxisAlignment.start,
  161. mainAxisSize: MainAxisSize.min,
  162. children: [
  163. MyTextView(
  164. title,
  165. textColor: context.appColors.textBlack,
  166. fontSize: 16,
  167. marginBottom: 7,
  168. isFontMedium: true,
  169. ),
  170. Row(
  171. mainAxisSize: MainAxisSize.max,
  172. children: [
  173. MyAssetImage(
  174. iconPath,
  175. width: iconWidth,
  176. height: iconHeight,
  177. color: DarkThemeUtil.multiColors(context, AppColorsTheme.colorPrimary, darkColor: Colors.white),
  178. ).marginOnly(right: 15),
  179. Column(
  180. mainAxisSize: MainAxisSize.min,
  181. children: [
  182. Row(
  183. children: [
  184. MyTextView(
  185. line1Txt,
  186. textColor: context.appColors.textBlack,
  187. fontSize: 14,
  188. isFontRegular: true,
  189. ).expanded(),
  190. MyTextView(
  191. line1Content ?? "",
  192. textColor: context.appColors.textBlack,
  193. fontSize: 14,
  194. isFontRegular: true,
  195. ),
  196. ],
  197. ),
  198. Visibility(
  199. visible: line2Txt != null,
  200. child: Row(
  201. children: [
  202. MyTextView(
  203. line2Txt ?? "",
  204. textColor: context.appColors.textBlack,
  205. fontSize: 14,
  206. isFontRegular: true,
  207. ).expanded(),
  208. MyTextView(
  209. line2Content ?? "",
  210. textColor: context.appColors.textBlack,
  211. fontSize: 14,
  212. isFontRegular: true,
  213. ),
  214. ],
  215. ).marginOnly(top: 6),
  216. ),
  217. ],
  218. ).expanded(),
  219. ],
  220. ),
  221. ],
  222. ),
  223. ),
  224. );
  225. }
  226. //底部的支付信息
  227. Widget _paymentInfo(BuildContext context, WidgetRef ref) {
  228. final viewModel = ref.watch(facilityBookingViewModelProvider.notifier);
  229. return Container(
  230. padding: const EdgeInsets.symmetric(vertical: 17.5, horizontal: 23),
  231. color: context.appColors.whiteBG,
  232. child: Column(
  233. crossAxisAlignment: CrossAxisAlignment.start,
  234. children: [
  235. MyTextView(
  236. S.current.card_caps,
  237. marginBottom: 17,
  238. textColor: context.appColors.textPrimary,
  239. fontSize: 17,
  240. isFontMedium: true,
  241. ),
  242. Row(
  243. children: [
  244. const MyAssetImage(
  245. Assets.facilityConfirmEcardIcon,
  246. height: 38,
  247. ),
  248. MyTextView(
  249. "Ending 9423",
  250. marginLeft: 15,
  251. marginRight: 15,
  252. textColor: context.appColors.textBlack,
  253. fontSize: 15,
  254. isFontMedium: true,
  255. ).expanded(),
  256. MyTextView(
  257. S.current.change,
  258. textColor: Colors.white,
  259. backgroundColor: context.appColors.btnBgDefault,
  260. paddingRight: 16,
  261. onClick: viewModel.gotoChooseCardPage,
  262. paddingLeft: 16,
  263. paddingTop: 8,
  264. paddingBottom: 8,
  265. cornerRadius: 7,
  266. fontSize: 15,
  267. isFontMedium: true,
  268. )
  269. ],
  270. )
  271. ],
  272. ),
  273. );
  274. }
  275. }