2024-04-29 13:58:27 +02:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
2024-06-02 16:32:19 +02:00
|
|
|
import '../components/my_drawer.dart';
|
|
|
|
import '../components/user_tile.dart';
|
|
|
|
import '../constants.dart';
|
|
|
|
import '../services/auth/auth_service.dart';
|
|
|
|
import '../services/user_service.dart';
|
2024-04-30 19:25:16 +02:00
|
|
|
import 'chat_page.dart';
|
2024-04-29 13:58:27 +02:00
|
|
|
|
2024-04-30 19:25:16 +02:00
|
|
|
class HomePage extends StatelessWidget {
|
|
|
|
HomePage({super.key});
|
2024-04-29 13:58:27 +02:00
|
|
|
|
2024-04-30 19:25:16 +02:00
|
|
|
final AuthService _authService = AuthService();
|
2024-04-29 13:58:27 +02:00
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return Scaffold(
|
|
|
|
appBar: AppBar(
|
2024-06-02 16:32:19 +02:00
|
|
|
title: const Text('Home'),
|
2024-06-07 02:18:20 +02:00
|
|
|
// different appbar style for homepage
|
2024-04-30 19:25:16 +02:00
|
|
|
backgroundColor: Colors.transparent,
|
2024-04-29 13:58:27 +02:00
|
|
|
),
|
2024-04-29 17:11:35 +02:00
|
|
|
drawer: const MyDrawer(),
|
2024-06-07 16:58:29 +02:00
|
|
|
// body: _buildUserList(),
|
|
|
|
body: Center(
|
|
|
|
child: SingleChildScrollView(
|
|
|
|
child: Column(
|
|
|
|
children: [
|
|
|
|
AspectRatio(
|
|
|
|
aspectRatio: 1,
|
|
|
|
child: LayoutBuilder(
|
|
|
|
builder: (context, constraints) {
|
|
|
|
// Calculation of the tile size based on the spacing
|
|
|
|
double size = constraints.biggest.shortestSide / 2 - 16;
|
|
|
|
return GridView.count(
|
|
|
|
crossAxisCount: 2,
|
|
|
|
crossAxisSpacing: 16.0,
|
|
|
|
mainAxisSpacing: 16.0,
|
|
|
|
padding: const EdgeInsets.all(16.0),
|
|
|
|
shrinkWrap: true,
|
|
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
|
|
children: [
|
|
|
|
_buildTile(
|
|
|
|
context,
|
|
|
|
'Discover',
|
|
|
|
Icons.explore,
|
|
|
|
Colors.lightBlue.shade300,
|
|
|
|
'/discover',
|
|
|
|
size,
|
|
|
|
),
|
|
|
|
_buildTile(
|
|
|
|
context,
|
|
|
|
'View Profiles',
|
|
|
|
Icons.star,
|
|
|
|
Colors.teal.shade300,
|
|
|
|
'/favorites',
|
|
|
|
size,
|
|
|
|
),
|
|
|
|
_buildTile(
|
|
|
|
context,
|
|
|
|
'Chat',
|
|
|
|
Icons.chat,
|
|
|
|
Colors.indigo.shade300,
|
|
|
|
'/chats',
|
|
|
|
size,
|
|
|
|
),
|
|
|
|
_buildTile(
|
|
|
|
context,
|
|
|
|
'My Profile',
|
|
|
|
Icons.person,
|
|
|
|
Colors.blueGrey.shade300,
|
|
|
|
'/profile',
|
|
|
|
size,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
},
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Container(
|
|
|
|
height: 400, // Adjust this height as needed
|
|
|
|
child: _buildUserList(),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Widget _buildTile(BuildContext context, String title, IconData icon,
|
|
|
|
Color color, String route, double size) {
|
|
|
|
return InkWell(
|
|
|
|
onTap: () {
|
|
|
|
Navigator.pushNamed(context, route);
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
width: size,
|
|
|
|
height: size,
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: color,
|
|
|
|
borderRadius: BorderRadius.circular(16.0),
|
|
|
|
),
|
|
|
|
child: Column(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
children: [
|
|
|
|
Icon(
|
|
|
|
icon,
|
|
|
|
size: 50,
|
|
|
|
color: Colors.white,
|
|
|
|
),
|
|
|
|
const SizedBox(height: 10),
|
|
|
|
Text(title,
|
|
|
|
style: const TextStyle(color: Colors.white, fontSize: 20)),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
2024-04-29 13:58:27 +02:00
|
|
|
);
|
|
|
|
}
|
2024-04-30 19:25:16 +02:00
|
|
|
|
|
|
|
// build a list of users except for the current logged in user
|
|
|
|
Widget _buildUserList() {
|
|
|
|
return StreamBuilder(
|
2024-06-02 16:32:19 +02:00
|
|
|
stream: UserService.getUsersStream(),
|
2024-04-30 19:25:16 +02:00
|
|
|
builder: (context, snapshot) {
|
|
|
|
// error
|
|
|
|
if (snapshot.hasError) {
|
2024-06-02 16:32:19 +02:00
|
|
|
return Text('Error: ${snapshot.error.toString()}');
|
2024-04-30 19:25:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//loading
|
|
|
|
if (snapshot.connectionState == ConnectionState.waiting) {
|
2024-06-02 16:32:19 +02:00
|
|
|
return const Text('Loading..');
|
2024-04-30 19:25:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// return list view
|
|
|
|
return ListView(
|
2024-06-07 16:58:29 +02:00
|
|
|
shrinkWrap: true,
|
|
|
|
physics: NeverScrollableScrollPhysics(),
|
2024-04-30 19:25:16 +02:00
|
|
|
children: snapshot.data!
|
|
|
|
.map<Widget>(
|
|
|
|
(userData) => _buildUserListItem(userData, context))
|
|
|
|
.toList(),
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// build individual user list item
|
|
|
|
Widget _buildUserListItem(
|
|
|
|
Map<String, dynamic> userData, BuildContext context) {
|
|
|
|
// display all users except current user
|
2024-06-02 16:32:19 +02:00
|
|
|
if (userData[Constants.dbFieldUsersEmail] !=
|
|
|
|
_authService.getCurrentUser()!.email) {
|
2024-04-30 19:25:16 +02:00
|
|
|
return UserTile(
|
2024-06-04 20:12:12 +02:00
|
|
|
text: userData[Constants.dbFieldUsersEmail],
|
2024-04-30 19:25:16 +02:00
|
|
|
onTap: () {
|
2024-06-02 16:32:19 +02:00
|
|
|
// tapped on a user -> go to chat page
|
2024-04-30 19:25:16 +02:00
|
|
|
Navigator.push(
|
|
|
|
context,
|
|
|
|
MaterialPageRoute(
|
|
|
|
builder: (context) => ChatPage(
|
2024-06-02 16:32:19 +02:00
|
|
|
receiverEmail: userData[Constants.dbFieldUsersEmail],
|
|
|
|
receiverID: userData[Constants.dbFieldUsersID],
|
2024-04-30 19:25:16 +02:00
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
return Container();
|
|
|
|
}
|
|
|
|
}
|
2024-04-29 17:11:35 +02:00
|
|
|
}
|