fix: StreamProvider for login state, rename LoginState to avoid matrix SDK conflict
This commit is contained in:
@@ -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<void> 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<LoginState> {
|
||||
class LoginNotifier extends StateNotifier<LoginFormState> {
|
||||
final Ref _ref;
|
||||
LoginNotifier(this._ref) : super(const LoginState());
|
||||
LoginNotifier(this._ref) : super(const LoginFormState());
|
||||
|
||||
Future<void> login({
|
||||
required String username,
|
||||
@@ -68,14 +68,14 @@ class LoginNotifier extends StateNotifier<LoginState> {
|
||||
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<LoginState> {
|
||||
}
|
||||
|
||||
final loginNotifierProvider =
|
||||
StateNotifierProvider<LoginNotifier, LoginState>((ref) {
|
||||
StateNotifierProvider<LoginNotifier, LoginFormState>((ref) {
|
||||
return LoginNotifier(ref);
|
||||
});
|
||||
|
||||
final isLoggedInProvider = Provider<bool>((ref) {
|
||||
final client = ref.watch(matrixClientProvider).valueOrNull;
|
||||
return client?.isLogged() ?? false;
|
||||
final isLoggedInProvider = StreamProvider<bool>((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;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -33,11 +33,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
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<LoginPage> {
|
||||
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(
|
||||
|
||||
Reference in New Issue
Block a user