mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-07 13:38:13 -08:00
123 lines
5.2 KiB
Dart
123 lines
5.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import 'package:fladder/models/error_log_model.dart';
|
|
import 'package:fladder/providers/crash_log_provider.dart';
|
|
import 'package:fladder/util/clipboard_helper.dart';
|
|
import 'package:fladder/util/list_padding.dart';
|
|
import 'package:fladder/util/localization_helper.dart';
|
|
import 'package:fladder/util/string_extensions.dart';
|
|
import 'package:fladder/widgets/shared/enum_selection.dart';
|
|
import 'package:fladder/widgets/shared/item_actions.dart';
|
|
|
|
final _selectedWarningProvider = StateProvider<ErrorType?>((ref) => null);
|
|
|
|
class CrashScreen extends ConsumerWidget {
|
|
const CrashScreen({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final provider = ref.read(crashLogProvider.notifier);
|
|
final selectedType = ref.watch(_selectedWarningProvider);
|
|
final crashLogs =
|
|
ref.watch(crashLogProvider).where((value) => selectedType == null ? true : value.type == selectedType);
|
|
return Dialog.fullscreen(
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(16.0),
|
|
child: Column(
|
|
children: [
|
|
Row(
|
|
spacing: 8,
|
|
children: [
|
|
Text(
|
|
"Error logs",
|
|
style: Theme.of(context).textTheme.titleLarge,
|
|
),
|
|
const Spacer(),
|
|
ElevatedButton(
|
|
onPressed: provider.clearLogs,
|
|
child: Text(context.localized.clear),
|
|
),
|
|
EnumBox(
|
|
current: selectedType == null ? context.localized.all : selectedType.name.capitalize(),
|
|
itemBuilder: (context) => [
|
|
ItemActionButton(
|
|
label: Text(context.localized.all),
|
|
action: () => ref.read(_selectedWarningProvider.notifier).update((state) => null),
|
|
),
|
|
...ErrorType.values.map(
|
|
(entry) => ItemActionButton(
|
|
label: Text(entry.name.capitalize()),
|
|
action: () => ref.read(_selectedWarningProvider.notifier).update((state) => entry),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
const CloseButton(),
|
|
],
|
|
),
|
|
const Divider(),
|
|
if (crashLogs.isNotEmpty)
|
|
Flexible(
|
|
child: Card(
|
|
child: ListView(
|
|
padding: const EdgeInsets.all(16),
|
|
shrinkWrap: true,
|
|
children: crashLogs
|
|
.map(
|
|
(e) => Column(
|
|
mainAxisSize: MainAxisSize.max,
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
children: [
|
|
Card(
|
|
color: e.color.withValues(alpha: 0.1),
|
|
margin: const EdgeInsets.symmetric(vertical: 12),
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.max,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
children: [
|
|
Expanded(
|
|
child: Card(
|
|
color: e.color.withValues(alpha: 0.2),
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(4.0),
|
|
child: Text(
|
|
e.label,
|
|
style:
|
|
Theme.of(context).textTheme.titleLarge?.copyWith(color: e.color),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
IconButton(
|
|
onPressed: () => context.copyToClipboard(e.clipBoard),
|
|
icon: const Icon(Icons.copy_all_rounded),
|
|
),
|
|
],
|
|
),
|
|
Text(e.content),
|
|
].addInBetween(const SizedBox(height: 16)),
|
|
),
|
|
),
|
|
),
|
|
const Divider(),
|
|
],
|
|
),
|
|
)
|
|
.toList(),
|
|
),
|
|
),
|
|
)
|
|
else
|
|
const Text("No crash-logs")
|
|
].addInBetween(const SizedBox(height: 12)),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|