updating carousel dismiss mechanism

This commit is contained in:
Roland Osborne 2022-10-17 13:11:24 -07:00
parent 9c8d76226b
commit 0591ed6170
7 changed files with 52 additions and 9 deletions

View File

@ -27,11 +27,11 @@ export function TopicItem({ item, focused, focus }) {
<ImageAsset topicId={item.topicId} asset={asset.item.image} dismiss={actions.hideCarousel} /> <ImageAsset topicId={item.topicId} asset={asset.item.image} dismiss={actions.hideCarousel} />
)} )}
{ asset.item.video && ( { asset.item.video && (
<VideoAsset topicId={item.topicId} asset={asset.item.video} /> <VideoAsset topicId={item.topicId} asset={asset.item.video} dismiss={actions.hideCarousel} />
)} )}
{ asset.item.audio && ( { asset.item.audio && (
<AudioAsset topicId={item.topicId} asset={asset.item.audio} active={state.activeId == asset.dataIndex} <AudioAsset topicId={item.topicId} asset={asset.item.audio} active={state.activeId == asset.dataIndex}
setActive={() => actions.setActive(asset.dataIndex)} /> setActive={() => actions.setActive(asset.dataIndex)} dismiss={actions.hideCarousel} />
)} )}
</View> </View>
) )

View File

@ -5,7 +5,7 @@ import { styles } from './AudioAsset.styled';
import audio from 'images/audio.png'; import audio from 'images/audio.png';
import Icons from '@expo/vector-icons/MaterialCommunityIcons'; import Icons from '@expo/vector-icons/MaterialCommunityIcons';
export function AudioAsset({ topicId, asset, active, setActive }) { export function AudioAsset({ topicId, asset, active, setActive, dismiss }) {
const { state, actions } = useAudioAsset(topicId, asset); const { state, actions } = useAudioAsset(topicId, asset);
@ -28,6 +28,9 @@ export function AudioAsset({ topicId, asset, active, setActive }) {
<Icons name="play-circle-outline" size={92} color={Colors.white} /> <Icons name="play-circle-outline" size={92} color={Colors.white} />
</TouchableOpacity> </TouchableOpacity>
)} )}
<TouchableOpacity style={styles.close} onPress={dismiss}>
<Icons name="close" size={24} color={Colors.white} />
</TouchableOpacity>
</View> </View>
); );
} }

View File

@ -15,9 +15,16 @@ export const styles = StyleSheet.create({
fontSize: 20, fontSize: 20,
paddingTop: 8, paddingTop: 8,
top: 0, top: 0,
paddingLeft: 20,
paddingRight: 20,
}, },
control: { control: {
position: 'absolute', position: 'absolute',
} },
close: {
position: 'absolute',
top: 0,
right: 0,
},
}) })

View File

@ -7,7 +7,7 @@ export function ImageAsset({ topicId, asset, dismiss }) {
const { state, actions } = useImageAsset(topicId, asset); const { state, actions } = useImageAsset(topicId, asset);
return ( return (
<TouchableOpacity onPress={dismiss}> <TouchableOpacity activeOpacity={1} onPress={dismiss}>
<Image source={{ uri: state.url }} style={{ borderRadius: 4, width: state.imageWidth, height: state.imageHeight }} resizeMode={'cover'} /> <Image source={{ uri: state.url }} style={{ borderRadius: 4, width: state.imageWidth, height: state.imageHeight }} resizeMode={'cover'} />
</TouchableOpacity> </TouchableOpacity>
); );

View File

@ -2,19 +2,27 @@ import { Image, View, TouchableOpacity } from 'react-native';
import Colors from 'constants/Colors'; import Colors from 'constants/Colors';
import { Video, AVPlaybackStatus } from 'expo-av'; import { Video, AVPlaybackStatus } from 'expo-av';
import { useVideoAsset } from './useVideoAsset.hook'; import { useVideoAsset } from './useVideoAsset.hook';
import GestureRecognizer from 'react-native-swipe-gestures';
import { styles } from './VideoAsset.styled';
import Icons from '@expo/vector-icons/MaterialCommunityIcons';
export function VideoAsset({ topicId, asset }) { export function VideoAsset({ topicId, asset, dismiss }) {
const { state, actions } = useVideoAsset(topicId, asset); const { state, actions } = useVideoAsset(topicId, asset);
return ( return (
<> <TouchableOpacity activeOpacity={1} onPress={actions.showClose}>
{ state.url && ( { state.url && (
<Video source={{ uri: state.url }} style={{ width: state.width, height: state.height }} resizeMode={'cover'} <Video source={{ uri: state.url }} style={{ width: state.width, height: state.height }} resizeMode={'cover'}
onReadyForDisplay={(e) => actions.setResolution(e.naturalSize.width, e.naturalSize.height)} onReadyForDisplay={(e) => actions.setResolution(e.naturalSize.width, e.naturalSize.height)}
useNativeControls={state.controls} resizeMode="contain" /> useNativeControls={state.controls} resizeMode="contain" />
)} )}
</> { state.closing && (
<TouchableOpacity style={styles.close} onPress={dismiss}>
<Icons name="close" size={24} color={Colors.white} />
</TouchableOpacity>
)}
</TouchableOpacity>
); );
} }

View File

@ -0,0 +1,16 @@
import { StyleSheet } from 'react-native';
import { Colors } from 'constants/Colors';
export const styles = StyleSheet.create({
close: {
backgroundColor: 'rgba(0, 0, 0, 0.6)',
position: 'absolute',
alignSelf: 'center',
justifySelf: 'center',
borderBottomLeftRadius: 4,
borderBottomRightRadius: 4,
paddingLeft: 4,
paddingRight: 4,
},
})

View File

@ -13,8 +13,10 @@ export function useVideoAsset(topicId, asset) {
weight: 1, weight: 1,
url: null, url: null,
controls: false, controls: false,
closing: false,
}); });
const closing = useRef(null);
const conversation = useContext(ConversationContext); const conversation = useContext(ConversationContext);
const dimensions = useWindowDimensions(); const dimensions = useWindowDimensions();
@ -50,7 +52,14 @@ export function useVideoAsset(topicId, asset) {
const actions = { const actions = {
setResolution: (width, height) => { setResolution: (width, height) => {
updateState({ controls: true, videoRatio: width / height }); updateState({ controls: true, videoRatio: width / height });
} },
showClose: () => {
clearTimeout(closing.current);
updateState({ closing: true });
closing.current = setTimeout(() => {
updateState({ closing: false });
}, 2000);
},
}; };
return { state, actions }; return { state, actions };