Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(example/basic): refactor code to follow best react-native practices #3990

Merged
merged 2 commits into from
Jul 15, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
moskalakamil marked this conversation as resolved.
Show resolved Hide resolved
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
moskalakamil marked this conversation as resolved.
Show resolved Hide resolved
Platform.OS === 'ios' && setPaused(true);
};

const channelUp = useCallback(() => {
moskalakamil marked this conversation as resolved.
Show resolved Hide resolved
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
103 changes: 49 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 @@ -10,20 +16,20 @@ import {
textTracksSelectionBy,
} from '../constants';
import MultiValueControl, {
MultiValueControlPropType,
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 @@ -37,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 @@ -83,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 @@ -143,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 @@ -199,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: MultiValueControlPropType) => {
Expand All @@ -222,15 +217,16 @@ const _Overlay = forwardRef<VideoRef, Props>((props, ref) => {
}
};

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 @@ -278,7 +274,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 @@ -323,16 +319,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