Skip to content

Commit

Permalink
chore(sample): refactor sample code to follow rn best practices (#3990)
Browse files Browse the repository at this point in the history
Co-authored-by: Olivier Bouillet <62574056+freeboub@users.noreply.github.com>
  • Loading branch information
moskalakamil and freeboub authored Jul 15, 2024
1 parent 8ef2df1 commit 7611da1
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 110 deletions.
104 changes: 53 additions & 51 deletions examples/basic/src/VideoPlayer.tsx
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
'use strict';

import React, {FC, useCallback, useRef, useState} from 'react';
import React, {type FC, useCallback, useRef, useState} from 'react';

import {TouchableOpacity, View} from 'react-native';
import {Platform, TouchableOpacity, View} from 'react-native';

import Video, {
AudioTrack,
OnAudioTracksData,
OnLoadData,
OnProgressData,
OnTextTracksData,
OnVideoAspectRatioData,
TextTrack,
OnBufferData,
OnAudioFocusChangedData,
OnVideoErrorData,
VideoRef,
OnTextTrackDataChangedData,
OnSeekData,
OnPlaybackStateChangedData,
OnPlaybackRateChangeData,
OnVideoTracksData,
SelectedVideoTrackType,
BufferingStrategyType,
ReactVideoSource,
SelectedTrackType,
TextTracks,
ResizeMode,
VideoTrack,
SelectedTrack,
SelectedVideoTrack,
EnumValues,
type AudioTrack,
type OnAudioTracksData,
type OnLoadData,
type OnProgressData,
type OnTextTracksData,
type OnVideoAspectRatioData,
type TextTrack,
type OnBufferData,
type OnAudioFocusChangedData,
type OnVideoErrorData,
type OnTextTrackDataChangedData,
type OnSeekData,
type OnPlaybackStateChangedData,
type OnPlaybackRateChangeData,
type OnVideoTracksData,
type ReactVideoSource,
type TextTracks,
type VideoTrack,
type SelectedTrack,
type SelectedVideoTrack,
type EnumValues,
} from 'react-native-video';
import styles from './styles';
import {AdditionalSourceInfo} from './types';
import {type AdditionalSourceInfo} from './types';
import {bufferConfig, srcList, textTracksSelectionBy} from './constants';
import {Overlay, toast} from './components';

Expand All @@ -58,7 +58,6 @@ const VideoPlayer: FC<Props> = ({}) => {
const [_, setVideoSize] = useState({videoWidth: 0, videoHeight: 0});
const [paused, setPaused] = useState(false);
const [fullscreen, setFullscreen] = useState(true);
const [decoration, setDecoration] = useState(true);
const [isLoading, setIsLoading] = useState(false);
const [audioTracks, setAudioTracks] = useState<AudioTrack[]>([]);
const [textTracks, setTextTracks] = useState<TextTrack[]>([]);
Expand Down Expand Up @@ -87,6 +86,31 @@ const VideoPlayer: FC<Props> = ({}) => {
const currentSrc = srcList[srcListId];
const additional = currentSrc as AdditionalSourceInfo;

const goToChannel = useCallback((channel: number) => {
setSrcListId(channel);
setDuration(0);
setCurrentTime(0);
setVideoSize({videoWidth: 0, videoHeight: 0});
setIsLoading(false);
setAudioTracks([]);
setTextTracks([]);
setSelectedAudioTrack(undefined);
setSelectedTextTrack(undefined);
setSelectedVideoTrack({
type: SelectedVideoTrackType.AUTO,
});
}, []);

const channelUp = useCallback(() => {
console.log('channel up');
goToChannel((srcListId + 1) % srcList.length);
}, [goToChannel, srcListId]);

const channelDown = useCallback(() => {
console.log('channel down');
goToChannel((srcListId + srcList.length - 1) % srcList.length);
}, [goToChannel, srcListId]);

const onAudioTracks = (data: OnAudioTracksData) => {
const selectedTrack = data.audioTracks?.find((x: AudioTrack) => {
return x.selected;
Expand Down Expand Up @@ -197,31 +221,11 @@ const VideoPlayer: FC<Props> = ({}) => {
console.log('onPlaybackStateChanged', data);
};

const goToChannel = (channel: number) => {
setSrcListId(channel);
setDuration(0);
setCurrentTime(0);
setVideoSize({videoWidth: 0, videoHeight: 0});
setIsLoading(false);
setAudioTracks([]);
setTextTracks([]);
setSelectedAudioTrack(undefined);
setSelectedTextTrack(undefined);
setSelectedVideoTrack({
type: SelectedVideoTrackType.AUTO,
});
const onFullScreenExit = () => {
// iOS pauses video on exit from full screen
Platform.OS === 'ios' && setPaused(true);
};

const channelUp = useCallback(() => {
console.log('channel up');
goToChannel((srcListId + 1) % srcList.length);
}, [srcListId]);

const channelDown = useCallback(() => {
console.log('channel down');
goToChannel((srcListId + srcList.length - 1) % srcList.length);
}, [srcListId]);

return (
<View style={styles.container}>
{(srcList[srcListId] as AdditionalSourceInfo)?.noView ? null : (
Expand All @@ -241,6 +245,7 @@ const VideoPlayer: FC<Props> = ({}) => {
fullscreen={fullscreen}
controls={controls}
resizeMode={resizeMode}
onFullscreenPlayerWillDismiss={onFullScreenExit}
onLoad={onLoad}
onAudioTracks={onAudioTracks}
onTextTracks={onTextTracks}
Expand Down Expand Up @@ -293,14 +298,11 @@ const VideoPlayer: FC<Props> = ({}) => {
currentTime={currentTime}
setMuted={setMuted}
muted={muted}
fullscreen={fullscreen}
duration={duration}
decoration={decoration}
paused={paused}
volume={volume}
setControls={setControls}
poster={poster}
setDecoration={setDecoration}
rate={rate}
setFullscreen={setFullscreen}
setPaused={setPaused}
Expand Down
2 changes: 1 addition & 1 deletion examples/basic/src/components/AudioTracksSelector.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {Picker} from '@react-native-picker/picker';
import {Text} from 'react-native';
import {AudioTrack, SelectedTrack} from 'react-native-video';
import type {AudioTrack, SelectedTrack} from 'react-native-video';
import styles from '../styles';
import React from 'react';

Expand Down
105 changes: 51 additions & 54 deletions examples/basic/src/components/Overlay.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
import React, {forwardRef, memo, useCallback} from 'react';
import React, {
forwardRef,
memo,
useCallback,
type Dispatch,
type SetStateAction,
} from 'react';
import {Indicator} from './Indicator.tsx';
import {View} from 'react-native';
import styles from '../styles.tsx';
Expand All @@ -9,19 +15,21 @@ import {
samplePoster,
textTracksSelectionBy,
} from '../constants';
import MultiValueControl from '../MultiValueControl.tsx';
import MultiValueControl, {
type MultiValueControlPropType,
} from '../MultiValueControl.tsx';
import {
AudioTrack,
EnumValues,
ResizeMode,
SelectedTrack,
VideoRef,
SelectedTrackType,
SelectedVideoTrack,
SelectedVideoTrackType,
TextTrack,
VideoDecoderProperties,
VideoRef,
VideoTrack,
type EnumValues,
type TextTrack,
type SelectedVideoTrack,
type SelectedTrack,
type VideoTrack,
type AudioTrack,
} from 'react-native-video';
import {
toast,
Expand All @@ -35,39 +43,36 @@ import {
type Props = {
channelDown: () => void;
channelUp: () => void;
fullscreen: boolean;
setFullscreen: (value: boolean) => void;
setFullscreen: Dispatch<SetStateAction<boolean>>;
controls: boolean;
setControls: (value: boolean) => void;
decoration: boolean;
setDecoration: (value: boolean) => void;
setControls: Dispatch<SetStateAction<boolean>>;
showNotificationControls: boolean;
setShowNotificationControls: (value: boolean) => void;
setShowNotificationControls: Dispatch<SetStateAction<boolean>>;
selectedAudioTrack: SelectedTrack | undefined;
setSelectedAudioTrack: (value: SelectedTrack | undefined) => void;
setSelectedAudioTrack: Dispatch<SetStateAction<SelectedTrack | undefined>>;
selectedTextTrack: SelectedTrack | undefined;
setSelectedTextTrack: (value: SelectedTrack | undefined) => void;
selectedVideoTrack: SelectedVideoTrack;
setSelectedVideoTrack: (value: SelectedVideoTrack) => void;
setIsSeeking: (value: boolean) => void;
setIsSeeking: Dispatch<SetStateAction<boolean>>;
rate: number;
setRate: (value: number) => void;
setRate: Dispatch<SetStateAction<number>>;
volume: number;
setVolume: (value: number) => void;
resizeMode: EnumValues<ResizeMode>;
setResizeMode: (value: EnumValues<ResizeMode>) => void;
setResizeMode: Dispatch<SetStateAction<EnumValues<ResizeMode>>>;
isLoading: boolean;
srcListId: number;
useCache: boolean;
setUseCache: (value: boolean) => void;
setUseCache: Dispatch<SetStateAction<boolean>>;
paused: boolean;
setPaused: (value: boolean) => void;
setPaused: Dispatch<SetStateAction<boolean>>;
repeat: boolean;
setRepeat: (value: boolean) => void;
setRepeat: Dispatch<SetStateAction<boolean>>;
poster: string | undefined;
setPoster: (value: string | undefined) => void;
setPoster: Dispatch<SetStateAction<string | undefined>>;
muted: boolean;
setMuted: (value: boolean) => void;
setMuted: Dispatch<SetStateAction<boolean>>;
currentTime: number;
duration: number;
isSeeking: boolean;
Expand All @@ -81,11 +86,8 @@ const _Overlay = forwardRef<VideoRef, Props>((props, ref) => {
channelUp,
channelDown,
setFullscreen,
fullscreen,
setControls,
controls,
setDecoration,
decoration,
setShowNotificationControls,
showNotificationControls,
setSelectedAudioTrack,
Expand Down Expand Up @@ -141,21 +143,18 @@ const _Overlay = forwardRef<VideoRef, Props>((props, ref) => {
}, []);

const toggleFullscreen = () => {
setFullscreen(!fullscreen);
setFullscreen(prev => !prev);
};
const toggleControls = () => {
setControls(!controls);
setControls(prev => !prev);
};

const toggleDecoration = () => {
setDecoration(!decoration);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
ref.current?.setFullScreen(!decoration);
const openDecoration = () => {
typeof ref !== 'function' && ref?.current?.setFullScreen(true);
};

const toggleShowNotificationControls = () => {
setShowNotificationControls(!showNotificationControls);
setShowNotificationControls(prev => !prev);
};

const onSelectedAudioTrackChange = (itemValue: string) => {
Expand Down Expand Up @@ -197,9 +196,7 @@ const _Overlay = forwardRef<VideoRef, Props>((props, ref) => {

const videoSeek = (position: number) => {
setIsSeeking(true);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
ref.current?.seek(position);
typeof ref !== 'function' && ref?.current?.seek(position);
};

const onRateSelected = (value: number) => {
Expand All @@ -214,15 +211,16 @@ const _Overlay = forwardRef<VideoRef, Props>((props, ref) => {
setResizeMode(value);
};

const toggleCache = () => setUseCache(!useCache);
const toggleCache = () => setUseCache(prev => !prev);

const togglePause = () => setPaused(!paused);
const togglePause = () => setPaused(prev => !prev);

const toggleRepeat = () => setRepeat(!repeat);
const toggleRepeat = () => setRepeat(prev => !prev);

const togglePoster = () => setPoster(poster ? undefined : samplePoster);
const togglePoster = () =>
setPoster(prev => (prev ? undefined : samplePoster));

const toggleMuted = () => setMuted(!muted);
const toggleMuted = () => setMuted(prev => !prev);

return (
<>
Expand Down Expand Up @@ -270,7 +268,7 @@ const _Overlay = forwardRef<VideoRef, Props>((props, ref) => {
unselectedText="loop disable"
/>
<ToggleControl onPress={toggleFullscreen} text="fullscreen" />
<ToggleControl onPress={toggleDecoration} text="decoration" />
<ToggleControl onPress={openDecoration} text="decoration" />
<ToggleControl
isSelected={!!poster}
onPress={togglePoster}
Expand Down Expand Up @@ -315,16 +313,15 @@ const _Overlay = forwardRef<VideoRef, Props>((props, ref) => {
<ToggleControl
isSelected={paused}
onPress={() => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
ref.current
?.save({})
?.then((response: unknown) => {
console.log('Downloaded URI', response);
})
.catch((error: unknown) => {
console.log('error during save ', error);
});
typeof ref !== 'function' &&
ref?.current
?.save({})
?.then((response: unknown) => {
console.log('Downloaded URI', response);
})
.catch((error: unknown) => {
console.log('error during save ', error);
});
}}
text="save"
/>
Expand Down
2 changes: 1 addition & 1 deletion examples/basic/src/components/TextTracksSelector.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {Picker} from '@react-native-picker/picker';
import {Text} from 'react-native';
import {TextTrack, SelectedTrack} from 'react-native-video';
import type {TextTrack, SelectedTrack} from 'react-native-video';
import styles from '../styles';
import React from 'react';

Expand Down
2 changes: 1 addition & 1 deletion examples/basic/src/components/TopControl.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, {FC, memo} from 'react';
import {Text, TouchableOpacity, View} from 'react-native';
import styles from '../styles.tsx';
import {srcList} from '../constants';
import {AdditionalSourceInfo} from '../types';
import {type AdditionalSourceInfo} from '../types';

type Props = {
srcListId: number;
Expand Down
4 changes: 2 additions & 2 deletions examples/basic/src/components/VideoTracksSelector.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import {Picker} from '@react-native-picker/picker';
import {Text} from 'react-native';
import {
SelectedVideoTrack,
SelectedVideoTrackType,
VideoTrack,
type SelectedVideoTrack,
type VideoTrack,
} from 'react-native-video';
import styles from '../styles';
import React from 'react';
Expand Down

0 comments on commit 7611da1

Please sign in to comment.