async changeStateAsync()

in client/client/app/shared/projectContext/index.js [1406:1508]


    async changeStateAsync(state, callbacks) {
        const {
            chromosome,
            position,
            reference,
            tracks,
            tracksState,
            viewport,
            layout,
            forceVariantsFilter,
            tracksReordering,
            filterDatasets,
            shouldAddAnnotationTracks,
            blatRegion,
            keepBLASTTrack
        } = state;
        if (reference && !this._reference) {
            this._referenceIsPromised = true;
            this.dispatcher.emitGlobalEvent('reference:pre:change');
        }
        if (tracksState) {
            tracksState.forEach(ts => {
                if (ts.bioDataItemId === undefined) {
                    return;
                }
                if (typeof ts.bioDataItemId === 'string') {
                    ts.bioDataItemId = decodeURIComponent(ts.bioDataItemId);
                }
                if (typeof ts.index === 'string') {
                    ts.index = decodeURIComponent(ts.index);
                }
            });
        }
        const {
            referenceDidChange,
            vcfFilesChanged,
            geneFilesDidChanged,
            recoveredTracksState
        } = await this._changeProject(reference, tracks, tracksState, tracksReordering, shouldAddAnnotationTracks);
        const tracksStateDidChange = await this._changeTracksState(recoveredTracksState || tracksState);
        const chromosomeDidChange = this._changeChromosome(chromosome);
        if (chromosomeDidChange && !keepBLASTTrack) {
            this.tracksState = (this.tracksState || [])
                .filter(track => track.format !== 'BLAST');
            this._tracks = (this.tracks || [])
                .filter(track => track.format !== 'BLAST');
        }
        if (chromosomeDidChange) {
            this.tracksState = (this.tracksState || [])
                .filter(track => track.format !== 'COMPARISON');
            this._tracks = (this.tracks || [])
                .filter(track => track.format !== 'COMPARISON');
        }
        if (referenceDidChange) {
            this.tracksState = (this.tracksState || [])
                .filter(track => track.format !== 'MOTIFS');
            this._tracks = (this.tracks || [])
                .filter(track => track.format !== 'MOTIFS');
        }
        let positionDidChange = false;
        let viewportDidChange = false;
        let blatRegionDidChange = false;

        if (blatRegion) {
            blatRegionDidChange = this._changeBlatRegion(blatRegion);
        }

        if (viewport) {
            viewportDidChange = this._changeViewport(viewport);
            if (viewportDidChange) {
                this._position = null;
            }
        } else if (position) {
            positionDidChange = this._changePosition(position);
            if (positionDidChange) {
                this._viewport = null;
            }
        }
        if (forceVariantsFilter || referenceDidChange || vcfFilesChanged) {
            this.filter({asDefault: true, callbacks});
        }
        if (layout) {
            this.layout = layout;
        }
        const datasetsFilterChanged = this._datasetsFilter !== filterDatasets;
        const datasetsUpdated = await this.refreshLocalDatasets();
        if (filterDatasets) {
            this._datasetsFilter = filterDatasets;
        }
        const layoutDidChange = !!layout;
        return {
            chromosomeDidChange,
            datasetsFilterChanged,
            datasetsUpdated,
            layoutDidChange,
            positionDidChange,
            referenceDidChange,
            tracksStateDidChange,
            viewportDidChange,
            blatRegionDidChange,
            geneFilesDidChanged
        };
    }