import 'package:flutter/material.dart'; import '../../core/service_locator.dart'; import '../../data/nostr/models/nostr_keypair.dart'; import '../../data/nostr/models/nostr_event.dart'; import '../relay_management/relay_management_screen.dart'; import '../relay_management/relay_management_controller.dart'; /// Screen for displaying and testing Nostr events. class NostrEventsScreen extends StatefulWidget { const NostrEventsScreen({super.key}); @override State createState() => _NostrEventsScreenState(); } class _NostrEventsScreenState extends State { List _events = []; bool _isLoading = false; Future _publishTestEvent() async { if (ServiceLocator.instance.nostrService == null) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Nostr service not available'), backgroundColor: Colors.red, ), ); } return; } // Check if user is logged in with Nostr final currentUser = ServiceLocator.instance.sessionService?.currentUser; if (currentUser == null || currentUser.nostrPrivateKey == null) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Please log in with Nostr (nsec key) to publish events.'), backgroundColor: Colors.orange, ), ); } return; } // Get relays final relays = ServiceLocator.instance.nostrService!.getRelays(); if (relays.isEmpty) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('No relays configured. Add relays in Relay Management.'), backgroundColor: Colors.orange, ), ); } return; } setState(() { _isLoading = true; }); try { // Reconstruct keypair from stored nsec final keyPair = NostrKeyPair.fromNsec(currentUser.nostrPrivateKey!); // Create a test event final event = NostrEvent.create( content: 'Test event from Flutter app - ${DateTime.now().toIso8601String()}', kind: 1, // Text note privateKey: keyPair.privateKey, ); // Publish to all enabled relays final results = await ServiceLocator.instance.nostrService!.publishEventToAllRelays(event); setState(() { _isLoading = false; _events.insert(0, 'Event published: ${event.id.substring(0, 8)}...'); }); final successCount = results.values.where((v) => v == true).length; final totalCount = results.length; if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Published to $successCount/$totalCount relays'), backgroundColor: successCount > 0 ? Colors.green : Colors.orange, ), ); } } catch (e) { setState(() { _isLoading = false; }); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Failed to publish: ${e.toString()}'), backgroundColor: Colors.red, ), ); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Nostr Events'), ), body: _isLoading ? const Center(child: CircularProgressIndicator()) : SingleChildScrollView( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ _buildActionsSection(), if (_events.isNotEmpty) ...[ const SizedBox(height: 24), _buildEventsSection(), ], ], ), ), ); } Widget _buildActionsSection() { return Card( child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const Text( 'Actions', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 12), ElevatedButton.icon( onPressed: _publishTestEvent, icon: const Icon(Icons.send), label: const Text('Publish Test Event'), style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 16), ), ), const SizedBox(height: 8), TextButton.icon( onPressed: () { if (ServiceLocator.instance.nostrService != null && ServiceLocator.instance.syncEngine != null) { Navigator.of(context).push( MaterialPageRoute( builder: (_) => RelayManagementScreen( controller: RelayManagementController( nostrService: ServiceLocator.instance.nostrService!, syncEngine: ServiceLocator.instance.syncEngine!, ), ), ), ); } else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Nostr service not available'), backgroundColor: Colors.red, ), ); } }, icon: const Icon(Icons.settings), label: const Text('Manage Relays'), ), ], ), ), ); } Widget _buildEventsSection() { return Card( child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Recent Events', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 12), ..._events.take(5).map((event) => Padding( padding: const EdgeInsets.only(bottom: 8), child: Text( event, style: const TextStyle(fontSize: 12), ), )), ], ), ), ); } }