You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudsolutions-atoms/lib/modules/cx_module/chat/model/call_session.dart

101 lines
2.7 KiB
Dart

/// Call session data model for audio/video calling
/// Stores all information about an active call
enum CallType { audio, video }
enum CallDirection { outgoing, incoming }
enum CallStatus {
idle,
checkingPermissions,
outgoingRinging,
incomingRinging,
connecting,
connected,
ended
}
class CallSession {
final String callId;
final CallType type;
final CallDirection direction;
final String peerId; // Employee number
final String peerName;
final String? peerAvatar;
final DateTime startTime;
String? sessionId; // For SDP/ICE correlation
String? sdpOffer;
String? sdpAnswer;
CallSession({
required this.callId,
required this.type,
required this.direction,
required this.peerId,
required this.peerName,
this.peerAvatar,
required this.startTime,
this.sessionId,
this.sdpOffer,
this.sdpAnswer,
});
Map<String, dynamic> toJson() => {
'callId': callId,
'type': type.name,
'direction': direction.name,
'peerId': peerId,
'peerName': peerName,
'peerAvatar': peerAvatar,
'startTime': startTime.toIso8601String(),
'sessionId': sessionId,
'sdpOffer': sdpOffer,
'sdpAnswer': sdpAnswer,
};
factory CallSession.fromJson(Map<String, dynamic> json) => CallSession(
callId: json['callId'],
type: CallType.values.firstWhere((e) => e.name == json['type']),
direction: CallDirection.values.firstWhere((e) => e.name == json['direction']),
peerId: json['peerId'],
peerName: json['peerName'],
peerAvatar: json['peerAvatar'],
startTime: DateTime.parse(json['startTime']),
sessionId: json['sessionId'],
sdpOffer: json['sdpOffer'],
sdpAnswer: json['sdpAnswer'],
);
CallSession copyWith({
String? callId,
CallType? type,
CallDirection? direction,
String? peerId,
String? peerName,
String? peerAvatar,
DateTime? startTime,
String? sessionId,
String? sdpOffer,
String? sdpAnswer,
}) {
return CallSession(
callId: callId ?? this.callId,
type: type ?? this.type,
direction: direction ?? this.direction,
peerId: peerId ?? this.peerId,
peerName: peerName ?? this.peerName,
peerAvatar: peerAvatar ?? this.peerAvatar,
startTime: startTime ?? this.startTime,
sessionId: sessionId ?? this.sessionId,
sdpOffer: sdpOffer ?? this.sdpOffer,
sdpAnswer: sdpAnswer ?? this.sdpAnswer,
);
}
bool get isVideo => type == CallType.video;
bool get isAudio => type == CallType.audio;
bool get isIncoming => direction == CallDirection.incoming;
bool get isOutgoing => direction == CallDirection.outgoing;
}