fix(android): phone-call

This commit is contained in:
devthejo 2025-10-23 22:51:25 +02:00
parent 54083205f0
commit 52fc3bc24b
No known key found for this signature in database
GPG key ID: 00CCA7A92B1D5351

View file

@ -1,20 +1,75 @@
import { Platform, Linking } from "react-native"; import { Platform, Linking, PermissionsAndroid } from "react-native";
import RNImmediatePhoneCall from "react-native-immediate-phone-call"; import RNImmediatePhoneCall from "react-native-immediate-phone-call";
export function phoneCallEmergency() { export async function phoneCallEmergency() {
const emergencyNumber = "112"; const emergencyNumber = "112";
if (Platform.OS === "ios") { if (Platform.OS === "ios") {
// Use telprompt URL scheme on iOS try {
Linking.openURL(`telprompt:${emergencyNumber}`).catch((err) => { // Prefer telprompt on iOS for immediate prompt, fallback to tel
console.error("Error opening phone dialer:", err); await Linking.openURL(`telprompt:${emergencyNumber}`);
// Fallback to regular tel: if telprompt fails } catch (err) {
Linking.openURL(`tel:${emergencyNumber}`).catch((err) => { console.error("Error opening phone dialer (iOS telprompt):", err);
console.error("Error opening phone dialer (fallback):", err); try {
}); await Linking.openURL(`tel:${emergencyNumber}`);
}); } catch (err2) {
} else { console.error("Error opening phone dialer (iOS tel fallback):", err2);
// Use RNImmediatePhoneCall on Android }
RNImmediatePhoneCall.immediatePhoneCall(emergencyNumber); }
return;
}
// Android: request CALL_PHONE upfront and provide deterministic fallback
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CALL_PHONE,
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
// Try immediate call, but arm a short fallback timer in case the OS/OEM ignores ACTION_CALL
let fallbackTriggered = false;
const triggerFallback = async () => {
if (fallbackTriggered) return;
fallbackTriggered = true;
try {
await Linking.openURL(`tel:${emergencyNumber}`);
} catch (e) {
console.error("Fallback to dialer failed:", e);
}
};
// Fire fallback after ~1.2s if nothing happens
const timer = setTimeout(triggerFallback, 1200);
try {
RNImmediatePhoneCall.immediatePhoneCall(emergencyNumber);
} catch (callErr) {
// If native throws synchronously, cancel timer and fallback immediately
clearTimeout(timer);
await triggerFallback();
return;
}
// Give a little extra time; if no fallback was needed, clear the timer
setTimeout(() => {
if (!fallbackTriggered) clearTimeout(timer);
}, 3000);
} else {
// Permission denied or never-ask-again: open dialer prompt
try {
await Linking.openURL(`tel:${emergencyNumber}`);
} catch (err) {
console.error("Permission denied; dialer fallback failed:", err);
}
}
} catch (err) {
console.error("CALL_PHONE permission request failed:", err);
// Last resort: open dialer
try {
await Linking.openURL(`tel:${emergencyNumber}`);
} catch (err2) {
console.error("Dialer fallback failed after permission error:", err2);
}
} }
} }