Add TWP Softphone Flutter app and complete mobile backend API
All checks were successful
Create Release / build (push) Successful in 4s
All checks were successful
Create Release / build (push) Successful in 4s
Backend: Add /voice/token endpoint with AccessToken + VoiceGrant for mobile VoIP, implement unhold_call() with call leg detection, wire FCM push notifications into call queue and webhook missed call handlers, add data-only FCM message support for Android background wake, and add Twilio API Key / Push Credential settings fields. Flutter app: Full softphone with Twilio Voice SDK integration, JWT auth with auto-refresh, SSE real-time queue updates, FCM push notifications, Material 3 UI with dashboard, active call screen, dialpad, and call controls (mute/speaker/hold/transfer). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
46
mobile/lib/models/call_info.dart
Normal file
46
mobile/lib/models/call_info.dart
Normal file
@@ -0,0 +1,46 @@
|
||||
enum CallState { idle, ringing, connecting, connected, disconnected }
|
||||
|
||||
class CallInfo {
|
||||
final CallState state;
|
||||
final String? callSid;
|
||||
final String? callerNumber;
|
||||
final Duration duration;
|
||||
final bool isMuted;
|
||||
final bool isSpeakerOn;
|
||||
final bool isOnHold;
|
||||
|
||||
const CallInfo({
|
||||
this.state = CallState.idle,
|
||||
this.callSid,
|
||||
this.callerNumber,
|
||||
this.duration = Duration.zero,
|
||||
this.isMuted = false,
|
||||
this.isSpeakerOn = false,
|
||||
this.isOnHold = false,
|
||||
});
|
||||
|
||||
CallInfo copyWith({
|
||||
CallState? state,
|
||||
String? callSid,
|
||||
String? callerNumber,
|
||||
Duration? duration,
|
||||
bool? isMuted,
|
||||
bool? isSpeakerOn,
|
||||
bool? isOnHold,
|
||||
}) {
|
||||
return CallInfo(
|
||||
state: state ?? this.state,
|
||||
callSid: callSid ?? this.callSid,
|
||||
callerNumber: callerNumber ?? this.callerNumber,
|
||||
duration: duration ?? this.duration,
|
||||
isMuted: isMuted ?? this.isMuted,
|
||||
isSpeakerOn: isSpeakerOn ?? this.isSpeakerOn,
|
||||
isOnHold: isOnHold ?? this.isOnHold,
|
||||
);
|
||||
}
|
||||
|
||||
bool get isActive =>
|
||||
state == CallState.ringing ||
|
||||
state == CallState.connecting ||
|
||||
state == CallState.connected;
|
||||
}
|
||||
Reference in New Issue
Block a user