conditionally show room avatar in header
This commit is contained in:
parent
d272c20e19
commit
f0a397f576
7 changed files with 110 additions and 95 deletions
|
|
@ -1,3 +1,4 @@
|
||||||
|
import "package:flutter/material.dart";
|
||||||
import "package:flutter/widgets.dart";
|
import "package:flutter/widgets.dart";
|
||||||
import "package:flutter_chat_core/flutter_chat_core.dart";
|
import "package:flutter_chat_core/flutter_chat_core.dart";
|
||||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||||
|
|
@ -118,3 +119,9 @@ extension ToMessage on Event {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension ToTheme on ColorScheme {
|
||||||
|
ThemeData get theme => ThemeData.from(
|
||||||
|
colorScheme: this,
|
||||||
|
).copyWith(appBarTheme: AppBarTheme(titleSpacing: 0));
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||||
|
import "package:nexus/helpers/extension_helper.dart";
|
||||||
import "package:nexus/widgets/room_chat.dart";
|
import "package:nexus/widgets/room_chat.dart";
|
||||||
import "package:nexus/widgets/sidebar.dart";
|
import "package:nexus/widgets/sidebar.dart";
|
||||||
import "package:scaled_app/scaled_app.dart";
|
import "package:scaled_app/scaled_app.dart";
|
||||||
|
|
@ -31,18 +32,16 @@ class App extends StatelessWidget {
|
||||||
|
|
||||||
return MaterialApp(
|
return MaterialApp(
|
||||||
debugShowCheckedModeBanner: false,
|
debugShowCheckedModeBanner: false,
|
||||||
theme: ThemeData.from(
|
theme:
|
||||||
colorScheme:
|
(lightDynamic ?? ColorScheme.fromSeed(seedColor: Colors.indigo))
|
||||||
lightDynamic ?? ColorScheme.fromSeed(seedColor: Colors.indigo),
|
.theme,
|
||||||
),
|
darkTheme:
|
||||||
darkTheme: ThemeData.from(
|
(darkDynamic ??
|
||||||
colorScheme:
|
|
||||||
darkDynamic ??
|
|
||||||
ColorScheme.fromSeed(
|
ColorScheme.fromSeed(
|
||||||
seedColor: Colors.indigo,
|
seedColor: Colors.indigo,
|
||||||
brightness: Brightness.dark,
|
brightness: Brightness.dark,
|
||||||
),
|
))
|
||||||
),
|
.theme,
|
||||||
home: Scaffold(
|
home: Scaffold(
|
||||||
body: Builder(
|
body: Builder(
|
||||||
builder: (context) => Row(
|
builder: (context) => Row(
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ class AvatarOrHash extends StatelessWidget {
|
||||||
borderRadius: BorderRadius.all(Radius.circular(4)),
|
borderRadius: BorderRadius.all(Radius.circular(4)),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
height: height,
|
height: height,
|
||||||
|
width: height,
|
||||||
child: avatar == null
|
child: avatar == null
|
||||||
? fallback ?? box
|
? fallback ?? box
|
||||||
: Image.network(
|
: Image.network(
|
||||||
|
|
|
||||||
|
|
@ -11,15 +11,29 @@ class MemberList extends ConsumerWidget {
|
||||||
const MemberList(this.room, {super.key});
|
const MemberList(this.room, {super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) => ColoredBox(
|
Widget build(BuildContext context, WidgetRef ref) => Drawer(
|
||||||
color: Theme.of(context).colorScheme.surfaceContainerLow,
|
shape: Border(),
|
||||||
child: SizedBox(
|
|
||||||
width: 240,
|
|
||||||
child: ref
|
child: ref
|
||||||
.watch(MembersController.provider(room))
|
.watch(MembersController.provider(room))
|
||||||
.betterWhen(
|
.betterWhen(
|
||||||
data: (members) => ListView(
|
data: (members) => ListView(
|
||||||
children: [
|
children: [
|
||||||
|
AppBar(
|
||||||
|
scrolledUnderElevation: 0,
|
||||||
|
backgroundColor: Theme.of(
|
||||||
|
context,
|
||||||
|
).colorScheme.surfaceContainerLow,
|
||||||
|
leading: Icon(Icons.people),
|
||||||
|
title: Text("Members"),
|
||||||
|
actionsPadding: EdgeInsets.only(right: 4),
|
||||||
|
actions: [
|
||||||
|
if (Scaffold.of(context).hasEndDrawer)
|
||||||
|
IconButton(
|
||||||
|
onPressed: Scaffold.of(context).closeEndDrawer,
|
||||||
|
icon: Icon(Icons.close),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
...members
|
...members
|
||||||
.where(
|
.where(
|
||||||
(membership) =>
|
(membership) =>
|
||||||
|
|
@ -48,6 +62,5 @@ class MemberList extends ConsumerWidget {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ import "package:nexus/widgets/avatar_or_hash.dart";
|
||||||
class RoomAppbar extends StatelessWidget implements PreferredSizeWidget {
|
class RoomAppbar extends StatelessWidget implements PreferredSizeWidget {
|
||||||
final bool isDesktop;
|
final bool isDesktop;
|
||||||
final FullRoom room;
|
final FullRoom room;
|
||||||
final VoidCallback onOpenMemberList;
|
final void Function(BuildContext context) onOpenMemberList;
|
||||||
final VoidCallback onOpenDrawer;
|
final void Function(BuildContext context) onOpenDrawer;
|
||||||
const RoomAppbar(
|
const RoomAppbar(
|
||||||
this.room, {
|
this.room, {
|
||||||
required this.isDesktop,
|
required this.isDesktop,
|
||||||
|
|
@ -23,24 +23,22 @@ class RoomAppbar extends StatelessWidget implements PreferredSizeWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
AppBar build(BuildContext context) => AppBar(
|
AppBar build(BuildContext context) => AppBar(
|
||||||
leading: isDesktop ? null : DrawerButton(onPressed: onOpenDrawer),
|
leading: isDesktop
|
||||||
actionsPadding: EdgeInsets.symmetric(horizontal: 8),
|
? AvatarOrHash(
|
||||||
title: Row(
|
|
||||||
children: [
|
|
||||||
AvatarOrHash(
|
|
||||||
room.avatar,
|
room.avatar,
|
||||||
room.title,
|
room.title,
|
||||||
height: 32,
|
height: 32,
|
||||||
fallback: Icon(Icons.numbers),
|
fallback: Icon(Icons.numbers),
|
||||||
headers: room.roomData.client.headers,
|
headers: room.roomData.client.headers,
|
||||||
),
|
)
|
||||||
SizedBox(width: 12),
|
: DrawerButton(onPressed: () => onOpenDrawer(context)),
|
||||||
Expanded(
|
scrolledUnderElevation: 0,
|
||||||
child: Column(
|
backgroundColor: Theme.of(context).colorScheme.surfaceContainerLow,
|
||||||
|
actionsPadding: EdgeInsets.symmetric(horizontal: 8),
|
||||||
|
title: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(room.title, overflow: TextOverflow.ellipsis),
|
Text(room.title, overflow: TextOverflow.ellipsis),
|
||||||
|
|
||||||
Text(
|
Text(
|
||||||
room.roomData.topic,
|
room.roomData.topic,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
|
|
@ -51,11 +49,11 @@ class RoomAppbar extends StatelessWidget implements PreferredSizeWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(onPressed: onOpenMemberList, icon: Icon(Icons.people)),
|
IconButton(
|
||||||
|
onPressed: () => onOpenMemberList(context),
|
||||||
|
icon: Icon(Icons.people),
|
||||||
|
),
|
||||||
if (!(Platform.isAndroid || Platform.isIOS))
|
if (!(Platform.isAndroid || Platform.isIOS))
|
||||||
IconButton(onPressed: () => exit(0), icon: Icon(Icons.close)),
|
IconButton(onPressed: () => exit(0), icon: Icon(Icons.close)),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -58,9 +58,11 @@ class RoomChat extends HookConsumerWidget {
|
||||||
appBar: RoomAppbar(
|
appBar: RoomAppbar(
|
||||||
room,
|
room,
|
||||||
isDesktop: isDesktop,
|
isDesktop: isDesktop,
|
||||||
onOpenDrawer: Scaffold.of(context).openDrawer,
|
onOpenDrawer: (_) => Scaffold.of(context).openDrawer(),
|
||||||
onOpenMemberList: () =>
|
onOpenMemberList: (thisContext) {
|
||||||
memberListOpened.value = !memberListOpened.value,
|
memberListOpened.value = !memberListOpened.value;
|
||||||
|
Scaffold.of(thisContext).openEndDrawer();
|
||||||
|
},
|
||||||
),
|
),
|
||||||
body: Row(
|
body: Row(
|
||||||
children: [
|
children: [
|
||||||
|
|
@ -245,9 +247,11 @@ class RoomChat extends HookConsumerWidget {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
if (memberListOpened.value == true) MemberList(room.roomData),
|
if (memberListOpened.value == true && isDesktop)
|
||||||
|
MemberList(room.roomData),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
endDrawer: isDesktop ? null : MemberList(room.roomData),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -61,23 +61,16 @@ class Sidebar extends HookConsumerWidget {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Row(
|
leading: AvatarOrHash(
|
||||||
children: [
|
|
||||||
AvatarOrHash(
|
|
||||||
space.avatar,
|
space.avatar,
|
||||||
fallback: space.icon,
|
fallback: space.icon,
|
||||||
space.title,
|
space.title,
|
||||||
headers: space.client.headers,
|
headers: space.client.headers,
|
||||||
),
|
),
|
||||||
SizedBox(width: 12),
|
title: Text(
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
space.title,
|
space.title,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
),
|
),
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
),
|
),
|
||||||
body: NavigationRail(
|
body: NavigationRail(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue