react-native-call-keeper
Version:
A React Native module for handling VoIP calls with CallKit (iOS) and ConnectionService (Android) support. Compatible with the New Architecture and Expo.
97 lines (79 loc) • 2.32 kB
JavaScript
const {
withInfoPlist,
withAndroidManifest,
createRunOncePlugin,
} = require('@expo/config-plugins');
/**
* Add CallKit background mode to iOS Info.plist
*/
function withCallKitBackground(config) {
return withInfoPlist(config, (config) => {
if (!config.modResults.UIBackgroundModes) {
config.modResults.UIBackgroundModes = [];
}
const backgroundModes = config.modResults.UIBackgroundModes;
if (!backgroundModes.includes('voip')) {
backgroundModes.push('voip');
}
if (!backgroundModes.includes('audio')) {
backgroundModes.push('audio');
}
return config;
});
}
/**
* Add required permissions to AndroidManifest.xml
*/
function withCallKeeperPermissions(config) {
return withAndroidManifest(config, (config) => {
const androidManifest = config.modResults.manifest;
// Ensure application tag exists
if (!androidManifest.application) {
androidManifest.application = [{}];
}
// Ensure uses-permission array exists
if (!androidManifest['uses-permission']) {
androidManifest['uses-permission'] = [];
}
const permissions = [
'android.permission.BIND_TELECOM_CONNECTION_SERVICE',
'android.permission.FOREGROUND_SERVICE',
'android.permission.READ_PHONE_STATE',
'android.permission.CALL_PHONE',
'android.permission.RECORD_AUDIO',
'android.permission.WAKE_LOCK',
'android.permission.READ_CALL_LOG',
'android.permission.WRITE_CALL_LOG',
'android.permission.MANAGE_OWN_CALLS',
];
// Add permissions if they don't exist
permissions.forEach((permission) => {
const hasPermission = androidManifest['uses-permission'].some(
(p) => p.$['android:name'] === permission
);
if (!hasPermission) {
androidManifest['uses-permission'].push({
$: {
'android:name': permission,
},
});
}
});
return config;
});
}
/**
* Main plugin function
*/
function withCallKeeper(config, props = {}) {
// Apply iOS modifications
config = withCallKitBackground(config);
// Apply Android modifications
config = withCallKeeperPermissions(config);
return config;
}
module.exports = createRunOncePlugin(
withCallKeeper,
'react-native-call-keeper',
'1.0.0'
);