mudular code ready to fork

This commit is contained in:
gitea
2025-11-08 12:54:40 +01:00
parent 5f8d8330f5
commit 8c6bf598f5
21 changed files with 288 additions and 519 deletions
+25 -29
View File
@@ -1,4 +1,6 @@
import 'package:flutter/material.dart';
import '../../core/logger.dart';
import '../../core/service_locator.dart';
import '../../data/session/session_service.dart';
import '../../data/firebase/firebase_service.dart';
import '../../data/nostr/nostr_service.dart';
@@ -6,16 +8,10 @@ import '../../data/nostr/models/nostr_keypair.dart';
/// Screen for user session management (login/logout).
class SessionScreen extends StatefulWidget {
final SessionService? sessionService;
final FirebaseService? firebaseService;
final NostrService? nostrService;
final VoidCallback? onSessionChanged;
const SessionScreen({
super.key,
this.sessionService,
this.firebaseService,
this.nostrService,
this.onSessionChanged,
});
@@ -38,8 +34,8 @@ class _SessionScreenState extends State<SessionScreen> {
void initState() {
super.initState();
// Check if Firebase Auth is available
_useFirebaseAuth = widget.firebaseService?.isEnabled == true &&
widget.firebaseService?.config.authEnabled == true;
_useFirebaseAuth = ServiceLocator.instance.firebaseService?.isEnabled == true &&
ServiceLocator.instance.firebaseService?.config.authEnabled == true;
}
@override
@@ -53,7 +49,7 @@ class _SessionScreenState extends State<SessionScreen> {
}
Future<void> _handleLogin() async {
if (widget.sessionService == null) return;
if (ServiceLocator.instance.sessionService == null) return;
setState(() {
_isLoading = true;
@@ -89,7 +85,7 @@ class _SessionScreenState extends State<SessionScreen> {
}
// Login with Nostr
await widget.sessionService!.loginWithNostr(nostrKey);
await ServiceLocator.instance.sessionService!.loginWithNostr(nostrKey);
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
@@ -104,7 +100,7 @@ class _SessionScreenState extends State<SessionScreen> {
}
// Handle Firebase or regular login
if (_useFirebaseAuth && widget.firebaseService != null) {
if (_useFirebaseAuth && ServiceLocator.instance.firebaseService != null) {
// Use Firebase Auth for authentication
final email = _emailController.text.trim();
final password = _passwordController.text.trim();
@@ -121,13 +117,13 @@ class _SessionScreenState extends State<SessionScreen> {
}
// Authenticate with Firebase
final firebaseUser = await widget.firebaseService!.loginWithEmailPassword(
final firebaseUser = await ServiceLocator.instance.firebaseService!.loginWithEmailPassword(
email: email,
password: password,
);
// Create session with Firebase user info
await widget.sessionService!.login(
await ServiceLocator.instance.sessionService!.login(
id: firebaseUser.uid,
username: firebaseUser.email?.split('@').first ?? firebaseUser.uid,
token: await firebaseUser.getIdToken(),
@@ -183,7 +179,7 @@ class _SessionScreenState extends State<SessionScreen> {
}
// Create session (demo mode - no real authentication)
await widget.sessionService!.login(
await ServiceLocator.instance.sessionService!.login(
id: userId,
username: username,
);
@@ -204,7 +200,7 @@ class _SessionScreenState extends State<SessionScreen> {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Login failed: ${e.toString().replaceAll('FirebaseException: ', '').replaceAll('SessionException: ', '')}'),
content: Text('Login failed: ${e.toString().replaceAll('FirebaseServiceException: ', '').replaceAll('SessionException: ', '')}'),
backgroundColor: Colors.red,
),
);
@@ -219,7 +215,7 @@ class _SessionScreenState extends State<SessionScreen> {
}
Future<void> _handleLogout() async {
if (widget.sessionService == null) return;
if (ServiceLocator.instance.sessionService == null) return;
setState(() {
_isLoading = true;
@@ -227,15 +223,15 @@ class _SessionScreenState extends State<SessionScreen> {
try {
// Logout from session service first
await widget.sessionService!.logout();
await ServiceLocator.instance.sessionService!.logout();
// Also logout from Firebase Auth if enabled
if (_useFirebaseAuth && widget.firebaseService != null) {
if (_useFirebaseAuth && ServiceLocator.instance.firebaseService != null) {
try {
await widget.firebaseService!.logout();
await ServiceLocator.instance.firebaseService!.logout();
} catch (e) {
// Log error but don't fail logout - session is already cleared
debugPrint('Warning: Firebase logout failed: $e');
Logger.warning('Firebase logout failed: $e');
}
}
@@ -268,10 +264,10 @@ class _SessionScreenState extends State<SessionScreen> {
}
Future<void> _handleRefresh() async {
if (widget.sessionService == null) return;
if (ServiceLocator.instance.sessionService == null) return;
try {
await widget.sessionService!.refreshNostrProfile();
await ServiceLocator.instance.sessionService!.refreshNostrProfile();
if (mounted) {
setState(() {});
ScaffoldMessenger.of(context).showSnackBar(
@@ -296,8 +292,8 @@ class _SessionScreenState extends State<SessionScreen> {
@override
Widget build(BuildContext context) {
final isLoggedIn = widget.sessionService?.isLoggedIn ?? false;
final currentUser = widget.sessionService?.currentUser;
final isLoggedIn = ServiceLocator.instance.sessionService?.isLoggedIn ?? false;
final currentUser = ServiceLocator.instance.sessionService?.currentUser;
return Scaffold(
appBar: AppBar(
@@ -389,7 +385,7 @@ class _SessionScreenState extends State<SessionScreen> {
_Nip05Section(
nip05: currentUser.nostrProfile!.nip05!,
publicKey: currentUser.id,
nostrService: widget.nostrService,
nostrService: ServiceLocator.instance.nostrService,
),
if (currentUser.nostrProfile?.nip05 != null &&
currentUser.nostrProfile!.nip05!.isNotEmpty)
@@ -476,7 +472,7 @@ class _SessionScreenState extends State<SessionScreen> {
const SizedBox(height: 24),
if (_useNostrLogin) ...[
// Key pair generation section
if (widget.nostrService != null) ...[
if (ServiceLocator.instance.nostrService != null) ...[
Card(
child: Padding(
padding: const EdgeInsets.all(16),
@@ -496,7 +492,7 @@ class _SessionScreenState extends State<SessionScreen> {
ElevatedButton.icon(
onPressed: () {
setState(() {
_generatedKeyPair = widget.nostrService!.generateKeyPair();
_generatedKeyPair = ServiceLocator.instance.nostrService!.generateKeyPair();
});
},
icon: const Icon(Icons.refresh, size: 18),
@@ -691,7 +687,7 @@ class _Nip05SectionState extends State<_Nip05Section> {
}
Future<void> _loadPreferredRelays() async {
if (widget.nostrService == null) {
if (ServiceLocator.instance.nostrService == null) {
setState(() {
_error = 'Nostr service not available';
});
@@ -704,7 +700,7 @@ class _Nip05SectionState extends State<_Nip05Section> {
});
try {
final relays = await widget.nostrService!.fetchPreferredRelaysFromNip05(
final relays = await ServiceLocator.instance.nostrService!.fetchPreferredRelaysFromNip05(
widget.nip05,
widget.publicKey,
);