All files / app/codeCharta/state/selectors/visibleFileStates visibleFileStates.selector.ts

93.33% Statements 28/30
75% Branches 6/8
100% Functions 8/8
93.33% Lines 28/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54102x 102x 102x 102x     2x 2x     102x 147x 93x     54x 47x     7x 4x     3x 5x 3x 3x 4x 3x   3x         3x       3x 2x 2x     1x     3x     102x 102x    
import { FileSelectionState, FileState } from "../../../model/files/files"
import { createSelectorFactory, defaultMemoize } from "@ngrx/store"
import { filesSelector } from "../../store/files/files.selector"
import { getVisibleFileStates, isDeltaState } from "../../../model/files/files.helper"
 
function removeMatch(array: string[], target: string): string[] {
    const matchIndex = array.indexOf(target)
    return [...array.slice(0, matchIndex), ...array.slice(matchIndex + 1)]
}
 
export function onlyVisibleFilesMatterComparer(fileStates1: FileState[], fileStates2: FileState[]): boolean {
    if (fileStates1 === fileStates2) {
        return true
    }
 
    if (fileStates1.length === 0 && fileStates2.length === 0) {
        return true
    }
 
    if (isDeltaState(fileStates1) !== isDeltaState(fileStates2)) {
        return false
    }
 
    const visibleFileStates1 = fileStates1
        .filter(file => file.selectedAs !== FileSelectionState.None)
        .map(file => file.file.fileMeta.fileName)
    let visibleFileStates2 = fileStates2
        .filter(file => file.selectedAs !== FileSelectionState.None)
        .map(file => file.file.fileMeta.fileName)
 
    Iif (visibleFileStates1.length !== visibleFileStates2.length) {
        return false
    }
 
    function reduceToDetermineIfArraysContainSameContents(previousCallResult: boolean, arrayMember: any): boolean {
        Iif (previousCallResult === false) {
            return false
        }
 
        if (visibleFileStates2.includes(arrayMember)) {
            visibleFileStates2 = removeMatch(visibleFileStates2, arrayMember)
            return true
        }
 
        return false
    }
 
    return visibleFileStates1.reduce(reduceToDetermineIfArraysContainSameContents, true)
}
 
export const visibleFileStatesSelector = createSelectorFactory(projection =>
    defaultMemoize(projection, onlyVisibleFilesMatterComparer, onlyVisibleFilesMatterComparer)
)(filesSelector, getVisibleFileStates)