Skip to content

Commit

Permalink
style: add message socket event
Browse files Browse the repository at this point in the history
  • Loading branch information
chopper985 committed Sep 6, 2024
1 parent e5ddb64 commit 6ff288d
Show file tree
Hide file tree
Showing 15 changed files with 131 additions and 41 deletions.
4 changes: 4 additions & 0 deletions lib/constants/socket_events.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,8 @@ class SocketEvent {
static const String sendPodNameSSC = 'SEND_POD_NAME_SSC';
static const String reconnect = 'reconnect_CSS';
static const String destroy = 'destroy';

static const String sendMessageSSC = 'SEND_MESSAGE_SSC';
static const String updateMessageSSC = 'UPDATE_MESSAGE_SSC';
static const String deleteMessageSSC = 'DELETE_MESSAGE_SSC';
}
2 changes: 1 addition & 1 deletion lib/core/api/meetings/repositories/meeting_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ class MeetingRepositoryImpl extends MeetingRepository {
final int indexOfMyParticipant = participants.lastIndexWhere(
(participant) => participantId != null
? participant.id == participantId
: participant.user.id == userId,
: participant.user?.id == userId,
);

if (indexOfMyParticipant == -1) return meeting;
Expand Down
20 changes: 14 additions & 6 deletions lib/core/api/messages/datasources/message_remote_datasource.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ abstract class MessageRemoteDataSource {
required int meetingId,
required String data,
});
Future<bool> editMessage({
Future<MessageModel?> editMessage({
required int messageId,
required String data,
});
Future<bool> deleteMessage({required int messageId});
Future<MessageModel?> deleteMessage({required int messageId});
}

@LazySingleton(as: MessageRemoteDataSource)
Expand Down Expand Up @@ -70,7 +70,7 @@ class MessageRemoteDataSourceImpl extends MessageRemoteDataSource {
}

@override
Future<bool> editMessage({
Future<MessageModel?> editMessage({
required int messageId,
required String data,
}) async {
Expand All @@ -79,15 +79,23 @@ class MessageRemoteDataSourceImpl extends MessageRemoteDataSource {
{"data": data},
);

return [StatusCode.ok, StatusCode.created].contains(response.statusCode);
if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) {
return MessageModel.fromMap(response.data);
}

return null;
}

@override
Future<bool> deleteMessage({required int messageId}) async {
Future<MessageModel?> deleteMessage({required int messageId}) async {
final Response response = await _remoteData.deleteRoute(
"${ApiEndpoints.chats}/$messageId",
);

return [StatusCode.ok, StatusCode.created].contains(response.statusCode);
if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) {
return MessageModel.fromMap(response.data);
}

return null;
}
}
19 changes: 11 additions & 8 deletions lib/core/api/messages/repositories/message_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,11 @@ abstract class MessageRepository {
required int meetingId,
required String data,
});
Future<bool> editMessage({required int messageId, required String data});
Future<bool> deleteMessage({required int messageId});
Future<MessageModel?> editMessage({
required int messageId,
required String data,
});
Future<MessageModel?> deleteMessage({required int messageId});
}

@LazySingleton(as: MessageRepository)
Expand All @@ -27,22 +30,22 @@ class MessageRepositoryImpl extends MessageRepository {
);

@override
Future<bool> deleteMessage({required int messageId}) async {
final bool isSucceed =
Future<MessageModel?> deleteMessage({required int messageId}) async {
final MessageModel? messageModel =
await _remoteDataSource.deleteMessage(messageId: messageId);

return isSucceed;
return messageModel;
}

@override
Future<bool> editMessage({
Future<MessageModel?> editMessage({
required int messageId,
required String data,
}) async {
final bool isSucceed =
final MessageModel? messageModel =
await _remoteDataSource.editMessage(messageId: messageId, data: data);

return isSucceed;
return messageModel;
}

@override
Expand Down
24 changes: 24 additions & 0 deletions lib/core/websocket/socket_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,30 @@ class SocketHandlerImpl extends SocketHandler {
);
}
});

_socket?.on(SocketEvent.sendMessageSSC, (data) {
if (data == null) return;

WaterbusSdk.onMesssageChanged?.call(
MessageSocketEvent(event: MessageEventEnum.create, data: data),
);
});

_socket?.on(SocketEvent.updateMessageSSC, (data) {
if (data == null) return;

WaterbusSdk.onMesssageChanged?.call(
MessageSocketEvent(event: MessageEventEnum.update, data: data),
);
});

