Brandon Presley
76411aa827
1. Logging in with saved credentials should just go straight to rooms page without flickering the login page 2. Rooms should be updated if an event fires for their names changing
111 lines
3.6 KiB
Dart
111 lines
3.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:matrix/matrix.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import 'package:zenith/login.dart';
|
|
import 'package:zenith/room.dart';
|
|
import 'package:zenith/zenith_client_provider.dart';
|
|
|
|
class RoomsPage extends StatefulWidget {
|
|
const RoomsPage({super.key});
|
|
|
|
@override
|
|
State<RoomsPage> createState() => _RoomsPageState();
|
|
}
|
|
|
|
class _RoomsPageState extends State<RoomsPage> {
|
|
bool loadingRooms = true;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
}
|
|
|
|
void sendMessage() {}
|
|
|
|
void viewRoom(Room room) {
|
|
Navigator.push(
|
|
context, MaterialPageRoute(builder: (context) => RoomPage(room: room)));
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
|
|
title: const Text("Zenith"),
|
|
actions: [
|
|
IconButton(
|
|
onPressed: () {
|
|
showDialog(
|
|
context: context,
|
|
builder: (context) => AlertDialog(
|
|
title: const Text("Log out?"),
|
|
actions: [
|
|
ElevatedButton(
|
|
onPressed: () {
|
|
Navigator.of(context).pop();
|
|
},
|
|
child: const Text("Cancel")),
|
|
ElevatedButton(
|
|
child: const Text("Confirm"),
|
|
onPressed: () async {
|
|
print("Logging out...");
|
|
final prefs = await SharedPreferences.getInstance();
|
|
prefs.remove("homeserver");
|
|
prefs.remove("username");
|
|
prefs.remove("password");
|
|
|
|
if (!mounted) return;
|
|
final provider = Provider.of<ZenithClientProvider>(
|
|
context,
|
|
listen: false);
|
|
await provider.client.logout();
|
|
|
|
if (!mounted) return;
|
|
Navigator.pushAndRemoveUntil(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) => const LoginPage()),
|
|
(route) => false);
|
|
},
|
|
)
|
|
],
|
|
),
|
|
);
|
|
},
|
|
icon: const Icon(Icons.logout))
|
|
],
|
|
),
|
|
body: Padding(
|
|
padding: const EdgeInsets.all(16.0),
|
|
child: Center(child: Consumer<ZenithClientProvider>(
|
|
builder: (context, provider, child) {
|
|
provider.client.onRoomState.stream.listen((event) {
|
|
setState(() {
|
|
loadingRooms = false;
|
|
});
|
|
});
|
|
|
|
if (loadingRooms)
|
|
return const CircularProgressIndicator();
|
|
else
|
|
return ListView.builder(
|
|
itemCount: provider.client.rooms.length,
|
|
itemBuilder: (context, index) => ListTile(
|
|
title: Text(provider.client.rooms[index]
|
|
.getLocalizedDisplayname()),
|
|
onTap: () => viewRoom(provider.client.rooms[index]),
|
|
));
|
|
},
|
|
)),
|
|
),
|
|
floatingActionButton: FloatingActionButton(
|
|
onPressed: sendMessage,
|
|
tooltip: 'Send message',
|
|
child: const Icon(Icons.send),
|
|
),
|
|
);
|
|
}
|
|
}
|