Skip to content

Commit a710ba9

Browse files
committed
feat: Buat fitur delete track di halaman report_screenshot_page.dart
1 parent 2505808 commit a710ba9

File tree

1 file changed

+177
-52
lines changed

1 file changed

+177
-52
lines changed

lib/feature/presentation/page/report_screenshot/report_screenshot_page.dart

Lines changed: 177 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:dipantau_desktop_client/feature/data/model/track_user/track_user
99
import 'package:dipantau_desktop_client/feature/data/model/user_profile/user_profile_response.dart';
1010
import 'package:dipantau_desktop_client/feature/presentation/bloc/member/member_bloc.dart';
1111
import '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';
1213
import 'package:dipantau_desktop_client/feature/presentation/page/photo_view/photo_view_page.dart';
1314
import 'package:dipantau_desktop_client/feature/presentation/widget/widget_custom_circular_progress_indicator.dart';
1415
import 'package:dipantau_desktop_client/feature/presentation/widget/widget_error.dart';
@@ -20,6 +21,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
2021
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
2122
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
2223
import 'package:go_router/go_router.dart';
24+
import 'package:lottie/lottie.dart';
2325

2426
class 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

Comments
 (0)