1- import React , { createContext , useState , useEffect } from 'react' ;
1+ import React , { createContext , useState } from 'react' ;
22import AsyncStorage from '@react-native-community/async-storage' ;
3+ import { Player } from '@react-native-community/audio-toolkit' ;
34import PropTypes from 'prop-types' ;
45
56export const SettingsContext = createContext ( ) ;
@@ -8,35 +9,75 @@ const KEYS = {
89 MP3 : 'default_mp3' ,
910} ;
1011
11- const mp3s = {
12+ export const MP3S = {
1213 ambient : 'ambient.mp3' ,
1314 forest : 'forest.mp3' ,
14- paino : 'paino.mp3' ,
15+ paino : 'piano.mp3' ,
16+ } ;
17+
18+ const playerConfig = {
19+ continuesToPlayInBackground : false ,
20+ autoDestroy : false ,
1521} ;
1622
1723export default function SettingsContextProvider ( { children } ) {
1824 const [ state , setState ] = useState ( {
1925 init : false ,
20- defaultMp3 : mp3s . paino ,
26+ mp3 : MP3S . paino ,
2127 } ) ;
28+ function getNewPlayer ( mp3 , play = false , cache = false ) {
29+ const newPlayer = new Player ( mp3 , playerConfig ) ;
30+ newPlayer . looping = true ;
31+ if ( play ) {
32+ newPlayer . prepare ( ( err ) => {
33+ if ( ! err ) {
34+ newPlayer . play ( ) ;
35+ }
36+ } ) ;
37+ }
38+ if ( cache ) {
39+ AsyncStorage . setItem ( KEYS . MP3 , mp3 ) ;
40+ }
41+ return newPlayer ;
42+ }
43+ const [ player , setPlayer ] = useState ( getNewPlayer ( MP3S . paino ) ) ;
44+ const safeSetState = ( newState ) => setState ( { ...state , ...newState } ) ;
45+ const safeSetPlayer = ( mp3 , ...p ) => {
46+ setPlayer ( getNewPlayer ( mp3 , ...p ) ) ;
47+ safeSetState ( { mp3 } ) ;
48+ } ;
2249
2350 async function initApp ( ) {
2451 try {
2552 const cache = await AsyncStorage . getItem ( KEYS . MP3 ) ;
26- console . log ( 'CACHE' , cache ) ;
27- setState ( { ...state , init : true } ) ;
53+ if ( cache && cache !== state . mp3 ) {
54+ safeSetState ( { ...state , init : true , mp3 : cache } ) ;
55+ safeSetPlayer ( cache ) ;
56+ } else {
57+ safeSetState ( { init : true } ) ;
58+ }
2859 } catch ( e ) {
2960 // e
3061 }
3162 }
3263
33- useEffect ( ( ) => {
34- if ( ! state . init ) {
35- initApp ( ) ;
36- }
37- } , [ state . init ] ) ;
64+ if ( ! state . init ) {
65+ initApp ( ) ;
66+ }
3867
39- return < SettingsContext . Provider value = { { ...state } } > { children } </ SettingsContext . Provider > ;
68+ return (
69+ < SettingsContext . Provider
70+ value = { {
71+ ...state ,
72+ player,
73+ getPlayer : ( ) => player ,
74+ setState : safeSetState ,
75+ setPlayer : safeSetPlayer ,
76+ } }
77+ >
78+ { children }
79+ </ SettingsContext . Provider >
80+ ) ;
4081}
4182
4283SettingsContextProvider . propTypes = {
0 commit comments