4
2
Fork 0

feat: added new conversation page

pull/54/head
Sudharshan S. 2019-06-22 17:07:50 +08:00
parent 7f529b090e
commit 08cf5a41b0
Signed by: sudharshan
GPG Key ID: C861C97AAF3D9559
6 changed files with 187 additions and 28 deletions

View File

@ -4,7 +4,7 @@ import 'package:sticky_headers/sticky_headers.dart';
import "../../../models/user_model.dart";
import "../../../blocs/contact_bloc.dart";
import "../widgets/contact_item.dart";
import "../../widgets/contact_item.dart";
import "../../widgets/top_bar.dart";
import "../../widgets/search_input.dart";
@ -48,23 +48,6 @@ class _HomeViewState extends State<HomeView> {
Navigator.pushNamed(context, "contact/new");
}),
]),
Padding(
padding: EdgeInsets.only(left: 15.0, right: 15.0, top: 10.0),
child: Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
SearchInput(
controller: searchController, hintText: "Search for people"),
Padding(
padding: EdgeInsets.only(top: 10.0, bottom: 10.0),
child: Row(children: <Widget>[
Icon(Icons.people_outline,
color: Theme.of(context).primaryColorDark, size: 30.0),
Padding(
padding: EdgeInsets.only(left: 20.0),
child: Text("Invite Friends",
style: Theme.of(context).textTheme.title.copyWith(
color: Theme.of(context).primaryColorDark))),
])),
])),
Expanded(
child: StreamBuilder(
stream: contactBloc.contacts,
@ -146,6 +129,26 @@ class _HomeViewState extends State<HomeView> {
]);
}).toList();
return ListView(padding: EdgeInsets.only(top: 0.0), children: children);
children.insertAll(0, [
Padding(
padding: EdgeInsets.only(left: 15.0, right: 15.0),
child: Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
SearchInput(
controller: searchController, hintText: "Search for people"),
Padding(
padding: EdgeInsets.only(top: 10.0, bottom: 10.0),
child: Row(children: <Widget>[
Icon(Icons.person_add,
color: Theme.of(context).primaryColorDark, size: 30.0),
Padding(
padding: EdgeInsets.only(left: 20.0),
child: Text("Invite Friends",
style: Theme.of(context).textTheme.title.copyWith(
color: Theme.of(context).primaryColorDark))),
])),
])),
]);
return ListView(padding: EdgeInsets.only(top: 10.0), children: children);
}
}

View File

@ -1,5 +1,7 @@
import "package:flutter/material.dart";
import "./widgets/home_view.dart";
import "./widgets/new_conversation_view.dart";
class ConversationTab extends StatefulWidget {
@override
@ -20,7 +22,7 @@ class _ConversationTabState extends State<ConversationTab> {
builder = (BuildContext _) => HomeView();
break;
case "conversation/new":
builder = (BuildContext _) => Center(child: Text("SOON"));
builder = (BuildContext _) => NewConversationView();
break;
default:
throw Exception("Invalid route: ${settings.name}");

View File

@ -3,7 +3,7 @@ import "package:flutter/material.dart";
import "../../../models/conversation_model.dart";
import "../../../blocs/conversation_bloc.dart";
import "../widgets/conversation_item.dart";
import "../../widgets/conversation_item.dart";
import "../../widgets/top_bar.dart";
import "../../widgets/search_input.dart";

View File

@ -0,0 +1,154 @@
import "package:flutter/material.dart";
import 'package:sticky_headers/sticky_headers.dart';
import "../../../models/user_model.dart";
import "../../../blocs/contact_bloc.dart";
import "../../widgets/contact_item.dart";
import "../../widgets/top_bar.dart";
import "../../widgets/search_input.dart";
class NewConversationView extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _NewConversationViewState();
}
}
class _NewConversationViewState extends State<NewConversationView> {
final searchController = TextEditingController();
@override
void initState() {
super.initState();
contactBloc.fetchContacts();
}
@override
void dispose() {
searchController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(children: <Widget>[
TopBar(title: "New Conversation", children: <Widget>[
IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Navigator.pop(context);
}),
Spacer(),
Padding(
padding: EdgeInsets.only(right: 13.0),
child: Text("Next",
style: Theme.of(context)
.accentTextTheme
.title
.copyWith(fontWeight: FontWeight.w300))),
]),
Expanded(
child: StreamBuilder(
stream: contactBloc.contacts,
builder: (context, AsyncSnapshot<List<User>> snapshot) {
if (snapshot.hasData) {
return buildList(snapshot);
} else if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
return Center(child: CircularProgressIndicator());
}))
]);
}
Widget buildList(AsyncSnapshot<List<User>> snapshot) {
final Map<String, List<User>> sortedList = {
"A": null,
"B": null,
"C": null,
"D": null,
"E": null,
"F": null,
"G": null,
"H": null,
"I": null,
"J": null,
"K": null,
"L": null,
"M": null,
"N": null,
"O": null,
"P": null,
"Q": null,
"R": null,
"S": null,
"T": null,
"U": null,
"V": null,
"W": null,
"X": null,
"Y": null,
"Z": null
};
// Sort the list into alphabets
sortedList.forEach((letter, list) {
sortedList[letter] = snapshot.data
.where((user) => user.firstName.startsWith(letter))
.toList();
});
// Create list of children
final children = sortedList.entries.map<Widget>((entry) {
if (entry.value.length == 0) {
return Container();
}
return Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
StickyHeader(
header: Container(
height: 21.0,
color: Colors.grey[200],
padding: EdgeInsets.symmetric(horizontal: 15.0),
alignment: Alignment.centerLeft,
child: Text(entry.key,
style: Theme.of(context)
.primaryTextTheme
.display1
.copyWith(color: Theme.of(context).primaryColorDark)),
),
content: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.only(top: 0.0),
shrinkWrap: true,
itemCount: entry.value.length,
itemBuilder: (context, index) {
return ContactItem(user: entry.value[index]);
}))
]);
}).toList();
children.insertAll(0, [
Padding(
padding: EdgeInsets.only(left: 15.0, right: 15.0),
child: Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
SearchInput(
controller: searchController, hintText: "Search for people"),
Padding(
padding: EdgeInsets.only(top: 10.0, bottom: 10.0),
child: Row(children: <Widget>[
Icon(Icons.group_add,
color: Theme.of(context).primaryColorDark, size: 30.0),
Padding(
padding: EdgeInsets.only(left: 20.0),
child: Text("New Group",
style: Theme.of(context).textTheme.title.copyWith(
color: Theme.of(context).primaryColorDark))),
])),
])),
]);
return ListView(padding: EdgeInsets.only(top: 10.0), children: children);
}
}

View File

@ -1,7 +1,7 @@
import "package:flutter/material.dart";
import "../../../models/user_model.dart";
import "../../widgets/user_avatar.dart";
import "../../models/user_model.dart";
import "../widgets/user_avatar.dart";
class ContactItem extends StatelessWidget {
final User user;

View File

@ -1,11 +1,11 @@
import "package:flutter/material.dart";
import "../../../models/user_model.dart";
import "../../../models/conversation_model.dart";
import "../../../blocs/conversation_bloc.dart";
import "../../../blocs/message_bloc.dart";
import "../../models/user_model.dart";
import "../../models/conversation_model.dart";
import "../../blocs/conversation_bloc.dart";
import "../../blocs/message_bloc.dart";
import "../../widgets/user_avatar.dart";
import "../widgets/user_avatar.dart";
class ConversationItem extends StatefulWidget {
final Conversation conversation;