minor fixes

This commit is contained in:
Salvatore Giordano
2020-11-18 10:49:35 +01:00
parent 0d7bf98a5b
commit d379de9f96
7 changed files with 471 additions and 393 deletions
+1 -1
View File
@@ -1 +1 @@
bb5f9103d9045cd6244bcae1f5f343e5 c3e639ccf9b069e37a7d1345194e6b99
+105 -102
View File
@@ -94,127 +94,130 @@ class ChooseUserPage extends StatelessWidget {
), ),
), ),
Expanded( Expanded(
child: ListView.separated( child: Padding(
separatorBuilder: (context, i) { padding: const EdgeInsets.only(top: 32),
return Container( child: ListView.separated(
width: double.infinity, separatorBuilder: (context, i) {
color: Colors.black12, return Container(
height: 1, width: double.infinity,
); color: Colors.black12,
}, height: 1,
itemCount: users.length + 1, );
itemBuilder: (context, i) { },
return [ itemCount: users.length + 1,
...users.entries.map((entry) { itemBuilder: (context, i) {
final token = entry.key; return [
final user = entry.value; ...users.entries.map((entry) {
return ListTile( final token = entry.key;
onTap: () async { final user = entry.value;
showDialog( return ListTile(
barrierDismissible: false, onTap: () async {
context: context, showDialog(
builder: (context) => Center( barrierDismissible: false,
child: Container( context: context,
decoration: BoxDecoration( builder: (context) => Center(
borderRadius: BorderRadius.circular(16), child: Container(
color: Colors.white, decoration: BoxDecoration(
), borderRadius: BorderRadius.circular(16),
height: 100, color: Colors.white,
width: 100, ),
child: Center( height: 100,
child: CircularProgressIndicator(), width: 100,
child: Center(
child: CircularProgressIndicator(),
),
), ),
), ),
);
final secureStorage = FlutterSecureStorage();
final client = StreamChat.of(context).client;
await client.setUser(
user,
token,
);
secureStorage.write(
key: kStreamApiKey,
value: kDefaultStreamApiKey,
);
secureStorage.write(
key: kStreamUserId,
value: user.id,
);
secureStorage.write(
key: kStreamToken,
value: token,
);
if (!kIsWeb) {
initNotifications(client);
}
Navigator.pop(context);
await Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) {
return StreamChat(
client: client,
child: ChannelListPage(),
);
},
),
);
},
leading: UserAvatar(
user: user,
constraints: BoxConstraints.tight(
Size.fromRadius(20),
), ),
); ),
title: Text(
final secureStorage = FlutterSecureStorage(); user.name,
final client = StreamChat.of(context).client; style: TextStyle(fontWeight: FontWeight.bold),
),
await client.setUser( subtitle: Text('Stream test account'),
user, trailing: SvgPicture.asset(
token, 'assets/icon_arrow_right.svg',
); height: 24,
width: 24,
secureStorage.write( ),
key: kStreamApiKey, );
value: kDefaultStreamApiKey, }),
); ListTile(
secureStorage.write( onTap: () {
key: kStreamUserId, Navigator.push(
value: user.id,
);
secureStorage.write(
key: kStreamToken,
value: token,
);
if (!kIsWeb) {
initNotifications(client);
}
Navigator.pop(context);
await Navigator.pushReplacement(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (context) { builder: (context) => AdvancedOptionsPage(),
return StreamChat(
client: client,
child: ChannelListPage(),
);
},
), ),
); );
}, },
leading: UserAvatar( leading: CircleAvatar(
user: user, child: Icon(
constraints: BoxConstraints.tight( StreamIcons.settings,
Size.fromRadius(20), color: Colors.black,
), ),
backgroundColor:
StreamChatTheme.of(context).secondaryColor,
), ),
title: Text( title: Text(
user.name, 'Advanced Options',
style: TextStyle(fontWeight: FontWeight.bold), style: TextStyle(fontWeight: FontWeight.bold),
), ),
subtitle: Text('Stream test account'), subtitle: Text('Custom settings'),
trailing: SvgPicture.asset( trailing: SvgPicture.asset(
'assets/icon_arrow_right.svg', 'assets/icon_arrow_right.svg',
height: 24, height: 24,
width: 24, width: 24,
clipBehavior: Clip.none,
), ),
);
}),
ListTile(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AdvancedOptionsPage(),
),
);
},
leading: CircleAvatar(
child: Icon(
StreamIcons.settings,
color: Colors.black,
),
backgroundColor:
StreamChatTheme.of(context).secondaryColor,
), ),
title: Text( ][i];
'Advanced Options', },
style: TextStyle(fontWeight: FontWeight.bold), ),
),
subtitle: Text('Custom settings'),
trailing: SvgPicture.asset(
'assets/icon_arrow_right.svg',
height: 24,
width: 24,
clipBehavior: Clip.none,
),
),
][i];
},
), ),
), ),
StreamVersion(), StreamVersion(),
+101 -84
View File
@@ -21,7 +21,7 @@ void main() async {
logLevel: Level.INFO, logLevel: Level.INFO,
showLocalNotification: showLocalNotification:
(!kIsWeb && Platform.isAndroid) ? showLocalNotification : null, (!kIsWeb && Platform.isAndroid) ? showLocalNotification : null,
persistenceEnabled: false, persistenceEnabled: true,
); );
if (userId != null) { if (userId != null) {
@@ -43,6 +43,7 @@ class MyApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData.light(), theme: ThemeData.light(),
darkTheme: ThemeData.dark(), darkTheme: ThemeData.dark(),
//TODO change to system once dark theme is implemented //TODO change to system once dark theme is implemented
@@ -63,89 +64,9 @@ class ChannelListPage extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final user = StreamChat.of(context).user; final user = StreamChat.of(context).user;
return Scaffold( return Scaffold(
drawer: Drawer( drawerEnableOpenDragGesture: true,
child: SafeArea( drawerEdgeDragWidth: 50,
child: Padding( drawer: _buildDrawer(context, user),
padding: EdgeInsets.only(
top: MediaQuery.of(context).viewPadding.top + 8,
),
child: Column(
children: [
Padding(
padding: const EdgeInsets.only(
bottom: 20.0,
left: 8,
),
child: Row(
children: [
UserAvatar(
user: user,
showOnlineStatus: false,
constraints: BoxConstraints.tight(Size.fromRadius(20)),
),
Padding(
padding: const EdgeInsets.only(left: 16.0),
child: Text(
user.name,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
),
],
),
),
ListTile(
leading: Icon(StreamIcons.edit),
title: Text(
'New direct message',
style: TextStyle(
fontSize: 14.5,
),
),
),
ListTile(
leading: Icon(StreamIcons.group),
title: Text(
'New group',
style: TextStyle(
fontSize: 14.5,
),
),
),
Expanded(
child: Container(
alignment: Alignment.bottomCenter,
child: ListTile(
onTap: () async {
await StreamChat.of(context).client.disconnect();
final secureStorage = FlutterSecureStorage();
await secureStorage.deleteAll();
Navigator.pop(context);
await Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => ChooseUserPage(),
),
);
},
leading: Icon(StreamIcons.user),
title: Text(
'Sign out',
style: TextStyle(
fontSize: 14.5,
),
),
),
),
),
],
),
),
),
),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
child: Icon(Icons.add), child: Icon(Icons.add),
onPressed: () { onPressed: () {
@@ -156,6 +77,11 @@ class ChannelListPage extends StatelessWidget {
), ),
body: ChannelsBloc( body: ChannelsBloc(
child: ChannelListView( child: ChannelListView(
onStartChatPressed: () {
Navigator.of(context).push(MaterialPageRoute(builder: (context) {
return CreateChannelPage();
}));
},
swipeToAction: true, swipeToAction: true,
filter: { filter: {
'members': { 'members': {
@@ -174,6 +100,92 @@ class ChannelListPage extends StatelessWidget {
), ),
); );
} }
Drawer _buildDrawer(BuildContext context, User user) {
return Drawer(
child: SafeArea(
child: Padding(
padding: EdgeInsets.only(
top: MediaQuery.of(context).viewPadding.top + 8,
),
child: Column(
children: [
Padding(
padding: const EdgeInsets.only(
bottom: 20.0,
left: 8,
),
child: Row(
children: [
UserAvatar(
user: user,
showOnlineStatus: false,
constraints: BoxConstraints.tight(Size.fromRadius(20)),
),
Padding(
padding: const EdgeInsets.only(left: 16.0),
child: Text(
user.name,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
),
],
),
),
ListTile(
leading: Icon(StreamIcons.edit),
title: Text(
'New direct message',
style: TextStyle(
fontSize: 14.5,
),
),
),
ListTile(
leading: Icon(StreamIcons.group),
title: Text(
'New group',
style: TextStyle(
fontSize: 14.5,
),
),
),
Expanded(
child: Container(
alignment: Alignment.bottomCenter,
child: ListTile(
onTap: () async {
await StreamChat.of(context).client.disconnect();
final secureStorage = FlutterSecureStorage();
await secureStorage.deleteAll();
Navigator.pop(context);
await Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => ChooseUserPage(),
),
);
},
leading: Icon(StreamIcons.user),
title: Text(
'Sign out',
style: TextStyle(
fontSize: 14.5,
),
),
),
),
),
],
),
),
),
);
}
} }
class ChannelPage extends StatelessWidget { class ChannelPage extends StatelessWidget {
@@ -418,6 +430,11 @@ class _CreateChannelPageState extends State<CreateChannelPage> {
limit: 25, limit: 25,
offset: offset, offset: offset,
), ),
filter: {
'id': {
r'$ne': client.state.user.id,
}
},
sort: [ sort: [
SortOption( SortOption(
'name', 'name',
+1 -1
View File
@@ -1,6 +1,6 @@
name: example name: example
description: A new Flutter project. description: A new Flutter project.
version: 1.0.60+62 version: 1.0.62+64
environment: environment:
sdk: ">=2.2.2 <3.0.0" sdk: ">=2.2.2 <3.0.0"
+74 -12
View File
@@ -70,6 +70,7 @@ class ChannelListView extends StatefulWidget {
this.errorBuilder, this.errorBuilder,
this.emptyBuilder, this.emptyBuilder,
this.onImageTap, this.onImageTap,
this.onStartChatPressed,
this.swipeToAction = false, this.swipeToAction = false,
this.pullToRefresh = true, this.pullToRefresh = true,
}) : super(key: key); }) : super(key: key);
@@ -129,6 +130,9 @@ class ChannelListView extends StatefulWidget {
/// Set it to false to disable the pull-to-refresh widget /// Set it to false to disable the pull-to-refresh widget
final bool pullToRefresh; final bool pullToRefresh;
/// Callback used in the default empty list widget
final VoidCallback onStartChatPressed;
@override @override
_ChannelListViewState createState() => _ChannelListViewState(); _ChannelListViewState createState() => _ChannelListViewState();
} }
@@ -185,13 +189,69 @@ class _ChannelListViewState extends State<ChannelListView>
builder: (context, viewportConstraints) { builder: (context, viewportConstraints) {
return SingleChildScrollView( return SingleChildScrollView(
physics: AlwaysScrollableScrollPhysics(), physics: AlwaysScrollableScrollPhysics(),
child: ConstrainedBox( child: Stack(
constraints: BoxConstraints( children: [
minHeight: viewportConstraints.maxHeight, ConstrainedBox(
), constraints: BoxConstraints(
child: Center( minHeight: viewportConstraints.maxHeight,
child: Text('You have no channels currently'), ),
), child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Icon(
StreamIcons.message,
size: 136,
color: Color(0xffDBDBDB),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'Lets start chatting!',
style: TextStyle(
fontSize: 16,
),
),
),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 8.0,
horizontal: 52,
),
child: Text(
'How about sending your first message to a friend?',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 14,
color: Color(0xff7A7A7A),
),
),
),
],
),
),
if (widget.onStartChatPressed != null)
Positioned(
right: 0,
left: 0,
bottom: 32,
child: Center(
child: FlatButton(
onPressed: widget.onStartChatPressed,
child: Text(
'Start a chat',
style: TextStyle(
color:
StreamChatTheme.of(context).accentColor,
fontWeight: FontWeight.bold,
),
),
),
),
),
],
), ),
); );
}, },
@@ -542,11 +602,13 @@ class _ChannelListViewState extends State<ChannelListView>
), ),
); );
} }
return snapshot.data return Container(
? _buildLoadingItem() height: 100,
: Container( padding: EdgeInsets.all(32),
height: 70, child: Center(
); child: snapshot.data ? CircularProgressIndicator() : Container(),
),
);
}); });
} }
+188 -193
View File
@@ -41,211 +41,206 @@ class GiphyAttachment extends StatelessWidget {
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
DecoratedBox( Card(
decoration: BoxDecoration(), elevation: 2,
child: Card( clipBehavior: Clip.antiAlias,
elevation: 2, shape: RoundedRectangleBorder(
clipBehavior: Clip.antiAlias, borderRadius: BorderRadius.only(
shape: RoundedRectangleBorder( topRight: Radius.circular(16.0),
borderRadius: BorderRadius.only( bottomRight: Radius.circular(0.0),
topRight: Radius.circular(16.0), topLeft: Radius.circular(16.0),
bottomRight: Radius.circular(0.0), bottomLeft: Radius.circular(16.0),
topLeft: Radius.circular(16.0),
bottomLeft: Radius.circular(16.0),
),
), ),
child: Column( ),
mainAxisSize: MainAxisSize.min, child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisSize: MainAxisSize.min,
children: <Widget>[ crossAxisAlignment: CrossAxisAlignment.stretch,
Stack( children: <Widget>[
children: [ Stack(
Padding( children: [
padding: const EdgeInsets.all(8.0), Padding(
child: GestureDetector( padding: const EdgeInsets.all(8.0),
onTap: () { child: GestureDetector(
Navigator.push(context, onTap: () {
MaterialPageRoute(builder: (_) { Navigator.push(context, MaterialPageRoute(builder: (_) {
return FullScreenImage( return FullScreenImage(
url: attachment.imageUrl ?? url: attachment.imageUrl ??
attachment.assetUrl ?? attachment.assetUrl ??
attachment.thumbUrl, attachment.thumbUrl,
); );
})); }));
}, },
child: CachedNetworkImage( child: CachedNetworkImage(
height: size?.height, height: size?.height,
width: size?.width, width: size?.width,
placeholder: (_, __) { placeholder: (_, __) {
return Container( return Container(
width: size?.width, width: size?.width,
height: size?.height, height: size?.height,
child: Center(
child: CircularProgressIndicator(),
),
);
},
imageUrl: attachment.thumbUrl ??
attachment.imageUrl ??
attachment.assetUrl,
errorWidget: (context, url, error) => AttachmentError(
attachment: attachment,
size: size,
),
fit: BoxFit.cover,
),
),
),
Positioned(
left: 0,
top: 0,
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(16.0),
)),
child: Padding(
padding: const EdgeInsets.only(
left: 8.0,
right: 8.0,
top: 8.0,
bottom: 4.0,
),
child: Row(
children: [
Icon(
StreamIcons.lightning,
color: StreamChatTheme.of(context).accentColor,
size: 16.0,
),
Text(
'GIPHY',
style: TextStyle(
color:
StreamChatTheme.of(context).accentColor,
fontWeight: FontWeight.bold,
fontSize: 11.0,
),
),
],
),
),
),
),
],
),
if (attachment.title != null)
Container(
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Card(
elevation: 2,
child: IconButton(
padding: const EdgeInsets.all(0),
constraints: BoxConstraints.tight(Size(32, 32)),
icon: Icon(
StreamIcons.left,
size: 24.0,
),
splashRadius: 16,
onPressed: () {
streamChannel.channel.sendAction(message, {
'image_action': 'shuffle',
});
},
),
shape: CircleBorder(),
),
Expanded(
child: Center( child: Center(
child: Text( child: CircularProgressIndicator(),
'"${attachment.title}"',
style: TextStyle(
fontStyle: FontStyle.italic,
),
),
), ),
), );
Card( },
elevation: 2, imageUrl: attachment.thumbUrl ??
child: IconButton( attachment.imageUrl ??
padding: const EdgeInsets.all(0), attachment.assetUrl,
constraints: BoxConstraints.tight(Size(32, 32)), errorWidget: (context, url, error) => AttachmentError(
icon: Icon( attachment: attachment,
StreamIcons.right, size: size,
size: 24.0, ),
), fit: BoxFit.cover,
splashRadius: 16,
onPressed: () {
streamChannel.channel.sendAction(message, {
'image_action': 'shuffle',
});
},
),
shape: CircleBorder(),
),
],
), ),
), ),
), ),
SizedBox( Positioned(
height: 4.0, left: 0,
), top: 0,
Container( child: Container(
color: Colors.black.withOpacity(0.2), decoration: BoxDecoration(
width: double.infinity, color: Colors.white,
height: 0.5, borderRadius: BorderRadius.only(
), bottomRight: Radius.circular(16.0),
Row( )),
mainAxisAlignment: MainAxisAlignment.start, child: Padding(
crossAxisAlignment: CrossAxisAlignment.center, padding: const EdgeInsets.only(
children: [ left: 8.0,
Expanded( right: 8.0,
child: FlatButton( top: 8.0,
height: 50, bottom: 4.0,
onPressed: () {
streamChannel.channel.sendAction(message, {
'image_action': 'cancel',
});
},
child: Text(
'Cancel',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.5)),
), ),
), child: Row(
), children: [
Container( Icon(
width: 0.5, StreamIcons.lightning,
color: Colors.black.withOpacity(0.2),
height: 50.0,
),
Expanded(
child: FlatButton(
height: 50,
onPressed: () {
streamChannel.channel.sendAction(message, {
'image_action': 'send',
});
},
child: Text(
'Send',
style: TextStyle(
color: StreamChatTheme.of(context).accentColor, color: StreamChatTheme.of(context).accentColor,
fontWeight: FontWeight.bold), size: 16.0,
),
Text(
'GIPHY',
style: TextStyle(
color: StreamChatTheme.of(context).accentColor,
fontWeight: FontWeight.bold,
fontSize: 11.0,
),
),
],
), ),
), ),
), ),
], ),
],
),
if (attachment.title != null)
Container(
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Card(
elevation: 2,
child: IconButton(
padding: const EdgeInsets.all(0),
constraints: BoxConstraints.tight(Size(32, 32)),
icon: Icon(
StreamIcons.left,
size: 24.0,
),
splashRadius: 16,
onPressed: () {
streamChannel.channel.sendAction(message, {
'image_action': 'shuffle',
});
},
),
shape: CircleBorder(),
),
Expanded(
child: Center(
child: Text(
'"${attachment.title}"',
style: TextStyle(
fontStyle: FontStyle.italic,
),
),
),
),
Card(
elevation: 2,
child: IconButton(
padding: const EdgeInsets.all(0),
constraints: BoxConstraints.tight(Size(32, 32)),
icon: Icon(
StreamIcons.right,
size: 24.0,
),
splashRadius: 16,
onPressed: () {
streamChannel.channel.sendAction(message, {
'image_action': 'shuffle',
});
},
),
shape: CircleBorder(),
),
],
),
),
), ),
], SizedBox(
), height: 4.0,
),
Container(
color: Colors.black.withOpacity(0.2),
width: double.infinity,
height: 0.5,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: FlatButton(
height: 50,
onPressed: () {
streamChannel.channel.sendAction(message, {
'image_action': 'cancel',
});
},
child: Text(
'Cancel',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.5)),
),
),
),
Container(
width: 0.5,
color: Colors.black.withOpacity(0.2),
height: 50.0,
),
Expanded(
child: FlatButton(
height: 50,
onPressed: () {
streamChannel.channel.sendAction(message, {
'image_action': 'send',
});
},
child: Text(
'Send',
style: TextStyle(
color: StreamChatTheme.of(context).accentColor,
fontWeight: FontWeight.bold),
),
),
),
],
),
],
), ),
), ),
SizedBox( SizedBox(
+1
View File
@@ -619,6 +619,7 @@ class _MessageWidgetState extends State<MessageWidget> {
child: Material( child: Material(
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
shape: attachmentShape, shape: attachmentShape,
type: MaterialType.transparency,
child: Transform( child: Transform(
transform: Matrix4.rotationY(widget.reverse ? pi : 0), transform: Matrix4.rotationY(widget.reverse ? pi : 0),
alignment: Alignment.center, alignment: Alignment.center,