Skip to content

Commit 3499026

Browse files
authored
Merge pull request #18 from CoderJava/feature/buat-fitur-delete-track-untuk-role-admin-dan-super-admin
Feature - Buat fitur delete track user khusus untuk role super admin dan admin di halaman report screenshot
2 parents 3408a67 + 991a5d1 commit 3499026

File tree

21 files changed

+778
-114
lines changed

21 files changed

+778
-114
lines changed

assets/animations/animation_delete_file.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

assets/translations/en-US.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,5 +232,9 @@
232232
"title_accessibility_mac": "Accessibility",
233233
"description_accessibility_mac": "This app would like to get keyboard & mouse activity. Grant access to this app in Security & Privacy preferences. Located in System Preferences. If it doesn't exists please add manually of if it exists please delete it.",
234234
"start_working": "Start working",
235-
"stop_working": "Stop working"
235+
"stop_working": "Stop working",
236+
"track_id_invalid": "Invalid track ID",
237+
"deleting_track": "Please wait a moment track data is\nbeing deleted",
238+
"dismiss": "Dismiss",
239+
"track_data_successfully_deleted": "Track data successfully deleted"
236240
}

lib/core/util/images.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ class BaseAnimation {
1717
static const animationUpload = '$_path/animation_upload.json';
1818
static const animationFailure = '$_path/animation_failure.json';
1919
static const animationSuccess = '$_path/animation_success.json';
20+
static const animationDeleteFile = '$_path/animation_delete_file.json';
2021
}

lib/feature/data/datasource/track/track_remote_data_source.dart

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ abstract class TrackRemoteDataSource {
4343
late String pathGetTrackUser;
4444

4545
Future<TrackUserResponse> getTrackUser(String userId, String date);
46+
47+
/// Panggil endpoint [host]/track/:id
48+
///
49+
/// Throws [DioException] untuk semua error kode
50+
late String pathDeleteTrack;
51+
52+
Future<GeneralResponse> deleteTrackUser(int trackId);
4653
}
4754

4855
class TrackRemoteDataSourceImpl implements TrackRemoteDataSource {
@@ -194,4 +201,25 @@ class TrackRemoteDataSourceImpl implements TrackRemoteDataSource {
194201
throw DioException(requestOptions: RequestOptions(path: pathGetTrackUser));
195202
}
196203
}
204+
205+
@override
206+
String pathDeleteTrack = '';
207+
208+
@override
209+
Future<GeneralResponse> deleteTrackUser(int trackId) async {
210+
pathDeleteTrack = '$baseUrl/$trackId';
211+
final response = await dio.delete(
212+
pathDeleteTrack,
213+
options: Options(
214+
headers: {
215+
baseUrlConfig.requiredToken: true,
216+
},
217+
),
218+
);
219+
if (response.statusCode.toString().startsWith('2')) {
220+
return GeneralResponse.fromJson(response.data);
221+
} else {
222+
throw DioException(requestOptions: RequestOptions(path: pathDeleteTrack));
223+
}
224+
}
197225
}

lib/feature/data/repository/track/track_repository_impl.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,34 @@ class TrackRepositoryImpl implements TrackRepository {
176176
}
177177
return (failure: failure, response: response);
178178
}
179+
180+
@override
181+
Future<({Failure? failure, GeneralResponse? response})> deleteTrackUser(int trackId) async {
182+
Failure? failure;
183+
GeneralResponse? response;
184+
final isConnected = await networkInfo.isConnected;
185+
if (isConnected) {
186+
try {
187+
response = await remoteDataSource.deleteTrackUser(trackId);
188+
} on DioException catch (error) {
189+
final message = error.message ?? error.toString();
190+
if (error.response == null) {
191+
failure = ServerFailure(message);
192+
} else {
193+
final errorMessage = getErrorMessageFromEndpoint(
194+
error.response?.data,
195+
message,
196+
error.response?.statusCode,
197+
);
198+
failure = ServerFailure(errorMessage);
199+
}
200+
} on TypeError catch (error) {
201+
final errorMessage = error.toString();
202+
failure = ParsingFailure(errorMessage);
203+
}
204+
} else {
205+
failure = ConnectionFailure();
206+
}
207+
return (failure: failure, response: response);
208+
}
179209
}

