UNPKG

mirador

Version:

An open-source, web-based 'multi-up' viewer that supports zoom-pan-rotate functionality, ability to display/compare simple images, and images with annotations.

80 lines (70 loc) 2.46 kB
import { createSelector } from 'reselect'; import { getMiradorCanvasWrapper } from './wrappers'; import { getCanvas, getVisibleCanvasIds } from './canvases'; import { miradorSlice, EMPTY_ARRAY } from './utils'; /** * Get the image layers from a canvas. * @param {object} state * @param {object} props * @param {string} props.canvasId * @param {string} props.windowId * @param {string} props.companionWindowId * @returns {Array} */ export const getCanvasLayers = createSelector([getCanvas, getMiradorCanvasWrapper], (canvas, getMiradorCanvas) => { if (!canvas) return []; return getMiradorCanvas(canvas).imageResources; }); export const getLayersForWindow = createSelector( [(state) => miradorSlice(state).layers, (state, { windowId }) => windowId], (layers, windowId) => (layers ? layers[windowId] || EMPTY_ARRAY : EMPTY_ARRAY), ); /** * Get the layer state for a particular canvas. * @param {object} state * @param {string} windowId * @returns {object} */ export const getLayers = createSelector( [getLayersForWindow, (state, { canvasId }) => canvasId], (layers, canvasId) => layers[canvasId], ); /** * Returns a list of canvas layers, sorted by the layer state configuration. * @param {object} state * @param {object} props * @param {string} props.companionWindowId * @returns {Array} */ export const getSortedLayers = createSelector([getCanvasLayers, getLayers], (canvasLayers, layerConfig) => { if (!layerConfig) return canvasLayers; const sorted = canvasLayers.sort((a, b) => { if ( layerConfig[a.id] && layerConfig[a.id].index !== undefined && layerConfig[b.id] && layerConfig[b.id].index !== undefined ) { return layerConfig[a.id].index - layerConfig[b.id].index; } // sort a layer with index data above layers without if (layerConfig[a.id] && layerConfig[a.id].index !== undefined) return -1; if (layerConfig[b.id] && layerConfig[b.id].index !== undefined) return 1; return 0; }); return sorted; }); /** * Get all the layer configuration for visible canvases. * @param {object} state * @param {object} props * @param {string} props.windowId * @returns {object} */ export const getLayersForVisibleCanvases = createSelector([getVisibleCanvasIds, getLayersForWindow], (canvasIds, layers) => canvasIds.reduce((acc, canvasId) => { // eslint-disable-next-line no-param-reassign acc[canvasId] = layers[canvasId]; return acc; }, {}), );