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);
},
};