import 'package:flutter/material.dart'; import 'bridge/location_bridge.dart'; class StatusScreen extends StatefulWidget { const StatusScreen({super.key}); @override State createState() => _StatusScreenState(); } class _StatusScreenState extends State { List> _logs = []; final ScrollController _scrollController = ScrollController(); @override void initState() { super.initState(); _loadLogs(); } @override void dispose() { _scrollController.dispose(); super.dispose(); } Future _loadLogs() async { final logs = await LocationBridge.getLogs(); if (mounted) { setState(() { _logs = logs.reversed.toList(); }); WidgetsBinding.instance.addPostFrameCallback((_) { if (_scrollController.hasClients) { _scrollController.jumpTo(_scrollController.position.maxScrollExtent); } }); } } String _formatTimestamp(int timestamp) { final dt = DateTime.fromMillisecondsSinceEpoch(timestamp); return '${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}:${dt.second.toString().padLeft(2, '0')}'; } Color _getLogColor(String eventType) { switch (eventType) { case 'ERROR': return Colors.red; case 'WARNING': return Colors.orange; case 'LOCATION': return Colors.green; case 'SYNC': return Colors.cyan; case 'HEARTBEAT': return Colors.yellow; case 'FILTERED': return Colors.grey; default: return Colors.white; } } Widget _buildTerminalLine(Map log) { final time = _formatTimestamp(log['timestamp'] as int? ?? 0); final type = log['eventType'] as String? ?? 'UNKNOWN'; final msg = log['message'] as String? ?? ''; final color = _getLogColor(type); return Text( '[$time] $type: $msg', style: TextStyle(fontFamily: 'monospace', fontSize: 12, color: color), ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Event Log'), actions: [IconButton(icon: Icon(Icons.refresh), onPressed: _loadLogs)], ), body: Container( color: Colors.black, child: _logs.isEmpty ? Center( child: Text( 'No logs yet. Start tracking to see logs.', style: TextStyle(color: Colors.grey), ), ) : ListView.builder( controller: _scrollController, padding: EdgeInsets.all(8), itemCount: _logs.length, itemBuilder: (context, index) { final log = _logs[index]; return _buildTerminalLine(log); }, ), ), ); } }