2023-01-25 01:53:55 +00:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:go_router/go_router.dart';
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
|
|
|
import '../controls/image_control.dart';
|
2023-04-13 14:30:09 +00:00
|
|
|
import '../controls/responsive_max_width.dart';
|
2023-01-25 01:53:55 +00:00
|
|
|
import '../controls/standard_appbar.dart';
|
2023-02-08 15:41:29 +00:00
|
|
|
import '../controls/status_and_refresh_button.dart';
|
|
|
|
import '../globals.dart';
|
2023-01-25 01:53:55 +00:00
|
|
|
import '../routes.dart';
|
|
|
|
import '../services/direct_message_service.dart';
|
2023-02-08 15:41:29 +00:00
|
|
|
import '../services/network_status_service.dart';
|
2023-03-14 03:47:40 +00:00
|
|
|
import '../utils/active_profile_selector.dart';
|
2023-01-25 01:53:55 +00:00
|
|
|
import '../utils/dateutils.dart';
|
|
|
|
|
|
|
|
class MessagesScreen extends StatelessWidget {
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2023-03-14 03:47:40 +00:00
|
|
|
final service = context
|
|
|
|
.watch<ActiveProfileSelector<DirectMessageService>>()
|
|
|
|
.activeEntry
|
|
|
|
.value;
|
2023-02-08 15:41:29 +00:00
|
|
|
final nss = getIt<NetworkStatusService>();
|
2023-01-25 01:53:55 +00:00
|
|
|
return Scaffold(
|
2023-01-25 18:51:53 +00:00
|
|
|
appBar: StandardAppBar.build(context, 'Direct Message Threads', actions: [
|
2023-02-08 15:41:29 +00:00
|
|
|
StatusAndRefreshButton(
|
|
|
|
valueListenable: nss.directMessageUpdateStatus,
|
|
|
|
refreshFunction: () async => await service.updateThreads(),
|
|
|
|
busyColor: Theme.of(context).colorScheme.background,
|
|
|
|
),
|
2023-01-25 18:51:53 +00:00
|
|
|
IconButton(
|
|
|
|
onPressed: () {
|
|
|
|
context.push('/messages/new_thread');
|
|
|
|
},
|
|
|
|
icon: Icon(Icons.add),
|
|
|
|
)
|
|
|
|
]),
|
2023-01-25 01:53:55 +00:00
|
|
|
body: RefreshIndicator(
|
|
|
|
onRefresh: () async {
|
2023-02-08 15:41:29 +00:00
|
|
|
service.updateThreads();
|
2023-01-25 01:53:55 +00:00
|
|
|
},
|
|
|
|
child: Center(child: buildBody(context, service)),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Widget buildBody(BuildContext context, DirectMessageService service) {
|
2023-02-08 15:41:29 +00:00
|
|
|
final threads = service.getThreads();
|
2023-01-25 18:06:46 +00:00
|
|
|
threads.sort((t1, t2) =>
|
|
|
|
t2.messages.last.createdAt.compareTo(t1.messages.last.createdAt));
|
2023-01-25 01:53:55 +00:00
|
|
|
return threads.isEmpty
|
|
|
|
? const Text('No Direct Message Threads')
|
2023-04-13 14:30:09 +00:00
|
|
|
: ResponsiveMaxWidth(
|
|
|
|
child: ListView.separated(
|
|
|
|
itemCount: threads.length,
|
|
|
|
itemBuilder: (context, index) {
|
|
|
|
final thread = threads[index];
|
|
|
|
final style = thread.allSeen
|
|
|
|
? null
|
|
|
|
: const TextStyle(fontWeight: FontWeight.bold);
|
|
|
|
return ListTile(
|
|
|
|
onTap: () => context.pushNamed(
|
|
|
|
ScreenPaths.thread,
|
|
|
|
queryParams: {'uri': thread.parentUri},
|
|
|
|
),
|
|
|
|
leading: ImageControl(
|
|
|
|
imageUrl: thread.participants.first.avatarUrl.toString(),
|
|
|
|
iconOverride: const Icon(Icons.person),
|
|
|
|
width: 32.0,
|
|
|
|
onTap: null,
|
|
|
|
),
|
|
|
|
title: Text(
|
|
|
|
[
|
|
|
|
'You',
|
|
|
|
...thread.participants
|
|
|
|
.map((p) => '${p.name}(${p.handle})')
|
|
|
|
].join(thread.participants.length == 1 ? ' & ' : ', '),
|
|
|
|
softWrap: true,
|
|
|
|
style: style,
|
|
|
|
),
|
|
|
|
subtitle: Text(
|
|
|
|
thread.title,
|
|
|
|
style: style,
|
|
|
|
),
|
|
|
|
trailing: Text(
|
|
|
|
ElapsedDateUtils.epochSecondsToString(
|
|
|
|
thread.messages.last.createdAt),
|
|
|
|
style: style,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
},
|
|
|
|
separatorBuilder: (_, __) => const Divider(),
|
|
|
|
),
|
2023-01-25 01:53:55 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|