mirror of
https://github.com/balzack/databag.git
synced 2025-05-05 07:55:15 +00:00
updating carousel dismiss mechanism
This commit is contained in:
parent
9c8d76226b
commit
0591ed6170
@ -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>
|
||||||
)
|
)
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
@ -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 };
|
||||||
|
Loading…
x
Reference in New Issue
Block a user