Messaging

Implemented Chat Screens, Profile Pages, Search Pages
WIP: User profile, new chat button
Intended: Groups, Calls, Voice Messages
Properly deleting chats, offline storage of messages
This commit is contained in:
2025-03-26 13:41:56 +00:00
parent 1a74d16d85
commit 1ba9e981e1
18 changed files with 812 additions and 236 deletions
+62 -8
View File
@@ -1,6 +1,10 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:messaging_app/components/messaging_provider.dart';
import 'package:messaging_app/models/users.dart';
import 'package:messaging_app/pages/conversations_page.dart';
import 'package:messaging_app/service/navigation_service.dart';
import 'package:provider/provider.dart';
import 'package:timeago/timeago.dart' as timeago;
@@ -21,7 +25,8 @@ class SearchPage extends StatefulWidget {
class _SearchPageState extends State<SearchPage> {
late String _searchText;
late List<Users> _usersData;
late List<User> _usersData;
//
@override
void initState() {
super.initState();
@@ -31,12 +36,14 @@ class _SearchPageState extends State<SearchPage> {
@override
Widget build(BuildContext context) {
return SizedBox(
height: widget.deviceHeight,
width: widget.deviceWidth,
child: ChangeNotifierProvider.value(
value: MessagingProviders.instance,
child: _searchPaheUI(),
return SingleChildScrollView(
child: SizedBox(
height: widget.deviceHeight,
width: widget.deviceWidth,
child: ChangeNotifierProvider.value(
value: MessagingProviders.instance,
child: _searchPaheUI(),
),
),
);
}
@@ -82,7 +89,7 @@ class _SearchPageState extends State<SearchPage> {
}
Widget _searchPageUIList() {
return StreamBuilder<List<Users>>(
return StreamBuilder<List<User>>(
stream: MessagingProviders.instance.getAllUsers(_searchText.trim()),
builder: (_, _snapshot) {
if (_snapshot.hasData) {
@@ -105,6 +112,53 @@ class _SearchPageState extends State<SearchPage> {
),
);
return ListTile(
enabled: true,
onTap: () async {
String _chatId;
String _linkId =
'${widget._auth.user!.$id}${_userData.id}';
_chatId = await MessagingProviders.instance
.getConversationLink(
_linkId.substring(0, 36));
if (_chatId.isEmpty) {
List<dynamic> _members = [
widget._auth.user!.$id,
_userData.id
];
List<String> messagesTemp = [];
messagesTemp = [
json.encode({
widget._auth.user!.$id: [],
}),
json.encode({
_userData.id: [],
})
];
Map<String, dynamic> _chat = {
"ownerId": widget._auth.user!.$id,
"members": _members,
"messages": messagesTemp
};
_chatId = await MessagingProviders.instance
.newMesaage(_chat);
}
NavigationService.instance.navigateToRoute(
MaterialPageRoute(
builder: (BuildContext _context) {
return ConversationsPage(
chatId: _chatId,
chatName: _userData.name,
chatImage: _userData.image,
);
},
),
);
},
title: Text(_userData.name),
leading: Container(
width: 50,