7c68fd1e61
- meaningless since its supposed to be a permanent link either way
102 lines
3.8 KiB
JavaScript
102 lines
3.8 KiB
JavaScript
// @flow
|
|
import { createSelector } from 'reselect';
|
|
import { createCachedSelector } from 're-reselect';
|
|
import { selectMyClaims, selectPendingClaims, selectClaimForUri } from 'redux/selectors/claims';
|
|
|
|
type State = { livestream: any };
|
|
|
|
const selectState = (state: State) => state.livestream || {};
|
|
|
|
export const selectFetchingLivestreams = (state: State) => selectState(state).fetchingById;
|
|
export const selectViewersById = (state: State) => selectState(state).viewersById;
|
|
export const selectActiveLivestreams = (state: State) => selectState(state).activeLivestreams;
|
|
export const selectFetchingActiveLivestreams = (state: State) => selectState(state).fetchingActiveLivestreams;
|
|
export const selectActiveLivestreamInitialized = (state: State) => selectState(state).activeLivestreamInitialized;
|
|
export const selectSocketConnectionById = (state: State) => selectState(state).socketConnectionById;
|
|
|
|
export const selectSocketConnectionForId = createSelector(
|
|
(state, claimId) => claimId,
|
|
selectSocketConnectionById,
|
|
(claimId, byId) => claimId && byId[claimId]
|
|
);
|
|
|
|
// select non-pending claims without sources for given channel
|
|
export const makeSelectLivestreamsForChannelId = (channelId: string) =>
|
|
createSelector(selectState, selectMyClaims, (livestreamState, myClaims = []) => {
|
|
return myClaims
|
|
.filter(
|
|
(claim) =>
|
|
claim.value_type === 'stream' &&
|
|
claim.value &&
|
|
!claim.value.source &&
|
|
claim.confirmations > 0 &&
|
|
claim.signing_channel &&
|
|
claim.signing_channel.claim_id === channelId
|
|
)
|
|
.sort((a, b) => b.timestamp - a.timestamp); // newest first
|
|
});
|
|
|
|
export const makeSelectIsFetchingLivestreams = (channelId: string) =>
|
|
createSelector(selectFetchingLivestreams, (fetchingLivestreams) => Boolean(fetchingLivestreams[channelId]));
|
|
|
|
export const selectViewersForId = (state: State, channelId: string) => {
|
|
const viewers = selectViewersById(state);
|
|
return viewers[channelId];
|
|
};
|
|
|
|
export const makeSelectPendingLivestreamsForChannelId = (channelId: string) =>
|
|
createSelector(selectPendingClaims, (pendingClaims) => {
|
|
return pendingClaims.filter(
|
|
(claim) =>
|
|
claim.value_type === 'stream' &&
|
|
claim.value &&
|
|
!claim.value.source &&
|
|
claim.signing_channel &&
|
|
claim.signing_channel.claim_id === channelId
|
|
);
|
|
});
|
|
|
|
export const selectIsActiveLivestreamForUri = createCachedSelector(
|
|
(state, uri) => uri,
|
|
selectActiveLivestreams,
|
|
(uri, activeLivestreams) => {
|
|
if (!uri || !activeLivestreams) {
|
|
return false;
|
|
}
|
|
|
|
const activeLivestreamValues = Object.values(activeLivestreams);
|
|
// $FlowFixMe - unable to resolve claimUri
|
|
return activeLivestreamValues.some((v) => v?.claimUri === uri);
|
|
}
|
|
)((state, uri) => String(uri));
|
|
|
|
export const selectActiveLivestreamForClaimId = createCachedSelector(
|
|
(state, claimId) => claimId,
|
|
selectActiveLivestreams,
|
|
(claimId, activeLivestreams) => {
|
|
if (!claimId || !activeLivestreams) {
|
|
return null;
|
|
}
|
|
|
|
const activeLivestreamValues = Object.values(activeLivestreams);
|
|
// $FlowFixMe - https://github.com/facebook/flow/issues/2221
|
|
return activeLivestreamValues.find((v) => v?.claimId === claimId) || null;
|
|
}
|
|
)((state, claimId) => String(claimId));
|
|
|
|
export const selectActiveLivestreamForChannel = createCachedSelector(
|
|
(state, channelId) => channelId,
|
|
selectActiveLivestreams,
|
|
(channelId, activeLivestreams) => {
|
|
if (!channelId || !activeLivestreams) {
|
|
return null;
|
|
}
|
|
return activeLivestreams[channelId];
|
|
}
|
|
)((state, channelId) => String(channelId));
|
|
|
|
export const selectActiveLiveClaimForChannel = createCachedSelector(
|
|
(state) => state,
|
|
selectActiveLivestreamForChannel,
|
|
(state, activeLivestream) => activeLivestream && selectClaimForUri(state, activeLivestream.claimUri)
|
|
)((state, channelId) => String(channelId));
|