56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
|
// @flow
|
||
|
import React from 'react';
|
||
|
import { BITWAVE_LIVE_API } from 'constants/livestream';
|
||
|
|
||
|
/**
|
||
|
* Gets latest livestream info list. Returns null (instead of a blank object)
|
||
|
* when there are no active livestreams.
|
||
|
*
|
||
|
* @param minViewers
|
||
|
* @param refreshMs
|
||
|
* @returns {{livestreamMap: null, loading: boolean}}
|
||
|
*/
|
||
|
export default function useGetLivestreams(minViewers: number = 0, refreshMs: number = 0) {
|
||
|
const [loading, setLoading] = React.useState(true);
|
||
|
const [livestreamMap, setLivestreamMap] = React.useState(null);
|
||
|
|
||
|
React.useEffect(() => {
|
||
|
function checkCurrentLivestreams() {
|
||
|
fetch(BITWAVE_LIVE_API)
|
||
|
.then((res) => res.json())
|
||
|
.then((res) => {
|
||
|
setLoading(false);
|
||
|
if (!res.data) {
|
||
|
setLivestreamMap(null);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const livestreamMap = res.data.reduce((acc, curr) => {
|
||
|
if (curr.viewCount >= minViewers) {
|
||
|
acc[curr.claimId] = curr;
|
||
|
}
|
||
|
return acc;
|
||
|
}, {});
|
||
|
|
||
|
setLivestreamMap(livestreamMap);
|
||
|
})
|
||
|
.catch((err) => {
|
||
|
setLoading(false);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
checkCurrentLivestreams();
|
||
|
|
||
|
if (refreshMs > 0) {
|
||
|
let fetchInterval = setInterval(checkCurrentLivestreams, refreshMs);
|
||
|
return () => {
|
||
|
if (fetchInterval) {
|
||
|
clearInterval(fetchInterval);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
}, []);
|
||
|
|
||
|
return { livestreamMap, loading };
|
||
|
}
|