diff --git a/lib/core/router.dart b/lib/core/router.dart index 5f2a8d7..58f4872 100644 --- a/lib/core/router.dart +++ b/lib/core/router.dart @@ -9,7 +9,7 @@ import 'package:pyramid/features/settings/settings_page.dart'; import 'package:pyramid/layout/shell_page.dart'; final routerProvider = Provider((ref) { - final isLoggedIn = ref.watch(isLoggedInProvider); + final isLoggedIn = ref.watch(isLoggedInProvider).valueOrNull ?? false; final hasServer = ref.watch(homeserverProvider) != null; return GoRouter( diff --git a/lib/features/auth/login_notifier.dart b/lib/features/auth/login_notifier.dart index 9ad0ede..6696c71 100644 --- a/lib/features/auth/login_notifier.dart +++ b/lib/features/auth/login_notifier.dart @@ -1,5 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:matrix/matrix.dart'; +import 'package:matrix/matrix.dart' as mx; import 'package:pyramid/core/matrix_client.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -21,22 +21,22 @@ Future saveHomeserver(WidgetRef ref, String url) async { enum LoginStatus { idle, loading, error } -class LoginState { +class LoginFormState { final LoginStatus status; final String? errorMessage; - const LoginState({this.status = LoginStatus.idle, this.errorMessage}); + const LoginFormState({this.status = LoginStatus.idle, this.errorMessage}); - LoginState copyWith({LoginStatus? status, String? errorMessage}) => - LoginState( + LoginFormState copyWith({LoginStatus? status, String? errorMessage}) => + LoginFormState( status: status ?? this.status, errorMessage: errorMessage, ); } -class LoginNotifier extends StateNotifier { +class LoginNotifier extends StateNotifier { final Ref _ref; - LoginNotifier(this._ref) : super(const LoginState()); + LoginNotifier(this._ref) : super(const LoginFormState()); Future login({ required String username, @@ -68,14 +68,14 @@ class LoginNotifier extends StateNotifier { await client.checkHomeserver(serverUri); await client.login( - LoginType.mLoginPassword, - identifier: AuthenticationUserIdentifier(user: username), + mx.LoginType.mLoginPassword, + identifier: mx.AuthenticationUserIdentifier(user: username), password: password, initialDeviceDisplayName: deviceName ?? 'Pyramid', ); state = state.copyWith(status: LoginStatus.idle); - } on MatrixException catch (e) { + } on mx.MatrixException catch (e) { state = state.copyWith( status: LoginStatus.error, errorMessage: e.errorMessage, @@ -90,11 +90,14 @@ class LoginNotifier extends StateNotifier { } final loginNotifierProvider = - StateNotifierProvider((ref) { + StateNotifierProvider((ref) { return LoginNotifier(ref); }); -final isLoggedInProvider = Provider((ref) { - final client = ref.watch(matrixClientProvider).valueOrNull; - return client?.isLogged() ?? false; +final isLoggedInProvider = StreamProvider((ref) async* { + final client = await ref.watch(matrixClientProvider.future); + yield client.isLogged(); + await for (final loginState in client.onLoginStateChanged.stream) { + yield loginState == mx.LoginState.loggedIn; + } }); diff --git a/lib/features/auth/login_page.dart b/lib/features/auth/login_page.dart index c65abf1..ca10341 100644 --- a/lib/features/auth/login_page.dart +++ b/lib/features/auth/login_page.dart @@ -33,11 +33,7 @@ class _LoginPageState extends ConsumerState { password: _passCtrl.text, homeserver: homeserver, ); - - final state = ref.read(loginNotifierProvider); - if (state.status == LoginStatus.idle && mounted) { - context.go('/rooms'); - } + // Redirect erfolgt reaktiv über isLoggedInProvider → Router } @override @@ -45,6 +41,7 @@ class _LoginPageState extends ConsumerState { final theme = Theme.of(context); final loginState = ref.watch(loginNotifierProvider); final loading = loginState.status == LoginStatus.loading; + final homeserver = ref.watch(homeserverProvider) ?? 'matrix.org'; return Scaffold(