@@ -9,6 +9,7 @@ import 'package:dipantau_desktop_client/feature/data/model/track_user/track_user
99import 'package:dipantau_desktop_client/feature/data/model/user_profile/user_profile_response.dart' ;
1010import 'package:dipantau_desktop_client/feature/presentation/bloc/member/member_bloc.dart' ;
1111import 'package:dipantau_desktop_client/feature/presentation/bloc/report_screenshot/report_screenshot_bloc.dart' ;
12+ import 'package:dipantau_desktop_client/feature/presentation/bloc/tracking/tracking_bloc.dart' ;
1213import 'package:dipantau_desktop_client/feature/presentation/page/photo_view/photo_view_page.dart' ;
1314import 'package:dipantau_desktop_client/feature/presentation/widget/widget_custom_circular_progress_indicator.dart' ;
1415import 'package:dipantau_desktop_client/feature/presentation/widget/widget_error.dart' ;
@@ -20,6 +21,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
2021import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart' ;
2122import 'package:font_awesome_flutter/font_awesome_flutter.dart' ;
2223import 'package:go_router/go_router.dart' ;
24+ import 'package:lottie/lottie.dart' ;
2325
2426class ReportScreenshotPage extends StatefulWidget {
2527 static const routePath = '/report-screenshot' ;
@@ -39,6 +41,8 @@ class _ReportScreenshotPageState extends State<ReportScreenshotPage> {
3941 final listUserProfile = < UserProfileResponse > [];
4042 final controllerFilterDate = TextEditingController ();
4143 final controllerFilterUser = TextEditingController ();
44+ final trackingBloc = sl <TrackingBloc >();
45+ final listTracks = < ItemTrackUserResponse > [];
4246
4347 var userId = '' ;
4448 var name = '' ;
@@ -48,6 +52,7 @@ class _ReportScreenshotPageState extends State<ReportScreenshotPage> {
4852 UserProfileResponse ? selectedUser;
4953 var isLoading = false ;
5054 var isPreparingDataSuccess = false ;
55+ var isRefreshPreviousPage = false ;
5156
5257 @override
5358 void setState (VoidCallback fn) {
@@ -86,60 +91,132 @@ class _ReportScreenshotPageState extends State<ReportScreenshotPage> {
8691
8792 @override
8893 Widget build (BuildContext context) {
89- return GestureDetector (
90- onTap: () => widgetHelper.unfocus (context),
91- child: Scaffold (
92- appBar: AppBar (
93- title: Text (
94- 'report_screenshot' .tr (),
95- ),
96- centerTitle: false ,
97- ),
98- body: MultiBlocProvider (
99- providers: [
100- BlocProvider <MemberBloc >(
101- create: (context) => memberBloc,
102- ),
103- BlocProvider <ReportScreenshotBloc >(
104- create: (context) => reportScreenshotBloc,
94+ return WillPopScope (
95+ onWillPop: () async {
96+ context.pop (isRefreshPreviousPage);
97+ return false ;
98+ },
99+ child: GestureDetector (
100+ onTap: () => widgetHelper.unfocus (context),
101+ child: Scaffold (
102+ appBar: AppBar (
103+ title: Text (
104+ 'report_screenshot' .tr (),
105105 ),
106- ],
107- child: MultiBlocListener (
108- listeners: [
109- BlocListener <MemberBloc , MemberState >(
110- listener: (context, state) {
111- if (state is FailureMemberState ) {
112- final errorMessage = state.errorMessage.convertErrorMessageToHumanMessage ();
113- if (errorMessage.contains ('401' )) {
114- widgetHelper.showDialog401 (context);
115- return ;
116- }
117- } else if (state is SuccessLoadListMemberState ) {
118- listUserProfile.clear ();
119- listUserProfile.addAll (state.response.data ?? []);
120- isPreparingDataSuccess = true ;
121- setState (() {});
122- }
123- },
106+ centerTitle: false ,
107+ ),
108+ body: MultiBlocProvider (
109+ providers: [
110+ BlocProvider <MemberBloc >(
111+ create: (context) => memberBloc,
124112 ),
125- BlocListener <ReportScreenshotBloc , ReportScreenshotState >(
126- listener: (context, state) {
127- isLoading = state is LoadingCenterReportScreenshotState ;
128- if (state is FailureReportScreenshotState ) {
129- final errorMessage = state.errorMessage.convertErrorMessageToHumanMessage ();
130- if (errorMessage.contains ('401' )) {
131- widgetHelper.showDialog401 (context);
132- return ;
133- }
134- }
135- },
113+ BlocProvider <ReportScreenshotBloc >(
114+ create: (context) => reportScreenshotBloc,
115+ ),
116+ BlocProvider <TrackingBloc >(
117+ create: (context) => trackingBloc,
136118 ),
137119 ],
138- child: Stack (
139- children: [
140- buildWidgetBody (),
141- buildWidgetLoadingPreparingData (),
120+ child: MultiBlocListener (
121+ listeners: [
122+ BlocListener <MemberBloc , MemberState >(
123+ listener: (context, state) {
124+ if (state is FailureMemberState ) {
125+ final errorMessage = state.errorMessage.convertErrorMessageToHumanMessage ();
126+ if (errorMessage.contains ('401' )) {
127+ widgetHelper.showDialog401 (context);
128+ return ;
129+ }
130+ } else if (state is SuccessLoadListMemberState ) {
131+ listUserProfile.clear ();
132+ listUserProfile.addAll (state.response.data ?? []);
133+ isPreparingDataSuccess = true ;
134+ setState (() {});
135+ }
136+ },
137+ ),
138+ BlocListener <ReportScreenshotBloc , ReportScreenshotState >(
139+ listener: (context, state) {
140+ isLoading = state is LoadingCenterReportScreenshotState ;
141+ if (state is FailureReportScreenshotState ) {
142+ final errorMessage = state.errorMessage.convertErrorMessageToHumanMessage ();
143+ if (errorMessage.contains ('401' )) {
144+ widgetHelper.showDialog401 (context);
145+ return ;
146+ }
147+ } else if (state is SuccessLoadReportScreenshotState ) {
148+ listTracks.clear ();
149+ listTracks.addAll (state.response.data ?? []);
150+ }
151+ },
152+ ),
153+ BlocListener <TrackingBloc , TrackingState >(
154+ listener: (context, state) {
155+ if (state is ! LoadingTrackingState ) {
156+ // untuk menutup dialog loading tracking
157+ context.pop ();
158+ }
159+
160+ if (state is FailureTrackingState ) {
161+ final errorMessage = state.errorMessage.convertErrorMessageToHumanMessage ();
162+ if (errorMessage.contains ('401' )) {
163+ widgetHelper.showDialog401 (context);
164+ return ;
165+ }
166+ showDialog (
167+ context: context,
168+ builder: (context) {
169+ return AlertDialog (
170+ title: Text ('oops' .tr ()),
171+ content: Text (errorMessage.hideResponseCode ()),
172+ actions: [
173+ TextButton (
174+ onPressed: () => context.pop (),
175+ child: Text ('dismiss' .tr ()),
176+ ),
177+ ],
178+ );
179+ },
180+ );
181+ } else if (state is LoadingTrackingState ) {
182+ showDialog (
183+ context: context,
184+ barrierDismissible: false ,
185+ builder: (context) {
186+ return AlertDialog (
187+ title: LottieBuilder .asset (
188+ BaseAnimation .animationDeleteFile,
189+ repeat: true ,
190+ width: 92 ,
191+ height: 92 ,
192+ ),
193+ content: Text (
194+ 'deleting_track' .tr (),
195+ textAlign: TextAlign .center,
196+ style: Theme .of (context).textTheme.bodyMedium,
197+ ),
198+ );
199+ },
200+ );
201+ } else if (state is SuccessDeleteTrackUserTrackingState ) {
202+ isRefreshPreviousPage = true ;
203+ final trackId = state.trackId;
204+ listTracks.removeWhere ((element) => element.id != null && element.id == trackId);
205+ widgetHelper.showSnackBar (
206+ context,
207+ 'track_data_successfully_deleted' .tr (),
208+ );
209+ setState (() {});
210+ }
211+ },
212+ ),
142213 ],
214+ child: Stack (
215+ children: [
216+ buildWidgetBody (),
217+ buildWidgetLoadingPreparingData (),
218+ ],
219+ ),
143220 ),
144221 ),
145222 ),
@@ -205,8 +282,7 @@ class _ReportScreenshotPageState extends State<ReportScreenshotPage> {
205282 onTryAgain: doLoadData,
206283 );
207284 } else if (state is SuccessLoadReportScreenshotState ) {
208- final listTracks = state.response.data ?? [];
209- return buildWidgetListData (listTracks);
285+ return buildWidgetListData ();
210286 }
211287 return Container ();
212288 },
@@ -334,7 +410,7 @@ class _ReportScreenshotPageState extends State<ReportScreenshotPage> {
334410 controllerFilterUser.text = name;
335411 }
336412
337- Widget buildWidgetListData (List < ItemTrackUserResponse > listTracks ) {
413+ Widget buildWidgetListData () {
338414 if (listTracks.isEmpty) {
339415 return Padding (
340416 padding: EdgeInsets .all (helper.getDefaultPaddingLayout),
@@ -539,6 +615,7 @@ class _ReportScreenshotPageState extends State<ReportScreenshotPage> {
539615 ),
540616 ),
541617 buildWidgetCountScreen (heightImage, listFiles),
618+ buildWidgetDeleteTask (heightImage, element.id),
542619 ],
543620 ),
544621 ),
@@ -709,4 +786,52 @@ class _ReportScreenshotPageState extends State<ReportScreenshotPage> {
709786 ),
710787 );
711788 }
789+
790+ Widget buildWidgetDeleteTask (double heightImage, int ? trackId) {
791+ if (userRole != null && userRole == UserRole .employee) {
792+ return Container ();
793+ }
794+
795+ return Align (
796+ alignment: Alignment .center,
797+ child: Padding (
798+ padding: EdgeInsets .only (top: heightImage),
799+ child: Row (
800+ mainAxisSize: MainAxisSize .max,
801+ mainAxisAlignment: MainAxisAlignment .end,
802+ children: [
803+ Material (
804+ borderRadius: BorderRadius .circular (999 ),
805+ child: InkWell (
806+ borderRadius: BorderRadius .circular (999 ),
807+ onTap: () {
808+ if (trackId == null ) {
809+ widgetHelper.showSnackBar (
810+ context,
811+ 'track_id_invalid' .tr (),
812+ );
813+ return ;
814+ }
815+
816+ trackingBloc.add (
817+ DeleteTrackUserTrackingEvent (
818+ trackId: trackId,
819+ ),
820+ );
821+ },
822+ child: const Padding (
823+ padding: EdgeInsets .all (8.0 ),
824+ child: FaIcon (
825+ FontAwesomeIcons .trashCan,
826+ color: Colors .red,
827+ size: 14 ,
828+ ),
829+ ),
830+ ),
831+ ),
832+ ],
833+ ),
834+ ),
835+ );
836+ }
712837}
0 commit comments