lbry-desktop/ui/js/selectors/file_info.js

114 lines
2.8 KiB
JavaScript

import lbry from 'lbry'
import {
createSelector,
} from 'reselect'
import {
selectClaimsByUri,
selectClaimListMineIsPending,
selectMyClaimsOutpoints,
} from 'selectors/claims'
export const _selectState = state => state.fileInfo || {}
export const selectAllFileInfos = createSelector(
_selectState,
(state) => state.fileInfos || {}
)
export const selectFileListIsPending = createSelector(
_selectState,
(state) => state.isFileListPending
)
export const selectFileListDownloadedOrPublishedIsPending = createSelector(
selectFileListIsPending,
selectClaimListMineIsPending,
(isFileListPending, isClaimListMinePending) => isFileListPending || isClaimListMinePending
)
export const selectFileInfoForUri = (state, props) => {
const claims = selectClaimsByUri(state),
claim = claims[props.uri],
fileInfos = selectAllFileInfos(state),
outpoint = claim ? `${claim.txid}:${claim.nout}` : undefined
return outpoint && fileInfos ? fileInfos[outpoint] : undefined
}
export const makeSelectFileInfoForUri = () => {
return createSelector(
selectFileInfoForUri,
(fileInfo) => fileInfo
)
}
export const selectUrisDownloading = createSelector(
_selectState,
(state) => state.urisDownloading || {}
)
const selectDownloadingForUri = (state, props) => {
const byUri = selectUrisDownloading(state)
return byUri[props.uri]
}
export const makeSelectDownloadingForUri = () => {
return createSelector(
selectDownloadingForUri,
(downloadingForUri) => !!downloadingForUri
)
}
export const selectUrisLoading = createSelector(
_selectState,
(state) => state.urisLoading || {}
)
const selectLoadingForUri = (state, props) => {
const byUri = selectUrisLoading(state)
return byUri[props.uri]
}
export const makeSelectLoadingForUri = () => {
return createSelector(
selectLoadingForUri,
(loading) => !!loading
)
}
export const selectFileInfosDownloaded = createSelector(
selectAllFileInfos,
selectMyClaimsOutpoints,
(fileInfos, myClaimOutpoints) => {
const fileInfoList = []
Object.values(fileInfos).forEach(fileInfo => {
if (fileInfo && myClaimOutpoints.indexOf(fileInfo.outpoint) === -1 && (fileInfo.completed || fileInfo.written_bytes)) {
fileInfoList.push(fileInfo)
}
})
return fileInfoList
}
)
export const selectFileInfosPendingPublish = createSelector(
_selectState,
(state) => {
return lbry.getPendingPublishes()
}
)
export const selectFileInfosPublished = createSelector(
selectAllFileInfos,
selectFileInfosPendingPublish,
selectMyClaimsOutpoints,
(allFileInfos, pendingFileInfos, outpoints) => {
const fileInfos = []
outpoints.forEach(outpoint => {
if (allFileInfos[outpoint]) {
fileInfos.push(allFileInfos[outpoint])
}
})
return [...fileInfos, ...pendingFileInfos]
}
)