import analytics from '@components/analytics' import Button from '@components/Button' import GracefullyImage from '@components/GracefullyImage' import { Slider } from '@sharcoux/slider' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import { Audio } from 'expo-av' import React, { useCallback, useState } from 'react' import { StyleSheet, View } from 'react-native' import { Blurhash } from 'react-native-blurhash' import attachmentAspectRatio from './aspectRatio' export interface Props { total: number index: number sensitiveShown: boolean audio: Mastodon.AttachmentAudio } const AttachmentAudio: React.FC = ({ total, index, sensitiveShown, audio }) => { const { theme } = useTheme() const [audioPlayer, setAudioPlayer] = useState() const [audioPlaying, setAudioPlaying] = useState(false) const [audioPosition, setAudioPosition] = useState(0) const playAudio = useCallback(async () => { analytics('timeline_shared_attachment_audio_play_press', { id: audio.id }) if (!audioPlayer) { const { sound } = await Audio.Sound.createAsync( { uri: audio.url }, {}, // @ts-ignore props => setAudioPosition(props.positionMillis) ) setAudioPlayer(sound) } else { await audioPlayer.setPositionAsync(audioPosition) audioPlayer.playAsync() setAudioPlaying(true) } }, [audioPlayer, audioPosition]) const pauseAudio = useCallback(async () => { analytics('timeline_shared_attachment_audio_pause_press', { id: audio.id }) audioPlayer!.pauseAsync() setAudioPlaying(false) }, [audioPlayer]) return ( {sensitiveShown ? ( audio.blurhash ? ( ) : null ) : ( <> {audio.preview_url && ( )}