import Button from '@components/Button' import { Slider } from '@sharcoux/slider' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import { Audio } from 'expo-av' import { Surface } from 'gl-react-expo' import { Blurhash } from 'gl-react-blurhash' import React, { useCallback, useState } from 'react' import { Image, StyleSheet, View } from 'react-native' export interface Props { sensitiveShown: boolean audio: Mastodon.AttachmentAudio } const AttachmentAudio: React.FC = ({ sensitiveShown, audio }) => { const { theme } = useTheme() const [audioPlayer, setAudioPlayer] = useState() const [audioPlaying, setAudioPlaying] = useState(false) const [audioPosition, setAudioPosition] = useState(0) const playAudio = useCallback(async () => { 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 () => { audioPlayer!.pauseAsync() setAudioPlaying(false) }, [audioPlayer]) return ( {sensitiveShown ? ( audio.blurhash && ( ) ) : ( <> {(audio.preview_url || audio.preview_remote_url) && ( )}