Files
upstream-mirror 1d2bfcac0c
Some checks failed
Prosody Plugin Tests / test (push) Failing after 10m11s
Close stale issues and PRs / stale (push) Failing after 1s
snapshot of https://github.com/jitsi/jitsi-meet.git @ fd1749dd28f4138aa80234fc7f311b19aaffa0e7 (2026-09-15)
2026-09-15 15:56:32 +05:00

74 lines
2.7 KiB
TypeScript

import { NativeEventEmitter, NativeModules } from 'react-native';
import { getName } from '../../app/functions.native';
/**
* Thin wrapper around Apple's CallKit functionality.
*
* In CallKit requests are performed via actions (either user or system started)
* and async events are reported via dedicated methods. This class exposes that
* functionality in the form of methods and events. One important thing to note
* is that even if an action is started by the system (because the user pressed
* the "end call" button in the CallKit view, for example) the event will be
* emitted in the same way as it would if the action originated from calling
* the "endCall" method in this class, for example.
*
* Emitted events:
* - performAnswerCallAction: The user pressed the answer button.
* - performEndCallAction: The call should be ended.
* - performSetMutedCallAction: The call muted state should change. The
* ancillary `data` object contains a `muted` attribute.
* - providerDidReset: The system has reset, all calls should be terminated.
* This event gets no associated data.
*
* All events get a `data` object with a `callUUID` property, unless stated
* otherwise.
*/
const RNCallKit = NativeModules.RNCallKit;
// Use a proxy because spreading a new arch native module silently loses its methods.
let CallKit: any;
if (RNCallKit) {
const eventEmitter = new NativeEventEmitter(RNCallKit);
const augmented: Record<string, any> = {
registerSubscriptions(context: any, delegate: any) {
RNCallKit.setProviderConfiguration({
iconTemplateImageName: 'CallKitIcon',
localizedName: getName()
});
return [
eventEmitter.addListener(
'performEndCallAction',
delegate._onPerformEndCallAction,
context),
eventEmitter.addListener(
'performSetMutedCallAction',
delegate._onPerformSetMutedCallAction,
context),
// According to CallKit's documentation, when the system resets
// we should terminate all calls. Hence, providerDidReset is
// the same to us as performEndCallAction.
eventEmitter.addListener(
'providerDidReset',
delegate._onPerformEndCallAction,
context)
];
}
};
CallKit = new Proxy(RNCallKit, {
get(target, prop, receiver) {
if (prop in augmented) {
return augmented[prop as string];
}
return Reflect.get(target, prop, receiver);
}
});
}
export default CallKit;