diff --git a/app/mobile/ios/Databag.xcodeproj/project.pbxproj b/app/mobile/ios/Databag.xcodeproj/project.pbxproj index a1032b72..f897739a 100644 --- a/app/mobile/ios/Databag.xcodeproj/project.pbxproj +++ b/app/mobile/ios/Databag.xcodeproj/project.pbxproj @@ -310,7 +310,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 7; + CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_TEAM = 3P65PQ7SUR; ENABLE_BITCODE = NO; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -348,7 +348,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 7; + CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_TEAM = 3P65PQ7SUR; INFOPLIST_FILE = Databag/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Databag; diff --git a/app/mobile/src/session/conversation/topicItem/TopicItem.jsx b/app/mobile/src/session/conversation/topicItem/TopicItem.jsx index 57d98b29..079228ec 100644 --- a/app/mobile/src/session/conversation/topicItem/TopicItem.jsx +++ b/app/mobile/src/session/conversation/topicItem/TopicItem.jsx @@ -97,8 +97,7 @@ export function TopicItem({ item, focused, focus, hosting, remove, update, block )} { asset.item.audio && ( - actions.setActive(asset.dataIndex)} dismiss={actions.hideCarousel} /> + )} ) diff --git a/app/mobile/src/session/conversation/topicItem/audioAsset/AudioAsset.jsx b/app/mobile/src/session/conversation/topicItem/audioAsset/AudioAsset.jsx index 1e4cd4dd..3a45fb58 100644 --- a/app/mobile/src/session/conversation/topicItem/audioAsset/AudioAsset.jsx +++ b/app/mobile/src/session/conversation/topicItem/audioAsset/AudioAsset.jsx @@ -1,36 +1,38 @@ -import { Text, Image, View, TouchableOpacity } from 'react-native'; +import { Image, View, Text, TouchableOpacity } from 'react-native'; +import { useRef } from 'react'; import Colors from 'constants/Colors'; +import { Video, AVPlaybackStatus } from 'expo-av'; import { useAudioAsset } from './useAudioAsset.hook'; +import GestureRecognizer from 'react-native-swipe-gestures'; import { styles } from './AudioAsset.styled'; -import audio from 'images/audio.png'; import Icons from '@expo/vector-icons/MaterialCommunityIcons'; +import audio from 'images/audio.png'; -export function AudioAsset({ topicId, asset, active, setActive, dismiss }) { +export function AudioAsset({ topicId, asset, dismiss }) { const { state, actions } = useAudioAsset(topicId, asset); - const play = () => { - actions.play(); - setActive(); - } + const player = useRef(null); return ( - - + + { asset.label } - { state.playing && active && ( - - + { !state.playing && state.loaded && ( + + )} - { (!state.playing || !active) && ( - - + { state.playing && state.loaded && ( + + )} - + + ); } diff --git a/app/mobile/src/session/conversation/topicItem/audioAsset/AudioAsset.styled.js b/app/mobile/src/session/conversation/topicItem/audioAsset/AudioAsset.styled.js index f1c57c96..20df34b6 100644 --- a/app/mobile/src/session/conversation/topicItem/audioAsset/AudioAsset.styled.js +++ b/app/mobile/src/session/conversation/topicItem/audioAsset/AudioAsset.styled.js @@ -2,13 +2,19 @@ import { StyleSheet } from 'react-native'; import { Colors } from 'constants/Colors'; export const styles = StyleSheet.create({ - background: { - backgroundColor: Colors.lightgrey, - borderRadius: 4, + container: { + position: 'relative', + borderRadius: 8, + backgroundColor: Colors.formBackground, display: 'flex', alignItems: 'center', justifyContent: 'center', }, + control: { + position: 'absolute', + paddingRight: 8, + paddingTop: 4, + }, label: { position: 'absolute', textAlign: 'center', @@ -18,13 +24,17 @@ export const styles = StyleSheet.create({ paddingLeft: 20, paddingRight: 20, }, - control: { - position: 'absolute', - }, close: { position: 'absolute', top: 0, right: 0, + paddingTop: 4, + paddingBottom: 4, + paddingLeft: 8, + paddingRight: 8, + }, + player: { + display: 'none', }, }) diff --git a/app/mobile/src/session/conversation/topicItem/audioAsset/useAudioAsset.hook.js b/app/mobile/src/session/conversation/topicItem/audioAsset/useAudioAsset.hook.js index 70dfcb07..079e8766 100644 --- a/app/mobile/src/session/conversation/topicItem/audioAsset/useAudioAsset.hook.js +++ b/app/mobile/src/session/conversation/topicItem/audioAsset/useAudioAsset.hook.js @@ -2,15 +2,18 @@ import { useState, useRef, useEffect, useContext } from 'react'; import { ConversationContext } from 'context/ConversationContext'; import { Image } from 'react-native'; import { useWindowDimensions } from 'react-native'; -import SoundPlayer from 'react-native-sound-player' export function useAudioAsset(topicId, asset) { const [state, setState] = useState({ - length: null, + width: 1, + height: 1, + url: null, playing: false, + loaded: false, }); + const closing = useRef(null); const conversation = useContext(ConversationContext); const dimensions = useWindowDimensions(); @@ -19,29 +22,36 @@ export function useAudioAsset(topicId, asset) { } useEffect(() => { - if (dimensions.width < dimensions.height) { - updateState({ length: 0.8 * dimensions.width }); + const frameRatio = dimensions.width / dimensions.height; + if (frameRatio > 1) { + //height constrained + const height = 0.9 * dimensions.height; + const width = height; + updateState({ width, height }); } else { - updateState({ length: 0.8 * dimensions.height }); + //width constrained + const width = 0.9 * dimensions.width; + const height = width; + updateState({ width, height }); } }, [dimensions]); useEffect(() => { const url = conversation.actions.getTopicAssetUrl(topicId, asset.full); - updateState({ url, playing: false }); - return () => { SoundPlayer.stop() } + updateState({ url }); }, [topicId, conversation, asset]); const actions = { play: () => { - SoundPlayer.playUrl(state.url); updateState({ playing: true }); }, pause: () => { - SoundPlayer.stop(); updateState({ playing: false }); }, + loaded: () => { + updateState({ loaded: true }); + } }; return { state, actions }; diff --git a/app/mobile/src/session/conversation/topicItem/imageAsset/ImageAsset.jsx b/app/mobile/src/session/conversation/topicItem/imageAsset/ImageAsset.jsx index 66359b66..bac84635 100644 --- a/app/mobile/src/session/conversation/topicItem/imageAsset/ImageAsset.jsx +++ b/app/mobile/src/session/conversation/topicItem/imageAsset/ImageAsset.jsx @@ -1,4 +1,4 @@ -import { Image, TouchableOpacity } from 'react-native'; +import { View, Image, ActivityIndicator, TouchableOpacity } from 'react-native'; import { useImageAsset } from './useImageAsset.hook'; import { styles } from './ImageAsset.styled'; import Colors from 'constants/Colors'; @@ -7,8 +7,13 @@ export function ImageAsset({ topicId, asset, dismiss }) { const { state, actions } = useImageAsset(topicId, asset); return ( - - + + + { !state.loaded && ( + + + + )} ); } diff --git a/app/mobile/src/session/conversation/topicItem/imageAsset/ImageAsset.styled.js b/app/mobile/src/session/conversation/topicItem/imageAsset/ImageAsset.styled.js index 9c879c72..982a04c1 100644 --- a/app/mobile/src/session/conversation/topicItem/imageAsset/ImageAsset.styled.js +++ b/app/mobile/src/session/conversation/topicItem/imageAsset/ImageAsset.styled.js @@ -2,6 +2,14 @@ import { StyleSheet } from 'react-native'; import { Colors } from 'constants/Colors'; export const styles = StyleSheet.create({ + container: { + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }, + loading: { + position: 'absolute', + }, overlay: { marginRight: 16, position: 'absolute', diff --git a/app/mobile/src/session/conversation/topicItem/imageAsset/useImageAsset.hook.js b/app/mobile/src/session/conversation/topicItem/imageAsset/useImageAsset.hook.js index 7d1f5dab..ffa5eda7 100644 --- a/app/mobile/src/session/conversation/topicItem/imageAsset/useImageAsset.hook.js +++ b/app/mobile/src/session/conversation/topicItem/imageAsset/useImageAsset.hook.js @@ -12,6 +12,7 @@ export function useImageAsset(topicId, asset) { imageWidth: 1, imageHeight: 1, url: null, + loaded: false, }); const conversation = useContext(ConversationContext); @@ -51,6 +52,9 @@ export function useImageAsset(topicId, asset) { }, [topicId, conversation, asset]); const actions = { + loaded: () => { + updateState({ loaded: true }); + } }; return { state, actions }; diff --git a/app/mobile/src/session/conversation/topicItem/videoAsset/VideoAsset.jsx b/app/mobile/src/session/conversation/topicItem/videoAsset/VideoAsset.jsx index fe4cb8b7..24bbbab3 100644 --- a/app/mobile/src/session/conversation/topicItem/videoAsset/VideoAsset.jsx +++ b/app/mobile/src/session/conversation/topicItem/videoAsset/VideoAsset.jsx @@ -1,8 +1,7 @@ -import { Image, View, TouchableOpacity } from 'react-native'; +import { ActivityIndicator, Image, View, TouchableOpacity } from 'react-native'; import Colors from 'constants/Colors'; import { Video, AVPlaybackStatus } from 'expo-av'; import { useVideoAsset } from './useVideoAsset.hook'; -import GestureRecognizer from 'react-native-swipe-gestures'; import { styles } from './VideoAsset.styled'; import Icons from '@expo/vector-icons/MaterialCommunityIcons'; @@ -11,18 +10,36 @@ export function VideoAsset({ topicId, asset, dismiss }) { const { state, actions } = useVideoAsset(topicId, asset); return ( - - { state.url && ( - ); } diff --git a/app/mobile/src/session/conversation/topicItem/videoAsset/VideoAsset.styled.js b/app/mobile/src/session/conversation/topicItem/videoAsset/VideoAsset.styled.js index 6b72992f..afe76ca9 100644 --- a/app/mobile/src/session/conversation/topicItem/videoAsset/VideoAsset.styled.js +++ b/app/mobile/src/session/conversation/topicItem/videoAsset/VideoAsset.styled.js @@ -2,15 +2,28 @@ import { StyleSheet } from 'react-native'; import { Colors } from 'constants/Colors'; export const styles = StyleSheet.create({ - close: { - backgroundColor: 'rgba(0, 0, 0, 0.6)', + container: { + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }, + overlay: { position: 'absolute', - alignSelf: 'center', - justifySelf: 'center', - borderBottomLeftRadius: 4, - borderBottomRightRadius: 4, - paddingLeft: 4, - paddingRight: 4, + backgroundColor: 'rgba(0, 0, 0, 0.4)', + }, + control: { + position: 'absolute', + paddingRight: 8, + paddingTop: 4, + }, + close: { + position: 'absolute', + top: 0, + right: 0, + paddingTop: 4, + paddingBottom: 4, + paddingLeft: 8, + paddingRight: 8, }, }) diff --git a/app/mobile/src/session/conversation/topicItem/videoAsset/useVideoAsset.hook.js b/app/mobile/src/session/conversation/topicItem/videoAsset/useVideoAsset.hook.js index c4c42509..832e0fe0 100644 --- a/app/mobile/src/session/conversation/topicItem/videoAsset/useVideoAsset.hook.js +++ b/app/mobile/src/session/conversation/topicItem/videoAsset/useVideoAsset.hook.js @@ -10,13 +10,14 @@ export function useVideoAsset(topicId, asset) { frameHeight: 1, videoRatio: 1, width: 1, - weight: 1, url: null, + playing: false, + loaded: false, controls: false, - closing: false, + display: { display: 'none' }, }); - const closing = useRef(null); + const controls = useRef(null); const conversation = useContext(ConversationContext); const dimensions = useWindowDimensions(); @@ -51,13 +52,20 @@ export function useVideoAsset(topicId, asset) { const actions = { setResolution: (width, height) => { - updateState({ controls: true, videoRatio: width / height }); + updateState({ loaded: true, display: {}, videoRatio: width / height }); }, - showClose: () => { - clearTimeout(closing.current); - updateState({ closing: true }); - closing.current = setTimeout(() => { - updateState({ closing: false }); + play: () => { + actions.showControls(); + updateState({ playing: true }); + }, + pause: () => { + updateState({ playing: false }); + }, + showControls: () => { + clearTimeout(controls.current); + updateState({ controls: true }); + controls.current = setTimeout(() => { + updateState({ controls: false }); }, 2000); }, };