_socket?.on(SocketEvent.deleteMessageSSC, (data) {
if (data == null) return;

WaterbusSdk.onMesssageChanged?.call(
MessageSocketEvent(event: MessageEventEnum.delete, data: data),
);
});
});
}

Expand Down
12 changes: 10 additions & 2 deletions lib/flutter_waterbus_sdk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,15 @@ class WaterbusSdk {
static String apiUrl = '';
static String wsUrl = '';
static String apiKey = '';
static String privateMessageKey = '';
static Function(CallbackPayload)? onEventChanged;
static Function(VideoSenderStats)? onStatsChanged;
static Function(Subtitle)? onSubtitle;
static Function(MessageSocketEvent)? onMesssageChanged;

set onMessageSocketChanged(Function(MessageSocketEvent) onMesssageChanged) {
WaterbusSdk.onMesssageChanged = onMesssageChanged;
}

set onEventChangedRegister(Function(CallbackPayload) onEventChanged) {
WaterbusSdk.onEventChanged = onEventChanged;
Expand All @@ -38,11 +44,13 @@ class WaterbusSdk {
Future<void> initializeApp({
required String wsUrl,
required String apiUrl,
required String privateMessageKey,
String apiKey = 'waterbus@2024',
}) async {
WaterbusSdk.wsUrl = wsUrl;
WaterbusSdk.apiUrl = apiUrl;
WaterbusSdk.apiKey = apiKey;
WaterbusSdk.privateMessageKey = privateMessageKey;

// Init dependency injection if needed
if (!getIt.isRegistered<WaterbusWebRTCManager>()) {
Expand Down Expand Up @@ -268,14 +276,14 @@ class WaterbusSdk {
return await _sdk.sendMessage(meetingId: meetingId, data: data);
}

Future<bool> editMessage({
Future<MessageModel?> editMessage({
required int messageId,
required String data,
}) async {
return await _sdk.editMessage(messageId: messageId, data: data);
}

Future<bool> deleteMessage({required int messageId}) async {
Future<MessageModel?> deleteMessage({required int messageId}) async {
return await _sdk.deleteMessage(messageId: messageId);
}

Expand Down
1 change: 1 addition & 0 deletions lib/types/models/index.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ export 'status_seen_message.dart';
export 'message_model.dart';
export 'media_source.dart';
export 'subtitle.dart';
export 'message_socket_event.dart';
6 changes: 3 additions & 3 deletions lib/types/models/meeting_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -148,14 +148,14 @@ class Meeting {
final int numberOfPaticipants = participants.length;

if (numberOfPaticipants == 1) {
return '${participants[0].user.fullName} is in the room';
return '${participants[0].user?.fullName} is in the room';
} else if (numberOfPaticipants == 2) {
return '${participants[0].user.fullName} and ${participants[1].user.fullName} are in the room';
return '${participants[0].user?.fullName} and ${participants[1].user?.fullName} are in the room';
} else {
final int otherParticipants = numberOfPaticipants - 2;
final String participantList = participants
.sublist(0, 2)
.map<String>((participant) => participant.user.fullName)
.map<String>((participant) => participant.user?.fullName ?? "")
.join(', ');
return '$participantList and $otherParticipants others are in the room';
}
Expand Down
22 changes: 17 additions & 5 deletions lib/types/models/message_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import 'dart:convert';

import 'package:waterbus_sdk/types/index.dart';
import 'package:waterbus_sdk/types/models/message_status_enum.dart';
import 'package:waterbus_sdk/types/models/sending_status_enum.dart';

class MessageModel {
final int id;
String data;
final int meeting;
final User? createdBy;
SendingStatusEnum sendingStatus;
MessageStatusEnum status;
final int type;
final DateTime createdAt;
Expand All @@ -19,7 +21,8 @@ class MessageModel {
required this.data,
required this.meeting,
required this.createdBy,
this.status = MessageStatusEnum.sent,
this.sendingStatus = SendingStatusEnum.sent,
required this.status,
required this.type,
required this.createdAt,
required this.updatedAt,
Expand All @@ -30,6 +33,7 @@ class MessageModel {
String? data,
int? meeting,
User? createdBy,
SendingStatusEnum? sendingStatus,
MessageStatusEnum? status,
int? type,
DateTime? createdAt,
Expand All @@ -40,6 +44,7 @@ class MessageModel {
data: data ?? this.data,
meeting: meeting ?? this.meeting,
createdBy: createdBy ?? this.createdBy,
sendingStatus: sendingStatus ?? this.sendingStatus,
status: status ?? this.status,
type: type ?? this.type,
createdAt: createdAt ?? this.createdAt,
Expand All @@ -53,7 +58,8 @@ class MessageModel {
'data': data,
'meeting': meeting,
'createdBy': createdBy,
'status': status,
'sendingStatus': sendingStatus.status,
'status': status.status,
'type': type,
'createdAt': createdAt.toString(),
'updatedAt': updatedAt.toString(),
Expand All @@ -68,6 +74,8 @@ class MessageModel {
? map['meeting']['id']
: map['meeting']) ??
0,
status:
(int.tryParse(map['status']?.toString() ?? "") ?? 0).getMessageStatus,
createdBy:
map['createdBy'] != null && map['createdBy'] is Map<String, dynamic>
? User.fromMap(map['createdBy'])
Expand All @@ -83,6 +91,8 @@ class MessageModel {
factory MessageModel.fromMapSocket(Map<String, dynamic> map) {
return MessageModel(
id: map['id'] ?? 0,
status:
(int.tryParse(map['status']?.toString() ?? "") ?? 0).getMessageStatus,
data: map['data'] ?? "",
meeting: (map['meeting'] is Map<String, dynamic>
? map['meeting']['id']
Expand All @@ -109,7 +119,7 @@ class MessageModel {

@override
String toString() {
return 'MessageModel(id: $id, data: $data, meeting: $meeting, type: $type, createdAt: $createdAt, updatedAt: $updatedAt, createdBy: $createdBy, status: $status)';
return 'MessageModel(id: $id, data: $data, meeting: $meeting, type: $type, createdAt: $createdAt, updatedAt: $updatedAt, createdBy: $createdBy, status: $sendingStatus)';
}

@override
Expand All @@ -123,7 +133,7 @@ class MessageModel {
other.type == type &&
other.updatedAt == updatedAt &&
other.createdAt == createdAt &&
other.status == status;
other.sendingStatus == sendingStatus;
}

@override
Expand All @@ -135,6 +145,8 @@ class MessageModel {
type.hashCode ^
updatedAt.hashCode ^
createdAt.hashCode ^
status.hashCode;
sendingStatus.hashCode;
}

bool get isDeleted => status == MessageStatusEnum.inactive;
}
10 changes: 10 additions & 0 deletions lib/types/models/message_socket_event.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
enum MessageEventEnum { create, update, delete }

class MessageSocketEvent {
final MessageEventEnum event;
final Map<String, dynamic> data;
MessageSocketEvent({
required this.event,
required this.data,
});
}
7 changes: 3 additions & 4 deletions lib/types/models/message_status_enum.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
enum MessageStatusEnum {
error(-1),
sending(0),
sent(1);
inactive(1),
active(0);

const MessageStatusEnum(this.status);

Expand All @@ -13,7 +12,7 @@ extension MessageStatusEnumX on int {
final int index =
MessageStatusEnum.values.indexWhere((status) => status.status == this);

if (index == -1) return MessageStatusEnum.sending;
if (index == -1) return MessageStatusEnum.inactive;

return MessageStatusEnum.values[index];
}
Expand Down
14 changes: 6 additions & 8 deletions lib/types/models/participant_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import 'package:waterbus_sdk/types/models/user_model.dart';

class Participant extends Equatable {
final int id;
final User user;
final User? user;
final bool isMe;
const Participant({
required this.id,
Expand All @@ -31,15 +31,17 @@ class Participant extends Equatable {
Map<String, dynamic> toMap() {
return <String, dynamic>{
'id': id,
'user': user.toMap(),
'user': user?.toMap(),
'isMe': isMe,
};
}

factory Participant.fromMap(Map<String, dynamic> map) {
return Participant(
id: map['id'] as int,
user: User.fromMap(map['user'] as Map<String, dynamic>),
user: map['user'] != null && map['user'] is Map<String, dynamic>
? User.fromMap(map['user'])
: null,
isMe: map['isMe'] ?? false,
);
}
Expand All @@ -64,10 +66,6 @@ class Participant extends Equatable {

@override
List<Object> get props {
return [
id,
user,
isMe,
];
return [id, isMe];
}
}
Loading

0 comments on commit 6ff288d

Please sign in to comment.