diff --git a/lib/login.dart b/lib/login.dart index 5eeddfc..c974fc8 100644 --- a/lib/login.dart +++ b/lib/login.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:zenith/chats.dart'; +import 'package:zenith/rooms.dart'; import 'package:zenith/zenith_client_provider.dart'; class LoginPage extends StatefulWidget { @@ -29,7 +29,7 @@ class _LoginPageState extends State { if (!mounted) return; Navigator.pushAndRemoveUntil( context, - MaterialPageRoute(builder: (context) => const ChatsPage()), + MaterialPageRoute(builder: (context) => const RoomsPage()), (route) => false); } diff --git a/lib/main.dart b/lib/main.dart index 17755fc..2e90efb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:zenith/chats.dart'; +import 'package:zenith/rooms.dart'; import 'package:zenith/login.dart'; import 'package:provider/provider.dart'; import 'package:zenith/zenith_client_provider.dart'; @@ -66,7 +66,7 @@ class _MyHomePageState extends State { if (!savedCreds) { return const LoginPage(); } else { - return const ChatsPage(); + return const RoomsPage(); } } } diff --git a/lib/room.dart b/lib/room.dart new file mode 100644 index 0000000..61f39c5 --- /dev/null +++ b/lib/room.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class RoomPage extends StatefulWidget { + const RoomPage({super.key, required this.room}); + + final Room room; + + @override + State createState() => _RoomPageState(); +} + +class _RoomPageState extends State { + Timeline? timeline; + + void updateTimeline() async { + final newTimeline = await widget.room.getTimeline( + eventContextId: widget.room.fullyRead, onUpdate: () => setState(() {})); + setState(() { + timeline = newTimeline; + }); + } + + @override + void initState() { + super.initState(); + updateTimeline(); + widget.room.onUpdate.stream.listen((event) { + updateTimeline(); + }); + } + + @override + void dispose() { + super.dispose(); + timeline?.cancelSubscriptions(); + widget.room.onUpdate.close(); + } + + void sendMessage() {} + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Theme.of(context).colorScheme.inversePrimary, + title: Text(widget.room.getLocalizedDisplayname()), + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: timeline == null + ? [const CircularProgressIndicator()] + : [ + Expanded( + child: ListView.builder( + itemCount: timeline?.events.length, + reverse: true, + itemBuilder: (context, index) => ListTile( + title: Text(timeline! + .events[index] + .senderFromMemoryOrFallback + .displayName ?? + ""), + subtitle: Text(timeline!.events[index].body), + )), + ) + ], + )), + floatingActionButton: FloatingActionButton( + onPressed: sendMessage, + tooltip: 'Send message', + child: const Icon(Icons.send), + ), + ); + } +} diff --git a/lib/chats.dart b/lib/rooms.dart similarity index 72% rename from lib/chats.dart rename to lib/rooms.dart index 9e046b7..3ba1220 100644 --- a/lib/chats.dart +++ b/lib/rooms.dart @@ -1,53 +1,62 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:zenith/zenith_client_provider.dart'; - -class ChatsPage extends StatefulWidget { - const ChatsPage({super.key}); - - @override - State createState() => _ChatsPageState(); -} - -class _ChatsPageState extends State { - final serverController = TextEditingController(); - final usernameController = TextEditingController(); - final passwordController = TextEditingController(); - - @override - void initState() { - super.initState(); - } - - void sendMessage() {} - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - title: const Text("Zenith"), - ), - body: Padding( - padding: const EdgeInsets.all(16.0), - child: Center(child: Consumer( - builder: (context, provider, child) { - if (provider.loading) - return const CircularProgressIndicator(); - else - return ListView.builder( - itemBuilder: (context, index) => ListTile( - title: Text(provider.client.rooms[index] - .getLocalizedDisplayname()), - )); - }, - )), - ), - floatingActionButton: FloatingActionButton( - onPressed: sendMessage, - tooltip: 'Send message', - child: const Icon(Icons.send), - ), - ); - } -} +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; +import 'package:provider/provider.dart'; +import 'package:zenith/room.dart'; +import 'package:zenith/zenith_client_provider.dart'; + +class RoomsPage extends StatefulWidget { + const RoomsPage({super.key}); + + @override + State createState() => _RoomsPageState(); +} + +class _RoomsPageState extends State { + final serverController = TextEditingController(); + final usernameController = TextEditingController(); + final passwordController = TextEditingController(); + + @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"), + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Center(child: Consumer( + builder: (context, provider, child) { + if (provider.loading) + 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), + ), + ); + } +}