Skip to content

Commit

Permalink
implementing Chat System
Browse files Browse the repository at this point in the history
  • Loading branch information
Hizar62 committed Sep 3, 2024
1 parent 3510c27 commit 0a5f321
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 7 deletions.
93 changes: 93 additions & 0 deletions lib/pages/chat_page.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:live/services/chat/chat_service.dart';

class ChatPage extends StatefulWidget {
final String receiverUsername;
Expand All @@ -15,6 +18,18 @@ class ChatPage extends StatefulWidget {
}

class _ChatPageState extends State<ChatPage> {
final TextEditingController _messageController = TextEditingController();
final ChatService _chatService = ChatService();
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

void sendMessage() async {
if (_messageController.text.isNotEmpty) {
await _chatService.sendMessage(
widget.receiverUserId, _messageController.text);
_messageController.clear();
}
}

@override
Widget build(BuildContext context) {
return Scaffold(
Expand All @@ -23,6 +38,84 @@ class _ChatPageState extends State<ChatPage> {
backgroundColor: const Color.fromARGB(255, 218, 20, 20),
foregroundColor: Colors.white,
),
body: Column(
children: [
Expanded(
child: _buildMessageList(),
),

// user input
_buildMessageInput(),
],
),
);
}

// build message list
Widget _buildMessageList() {
return StreamBuilder(
stream: _chatService.getMessages(
widget.receiverUserId, _firebaseAuth.currentUser!.uid),
builder: (context, snapshot) {
if (snapshot.hasError) {
print('Snapshot Error: ${snapshot.error}');
return Text('Error: ${snapshot.error}');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return const Text('Loading...');
}
if (!snapshot.hasData || snapshot.data!.docs.isEmpty) {
return const Text('No messages yet.');
}

return ListView(
children: snapshot.data!.docs
.map((document) => _buildMessageItem(document))
.toList(),
);
});
}

// build message item
Widget _buildMessageItem(DocumentSnapshot document) {
Map<String, dynamic> data = document.data() as Map<String, dynamic>;

var alignment = (data['senderId'] == _firebaseAuth.currentUser!.uid)
? Alignment.centerRight
: Alignment.centerLeft;

return Container(
alignment: alignment,
padding: EdgeInsets.symmetric(vertical: 5, horizontal: 10),
child: Column(
crossAxisAlignment: alignment == Alignment.centerRight
? CrossAxisAlignment.end
: CrossAxisAlignment.start,
children: [
Text(data['senderName'],
style: TextStyle(fontWeight: FontWeight.bold)),
SizedBox(height: 5),
Text(data[
'message']), // Corrected field name from 'messages' to 'message'
],
),
);
}

// build message input
Widget _buildMessageInput() {
return Row(
children: [
Expanded(
child: TextFormField(
controller: _messageController,
obscureText: false,
decoration: const InputDecoration(hintText: 'Enter a Message'),
)),
IconButton(
onPressed: sendMessage,
icon: const Icon(Icons.arrow_upward_outlined))
],
);
}
}
38 changes: 31 additions & 7 deletions lib/services/chat/chat_service.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
// import 'package:flutter/material.dart';
import 'package:live/model/message.dart';

class ChatService {
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
final FirebaseFirestore _firebaseFirestore = FirebaseFirestore.instance;
final FirebaseFirestore _firestore = FirebaseFirestore.instance;

// Send Message
Future<void> sendMessage(String recevierId, String message) async {
// get current info
Future<void> sendMessage(String receiverId, String message) async {
final String currentUserId = _firebaseAuth.currentUser!.uid;
final String currentUserName = _firebaseAuth.currentUser!.email.toString();
final Timestamp timestamp = Timestamp.now();
Expand All @@ -18,14 +17,39 @@ class ChatService {
Message newMessage = Message(
senderId: currentUserId,
senderName: currentUserName,
userId: recevierId,
userId: receiverId,
message: message,
timeStamp: timestamp);

// construct chat room id
List<String> ids = [currentUserId, receiverId];
ids.sort();
String chatRoomId = ids.join("_");

// add new message to database
print('Sending message to chat room: $chatRoomId');
print('Message: ${newMessage.toMap()}');

await _firestore
.collection('chat_rooms')
.doc(chatRoomId)
.collection('messages')
.add(newMessage.toMap())
.then((value) => print("Message sent successfully"))
.catchError((error) => print("Failed to send message: $error"));
}

// Get Message
Stream<QuerySnapshot> getMessages(String userId, String otherUserId) {
List<String> ids = [userId, otherUserId];
ids.sort();
String chatRoomId = ids.join("_");

print('Fetching messages for chat room: $chatRoomId');

return _firestore
.collection('chat_rooms')
.doc(chatRoomId)
.collection('messages') // Ensure collection name is correct
.orderBy('timeStamp', descending: false)
.snapshots();
}
}

0 comments on commit 0a5f321

Please sign in to comment.