Compare commits

...

5 Commits

3 changed files with 48 additions and 14 deletions

View File

@@ -60,7 +60,7 @@ export function ActionAvatar(props : ActionAvatarProps) {
size={120} size={120}
radius={120} radius={120}
mx="auto" mx="auto"
bg={'#fff'} bg={avatars.length > 0 ? '#fff' : undefined}
name={props.title.trim() || props.publicKey} name={props.title.trim() || props.publicKey}
color={'initials'} color={'initials'}
src={avatars.length > 0 ? src={avatars.length > 0 ?

View File

@@ -84,6 +84,7 @@ export function CallProvider(props : CallProviderProps) {
const mutedRef = useRef<boolean>(false); const mutedRef = useRef<boolean>(false);
const soundRef = useRef<boolean>(true); const soundRef = useRef<boolean>(true);
const {sendMessage} = useDeattachedSender(); const {sendMessage} = useDeattachedSender();
const hasRemoteTrackRef = useRef<boolean>(false);
const {playSound, stopSound, stopLoopSound} = useSound(); const {playSound, stopSound, stopLoopSound} = useSound();
const {setWindowPriority} = useWindow(); const {setWindowPriority} = useWindow();
@@ -231,6 +232,18 @@ export function CallProvider(props : CallProviderProps) {
/** /**
* Нам поступает звонок * Нам поступает звонок
*/ */
if(callState != CallState.ENDED){
/**
* У нас уже есть активный звонок, отправляем сигнал другой стороне, что линия занята
*/
let busySignal = new PacketSignalPeer();
busySignal.setSrc(publicKey);
busySignal.setDst(packet.getSrc());
busySignal.setSignalType(SignalType.END_CALL_BECAUSE_BUSY);
send(busySignal);
info("Received incoming call from " + packet.getSrc() + " but we are already on a call, sent busy signal");
return;
}
setWindowPriority(true); setWindowPriority(true);
playSound("ringtone.mp3", true); playSound("ringtone.mp3", true);
setActiveCall(packet.getSrc()); setActiveCall(packet.getSrc());
@@ -293,8 +306,19 @@ export function CallProvider(props : CallProviderProps) {
setCallState(CallState.WEB_RTC_EXCHANGE); setCallState(CallState.WEB_RTC_EXCHANGE);
} }
if(signalType == SignalType.CREATE_ROOM) { if(signalType == SignalType.CREATE_ROOM) {
if(!sessionKeys){
/**
* Сервер может отправить CREATE_ROOM сигнал, даже если мы приняли звонок на другом устройстве, по этому проверяем,
* на этом ли устройстве звонок принят посредством проверки наличия сгенерированных ключей шифрования
*/
stopLoopSound();
stopSound();
end();
return;
}
/** /**
* Создана комната для обмена WebRTC потоками * Создана комната для обмена WebRTC потоками, но такое событие сервер может отправить даже если звонок
* был принят с другого устройства, по этому проверяем, наш ли звонок
*/ */
roomIdRef.current = packet.getRoomId(); roomIdRef.current = packet.getRoomId();
info("WebRTC room created with id: " + packet.getRoomId()); info("WebRTC room created with id: " + packet.getRoomId());
@@ -327,10 +351,7 @@ export function CallProvider(props : CallProviderProps) {
* WebRTC соединение установлено, звонок активен, останавливаем все остальные звуки * WebRTC соединение установлено, звонок активен, останавливаем все остальные звуки
* системы * системы
*/ */
stopLoopSound(); tryActivateCall();
stopSound();
setCallState(CallState.ACTIVE);
info("WebRTC connection established, call is active"); info("WebRTC connection established, call is active");
} }
} }
@@ -345,7 +366,8 @@ export function CallProvider(props : CallProviderProps) {
* При получении медиа-трека с другой стороны * При получении медиа-трека с другой стороны
*/ */
if(remoteAudioRef.current && event.streams[0]){ if(remoteAudioRef.current && event.streams[0]){
console.info(event.streams); hasRemoteTrackRef.current = true;
tryActivateCall();
remoteAudioRef.current.srcObject = event.streams[0]; remoteAudioRef.current.srcObject = event.streams[0];
remoteAudioRef.current.muted = !soundRef.current; remoteAudioRef.current.muted = !soundRef.current;
void remoteAudioRef.current.play().catch((e) => { void remoteAudioRef.current.play().catch((e) => {
@@ -382,6 +404,15 @@ export function CallProvider(props : CallProviderProps) {
} }
}, [activeCall, sessionKeys, duration]); }, [activeCall, sessionKeys, duration]);
const tryActivateCall = () => {
if(hasRemoteTrackRef.current && peerConnectionRef.current?.connectionState == "connected"){
stopLoopSound();
stopSound();
setCallState(CallState.ACTIVE);
info("Call is now active");
}
}
const openCallsModal = (text : string) => { const openCallsModal = (text : string) => {
modals.open({ modals.open({
centered: true, centered: true,
@@ -443,8 +474,7 @@ export function CallProvider(props : CallProviderProps) {
/** /**
* Только если звонок был активен воспроизводим звуки * Только если звонок был активен воспроизводим звуки
*/ */
stopLoopSound(); playSound("end_call.mp3");
stopSound();
} }
if (remoteAudioRef.current) { if (remoteAudioRef.current) {
remoteAudioRef.current.pause(); remoteAudioRef.current.pause();
@@ -454,7 +484,6 @@ export function CallProvider(props : CallProviderProps) {
setDuration(0); setDuration(0);
durationIntervalRef.current && clearInterval(durationIntervalRef.current); durationIntervalRef.current && clearInterval(durationIntervalRef.current);
setWindowPriority(false); setWindowPriority(false);
playSound("end_call.mp3");
peerConnectionRef.current?.close(); peerConnectionRef.current?.close();
peerConnectionRef.current = null; peerConnectionRef.current = null;
roomIdRef.current = ""; roomIdRef.current = "";
@@ -467,6 +496,8 @@ export function CallProvider(props : CallProviderProps) {
setDuration(0); setDuration(0);
setMutedState(false); setMutedState(false);
setSoundState(true); setSoundState(true);
stopLoopSound();
stopSound();
roleRef.current = null; roleRef.current = null;
} }

View File

@@ -1,8 +1,11 @@
export const APP_VERSION = "1.1.6"; export const APP_VERSION = "1.1.7";
export const CORE_MIN_REQUIRED_VERSION = "1.5.5"; export const CORE_MIN_REQUIRED_VERSION = "1.5.5";
export const RELEASE_NOTICE = ` export const RELEASE_NOTICE = `
**Обновление v1.1.6** :emoji_1f631: **Обновление v1.1.7** :emoji_1f631:
- Исправлена ошибка, из-за которой системные звуки могли продолжать проигрываться при активном звонке. - Исправлен цвет аватарки при ее отсутствии в профиле
- Исправлена ошибка при множественном выборе сообщений для их пересылки. - Исправлены встречные звонки (состояние гонки)
- Защита от принятия уже принятого звонка
- Исправление системных звуков при звонках
- Время звонка начинается с момента фактического установления соединения с собеседником, а не с момента принятия звонка
`; `;