Skip to content

Commit 6dc8abe

Browse files
fix: compass-app bug in dismissable homescreen item (#2449)
1 parent 0ab945f commit 6dc8abe

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

compass_app/app/lib/ui/home/widgets/home_screen.dart

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,20 @@ class _HomeScreenState extends State<HomeScreen> {
100100
booking: widget.viewModel.bookings[index],
101101
onTap: () => context.push(Routes.bookingWithId(
102102
widget.viewModel.bookings[index].id)),
103-
onDismissed: (_) =>
104-
widget.viewModel.deleteBooking.execute(
105-
widget.viewModel.bookings[index].id,
106-
),
103+
confirmDismiss: (_) async {
104+
// wait for command to complete
105+
await widget.viewModel.deleteBooking.execute(
106+
widget.viewModel.bookings[index].id,
107+
);
108+
// if command completed successfully, return true
109+
if (widget.viewModel.deleteBooking.completed) {
110+
// removes the dismissable from the list
111+
return true;
112+
} else {
113+
// the dismissable stays in the list
114+
return false;
115+
}
116+
},
107117
),
108118
)
109119
],
@@ -141,19 +151,19 @@ class _Booking extends StatelessWidget {
141151
super.key,
142152
required this.booking,
143153
required this.onTap,
144-
required this.onDismissed,
154+
required this.confirmDismiss,
145155
});
146156

147157
final BookingSummary booking;
148158
final GestureTapCallback onTap;
149-
final DismissDirectionCallback onDismissed;
159+
final ConfirmDismissCallback confirmDismiss;
150160

151161
@override
152162
Widget build(BuildContext context) {
153163
return Dismissible(
154164
key: ValueKey(booking.id),
155165
direction: DismissDirection.endToStart,
156-
onDismissed: onDismissed,
166+
confirmDismiss: confirmDismiss,
157167
child: InkWell(
158168
onTap: onTap,
159169
child: Padding(

compass_app/app/test/ui/home/widgets/home_screen_test.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:compass_app/data/repositories/itinerary_config/itinerary_config_
77
import 'package:compass_app/routing/routes.dart';
88
import 'package:compass_app/ui/home/view_models/home_viewmodel.dart';
99
import 'package:compass_app/ui/home/widgets/home_screen.dart';
10+
import 'package:compass_app/utils/result.dart';
1011
import 'package:flutter/foundation.dart';
1112
import 'package:flutter_test/flutter_test.dart';
1213
import 'package:mocktail/mocktail.dart';
@@ -102,5 +103,29 @@ void main() {
102103
// Booking should be deleted from repository
103104
expect(bookingRepository.bookings, isEmpty);
104105
});
106+
107+
testWidgets('fail to delete booking', (tester) async {
108+
// Create a ViewModel with a repository that will fail to delete
109+
viewModel = HomeViewModel(
110+
bookingRepository: _BadFakeBookingRepository()..createBooking(kBooking),
111+
userRepository: FakeUserRepository(),
112+
);
113+
await loadWidget(tester);
114+
await tester.pumpAndSettle();
115+
116+
// Swipe on booking (created from kBooking)
117+
await tester.drag(find.text('name1, Europe'), const Offset(-1000, 0));
118+
await tester.pumpAndSettle();
119+
120+
// Existing booking should be there
121+
expect(find.text('name1, Europe'), findsOneWidget);
122+
});
105123
});
106124
}
125+
126+
class _BadFakeBookingRepository extends FakeBookingRepository {
127+
@override
128+
Future<Result<void>> delete(int id) async {
129+
return Result.error(Exception('Failed to delete booking'));
130+
}
131+
}

0 commit comments

Comments
 (0)