mirror of
https://github.com/balzack/databag.git
synced 2025-02-12 03:29:16 +00:00
added ringing modal to mobile
This commit is contained in:
parent
cd06333ccb
commit
ee474b5f73
@ -571,7 +571,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
@ -643,7 +643,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { checkResponse, fetchWithTimeout } from './fetchUtil';
|
import { checkResponse, fetchWithTimeout } from './fetchUtil';
|
||||||
|
|
||||||
export async function removeContactCall(server, token, calllId) {
|
export async function removeContactCall(server, token, callId) {
|
||||||
const call = await fetchWithTimeout(`https://${server}/talk/calls/${callId}?contact=${token}`, { method: 'DELETE' });
|
const call = await fetchWithTimeout(`https://${server}/talk/calls/${callId}?contact=${token}`, { method: 'DELETE' });
|
||||||
checkResponse(call);
|
checkResponse(call);
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ export function useRingContext() {
|
|||||||
updateState({ ringing: ringing.current });
|
updateState({ ringing: ringing.current });
|
||||||
}, EXPIRE);
|
}, EXPIRE);
|
||||||
},
|
},
|
||||||
ignore: (cardId, callId) => {
|
ignore: async (cardId, callId) => {
|
||||||
const key = `${cardId}:${callId}`
|
const key = `${cardId}:${callId}`
|
||||||
const call = ringing.current.get(key);
|
const call = ringing.current.get(key);
|
||||||
if (call) {
|
if (call) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { View, ScrollView, TouchableOpacity, StatusBar, Text, Image } from 'react-native';
|
import { View, ScrollView, TouchableOpacity, StatusBar, Text, Image, Modal } from 'react-native';
|
||||||
import { useState, useEffect, useContext } from 'react';
|
import { useState, useEffect, useContext } from 'react';
|
||||||
import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
|
import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
|
||||||
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
||||||
@ -6,6 +6,7 @@ import { createDrawerNavigator } from '@react-navigation/drawer';
|
|||||||
import { createStackNavigator } from '@react-navigation/stack';
|
import { createStackNavigator } from '@react-navigation/stack';
|
||||||
import { NavigationContainer } from '@react-navigation/native';
|
import { NavigationContainer } from '@react-navigation/native';
|
||||||
import Ionicons from 'react-native-vector-icons/AntDesign';
|
import Ionicons from 'react-native-vector-icons/AntDesign';
|
||||||
|
import MatIcons from 'react-native-vector-icons/MaterialCommunityIcons';
|
||||||
import { useSession } from './useSession.hook';
|
import { useSession } from './useSession.hook';
|
||||||
import { styles } from './Session.styled';
|
import { styles } from './Session.styled';
|
||||||
import Colors from 'constants/Colors';
|
import Colors from 'constants/Colors';
|
||||||
@ -22,6 +23,7 @@ import { ConversationContext } from 'context/ConversationContext';
|
|||||||
import { ProfileContext } from 'context/ProfileContext';
|
import { ProfileContext } from 'context/ProfileContext';
|
||||||
import { ProfileIcon } from './profileIcon/ProfileIcon';
|
import { ProfileIcon } from './profileIcon/ProfileIcon';
|
||||||
import { CardsIcon } from './cardsIcon/CardsIcon';
|
import { CardsIcon } from './cardsIcon/CardsIcon';
|
||||||
|
import { Logo } from 'utils/Logo';
|
||||||
import splash from 'images/session.png';
|
import splash from 'images/session.png';
|
||||||
|
|
||||||
const ConversationStack = createStackNavigator();
|
const ConversationStack = createStackNavigator();
|
||||||
@ -159,6 +161,7 @@ function ContactStackScreen() {
|
|||||||
|
|
||||||
export function Session() {
|
export function Session() {
|
||||||
|
|
||||||
|
const [ringing, setRinging] = useState([]);
|
||||||
const { state, actions } = useSession();
|
const { state, actions } = useSession();
|
||||||
|
|
||||||
const drawerParams = { drawerPosition: 'right', headerShown: false, swipeEnabled: false, drawerType: 'front' };
|
const drawerParams = { drawerPosition: 'right', headerShown: false, swipeEnabled: false, drawerType: 'front' };
|
||||||
@ -310,6 +313,31 @@ export function Session() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
let incoming = [];
|
||||||
|
for (let i = 0; i < state.ringing.length; i++) {
|
||||||
|
const { img, name, handle, callId, cardId, contactNode, contactToken, calleeToken } = state.ringing[i];
|
||||||
|
const label = name ? name : `${handle}@${contactNode}`;
|
||||||
|
const key = `${cardId}:${callId}`
|
||||||
|
incoming.push(
|
||||||
|
<View key={key} style={styles.ringEntry}>
|
||||||
|
<Logo src={img} width={40} height={40} radius={4} />
|
||||||
|
<Text style={styles.ringName} numberOfLines={1} ellipsizeMode={'tail'}>{ label }</Text>
|
||||||
|
<TouchableOpacity style={styles.ringIgnore} onPress={() => actions.ignore(cardId, callId)}>
|
||||||
|
<MatIcons name={'eye-off-outline'} size={20} color={Colors.text} />
|
||||||
|
</TouchableOpacity>
|
||||||
|
<TouchableOpacity style={styles.ringDecline} onPress={() => actions.decline(cardId, contactNode, contactToken, callId)}>
|
||||||
|
<MatIcons name={'phone-hangup'} size={20} color={Colors.alert} />
|
||||||
|
</TouchableOpacity>
|
||||||
|
<TouchableOpacity style={styles.ringAccept} onPress={() => actions.accept(cardId, callId, contactNode, contactToken, calleeToken)}>
|
||||||
|
<MatIcons name={'phone'} size={20} color={Colors.primary} />
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
setRinging(incoming);
|
||||||
|
}, [state.ringing]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<NavigationContainer>
|
<NavigationContainer>
|
||||||
<View style={styles.body}>
|
<View style={styles.body}>
|
||||||
@ -379,6 +407,18 @@ export function Session() {
|
|||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
|
<Modal
|
||||||
|
animationType="fade"
|
||||||
|
transparent={true}
|
||||||
|
visible={ringing.length > 0}
|
||||||
|
supportedOrientations={['portrait', 'landscape']}
|
||||||
|
>
|
||||||
|
<View style={styles.ringBase}>
|
||||||
|
<View style={styles.ringFrame}>
|
||||||
|
{ ringing }
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Modal>
|
||||||
</NavigationContainer>
|
</NavigationContainer>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -138,5 +138,53 @@ export const styles = StyleSheet.create({
|
|||||||
fontSize: 18,
|
fontSize: 18,
|
||||||
color: Colors.tetx,
|
color: Colors.tetx,
|
||||||
},
|
},
|
||||||
|
ringBase: {
|
||||||
|
display: 'flex',
|
||||||
|
width: '100%',
|
||||||
|
height: '100%',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
backgroundColor: 'rgba(52, 52, 52, 0.8)'
|
||||||
|
},
|
||||||
|
ringFrame: {
|
||||||
|
backgroundColor: Colors.formBackground,
|
||||||
|
padding: 16,
|
||||||
|
width: '90%',
|
||||||
|
maxWidth: 400,
|
||||||
|
borderRadius: 4,
|
||||||
|
},
|
||||||
|
ringEntry: {
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
ringName: {
|
||||||
|
flexGrow: 1,
|
||||||
|
paddingLeft: 8,
|
||||||
|
paddingRight: 8,
|
||||||
|
},
|
||||||
|
ringIgnore: {
|
||||||
|
borderWidth: 1,
|
||||||
|
borderRadius: 20,
|
||||||
|
borderColor: Colors.text,
|
||||||
|
padding: 6,
|
||||||
|
marginRight: 4,
|
||||||
|
},
|
||||||
|
ringDecline: {
|
||||||
|
borderWidth: 1,
|
||||||
|
borderRadius: 20,
|
||||||
|
borderColor: Colors.alert,
|
||||||
|
padding: 6,
|
||||||
|
marginLeft: 8,
|
||||||
|
marginRight: 8,
|
||||||
|
},
|
||||||
|
ringAccept: {
|
||||||
|
borderWidth: 1,
|
||||||
|
borderRadius: 20,
|
||||||
|
borderColor: Colors.primary,
|
||||||
|
padding: 6,
|
||||||
|
marginLeft: 4,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -3,10 +3,13 @@ import { useWindowDimensions } from 'react-native';
|
|||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import config from 'constants/Config';
|
import config from 'constants/Config';
|
||||||
import { StoreContext } from 'context/StoreContext';
|
import { StoreContext } from 'context/StoreContext';
|
||||||
|
import { CardContext } from 'context/CardContext';
|
||||||
|
import { RingContext } from 'context/RingContext';
|
||||||
|
|
||||||
export function useSession() {
|
export function useSession() {
|
||||||
|
|
||||||
const [state, setState] = useState({
|
const [state, setState] = useState({
|
||||||
|
ringing: [],
|
||||||
tabbled: null,
|
tabbled: null,
|
||||||
subWidth: '50%',
|
subWidth: '50%',
|
||||||
baseWidth: '50%',
|
baseWidth: '50%',
|
||||||
@ -15,6 +18,8 @@ export function useSession() {
|
|||||||
firstRun: null,
|
firstRun: null,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const ring = useContext(RingContext);
|
||||||
|
const card = useContext(CardContext);
|
||||||
const store = useContext(StoreContext);
|
const store = useContext(StoreContext);
|
||||||
const dimensions = useWindowDimensions();
|
const dimensions = useWindowDimensions();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@ -24,6 +29,27 @@ export function useSession() {
|
|||||||
setState((s) => ({ ...s, ...value }));
|
setState((s) => ({ ...s, ...value }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const ringing = [];
|
||||||
|
const expired = Date.now();
|
||||||
|
ring.state.ringing.forEach(call => {
|
||||||
|
if (call.expires > expired && !call.status) {
|
||||||
|
const { callId, cardId, calleeToken } = call;
|
||||||
|
const contact = card.state.cards.get(cardId);
|
||||||
|
if (contact) {
|
||||||
|
const { imageSet, name, handle, node, guid } = contact.card?.profile || {};
|
||||||
|
const { token } = contact.card?.detail || {};
|
||||||
|
const contactToken = `${guid}.${token}`;
|
||||||
|
const img = imageSet ? card.actions.getCardImageUrl(cardId) : null;
|
||||||
|
ringing.push({ cardId, img, name, handle, contactNode: node, callId, contactToken, calleeToken });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const { callStatus, localStream, localVideo, localAudio, remoteStream, remoteVideo, remoteAudio } = ring.state;
|
||||||
|
updateState({ ringing, callStatus, localStream, localVideo, localAudio, remoteStream, remoteVideo, remoteAudio });
|
||||||
|
}, [ring.state]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
checkFirstRun();
|
checkFirstRun();
|
||||||
}, []);
|
}, []);
|
||||||
@ -55,6 +81,16 @@ export function useSession() {
|
|||||||
updateState({ firstRun: false });
|
updateState({ firstRun: false });
|
||||||
store.actions.setFirstRun();
|
store.actions.setFirstRun();
|
||||||
},
|
},
|
||||||
|
ignore: async (cardId, callId) => {
|
||||||
|
await ring.actions.ignore(cardId, callId);
|
||||||
|
},
|
||||||
|
decline: async (cardId, contactNode, contactToken, callId) => {
|
||||||
|
await ring.actions.decline(cardId, contactNode, contactToken, callId);
|
||||||
|
},
|
||||||
|
accept: async (cardId, callId, contactNode, contactToken, calleeToken) => {
|
||||||
|
await ring.actions.accept(cardId, callId, contactNode, contactToken, calleeToken);
|
||||||
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return { state, actions };
|
return { state, actions };
|
||||||
|
Loading…
Reference in New Issue
Block a user