Skip to content

Commit

Permalink
Fix: re-rendering player
Browse files Browse the repository at this point in the history
  • Loading branch information
sawyerf committed Dec 26, 2024
1 parent 3e0b31f commit 73bc9d2
Show file tree
Hide file tree
Showing 9 changed files with 48 additions and 39 deletions.
4 changes: 1 addition & 3 deletions App.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { HomeStack, SearchStack, PlaylistsStack, SettingsStack } from '~/screens

import { ConfigContext, SetConfigContext, getConfig } from '~/contexts/config';
import { getSettings, SettingsContext, SetSettingsContext } from '~/contexts/settings';
import { initPlayer, initService } from '~/utils/player';
import { initPlayer } from '~/utils/player';
import { SongContext, defaultSong, songReducer } from '~/contexts/song';
import { ThemeContext, getTheme } from '~/contexts/theme';

Expand Down Expand Up @@ -107,6 +107,4 @@ const App = () => {
);
}

initService()

export default App;
5 changes: 3 additions & 2 deletions app/components/player/BoxDesktopPlayer.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,18 @@ import Icon from 'react-native-vector-icons/FontAwesome';
import { ConfigContext } from '~/contexts/config';
import { SongContext } from '~/contexts/song';
import { ThemeContext } from '~/contexts/theme';
import { nextSong, pauseSong, resumeSong, previousSong, setPosition, secondToTime, setVolume, getVolume, updateVolume, setRepeat } from '~/utils/player';
import { nextSong, pauseSong, resumeSong, previousSong, setPosition, secondToTime, setVolume, getVolume, updateVolume, setRepeat, updateTime } from '~/utils/player';
import { urlCover } from '~/utils/api';
import IconButton from '~/components/button/IconButton';
import ImageError from '~/components/ImageError';
import SlideBar from '~/components/button/SlideBar';

