track_share_view.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. import 'dart:io';
  2. import 'package:flutter/cupertino.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:location/data/api/response/track_daily_summary_response.dart';
  6. import 'package:location/data/bean/user_info.dart';
  7. import 'package:location/data/repositories/account_repository.dart';
  8. import 'package:location/resource/assets.gen.dart';
  9. import 'package:location/resource/string.gen.dart';
  10. import 'package:location/utils/common_expand.dart';
  11. import 'package:location/utils/date_util.dart';
  12. import '../../../data/bean/track_summary.dart';
  13. import '../../../resource/colors.gen.dart';
  14. import '../../../resource/fonts.gen.dart';
  15. import '../../../utils/common_style.dart';
  16. import '../../../widget/dashed_line.dart';
  17. import '../../../widget/rich_text_replace.dart';
  18. class TrackShareView extends StatelessWidget {
  19. final TrackDailySummaryResponse trackDailySummary;
  20. final UserInfo userInfo;
  21. final int day;
  22. const TrackShareView(this.day, this.userInfo, this.trackDailySummary,
  23. {super.key});
  24. @override
  25. Widget build(BuildContext context) {
  26. return Container(
  27. width: double.infinity,
  28. decoration: BoxDecoration(
  29. gradient: LinearGradient(
  30. colors: ['#C8C0FF'.color, '#FFFFFF'.color, '#B7ACFF'.color],
  31. begin: Alignment.bottomLeft,
  32. end: Alignment.topRight),
  33. ),
  34. child: IntrinsicHeight(
  35. child: Stack(
  36. children: [
  37. buildShareTitleView(),
  38. buildRobotView(),
  39. Column(
  40. children: [
  41. SizedBox(height: 129.w),
  42. buildShareContentView(),
  43. ],
  44. ),
  45. _buildShareAvatarView(),
  46. ],
  47. ),
  48. ),
  49. );
  50. }
  51. Widget buildShareContentView() {
  52. return Container(
  53. margin: EdgeInsets.symmetric(horizontal: 24.w),
  54. child: Column(
  55. children: [
  56. buildContent1View(),
  57. Container(
  58. color: ColorName.white,
  59. margin: EdgeInsets.symmetric(horizontal: 14.w),
  60. child: DashedLine(
  61. height: 1.w,
  62. color: '#CCCCCC'.color,
  63. dashWidth: 3.w,
  64. dashSpace: 3.w,
  65. ),
  66. ),
  67. buildContent2View(),
  68. SizedBox(height: 6.w),
  69. Text(
  70. StringName.aiGenerateAlert,
  71. style: TextStyle(fontSize: 9.sp, color: ColorName.black30),
  72. ),
  73. Visibility(
  74. visible: trackDailySummary.stayLongest == null,
  75. child: SizedBox(height: 80.w)),
  76. Visibility(
  77. visible: !trackDailySummary.showTrackSituation,
  78. child: SizedBox(height: 80.w)),
  79. SizedBox(height: 96.w),
  80. buildAppLogoView(),
  81. SizedBox(height: 16.w),
  82. ],
  83. ),
  84. );
  85. }
  86. Widget buildAppLogoView() {
  87. return Row(
  88. mainAxisAlignment: MainAxisAlignment.center,
  89. children: [
  90. Assets.images.iconLogo.image(width: 28.w, height: 28.w),
  91. SizedBox(width: 6.w),
  92. Column(
  93. crossAxisAlignment: CrossAxisAlignment.start,
  94. children: [
  95. Text(Platform.isIOS ? StringName.appNameIos : StringName.appName,
  96. style: TextStyle(
  97. fontSize: 12.sp,
  98. fontWeight: FontWeight.bold,
  99. color: ColorName.black)),
  100. SizedBox(height: 2.w),
  101. Text(StringName.trackStayShareLogoDesc,
  102. style: TextStyle(fontSize: 9.sp, color: '#74839C'.color))
  103. ],
  104. )
  105. ],
  106. );
  107. }
  108. Widget buildContent2View() {
  109. return Container(
  110. width: double.infinity,
  111. padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 20.w),
  112. decoration: BoxDecoration(
  113. color: ColorName.white, borderRadius: BorderRadius.circular(14.w)),
  114. child: Column(
  115. children: [
  116. _buildSituationItem(
  117. Assets.images.iconSharePhone.provider(),
  118. StringName.trackDailySummaryPhone,
  119. trackDailySummary.phoneSituation,
  120. isShowDivider: trackDailySummary.stayLongest != null),
  121. _buildSituationItem(Assets.images.iconShareStay.provider(),
  122. StringName.trackDailySummaryStay, trackDailySummary.stayLongest,
  123. isShowDivider: trackDailySummary.showTrackSituation &&
  124. trackDailySummary.trackSituation?.isNotEmpty == true),
  125. _buildDailyTrack()
  126. ],
  127. ),
  128. );
  129. }
  130. Widget _buildDailyTrack() {
  131. if (trackDailySummary.trackSituation?.isNotEmpty == true) {
  132. return SizedBox(
  133. width: double.infinity,
  134. child: Column(
  135. crossAxisAlignment: CrossAxisAlignment.start,
  136. children: [
  137. Row(children: [
  138. Assets.images.iconShareTrackDetail
  139. .image(width: 15.w, height: 15.w),
  140. SizedBox(width: 4.w),
  141. Text(StringName.trackDailySummarytrack,
  142. style: TextStyle(
  143. fontSize: 13.sp,
  144. color: '#333333'.color,
  145. fontWeight: FontWeight.bold)),
  146. ]),
  147. SizedBox(height: 8.w),
  148. Text(
  149. trackDailySummary.trackSituation ?? '',
  150. style: TextStyle(fontSize: 11.sp, color: '#666666'.color),
  151. ),
  152. SizedBox(height: 12.w),
  153. ],
  154. ),
  155. );
  156. }
  157. return SizedBox.shrink();
  158. }
  159. Widget _buildSituationItem(
  160. ImageProvider icon, String title, TrackSummary? summary,
  161. {bool isShowDivider = true}) {
  162. if (summary == null) {
  163. return SizedBox.shrink();
  164. }
  165. return SizedBox(
  166. width: double.infinity,
  167. child: Column(
  168. crossAxisAlignment: CrossAxisAlignment.start,
  169. children: [
  170. Row(children: [
  171. Image(image: icon, width: 15.w, height: 15.w),
  172. SizedBox(width: 4.w),
  173. Text(title,
  174. style: TextStyle(
  175. fontSize: 13.sp,
  176. color: '#333333'.color,
  177. fontWeight: FontWeight.bold)),
  178. ]),
  179. SizedBox(height: 8.w),
  180. RichTextReplace(
  181. text: summary.text,
  182. items: summary.items,
  183. defaultStyle: TextStyle(fontSize: 11.sp, color: '#666666'.color),
  184. replacedStyle: TextStyle(
  185. fontWeight: FontWeight.bold,
  186. fontSize: 11.sp,
  187. color: '#333333'.color)),
  188. SizedBox(height: 16.w),
  189. Visibility(
  190. visible: isShowDivider,
  191. child: Container(
  192. width: double.infinity,
  193. height: 1.w,
  194. color: '#EEEEEE'.color,
  195. ),
  196. ),
  197. Visibility(visible: isShowDivider, child: SizedBox(height: 16.w)),
  198. ],
  199. ),
  200. );
  201. }
  202. Widget buildContent1View() {
  203. return Container(
  204. decoration: BoxDecoration(
  205. color: ColorName.white,
  206. borderRadius: BorderRadius.circular(14.w),
  207. border: Border.all(color: ColorName.white, width: 2.w),
  208. image: DecorationImage(
  209. image: Assets.images.bgTrackReportUser.provider())),
  210. width: double.infinity,
  211. height: 95.w,
  212. child: Stack(
  213. children: [
  214. Positioned(
  215. top: 0,
  216. bottom: 0,
  217. right: 32.w,
  218. child: Column(
  219. crossAxisAlignment: CrossAxisAlignment.start,
  220. mainAxisAlignment: MainAxisAlignment.center,
  221. children: [
  222. Text(DateUtil.getDayOfMonth(day),
  223. style: TextStyle(
  224. fontFamily: FontFamily.oppoSans,
  225. fontSize: 36.w,
  226. fontWeight: FontWeight.bold,
  227. height: 1)),
  228. SizedBox(height: 4.w),
  229. Row(
  230. children: [
  231. Text(
  232. '${DateUtil.fromMillisecondsSinceEpoch("yyyy/MM", day)} ${DateUtil.getWeekday(day)}',
  233. style: TextStyle(
  234. fontSize: 11.sp,
  235. color: '#666666'.color,
  236. height: 1)),
  237. ],
  238. )
  239. ],
  240. ),
  241. )
  242. ],
  243. ),
  244. );
  245. }
  246. Widget _buildShareAvatarView() {
  247. return Positioned(
  248. left: 54.w,
  249. top: 118.w,
  250. child: Column(
  251. children: [
  252. Container(
  253. width: 68.w,
  254. height: 68.w,
  255. decoration: BoxDecoration(
  256. shape: BoxShape.circle,
  257. border: Border.all(color: '#A362FF'.color, width: 2.w),
  258. ),
  259. child: buildCustomAvatarView(
  260. size: double.infinity,
  261. avatar: userInfo.avatar ?? '',
  262. ),
  263. ),
  264. SizedBox(height: 6.w),
  265. Text(getUserName(),
  266. style: TextStyle(
  267. fontSize: 12.sp,
  268. color: '#333333'.color,
  269. fontWeight: FontWeight.w500))
  270. ],
  271. ),
  272. );
  273. }
  274. String getUserName() {
  275. String phone;
  276. if (userInfo.isMine == true) {
  277. phone = AccountRepository.getInstance().loginPhoneNum.value ??
  278. userInfo.phoneNumber;
  279. } else {
  280. phone = userInfo.phoneNumber;
  281. }
  282. if (phone.length > 4) {
  283. phone = phone.substring(phone.length - 4);
  284. }
  285. return '${StringName.mineAccountLoggedDesc}$phone';
  286. }
  287. Widget buildRobotView() {
  288. return Positioned(
  289. top: 8.w,
  290. right: 6.w,
  291. child: Assets.images.imgTrackReportRobot
  292. .image(width: 150.w, height: 150.w));
  293. }
  294. Widget buildShareTitleView() {
  295. return Positioned(
  296. left: 23.w,
  297. top: 31.w,
  298. child: Column(
  299. crossAxisAlignment: CrossAxisAlignment.start,
  300. children: [
  301. Assets.images.imgTrackReportTitle.image(height: 57.w),
  302. Row(
  303. children: [
  304. if (trackDailySummary.showTrackSituation &&
  305. trackDailySummary.trackSituation?.isNotEmpty == true)
  306. _buildTitle(StringName.trackDailySummarytrack),
  307. if (trackDailySummary.phoneSituation != null)
  308. _buildTitle(StringName.trackDailySummaryPhone),
  309. if (trackDailySummary.stayLongest != null)
  310. _buildTitle(StringName.trackStayLongestPlace),
  311. ],
  312. )
  313. ],
  314. ),
  315. );
  316. }
  317. Widget _buildTitle(String title) {
  318. return Container(
  319. margin: EdgeInsets.only(right: 6.w),
  320. padding: EdgeInsets.symmetric(horizontal: 6.w, vertical: 4.w),
  321. decoration: BoxDecoration(
  322. color: '#A362FF'.color, borderRadius: BorderRadius.circular(100.w)),
  323. child: Text(title,
  324. style:
  325. TextStyle(fontSize: 10.sp, color: ColorName.white, height: 1)));
  326. }
  327. }