track_share_view.dart 11 KB

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