const BoxDesktopPlayer = ({ fullscreen, time }) => {
const BoxDesktopPlayer = ({ fullscreen }) => {
const [song, songDispatch] = React.useContext(SongContext)
const [volume, setVol] = React.useState(getVolume())
const config = React.useContext(ConfigContext)
const theme = React.useContext(ThemeContext)
const time = updateTime()

React.useEffect(() => {
return updateVolume(setVol)
Expand Down
5 changes: 3 additions & 2 deletions app/components/player/FullScreenPlayer.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { ConfigContext } from '~/contexts/config';
import { SongContext } from '~/contexts/song';
import { ThemeContext } from '~/contexts/theme';
import { nextSong, previousSong, pauseSong, resumeSong, secondToTime, setRepeat } from '~/utils/player';
import { nextSong, previousSong, pauseSong, resumeSong, secondToTime, setRepeat, updateTime } from '~/utils/player';
import { parseLrc } from '~/utils/lrc';
import { setPosition } from '~/utils/player';
import { urlCover, getApi } from '~/utils/api';
Expand All @@ -21,13 +21,14 @@ const preview = {
LYRICS: 2
}

const FullScreenPlayer = ({ fullscreen, time }) => {
const FullScreenPlayer = ({ fullscreen }) => {
const config = React.useContext(ConfigContext)
const theme = React.useContext(ThemeContext)
const [song, songDispatch] = React.useContext(SongContext)
const insets = useSafeAreaInsets();
const [lyrics, setLyrics] = React.useState([])
const [isPreview, setIsPreview] = React.useState(preview.COVER)
const time = updateTime()

React.useEffect(() => {
setIsPreview(preview.COVER)
Expand Down
9 changes: 4 additions & 5 deletions app/components/player/Player.native.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
import React from 'react';
import { useProgress, Event, useTrackPlayerEvents, State } from 'react-native-track-player';

import { SettingsContext } from '~/contexts/settings';
import { SongContext } from '~/contexts/song';
import BoxPlayer from './BoxPlayer';
import FullScreenPlayer from './FullScreenPlayer';
import BoxDesktopPlayer from './BoxDesktopPlayer';
import { useProgress, Event, useTrackPlayerEvents, State } from 'react-native-track-player';

const events = [
Event.PlaybackState,
Event.PlaybackState,
Event.PlaybackActiveTrackChanged,
];

const Player = ({ state, fullscreen }) => {
const [song, songDispatch] = React.useContext(SongContext)
const settings = React.useContext(SettingsContext)
const progress = useProgress(500)

useTrackPlayerEvents(events, async (event) => {
if (event.type === Event.PlaybackState) {
Expand All @@ -30,8 +29,8 @@ const Player = ({ state, fullscreen }) => {
}, [state.index])

if (!song?.songInfo) return null
else if (fullscreen.value) return <FullScreenPlayer fullscreen={fullscreen} time={progress} />
else if (settings.isDesktop) return <BoxDesktopPlayer fullscreen={fullscreen} time={progress} />
else if (fullscreen.value) return <FullScreenPlayer fullscreen={fullscreen} />
else if (settings.isDesktop) return <BoxDesktopPlayer fullscreen={fullscreen} />
return <BoxPlayer fullscreen={fullscreen} />
}

Expand Down
10 changes: 2 additions & 8 deletions app/components/player/Player.web.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,21 @@ import React from 'react';

import { SettingsContext } from '~/contexts/settings';
import { SongContext } from '~/contexts/song';
import { updateTime } from '~/utils/player';
import BoxPlayer from './BoxPlayer';
import FullScreenPlayer from './FullScreenPlayer';
import BoxDesktopPlayer from './BoxDesktopPlayer';

const Player = ({ state, fullscreen }) => {
const [song, songDispatch] = React.useContext(SongContext)
const settings = React.useContext(SettingsContext)
const [time, setTime] = React.useState(null)

React.useEffect(() => {
return updateTime(setTime)
}, [])

React.useEffect(() => {
fullscreen.set(false)
}, [state.index])

if (!song?.songInfo) return null
else if (fullscreen.value) return <FullScreenPlayer fullscreen={fullscreen} time={time ? time : song} />
else if (settings.isDesktop) return <BoxDesktopPlayer fullscreen={fullscreen} time={time ? time : song} />
else if (fullscreen.value) return <FullScreenPlayer fullscreen={fullscreen} />
else if (settings.isDesktop) return <BoxDesktopPlayer fullscreen={fullscreen} />
return <BoxPlayer fullscreen={fullscreen} />
}

Expand Down
7 changes: 4 additions & 3 deletions app/utils/player.native.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import TrackPlayer, { AppKilledPlaybackBehavior, Capability, RepeatMode, State } from "react-native-track-player"
import TrackPlayer, { AppKilledPlaybackBehavior, Capability, RepeatMode, State, useProgress } from "react-native-track-player"
import { getApi, urlCover, urlStream } from './api';

export const initService = async () => {
Expand Down Expand Up @@ -63,7 +63,6 @@ export const resumeSong = async () => {
}

export const playSong = async (config, songDispatch, queue, index) => {
const track = queue[index]
const tracks = queue.map((track) => {
return {
...track,
Expand Down Expand Up @@ -147,4 +146,6 @@ export const tuktuktuk = async (songDispatch) => {
}

export const updateVolume = (setVolume) => { }
export const updateTime = (setTime) => { }
export const updateTime = () => {
return useProgress(500)
}
37 changes: 22 additions & 15 deletions app/utils/player.web.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import React from 'react';
import * as serviceWorkerRegistration from '~/services/serviceWorkerRegistration';

import { getApi, urlCover, urlStream } from './api';
Expand Down Expand Up @@ -75,21 +76,27 @@ export const initPlayer = async (songDispatch) => {
})
}

export const updateTime = (setTime) => {
const sound = audio()
const timeUpdateHandler = () => {
setTime({
position: audio().currentTime,
duration: audio().duration,
})
}
export const updateTime = () => {
const [time, setTime] = React.useState({ position: 0, duration: 0 })

sound.addEventListener('timeupdate', timeUpdateHandler)
sound.addEventListener('durationchange', timeUpdateHandler)
return () => {
sound.removeEventListener('timeupdate', timeUpdateHandler)
sound.removeEventListener('durationchange', timeUpdateHandler)
}
React.useEffect(() => {
const sound = audio()
const timeUpdateHandler = () => {
setTime({
position: audio().currentTime,
duration: audio().duration,
})
}

sound.addEventListener('timeupdate', timeUpdateHandler)
sound.addEventListener('durationchange', timeUpdateHandler)
return () => {
sound.removeEventListener('timeupdate', timeUpdateHandler)
sound.removeEventListener('durationchange', timeUpdateHandler)
}
}, [])

return time
}

const downloadNextSong = async (config, queue, currentIndex) => {
Expand Down Expand Up @@ -205,5 +212,5 @@ export const tuktuktuk = (songDispatch) => {
}

export const setRepeat = async (songdispatch, action) => {
songdispatch({ type: 'setActionEndOfSong', action })
songdispatch({ type: 'setActionEndOfSong', action })
}
8 changes: 8 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import registerRootComponent from 'expo/build/launch/registerRootComponent';

import App from './App';
import { initService } from './app/utils/player';

registerRootComponent(App);

initService()
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "castafiore",
"version": "2024.12.25",
"main": "node_modules/expo/AppEntry.js",
"main": "index.js",
"homepage": ".",
"scripts": {
"start": "expo start",
Expand Down

0 comments on commit 73bc9d2

Please sign in to comment.