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.
55 lines (49 loc) • 1.97 kB
JavaScript
import {
all, put, select, takeEvery,
} from 'redux-saga/effects';
import { requestCanvasAnnotations, receiveAnnotation, requestAnnotation } from '../actions';
import {
getAnnotations, getCanvas, getMiradorCanvasWrapper,
} from '../selectors';
import ActionTypes from '../actions/action-types';
import MiradorCanvas from '../../lib/MiradorCanvas';
/** Fetch annotations for a given canvas */
export function* fetchCanvasAnnotations({ canvasId, windowId }) {
const canvas = yield select(getCanvas, { canvasId, windowId });
const annotations = yield select(getAnnotations);
const getMiradorCanvas = yield select(getMiradorCanvasWrapper);
const miradorCanvas = getMiradorCanvas(canvas);
return yield all([
// IIIF v2
...miradorCanvas.annotationListUris
.filter(uri => !(annotations[canvas.id] && annotations[canvas.id][uri]))
.map(uri => put(requestAnnotation(canvas.id, uri))),
// IIIF v3
...miradorCanvas.canvasAnnotationPages
.filter(annotation => !(annotations[canvas.id] && annotations[canvas.id][annotation.id]))
.map((annotation) => {
// If there are no items, try to retrieve the referenced resource.
// otherwise the resource should be embedded and just add to the store.
if (!annotation.items) {
return put(requestAnnotation(canvas.id, annotation.id));
}
return put(receiveAnnotation(canvas.id, annotation.id, annotation));
}),
]);
}
/**
* Fetch annotations for the visible canvases.
*/
export function* fetchAnnotations({ visibleCanvases = [], windowId }) {
// this little indirection allows plugins to also handle the request
return yield all(visibleCanvases.map(canvasId => (
put(requestCanvasAnnotations(windowId, canvasId))
)));
}
/** */
export default function* appSaga() {
yield all([
takeEvery(ActionTypes.REQUEST_CANVAS_ANNOTATIONS, fetchCanvasAnnotations),
takeEvery(ActionTypes.SET_CANVAS, fetchAnnotations),
]);
}