diff options
Diffstat (limited to 'src/view/com/composer')
-rw-r--r-- | src/view/com/composer/Composer.tsx | 44 | ||||
-rw-r--r-- | src/view/com/composer/videos/SelectVideoBtn.tsx | 15 | ||||
-rw-r--r-- | src/view/com/composer/videos/VideoPreview.web.tsx | 2 |
3 files changed, 47 insertions, 14 deletions
diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 8a8fa66b7..e42e23ba5 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -181,6 +181,7 @@ export const ComposePost = observer(function ComposePost({ clearVideo, state: videoUploadState, updateVideoDimensions, + dispatch: videoUploadDispatch, } = useUploadVideo({ setStatus: setProcessingState, onSuccess: () => { @@ -313,8 +314,8 @@ export const ComposePost = observer(function ComposePost({ if ( !finishedUploading && - videoUploadState.status !== 'idle' && - videoUploadState.asset + videoUploadState.asset && + videoUploadState.status !== 'done' ) { setPublishOnUpload(true) return @@ -607,7 +608,7 @@ export const ComposePost = observer(function ComposePost({ </Text> </View> )} - {error !== '' && ( + {(error !== '' || videoUploadState.error) && ( <View style={[a.px_lg, a.pb_sm]}> <View style={[ @@ -623,7 +624,7 @@ export const ComposePost = observer(function ComposePost({ ]}> <CircleInfo fill={t.palette.negative_400} /> <NewText style={[a.flex_1, a.leading_snug, {paddingTop: 1}]}> - {error} + {error || videoUploadState.error} </NewText> <Button label={_(msg`Dismiss error`)} @@ -638,7 +639,10 @@ export const ComposePost = observer(function ComposePost({ right: a.px_md.paddingRight, }, ]} - onPress={() => setError('')}> + onPress={() => { + if (error) setError('') + else videoUploadDispatch({type: 'Reset'}) + }}> <ButtonIcon icon={X} /> </Button> </View> @@ -755,7 +759,8 @@ export const ComposePost = observer(function ComposePost({ t.atoms.border_contrast_medium, styles.bottomBar, ]}> - {videoUploadState.status !== 'idle' ? ( + {videoUploadState.status !== 'idle' && + videoUploadState.status !== 'done' ? ( <VideoUploadToolbar state={videoUploadState} /> ) : ( <ToolbarWrapper style={[a.flex_row, a.align_center, a.gap_xs]}> @@ -764,6 +769,7 @@ export const ComposePost = observer(function ComposePost({ <SelectVideoBtn onSelectVideo={selectVideo} disabled={!canSelectImages} + setError={setError} /> )} <OpenCameraBtn gallery={gallery} disabled={!canSelectImages} /> @@ -1032,15 +1038,33 @@ function ToolbarWrapper({ function VideoUploadToolbar({state}: {state: VideoUploadState}) { const t = useTheme() + const {_} = useLingui() + + let text = '' + + switch (state.status) { + case 'compressing': + text = _('Compressing video...') + break + case 'uploading': + text = _('Uploading video...') + break + case 'processing': + text = _('Processing video...') + break + case 'done': + text = _('Video uploaded') + break + } + // we could use state.jobStatus?.progress but 99% of the time it jumps from 0 to 100 const progress = state.status === 'compressing' || state.status === 'uploading' ? state.progress - : state.jobStatus?.progress ?? 100 + : 100 return ( - <ToolbarWrapper - style={[a.gap_sm, a.flex_row, a.align_center, {paddingVertical: 5}]}> + <ToolbarWrapper style={[a.flex_row, a.align_center, {paddingVertical: 5}]}> <ProgressCircle size={30} borderWidth={1} @@ -1048,7 +1072,7 @@ function VideoUploadToolbar({state}: {state: VideoUploadState}) { color={t.palette.primary_500} progress={progress} /> - <Text>{state.status}</Text> + <NewText style={[a.font_bold, a.ml_sm]}>{text}</NewText> </ToolbarWrapper> ) } diff --git a/src/view/com/composer/videos/SelectVideoBtn.tsx b/src/view/com/composer/videos/SelectVideoBtn.tsx index 9c528a92e..d8accd062 100644 --- a/src/view/com/composer/videos/SelectVideoBtn.tsx +++ b/src/view/com/composer/videos/SelectVideoBtn.tsx @@ -19,9 +19,10 @@ const VIDEO_MAX_DURATION = 90 type Props = { onSelectVideo: (video: ImagePickerAsset) => void disabled?: boolean + setError: (error: string) => void } -export function SelectVideoBtn({onSelectVideo, disabled}: Props) { +export function SelectVideoBtn({onSelectVideo, disabled, setError}: Props) { const {_} = useLingui() const t = useTheme() const {requestVideoAccessIfNeeded} = useVideoLibraryPermission() @@ -41,9 +42,17 @@ export function SelectVideoBtn({onSelectVideo, disabled}: Props) { UIImagePickerPreferredAssetRepresentationMode.Current, }) if (response.assets && response.assets.length > 0) { - onSelectVideo(response.assets[0]) + try { + onSelectVideo(response.assets[0]) + } catch (err) { + if (err instanceof Error) { + setError(err.message) + } else { + setError(_(msg`An error occurred while selecting the video`)) + } + } } - }, [onSelectVideo, requestVideoAccessIfNeeded]) + }, [onSelectVideo, requestVideoAccessIfNeeded, setError, _]) return ( <> diff --git a/src/view/com/composer/videos/VideoPreview.web.tsx b/src/view/com/composer/videos/VideoPreview.web.tsx index 5e7f82857..e802adddf 100644 --- a/src/view/com/composer/videos/VideoPreview.web.tsx +++ b/src/view/com/composer/videos/VideoPreview.web.tsx @@ -59,7 +59,7 @@ export function VideoPreview({ <video ref={ref} src={video.uri} - style={a.flex_1} + style={{width: '100%', height: '100%', objectFit: 'cover'}} autoPlay loop muted |