feat: type stats and event log models
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import '../app/load_state.dart';
|
||||
import '../models/event_log_item.dart';
|
||||
import '../providers/providers.dart';
|
||||
import '../widgets/load_error_view.dart';
|
||||
|
||||
@@ -52,8 +53,8 @@ class _EventLogScreenState extends ConsumerState<EventLogScreen> {
|
||||
}
|
||||
|
||||
Widget _buildContent(
|
||||
LoadState<List<dynamic>> eventsState,
|
||||
List<dynamic> events,
|
||||
LoadState<List<EventLogItem>> eventsState,
|
||||
List<EventLogItem> events,
|
||||
) {
|
||||
if ((eventsState.isIdle || eventsState.isLoading) && events.isEmpty) {
|
||||
return const Center(
|
||||
@@ -103,10 +104,7 @@ class _EventLogScreenState extends ConsumerState<EventLogScreen> {
|
||||
}
|
||||
|
||||
final eventIndex = index - statusHeaderCount;
|
||||
final event = events[eventIndex];
|
||||
return _EventRow(
|
||||
event: event is Map ? Map<String, dynamic>.from(event) : {},
|
||||
);
|
||||
return _EventRow(event: events[eventIndex]);
|
||||
},
|
||||
),
|
||||
);
|
||||
@@ -114,22 +112,12 @@ class _EventLogScreenState extends ConsumerState<EventLogScreen> {
|
||||
}
|
||||
|
||||
class _EventRow extends StatelessWidget {
|
||||
final Map<String, dynamic> event;
|
||||
final EventLogItem event;
|
||||
|
||||
const _EventRow({required this.event});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final timestamp =
|
||||
event['timestamp'] ?? event['time'] ?? event['created_at'] ?? '';
|
||||
final action = event['action'] ?? event['command'] ?? event['type'] ?? '';
|
||||
final targetId =
|
||||
event['target_id'] ?? event['target'] ?? event['group_id'] ?? '';
|
||||
final params = event['params'] ?? event['details'] ?? '';
|
||||
final actor = event['actor'] ?? event['user'] ?? event['key_name'] ?? '';
|
||||
|
||||
final formattedTime = _formatTime(timestamp.toString());
|
||||
|
||||
return Card(
|
||||
margin: const EdgeInsets.only(bottom: 4),
|
||||
child: Padding(
|
||||
@@ -141,7 +129,7 @@ class _EventRow extends StatelessWidget {
|
||||
SizedBox(
|
||||
width: 80,
|
||||
child: Text(
|
||||
formattedTime,
|
||||
event.formattedTime,
|
||||
style: const TextStyle(
|
||||
fontSize: 11,
|
||||
color: Colors.white38,
|
||||
@@ -156,15 +144,15 @@ class _EventRow extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'$action - $targetId',
|
||||
event.title,
|
||||
style: const TextStyle(
|
||||
fontSize: 13,
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
if (params.toString().isNotEmpty)
|
||||
if (event.paramsText.isNotEmpty)
|
||||
Text(
|
||||
params.toString(),
|
||||
event.paramsText,
|
||||
style: const TextStyle(
|
||||
fontSize: 11,
|
||||
color: Colors.white38,
|
||||
@@ -172,9 +160,9 @@ class _EventRow extends StatelessWidget {
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
if (actor.toString().isNotEmpty)
|
||||
if (event.actor.isNotEmpty)
|
||||
Text(
|
||||
actor.toString(),
|
||||
event.actor,
|
||||
style: const TextStyle(
|
||||
fontSize: 10,
|
||||
color: Colors.white24,
|
||||
@@ -188,15 +176,4 @@ class _EventRow extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
String _formatTime(String iso) {
|
||||
if (iso.isEmpty) return '';
|
||||
try {
|
||||
final d = DateTime.parse(iso);
|
||||
String pad(int n) => n.toString().padLeft(2, '0');
|
||||
return '${pad(d.day)}.${pad(d.month)} ${pad(d.hour)}:${pad(d.minute)}:${pad(d.second)}';
|
||||
} catch (_) {
|
||||
return iso;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user