forked from Nexus/nexus
add support for sending media
Still needs camera support.
This commit is contained in:
parent
a8285548e8
commit
c4f63d18b5
13 changed files with 303 additions and 122 deletions
41
lib/controllers/attachment.dart
Normal file
41
lib/controllers/attachment.dart
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
import "package:file_selector/file_selector.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/client.dart";
|
||||
import "package:nexus/controllers/rooms.dart";
|
||||
import "package:nexus/models/content/content.dart";
|
||||
import "package:nexus/models/content/message.dart";
|
||||
import "package:path/path.dart";
|
||||
|
||||
class AttachmentController extends Notifier<(String, MessageContent?)?> {
|
||||
final String roomId;
|
||||
AttachmentController(this.roomId);
|
||||
|
||||
@override
|
||||
Null build() => null;
|
||||
|
||||
Future<void> add(XFile file) async {
|
||||
final filename = basename(file.path);
|
||||
state = (filename, null);
|
||||
|
||||
final room = ref.watch(
|
||||
RoomsController.provider.select((value) => value[roomId]),
|
||||
);
|
||||
|
||||
final content = await ref
|
||||
.watch(ClientController.provider.notifier)
|
||||
.uploadMedia(
|
||||
.new(
|
||||
path: file.path,
|
||||
encrypted:
|
||||
room?.state[EventType.encryption.name]?.isNotEmpty == true,
|
||||
),
|
||||
);
|
||||
|
||||
state = (filename, content);
|
||||
}
|
||||
|
||||
static final provider = NotifierProvider.family
|
||||
.autoDispose<AttachmentController, (String, MessageContent?)?, String>(
|
||||
AttachmentController.new,
|
||||
);
|
||||
}
|
||||
|
|
@ -14,6 +14,7 @@ import "package:nexus/controllers/sync_status.dart";
|
|||
import "package:nexus/controllers/top_level_spaces.dart";
|
||||
import "package:nexus/helpers/extensions/gomuks_buffer.dart";
|
||||
import "package:nexus/main.dart";
|
||||
import "package:nexus/models/content/message.dart";
|
||||
import "package:nexus/models/event.dart";
|
||||
import "package:nexus/models/oauth_auth_code_response.dart";
|
||||
import "package:nexus/models/paginate.dart";
|
||||
|
|
@ -32,6 +33,7 @@ import "package:nexus/models/requests/send_event.dart";
|
|||
import "package:nexus/models/requests/send_message.dart";
|
||||
import "package:nexus/models/requests/set_membership.dart";
|
||||
import "package:nexus/models/requests/set_state.dart";
|
||||
import "package:nexus/models/requests/upload_media.dart";
|
||||
import "package:nexus/models/room.dart";
|
||||
import "package:nexus/models/sync_data.dart";
|
||||
import "package:nexus/src/third_party/gomuks.g.dart";
|
||||
|
|
@ -266,6 +268,9 @@ class ClientController extends AsyncNotifier<int> {
|
|||
Future<void> setMembership(SetMembershipRequest request) =>
|
||||
_sendCommand("set_membership", request.toJson());
|
||||
|
||||
Future<MessageContent> uploadMedia(UploadMediaRequest request) async =>
|
||||
.fromJson(await _sendCommand("upload_media", request.toJson()));
|
||||
|
||||
Future<void> logout() => _sendCommand("logout");
|
||||
|
||||
Future<void> markRead(Room room) async {
|
||||
|
|
|
|||
11
lib/controllers/image_picker.dart
Normal file
11
lib/controllers/image_picker.dart
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:image_picker/image_picker.dart";
|
||||
|
||||
class ImagePickerController extends Notifier<ImagePicker> {
|
||||
@override
|
||||
ImagePicker build() => .new();
|
||||
|
||||
static final provider = NotifierProvider<ImagePickerController, ImagePicker>(
|
||||
ImagePickerController.new,
|
||||
);
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ import "package:collection/collection.dart";
|
|||
import "package:fast_immutable_collections/fast_immutable_collections.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:fluttertagger/fluttertagger.dart";
|
||||
import "package:nexus/controllers/attachment.dart";
|
||||
import "package:nexus/controllers/client.dart";
|
||||
import "package:nexus/controllers/rooms.dart";
|
||||
import "package:nexus/models/content/content.dart";
|
||||
|
|
@ -120,6 +121,10 @@ class RoomChatController extends AsyncNotifier<IList<Event>?> {
|
|||
required RelationType relationType,
|
||||
Event? relation,
|
||||
}) async {
|
||||
final attachment = ref.watch(AttachmentController.provider(roomId));
|
||||
|
||||
if (attachment != null && attachment.$2 == null) return;
|
||||
|
||||
var taggedMessage = text;
|
||||
|
||||
for (final tag in tags) {
|
||||
|
|
@ -136,6 +141,7 @@ class RoomChatController extends AsyncNotifier<IList<Event>?> {
|
|||
final event = await client.sendMessage(
|
||||
SendMessageRequest(
|
||||
roomId: roomId,
|
||||
baseContent: attachment?.$2,
|
||||
mentions: Mentions(
|
||||
userIds: [
|
||||
if (shouldMention == true &&
|
||||
|
|
@ -152,6 +158,8 @@ class RoomChatController extends AsyncNotifier<IList<Event>?> {
|
|||
),
|
||||
);
|
||||
|
||||
ref.invalidate(AttachmentController.provider(roomId));
|
||||
|
||||
ref
|
||||
.watch(RoomsController.provider.notifier)
|
||||
.update(
|
||||
|
|
|
|||
Loading…
Reference in a new issue