Comments (1)
import {
useCallback,
useEffect,
useRef,
useState,
MutableRefObject,
} from 'react';
import Sound from 'react-native-sound';
import { downLoadFile } from '@/utils/utils';
type Status = 'pause' | 'play' | 'pending';
export const statusMap: Record<'PAUSE' | 'PLAY' | 'PENDING', Status> = {
PAUSE: 'pause',
PLAY: 'play',
PENDING: 'pending',
};
export type SoundMethods = {
play: (callback: (error: Error) => void) => void;
pause: () => void;
};
export type Info = {
status: Status;
currentTime: number;
duration: number;
};
const useSound = (
url: string
): [SoundMethods, Info, MutableRefObject<Sound | null>] => {
const soundRef = useRef<Sound | null>(null);
const timer = useRef<any>(null);
const [status, setStatus] = useState(statusMap.PAUSE);
const [currentTime, setCurrentTime] = useState(0);
const [error, setError] = useState('');
const [duration, setDuration] = useState(0);
const play = useCallback(
(callback) => {
setStatus(statusMap.PLAY);
soundRef.current?.play((success) => {
if (success) {
clearInterval(timer.current);
setStatus(statusMap.PAUSE);
setCurrentTime(duration);
}
});
callback(error);
},
[error, duration]
);
const pause = useCallback(() => {
soundRef.current?.pause();
setStatus(statusMap.PAUSE);
}, []);
useEffect(() => {
if (status === statusMap.PLAY) {
timer.current = setInterval(() => {
soundRef.current?.getCurrentTime((second) => {
setCurrentTime(second);
});
}, 1000);
}
return () => {
clearInterval(timer.current);
};
}, [status, soundRef]);
useEffect(() => {
if (!url) {
return;
}
setStatus(statusMap.PENDING);
const { savePath, rnfs } = downLoadFile(url);
rnfs.promise
.then((res) => {
if (res.statusCode === 200) {
soundRef.current = new Sound(savePath, '', (err) => {
if (err) {
setError(err);
return;
}
setDuration(soundRef.current?.getDuration()!);
});
setStatus(statusMap.PAUSE);
}
})
.catch((err) => {
setError(err);
});
return () => {
soundRef.current?.release();
};
}, [url]);
return [
{ play, pause },
{
status,
currentTime,
duration,
},
soundRef,
];
};
export default useSound;
from step-by-step.
Related Issues (20)
- 面试总结
- 腾讯面试题
- react事件机制
- 如何实现异常监控
- diff算法(vue react
- webpacl vs rollup HOT 2
- 项目异常捕获 HOT 2
- 关于ref
- es6继承 HOT 2
- nextJs服务端渲染
- 20210428
- typescript专题
- react native架构 HOT 2
- 面经20210511 HOT 11
- 安全 HOT 7
- Axios HOT 2
- 性能优化 HOT 1
- 新知识2021
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from step-by-step.