OpenContacts/lib/widgets/home_screen.dart

92 lines
2.8 KiB
Dart
Raw Normal View History

2023-04-29 15:26:12 -04:00
import 'package:contacts_plus/apis/friend_api.dart';
import 'package:contacts_plus/main.dart';
import 'package:contacts_plus/models/friend.dart';
import 'package:contacts_plus/widgets/messages.dart';
2023-04-29 13:18:46 -04:00
import 'package:flutter/material.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
2023-04-29 15:26:12 -04:00
Future<List<Friend>>? _friendsFuture;
@override
void initState() {
super.initState();
_refreshFriendsList();
}
void _refreshFriendsList() {
2023-04-29 16:21:00 -04:00
_friendsFuture = FriendApi.getFriendsList().then((Iterable<Friend> value) =>
2023-04-29 15:26:12 -04:00
value.toList()
..sort((a, b) {
if (a.userStatus.onlineStatus == b.userStatus.onlineStatus) {
return a.userStatus.lastStatusChange.compareTo(b.userStatus.lastStatusChange);
} else {
if (a.userStatus.onlineStatus == OnlineStatus.online) {
return -1;
} else {
return 1;
}
}
},
),
);
}
2023-04-29 13:18:46 -04:00
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Contacts+"),
),
2023-04-29 15:26:12 -04:00
body: RefreshIndicator(
onRefresh: () async {
_refreshFriendsList();
await _friendsFuture;
},
child: FutureBuilder(
future: _friendsFuture,
builder: (context, snapshot) {
if (snapshot.hasData) {
final data = snapshot.data as Iterable<Friend>;
return ListView.builder(
itemCount: data.length,
itemBuilder: (context, index) {
final entry = data.elementAt(index);
return ListTile(
title: Text(entry.username),
subtitle: Text(entry.userStatus.onlineStatus.name),
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => Messages(friend: entry)));
},
);
},
);
} else if (snapshot.hasError) {
return Center(
child: Padding(
padding: const EdgeInsets.all(64),
child: Text(
"Something went wrong: ${snapshot.error}",
softWrap: true,
style: Theme
.of(context)
.textTheme
.labelMedium,
),
),
);
} else {
return const LinearProgressIndicator();
}
2023-04-29 13:18:46 -04:00
}
2023-04-29 15:26:12 -04:00
),
2023-04-29 13:18:46 -04:00
),
);
}
}