feat: Matrix login flow with auth guard and client provider

This commit is contained in:
Bernd Steckmeister
2026-04-19 19:56:12 +02:00
parent 062b8b6a94
commit 883d24479b
5 changed files with 307 additions and 3 deletions
+30
View File
@@ -0,0 +1,30 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:matrix/matrix.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
final matrixClientProvider = FutureProvider<Client>((ref) async {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) {
sqfliteFfiInit();
databaseFactory = databaseFactoryFfi;
}
final appDir = await getApplicationSupportDirectory();
final dbPath = p.join(appDir.path, 'pyramid.sqlite');
final db = await databaseFactoryFfi.openDatabase(dbPath);
final sdkDb = await MatrixSdkDatabase.init('pyramid', database: db);
final client = Client('Pyramid', database: sdkDb);
await client.init();
return client;
});
final secureStorageProvider = Provider<FlutterSecureStorage>((ref) {
return const FlutterSecureStorage();
});
+16 -2
View File
@@ -1,14 +1,28 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:pyramid/layout/shell_page.dart';
import 'package:pyramid/features/rooms/rooms_page.dart';
import 'package:pyramid/features/auth/login_notifier.dart';
import 'package:pyramid/features/auth/login_page.dart';
import 'package:pyramid/features/chat/chat_page.dart';
import 'package:pyramid/features/rooms/rooms_page.dart';
import 'package:pyramid/features/settings/settings_page.dart';
import 'package:pyramid/layout/shell_page.dart';
final routerProvider = Provider<GoRouter>((ref) {
final isLoggedIn = ref.watch(isLoggedInProvider);
return GoRouter(
initialLocation: '/rooms',
redirect: (context, state) {
final loggingIn = state.matchedLocation == '/login';
if (!isLoggedIn && !loggingIn) return '/login';
if (isLoggedIn && loggingIn) return '/rooms';
return null;
},
routes: [
GoRoute(
path: '/login',
builder: (context, state) => const LoginPage(),
),
ShellRoute(
builder: (context, state, child) => ShellPage(child: child),
routes: [