Add glitchtip for centralized error logging

This commit is contained in:
2026-07-30 02:32:30 +02:00
parent 498ad68e1c
commit c210f80f27
15 changed files with 416 additions and 193 deletions
+47 -11
View File
@@ -6,6 +6,7 @@ import 'package:kooltab2/views/dialogs/close_tab_dialog.dart';
import 'package:kooltab2/views/dialogs/new_tab_dialog.dart';
import 'package:kooltab2/views/widgets/product_tile.dart';
import 'package:provider/provider.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import '../models/bar_tab.dart';
@@ -53,7 +54,7 @@ class _BarScreenViewState extends State<BarScreenView> {
const SizedBox(width: 6),
IconButton(
tooltip: 'Refresh',
onPressed: viewModel.load,
onPressed: () => viewModel.load(),
icon: const Icon(Icons.refresh_rounded),
),
const SizedBox(width: 6),
@@ -127,7 +128,8 @@ class _BarScreenViewState extends State<BarScreenView> {
try {
await viewModel.addProductToSelectedTab(product);
} catch (e) {
} catch (e, stack) {
Sentry.captureException(e, stackTrace: stack);
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('$e')),
@@ -304,7 +306,7 @@ class _TabPanel extends StatefulWidget {
final ValueChanged<String> onTabSelected;
final Future<void> Function(TabItem item, int quantity) onItemQuantityChanged;
final VoidCallback onCloseTabPressed;
final ValueChanged<String> onTabClosed;
final Future<void> Function(String) onTabClosed;
const _TabPanel({
required this.tabs,
@@ -460,7 +462,7 @@ class _OpenTabsList extends StatelessWidget {
final List<BarTab> tabs;
final String? selectedTabId;
final ValueChanged<String> onTabSelected;
final ValueChanged<String> onTabClosed;
final Future<void> Function(String) onTabClosed;
const _OpenTabsList({
required this.tabs,
@@ -498,17 +500,25 @@ class _OpenTabsList extends StatelessWidget {
extentRatio: 0.6,
children: [
SlidableAction(
onPressed: (_) {
onTabSelected(tab.id);
// TODO: rename/edit tab
},
onPressed: (_) => onTabSelected(tab.id),
icon: Icons.edit_outlined,
label: 'Edit',
backgroundColor: Theme.of(context).colorScheme.secondary,
foregroundColor: Theme.of(context).colorScheme.onSecondary,
),
SlidableAction(
onPressed: (_) => onTabClosed(tab.id),
onPressed: (_) async {
try {
await onTabClosed(tab.id);
} catch (e, stack) {
Sentry.captureException(e, stackTrace: stack);
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Could not close tab: $e')),
);
}
}
},
icon: Icons.close_rounded,
label: 'Close',
backgroundColor: Theme.of(context).colorScheme.error,
@@ -723,7 +733,20 @@ class _TabItemRow extends StatelessWidget {
children: [
IconButton(
visualDensity: VisualDensity.compact,
onPressed: () => onQuantityChanged(item, item.quantity - 1),
onPressed: () async {
try {
await onQuantityChanged(item, item.quantity - 1);
} catch (e, stack) {
Sentry.captureException(e, stackTrace: stack);
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Could not update quantity: $e'),
),
);
}
}
},
icon: const Icon(Icons.remove_rounded, size: 18),
),
SizedBox(
@@ -736,7 +759,20 @@ class _TabItemRow extends StatelessWidget {
),
IconButton(
visualDensity: VisualDensity.compact,
onPressed: () => onQuantityChanged(item, item.quantity + 1),
onPressed: () async {
try {
await onQuantityChanged(item, item.quantity + 1);
} catch (e, stack) {
Sentry.captureException(e, stackTrace: stack);
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Could not update quantity: $e'),
),
);
}
}
},
icon: const Icon(Icons.add_rounded, size: 18),
),
],