Files
fcs/lib/pages/user_search_page.dart
2020-08-30 21:26:37 +06:30

190 lines
5.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:fcs/model/user_model.dart';
import 'package:fcs/fcs/common/theme.dart';
import 'package:fcs/vo/user.dart';
import 'user_editor.dart';
Future<User> showUserPlacesSearch(BuildContext context) async =>
await showSearch<User>(
context: context,
delegate: UserSearchDelegate(),
);
class UserSearchDelegate extends SearchDelegate<User> {
@override
ThemeData appBarTheme(BuildContext context) {
final ThemeData theme = Theme.of(context);
return theme.copyWith(
inputDecorationTheme: InputDecorationTheme(
hintStyle: TextStyle(
color: theme.primaryTextTheme.title.color, fontSize: 16)),
primaryColor: primaryColor,
primaryIconTheme: theme.primaryIconTheme.copyWith(color: Colors.white),
primaryColorBrightness: Brightness.light,
primaryTextTheme: theme.textTheme,
textTheme: theme.textTheme.copyWith(
title: theme.textTheme.title.copyWith(
color: theme.primaryTextTheme.title.color, fontSize: 16)),
);
}
@override
List<Widget> buildActions(BuildContext context) {
return [
IconButton(
icon: Icon(Icons.clear),
onPressed: () => query = '',
),
];
}
@override
Widget buildLeading(BuildContext context) {
return IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () => close(context, null),
);
}
@override
Widget buildResults(BuildContext context) {
final userModel = Provider.of<UserModel>(context);
return FutureBuilder(
future: userModel.searchUser(query),
builder: (context, AsyncSnapshot<List<User>> snapshot) {
if (snapshot.hasData) {
if (snapshot.data.length == 0) {
return Container(
child: Center(
child: Text(
"Error :No Search User",
textAlign: TextAlign.center,
),
),
);
}
return Container(
padding: EdgeInsets.only(top: 15),
child: ListView(
children: snapshot.data.map((u) => UserRow(user: u)).toList(),
),
);
} else if (snapshot.hasError) {
return Container(
child: Center(
child: Text(
'${snapshot.error}',
textAlign: TextAlign.center,
),
),
);
} else {
return Container(
child: Center(
child: CircularProgressIndicator(
valueColor:
new AlwaysStoppedAnimation<Color>(primaryColor)),
),
);
}
});
}
@override
Widget buildSuggestions(BuildContext context) {
return Container(
child: Center(
child: Opacity(
opacity: 0.2,
child: Icon(
Icons.supervised_user_circle,
size: 200,
)),
),
);
}
}
class UserRow extends StatefulWidget {
final User user;
const UserRow({Key key, this.user}) : super(key: key);
@override
_UserRowState createState() => _UserRowState();
}
class _UserRowState extends State<UserRow> {
var dateFormatter = new DateFormat('dd MMM yyyy - hh:mm:ss a');
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.only(left: 15, right: 15),
child: Card(
elevation: 10,
color: Colors.white,
child: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UserEditor(user: widget.user)),
);
},
child: Row(
children: <Widget>[
Expanded(
child: new Padding(
padding: const EdgeInsets.symmetric(vertical: 7.0),
child: new Row(
children: <Widget>[
new Padding(
padding:
new EdgeInsets.symmetric(horizontal: 20.0 - 15 / 2),
child: Icon(
Icons.account_circle,
color: primaryColor,
size: 55,
),
),
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Text(
widget.user.name == null ? "" : widget.user.name,
style: new TextStyle(
fontSize: 16.0, color: Colors.black),
),
new Text(
widget.user.phone == null ? "" : widget.user.phone,
style: new TextStyle(
fontSize: 14.0, color: Colors.grey),
),
widget.user.device == null
? Text("No login",
style: TextStyle(color: Colors.red))
: Text("last active",
style: TextStyle(color: Colors.green)),
Text(
"${widget.user.device == null ? "" : widget.user.device}",
style: TextStyle(fontSize: 11)),
Text(
"${widget.user.lastActiveTime == null ? "" : dateFormatter.format(widget.user.lastActiveTime)}")
],
),
],
),
),
),
],
),
),
),
);
}
}