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
+10 -26
View File
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import '../../core/service_locator.dart';
import '../home/home_screen.dart';
import '../immich/immich_screen.dart';
import '../nostr_events/nostr_events_screen.dart';
@@ -6,11 +7,6 @@ import '../relay_management/relay_management_screen.dart';
import '../relay_management/relay_management_controller.dart';
import '../session/session_screen.dart';
import '../settings/settings_screen.dart';
import '../../data/nostr/nostr_service.dart';
import '../../data/sync/sync_engine.dart';
import '../../data/session/session_service.dart';
import '../../data/local/local_storage_service.dart';
import '../../data/firebase/firebase_service.dart';
/// Route names for the app navigation.
class AppRoutes {
@@ -86,31 +82,25 @@ class AppRouter {
switch (settings.name) {
case AppRoutes.home:
return MaterialPageRoute(
builder: (_) => HomeScreen(
localStorageService: localStorageService,
),
builder: (_) => const HomeScreen(),
settings: settings,
);
case AppRoutes.immich:
return MaterialPageRoute(
builder: (_) => ImmichScreen(
localStorageService: localStorageService,
),
builder: (_) => const ImmichScreen(),
settings: settings,
);
case AppRoutes.nostrEvents:
return MaterialPageRoute(
builder: (_) => NostrEventsScreen(
nostrService: nostrService,
syncEngine: syncEngine,
sessionService: sessionService,
),
builder: (_) => const NostrEventsScreen(),
settings: settings,
);
case AppRoutes.relayManagement:
final nostrService = ServiceLocator.instance.nostrService;
final syncEngine = ServiceLocator.instance.syncEngine;
if (nostrService == null || syncEngine == null) {
return MaterialPageRoute(
builder: (_) => _buildErrorScreen('Nostr service not available'),
@@ -120,8 +110,8 @@ class AppRouter {
return MaterialPageRoute(
builder: (_) => RelayManagementScreen(
controller: RelayManagementController(
nostrService: nostrService!,
syncEngine: syncEngine!,
nostrService: nostrService,
syncEngine: syncEngine,
),
),
settings: settings,
@@ -129,19 +119,13 @@ class AppRouter {
case AppRoutes.session:
return MaterialPageRoute(
builder: (_) => SessionScreen(
sessionService: sessionService,
firebaseService: firebaseService,
nostrService: nostrService,
),
builder: (_) => const SessionScreen(),
settings: settings,
);
case AppRoutes.settings:
return MaterialPageRoute(
builder: (_) => SettingsScreen(
firebaseService: firebaseService,
),
builder: (_) => const SettingsScreen(),
settings: settings,
);
+15 -46
View File
@@ -4,31 +4,11 @@ import '../immich/immich_screen.dart';
import '../nostr_events/nostr_events_screen.dart';
import '../session/session_screen.dart';
import '../settings/settings_screen.dart';
import '../../data/session/session_service.dart';
import '../../data/local/local_storage_service.dart';
import '../../data/nostr/nostr_service.dart';
import '../../data/sync/sync_engine.dart';
import '../../data/firebase/firebase_service.dart';
import '../../data/immich/immich_service.dart';
import '../../core/service_locator.dart';
/// Main navigation scaffold with bottom navigation bar.
class MainNavigationScaffold extends StatefulWidget {
final SessionService? sessionService;
final LocalStorageService? localStorageService;
final NostrService? nostrService;
final SyncEngine? syncEngine;
final FirebaseService? firebaseService;
final ImmichService? immichService;
const MainNavigationScaffold({
super.key,
this.sessionService,
this.localStorageService,
this.nostrService,
this.syncEngine,
this.firebaseService,
this.immichService,
});
const MainNavigationScaffold({super.key});
@override
State<MainNavigationScaffold> createState() => _MainNavigationScaffoldState();
@@ -43,7 +23,8 @@ class _MainNavigationScaffoldState extends State<MainNavigationScaffold> {
setState(() {
_currentIndex = index;
// If accessing a protected route (Immich=1, Nostr=2) while not logged in, remember it
if ((index == 1 || index == 2) && !(widget.sessionService?.isLoggedIn ?? false)) {
final sessionService = ServiceLocator.instance.sessionService;
if ((index == 1 || index == 2) && !(sessionService?.isLoggedIn ?? false)) {
_pendingProtectedRoute = index;
} else {
_pendingProtectedRoute = null;
@@ -57,7 +38,8 @@ class _MainNavigationScaffoldState extends State<MainNavigationScaffold> {
_loginStateVersion++; // Force rebuild when login state changes
// If user just logged in and was trying to access a protected route, navigate there
if (widget.sessionService?.isLoggedIn == true && _pendingProtectedRoute != null) {
final sessionService = ServiceLocator.instance.sessionService;
if (sessionService?.isLoggedIn == true && _pendingProtectedRoute != null) {
_currentIndex = _pendingProtectedRoute!;
_pendingProtectedRoute = null;
}
@@ -65,43 +47,30 @@ class _MainNavigationScaffoldState extends State<MainNavigationScaffold> {
}
Widget _buildScreen(int index) {
final locator = ServiceLocator.instance;
final sessionService = locator.sessionService;
switch (index) {
case 0:
return HomeScreen(
localStorageService: widget.localStorageService,
);
return const HomeScreen();
case 1:
// Check auth guard for Immich
if (!(widget.sessionService?.isLoggedIn ?? false)) {
if (!(sessionService?.isLoggedIn ?? false)) {
return _buildLoginRequiredScreen();
}
return ImmichScreen(
localStorageService: widget.localStorageService,
immichService: widget.immichService,
);
return const ImmichScreen();
case 2:
// Check auth guard for Nostr Events
if (!(widget.sessionService?.isLoggedIn ?? false)) {
if (!(sessionService?.isLoggedIn ?? false)) {
return _buildLoginRequiredScreen();
}
return NostrEventsScreen(
nostrService: widget.nostrService,
syncEngine: widget.syncEngine,
sessionService: widget.sessionService,
);
return const NostrEventsScreen();
case 3:
return SessionScreen(
sessionService: widget.sessionService,
firebaseService: widget.firebaseService,
nostrService: widget.nostrService,
onSessionChanged: _onSessionStateChanged,
);
case 4:
return SettingsScreen(
firebaseService: widget.firebaseService,
nostrService: widget.nostrService,
syncEngine: widget.syncEngine,
);
return const SettingsScreen();
default:
return const SizedBox();
}