Transform CallProvider into 'CallManager' hook, review WebSocket messages for calls

- These changes allowed to remove more cascading effects. It is now possible to reactivate StrictMode. Downside is we lost the 'optional context' of CallProvider: the call logic will be loaded even if there is no call.
- The WebSocket messages have been changed so the client does not have to know the conversation members before a call. Previously, the client had to fetch the conversation members for a call, which was causing cascading effects.
- Accidentally, moving the handling of conversation members to the server added some logic for calls with more than two participants, but it is still not ready to work.

* CallProvider.tsx will be renamed in next commit in order to make it easier to track its file history

Change-Id: Iae711009adafce065ac3defc1c91c7ca0f37898c
diff --git a/common/src/interfaces/websocket-message.ts b/common/src/interfaces/websocket-message.ts
index b908737..f85ea5e 100644
--- a/common/src/interfaces/websocket-message.ts
+++ b/common/src/interfaces/websocket-message.ts
@@ -18,26 +18,37 @@
 import { WebSocketMessageType } from '../enums/websocket-message-type.js';
 import { IConversationRequest } from './conversation.js';
 import {
-  CallAction,
-  CallBegin,
+  CallExit,
+  CallInvite,
+  CallJoin,
   ComposingStatus,
   ConversationMessage,
   ConversationView,
   WebRtcIceCandidate,
   WebRtcSdp,
+  WithReceiver,
+  WithSender,
 } from './websocket-interfaces.js';
 
 export interface WebSocketMessageTable {
-  [WebSocketMessageType.CallAccept]: CallAction;
-  [WebSocketMessageType.CallBegin]: CallBegin;
-  [WebSocketMessageType.CallEnd]: CallAction;
   [WebSocketMessageType.ComposingStatus]: ComposingStatus;
   [WebSocketMessageType.ConversationMessage]: ConversationMessage;
   [WebSocketMessageType.ConversationRequest]: IConversationRequest;
   [WebSocketMessageType.ConversationView]: ConversationView;
-  [WebSocketMessageType.WebRtcOffer]: WebRtcSdp;
-  [WebSocketMessageType.WebRtcAnswer]: WebRtcSdp;
-  [WebSocketMessageType.WebRtcIceCandidate]: WebRtcIceCandidate;
+
+  // calls (in the order they should be sent)
+  [WebSocketMessageType.sendCallInvite]: CallInvite;
+  [WebSocketMessageType.onCallInvite]: CallInvite & WithSender;
+  [WebSocketMessageType.sendCallExit]: CallExit; // can be sent any time after invite
+  [WebSocketMessageType.onCallExit]: CallExit & WithSender;
+  [WebSocketMessageType.sendCallJoin]: CallJoin;
+  [WebSocketMessageType.onCallJoin]: CallJoin & WithSender;
+  [WebSocketMessageType.sendWebRtcOffer]: WebRtcSdp & WithReceiver;
+  [WebSocketMessageType.onWebRtcOffer]: WebRtcSdp & WithSender;
+  [WebSocketMessageType.sendWebRtcAnswer]: WebRtcSdp & WithReceiver;
+  [WebSocketMessageType.onWebRtcAnswer]: WebRtcSdp & WithSender;
+  [WebSocketMessageType.sendWebRtcIceCandidate]: WebRtcIceCandidate & WithReceiver;
+  [WebSocketMessageType.onWebRtcIceCandidate]: WebRtcIceCandidate & WithSender;
 }
 
 export interface WebSocketMessage<T extends WebSocketMessageType> {