lib/feature/domain/repository/track/track_repository.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ abstract class TrackRepository {
1717
Future<({Failure? failure, GeneralResponse? response})> bulkCreateTrackImage(BulkCreateTrackImageBody body);
1818

1919
Future<({Failure? failure, TrackUserResponse? response})> getTrackUser(String userId, String date);
20+
21+
Future<({Failure? failure, GeneralResponse? response})> deleteTrackUser(int trackId);
2022
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import 'package:dipantau_desktop_client/core/error/failure.dart';
2+
import 'package:dipantau_desktop_client/core/usecase/usecase.dart';
3+
import 'package:dipantau_desktop_client/feature/data/model/general/general_response.dart';
4+
import 'package:dipantau_desktop_client/feature/domain/repository/track/track_repository.dart';
5+
import 'package:equatable/equatable.dart';
6+
7+
class DeleteTrackUser implements UseCaseRecords<GeneralResponse?, ParamsDeleteTrackUser> {
8+
final TrackRepository repository;
9+
10+
DeleteTrackUser({required this.repository});
11+
12+
@override
13+
Future<({Failure? failure, GeneralResponse? response})> call(ParamsDeleteTrackUser params) {
14+
return repository.deleteTrackUser(params.trackId);
15+
}
16+
}
17+
18+
class ParamsDeleteTrackUser extends Equatable {
19+
final int trackId;
20+
21+
ParamsDeleteTrackUser({required this.trackId});
22+
23+
@override
24+
List<Object?> get props => [
25+
trackId,
26+
];
27+
28+
@override
29+
String toString() {
30+
return 'ParamsDeleteTrackUser{trackId: $trackId}';
31+
}
32+
}

lib/feature/presentation/bloc/tracking/tracking_bloc.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:bloc_concurrency/bloc_concurrency.dart';
55
import 'package:dipantau_desktop_client/core/util/helper.dart';
66
import 'package:dipantau_desktop_client/feature/data/model/create_track/create_track_body.dart';
77
import 'package:dipantau_desktop_client/feature/domain/usecase/create_track/create_track.dart';
8+
import 'package:dipantau_desktop_client/feature/domain/usecase/delete_track_user/delete_track_user.dart';
89

910
part 'tracking_event.dart';
1011

@@ -13,12 +14,16 @@ part 'tracking_state.dart';
1314
class TrackingBloc extends Bloc<TrackingEvent, TrackingState> {
1415
final CreateTrack createTrack;
1516
final Helper helper;
17+
final DeleteTrackUser deleteTrackUser;
1618

1719
TrackingBloc({
1820
required this.createTrack,
1921
required this.helper,
22+
required this.deleteTrackUser,
2023
}) : super(InitialTrackingState()) {
2124
on<CreateTimeTrackingEvent>(_onCreateTimeTrackingEvent, transformer: sequential());
25+
26+
on<DeleteTrackUserTrackingEvent>(_onDeleteTrackUserTrackingEvent);
2227
}
2328

2429
FutureOr<void> _onCreateTimeTrackingEvent(
@@ -42,4 +47,31 @@ class TrackingBloc extends Bloc<TrackingEvent, TrackingState> {
4247
final errorMessage = helper.getErrorMessageFromFailure(failure);
4348
emit(FailureTrackingState(errorMessage: errorMessage));
4449
}
50+
51+
FutureOr<void> _onDeleteTrackUserTrackingEvent(
52+
DeleteTrackUserTrackingEvent event,
53+
Emitter<TrackingState> emit,
54+
) async {
55+
emit(LoadingTrackingState());
56+
await Future.delayed(const Duration(seconds: 3));
57+
final trackId = event.trackId;
58+
final result = await deleteTrackUser(
59+
ParamsDeleteTrackUser(
60+
trackId: event.trackId,
61+
),
62+
);
63+
final response = result.response;
64+
final failure = result.failure;
65+
if (response != null) {
66+
emit(
67+
SuccessDeleteTrackUserTrackingState(
68+
trackId: trackId,
69+
),
70+
);
71+
return;
72+
}
73+
74+
final errorMessage = helper.getErrorMessageFromFailure(failure);
75+
emit(FailureTrackingState(errorMessage: errorMessage));
76+
}
4577
}

lib/feature/presentation/bloc/tracking/tracking_event.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,15 @@ class CreateTimeTrackingEvent extends TrackingEvent {
1717
String toString() {
1818
return 'CreateTimeTrackingEvent{body: $body, trackEntityId: $trackEntityId}';
1919
}
20+
}
21+
22+
class DeleteTrackUserTrackingEvent extends TrackingEvent {
23+
final int trackId;
24+
25+
DeleteTrackUserTrackingEvent({required this.trackId});
26+
27+
@override
28+
String toString() {
29+
return 'DeleteTrackUserTrackingEvent{trackId: $trackId}';
30+
}
2031
}

lib/feature/presentation/bloc/tracking/tracking_state.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,15 @@ class SuccessCreateTimeTrackingState extends TrackingState {
3232
String toString() {
3333
return 'SuccessCreateTimeTrackingState{files: $files, trackEntityId: $trackEntityId}';
3434
}
35-
}
35+
}
36+
37+
class SuccessDeleteTrackUserTrackingState extends TrackingState {
38+
final int trackId;
39+
40+
SuccessDeleteTrackUserTrackingState({required this.trackId});
41+
42+
@override
43+
String toString() {
44+
return 'SuccessDeleteTrackUserTrackingState{trackId: $trackId}';
45+
}
46+
}

0 commit comments

Comments
 (0)