Files
MessagingApp/lib/pages/recent_converstations_page.dart
T
2025-03-30 04:04:00 +01:00

165 lines
5.2 KiB
Dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:messaging_app/components/messaging_provider.dart';
import 'package:messaging_app/models/conversations.dart';
import 'package:messaging_app/pages/conversations_page.dart';
import 'package:messaging_app/service/navigation_service.dart';
import 'package:messaging_app/service/snackbar_service.dart';
import 'package:provider/provider.dart';
import 'package:timeago/timeago.dart' as timeago;
// ignore: must_be_immutable
class RecentConverstationsPage extends StatefulWidget {
//
final double _deviceHeight;
final double _deviceWidth;
const RecentConverstationsPage(this._deviceHeight, this._deviceWidth,
{super.key});
@override
State<RecentConverstationsPage> createState() =>
_RecentConverstationsPageState();
}
class _RecentConverstationsPageState extends State<RecentConverstationsPage> {
late MessagingProviders _auth;
List<Conversations> streamData = [];
// To listen to the conversations stream
@override
void dispose() {
super.dispose();
loadStream();
}
loadStream() async {
streamData =
await MessagingProviders.instance.getUserConversations(_auth.user!.$id);
}
subscribe() {
MessagingProviders.instance.subscription!.stream.listen((data) {
final event = data.events.first;
if (event.endsWith('.create')) {
streamData.add(data.payload['']);
} else if (event.endsWith('.update')) {}
});
}
@override
void initState() {
super.initState();
MessagingProviders.instance.subscription!.stream.listen((data) {
final event = data.events.first;
;
});
}
@override
Widget build(BuildContext context) {
return SizedBox(
height: widget._deviceHeight,
width: widget._deviceWidth,
child: ChangeNotifierProvider<MessagingProviders>.value(
value: MessagingProviders.instance,
child: _conversationView(context),
),
);
}
Widget _conversationView(BuildContext _context) {
return Builder(builder: (BuildContext _context) {
SnackBarService.instance.buildContext = _context;
_auth = Provider.of<MessagingProviders>(_context);
return SizedBox(
height: widget._deviceHeight,
width: widget._deviceWidth,
child: StreamBuilder<List<Conversations>>(
stream: MessagingProviders.instance
.getUserConversation(_auth.user!.$id),
builder: (_context, _snapshot) {
if (_snapshot.hasData) {
return ListView.builder(
itemCount: _snapshot.data!.length,
itemBuilder: (_context, _index) {
var _details = _snapshot.data![_index].details;
var _chatId = _snapshot.data![_index].chatId;
return ListTile(
onTap: () {
//
NavigationService.instance.navigateToRoute(
MaterialPageRoute(
builder: (BuildContext _context) {
return ConversationsPage(
chatId: _chatId,
chatName: _details.name,
chatImage: _details.image,
);
},
),
);
},
title: Text(_details.name),
subtitle: Text(
_details.type == 'text'
? _details.lastMessage!
: 'attachment: image',
),
leading: Container(
width: 50,
height: 50,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(100),
image: DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(_details.image),
),
),
),
trailing: _listTrailingWidget(_details.timeStamp),
);
},
);
} else if (_snapshot.hasError) {
return Align(
child: Text(
"no active conversation",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
),
),
);
} else {
return SpinKitWanderingCubes(
color: Colors.blue,
size: 50.0,
);
}
}),
);
});
}
Widget _listTrailingWidget(DateTime? _date) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
"last message",
style: TextStyle(fontSize: 15),
),
Text(
timeago.format(_date!),
style: TextStyle(fontSize: 15),
)
],
);
}
}