forked from Henry-Hiles/nexus
add minimal scroll to message, only when on current timeline
This commit is contained in:
parent
cb22bdc314
commit
9a3f7e9bdc
4 changed files with 22 additions and 9 deletions
|
|
@ -167,6 +167,11 @@ class ClientController extends AsyncNotifier<int> {
|
||||||
await _sendCommand("leave_room", {"room_id": room.metadata!.id});
|
await _sendCommand("leave_room", {"room_id": room.metadata!.id});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// (await _sendCommand("get_event_context", {
|
||||||
|
// "room_id": request.roomId,
|
||||||
|
// "event_id": r"$OqZT4NuTj0J1-771IOEEWRI4XdumRNu6ighlvO3K3gc",
|
||||||
|
// }));
|
||||||
|
|
||||||
Future<IList<Event>> getRoomState(GetRoomStateRequest request) async {
|
Future<IList<Event>> getRoomState(GetRoomStateRequest request) async {
|
||||||
final response =
|
final response =
|
||||||
(await _sendCommand("get_room_state", request.toJson())) as List;
|
(await _sendCommand("get_room_state", request.toJson())) as List;
|
||||||
|
|
|
||||||
|
|
@ -18,12 +18,12 @@ import "package:nexus/models/relation_type.dart";
|
||||||
import "package:nexus/models/requests/send_message_request.dart";
|
import "package:nexus/models/requests/send_message_request.dart";
|
||||||
import "package:nexus/models/room.dart";
|
import "package:nexus/models/room.dart";
|
||||||
|
|
||||||
class RoomChatController extends AsyncNotifier<ChatController> {
|
class RoomChatController extends AsyncNotifier<InMemoryChatController> {
|
||||||
final String roomId;
|
final String roomId;
|
||||||
RoomChatController(this.roomId);
|
RoomChatController(this.roomId);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<ChatController> build() async {
|
Future<InMemoryChatController> build() async {
|
||||||
final client = ref.watch(ClientController.provider.notifier);
|
final client = ref.watch(ClientController.provider.notifier);
|
||||||
var room = ref.read(RoomsController.provider)[roomId];
|
var room = ref.read(RoomsController.provider)[roomId];
|
||||||
if (room == null) return InMemoryChatController();
|
if (room == null) return InMemoryChatController();
|
||||||
|
|
@ -283,8 +283,13 @@ class RoomChatController extends AsyncNotifier<ChatController> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> scrollToMessage(Message message) async {
|
||||||
|
final controller = await future;
|
||||||
|
return await controller.scrollToMessage(message.id);
|
||||||
|
}
|
||||||
|
|
||||||
static final provider = AsyncNotifierProvider.family
|
static final provider = AsyncNotifierProvider.family
|
||||||
.autoDispose<RoomChatController, ChatController, String>(
|
.autoDispose<RoomChatController, InMemoryChatController, String>(
|
||||||
RoomChatController.new,
|
RoomChatController.new,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -435,6 +435,7 @@ class RoomChat extends HookConsumerWidget {
|
||||||
customWidget: getTextWidget(message),
|
customWidget: getTextWidget(message),
|
||||||
topWidget: TopWidget(
|
topWidget: TopWidget(
|
||||||
message,
|
message,
|
||||||
|
onTapReply: notifier.scrollToMessage,
|
||||||
groupStatus: groupStatus,
|
groupStatus: groupStatus,
|
||||||
),
|
),
|
||||||
message: message,
|
message: message,
|
||||||
|
|
@ -491,6 +492,8 @@ class RoomChat extends HookConsumerWidget {
|
||||||
topWidget: TopWidget(
|
topWidget: TopWidget(
|
||||||
message,
|
message,
|
||||||
groupStatus: groupStatus,
|
groupStatus: groupStatus,
|
||||||
|
onTapReply:
|
||||||
|
notifier.scrollToMessage,
|
||||||
alwaysShow: true,
|
alwaysShow: true,
|
||||||
),
|
),
|
||||||
message: textMessage,
|
message: textMessage,
|
||||||
|
|
@ -503,6 +506,8 @@ class RoomChat extends HookConsumerWidget {
|
||||||
: TopWidget(
|
: TopWidget(
|
||||||
message,
|
message,
|
||||||
groupStatus: groupStatus,
|
groupStatus: groupStatus,
|
||||||
|
onTapReply:
|
||||||
|
notifier.scrollToMessage,
|
||||||
alwaysShow: true,
|
alwaysShow: true,
|
||||||
),
|
),
|
||||||
customImageProvider: CachedNetworkImage(
|
customImageProvider: CachedNetworkImage(
|
||||||
|
|
@ -547,6 +552,7 @@ class RoomChat extends HookConsumerWidget {
|
||||||
child: FlyerChatFileMessage(
|
child: FlyerChatFileMessage(
|
||||||
topWidget: TopWidget(
|
topWidget: TopWidget(
|
||||||
message,
|
message,
|
||||||
|
onTapReply: notifier.scrollToMessage,
|
||||||
groupStatus: groupStatus,
|
groupStatus: groupStatus,
|
||||||
),
|
),
|
||||||
message: message,
|
message: message,
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,11 @@ class TopWidget extends ConsumerWidget {
|
||||||
final Message message;
|
final Message message;
|
||||||
final bool alwaysShow;
|
final bool alwaysShow;
|
||||||
final MessageGroupStatus? groupStatus;
|
final MessageGroupStatus? groupStatus;
|
||||||
|
final void Function(Message message)? onTapReply;
|
||||||
const TopWidget(
|
const TopWidget(
|
||||||
this.message, {
|
this.message, {
|
||||||
required this.groupStatus,
|
required this.groupStatus,
|
||||||
|
this.onTapReply,
|
||||||
this.alwaysShow = false,
|
this.alwaysShow = false,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
|
@ -54,12 +56,7 @@ class TopWidget extends ConsumerWidget {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: EdgeInsets.only(bottom: 12),
|
padding: EdgeInsets.only(bottom: 12),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () => showDialog(
|
onTap: () => onTapReply?.call(replyMessage),
|
||||||
context: context,
|
|
||||||
builder: (_) => Dialog(
|
|
||||||
child: Text("TODO: Scroll to original message"),
|
|
||||||
), // TODO
|
|
||||||
),
|
|
||||||
child: Quoted(
|
child: Quoted(
|
||||||
Row(
|
Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue