mirror of
				https://github.com/vector-im/element-web.git
				synced 2025-10-31 16:21:46 +01:00 
			
		
		
		
	Refactoring and fixes
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
This commit is contained in:
		
							parent
							
								
									3bf28e3a6b
								
							
						
					
					
						commit
						521b2445a8
					
				| @ -14,7 +14,6 @@ See the License for the specific language governing permissions and | |||||||
| limitations under the License. | limitations under the License. | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| import { EventType } from "matrix-js-sdk/src/@types/event"; | import { EventType } from "matrix-js-sdk/src/@types/event"; | ||||||
| import { MatrixEvent } from "matrix-js-sdk/src/models/event"; | import { MatrixEvent } from "matrix-js-sdk/src/models/event"; | ||||||
| import { CallEvent, CallState, CallType, MatrixCall } from "matrix-js-sdk/src/webrtc/call"; | import { CallEvent, CallState, CallType, MatrixCall } from "matrix-js-sdk/src/webrtc/call"; | ||||||
| @ -38,9 +37,9 @@ export enum CustomCallState { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export default class CallEventGrouper extends EventEmitter { | export default class CallEventGrouper extends EventEmitter { | ||||||
|     events: Set<MatrixEvent> = new Set<MatrixEvent>(); |     private events: Set<MatrixEvent> = new Set<MatrixEvent>(); | ||||||
|     call: MatrixCall; |     private call: MatrixCall; | ||||||
|     state: CallState | CustomCallState; |     public state: CallState | CustomCallState; | ||||||
| 
 | 
 | ||||||
|     constructor() { |     constructor() { | ||||||
|         super(); |         super(); | ||||||
| @ -52,6 +51,30 @@ export default class CallEventGrouper extends EventEmitter { | |||||||
|         return [...this.events].find((event) => event.getType() === EventType.CallInvite); |         return [...this.events].find((event) => event.getType() === EventType.CallInvite); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     private get hangup(): MatrixEvent { | ||||||
|  |         return [...this.events].find((event) => event.getType() === EventType.CallHangup); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public get isVoice(): boolean { | ||||||
|  |         const invite = this.invite; | ||||||
|  |         if (!invite) return; | ||||||
|  | 
 | ||||||
|  |         // FIXME: Find a better way to determine this from the event?
 | ||||||
|  |         if (invite.getContent()?.offer?.sdp?.indexOf('m=video') !== -1) return false; | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public get hangupReason(): string | null { | ||||||
|  |         return this.hangup?.getContent()?.reason; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Returns true if there are only events from the other side - we missed the call | ||||||
|  |      */ | ||||||
|  |     private get callWasMissed(): boolean { | ||||||
|  |         return ![...this.events].some((event) => event.sender?.userId === MatrixClientPeg.get().getUserId()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public answerCall = () => { |     public answerCall = () => { | ||||||
|         this.call?.answer(); |         this.call?.answer(); | ||||||
|     } |     } | ||||||
| @ -68,35 +91,6 @@ export default class CallEventGrouper extends EventEmitter { | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public isVoice(): boolean { |  | ||||||
|         const invite = this.invite; |  | ||||||
| 
 |  | ||||||
|         // FIXME: Find a better way to determine this from the event?
 |  | ||||||
|         let isVoice = true; |  | ||||||
|         if ( |  | ||||||
|             invite.getContent().offer && invite.getContent().offer.sdp && |  | ||||||
|             invite.getContent().offer.sdp.indexOf('m=video') !== -1 |  | ||||||
|         ) { |  | ||||||
|             isVoice = false; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return isVoice; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public getState(): CallState | CustomCallState { |  | ||||||
|         return this.state; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public getHangupReason(): string | null { |  | ||||||
|         return [...this.events].find((event) => event.getType() === EventType.CallHangup)?.getContent()?.reason; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Returns true if there are only events from the other side - we missed the call |  | ||||||
|      */ |  | ||||||
|     private wasThisCallMissed(): boolean { |  | ||||||
|         return ![...this.events].some((event) => event.sender?.userId === MatrixClientPeg.get().getUserId()); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     private setCallListeners() { |     private setCallListeners() { | ||||||
|         if (!this.call) return; |         if (!this.call) return; | ||||||
| @ -110,7 +104,7 @@ export default class CallEventGrouper extends EventEmitter { | |||||||
|             const lastEvent = [...this.events][this.events.size - 1]; |             const lastEvent = [...this.events][this.events.size - 1]; | ||||||
|             const lastEventType = lastEvent.getType(); |             const lastEventType = lastEvent.getType(); | ||||||
| 
 | 
 | ||||||
|             if (this.wasThisCallMissed()) this.state = CustomCallState.Missed; |             if (this.callWasMissed) this.state = CustomCallState.Missed; | ||||||
|             else if (lastEventType === EventType.CallHangup) this.state = CallState.Ended; |             else if (lastEventType === EventType.CallHangup) this.state = CallState.Ended; | ||||||
|             else if (lastEventType === EventType.CallReject) this.state = CallState.Ended; |             else if (lastEventType === EventType.CallReject) this.state = CallState.Ended; | ||||||
|             else if (lastEventType === EventType.CallInvite && this.call) this.state = CallState.Connecting; |             else if (lastEventType === EventType.CallInvite && this.call) this.state = CallState.Connecting; | ||||||
| @ -119,16 +113,16 @@ export default class CallEventGrouper extends EventEmitter { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private setCall = () => { |     private setCall = () => { | ||||||
|  |         if (this.call) return; | ||||||
|  | 
 | ||||||
|         const callId = [...this.events][0].getContent().call_id; |         const callId = [...this.events][0].getContent().call_id; | ||||||
|         if (!this.call) { |         this.call = CallHandler.sharedInstance().getCallById(callId); | ||||||
|             this.call = CallHandler.sharedInstance().getCallById(callId); |         this.setCallListeners(); | ||||||
|             this.setCallListeners(); |  | ||||||
|         } |  | ||||||
|         this.setState(); |         this.setState(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public add(event: MatrixEvent) { |     public add(event: MatrixEvent) { | ||||||
|         this.events.add(event); |         this.events.add(event); | ||||||
|         this.setState(); |         this.setCall(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -43,7 +43,7 @@ export default class CallEvent extends React.Component<IProps, IState> { | |||||||
|         super(props); |         super(props); | ||||||
| 
 | 
 | ||||||
|         this.state = { |         this.state = { | ||||||
|             callState: this.props.callEventGrouper.getState(), |             callState: this.props.callEventGrouper.state, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -77,7 +77,7 @@ export default class CallEvent extends React.Component<IProps, IState> { | |||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
|         if (state === CallState.Ended) { |         if (state === CallState.Ended) { | ||||||
|             const hangupReason = this.props.callEventGrouper.getHangupReason(); |             const hangupReason = this.props.callEventGrouper.hangupReason; | ||||||
| 
 | 
 | ||||||
|             if (["user_hangup", "user hangup"].includes(hangupReason) || !hangupReason) { |             if (["user_hangup", "user hangup"].includes(hangupReason) || !hangupReason) { | ||||||
|                 // workaround for https://github.com/vector-im/element-web/issues/5178
 |                 // workaround for https://github.com/vector-im/element-web/issues/5178
 | ||||||
| @ -157,7 +157,7 @@ export default class CallEvent extends React.Component<IProps, IState> { | |||||||
|     render() { |     render() { | ||||||
|         const event = this.props.mxEvent; |         const event = this.props.mxEvent; | ||||||
|         const sender = event.sender ? event.sender.name : event.getSender(); |         const sender = event.sender ? event.sender.name : event.getSender(); | ||||||
|         const callType = this.props.callEventGrouper.isVoice() ? _t("Voice call") : _t("Video call"); |         const callType = this.props.callEventGrouper.isVoice ? _t("Voice call") : _t("Video call"); | ||||||
|         const content = this.renderContent(this.state.callState); |         const content = this.renderContent(this.state.callState); | ||||||
| 
 | 
 | ||||||
|         return ( |         return ( | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user