UNPKG

6.37 kBJavaScriptView Raw
1import "core-js/modules/es.array.iterator";
2import "core-js/modules/web.dom-collections.iterator";
3import _findInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/find";
4import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
5import _Object$assign from "@babel/runtime-corejs3/core-js-stable/object/assign";
6import _objectWithoutPropertiesLoose from "@babel/runtime-corejs3/helpers/objectWithoutPropertiesLoose";
7import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
8import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
9import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array";
10// @flow
11import * as React from 'react';
12import isEqual from 'lodash/isEqual';
13import createFilterOrig from 'mapeo-entity-filter';
14import ObservationDialog from './ObservationDialog';
15import getStats from './stats';
16import { defaultGetPreset } from './utils/helpers';
17/*:: import type { Observation } from 'mapeo-schema'*/
18
19/*:: import type {
20 PresetWithFields,
21 PresetWithAdditionalFields,
22 GetMedia,
23 Filter,
24 GetIconUrl,
25 GetMediaUrl
26} from './types'*/
27
28/*:: export type CommonViewProps = {
29 /** Array of observations to render *-/
30 observations?: Array<Observation>,
31 /** Called when an observation is editing/updated *-/
32 onUpdateObservation: (observation: Observation) => void,
33 onDeleteObservation: (id: string) => void,
34 /** A function called with an observation that should return a matching preset
35 * with field definitions *-/
36 presets?: PresetWithFields[],
37 getMediaUrl: GetMediaUrl,
38 getIconUrl?: GetIconUrl,
39 /** Filter to apply to observations *-/
40 filter?: Filter
41}*/
42
43/*:: type Props = {
44 ...$Exact<CommonViewProps>,
45 children: ({
46 filteredObservations: Array<Observation>,
47 onClickObservation: (observationId: string, imageIndex?: number) => void,
48 getPreset: Observation => PresetWithAdditionalFields,
49 getMedia: GetMedia
50 }) => React.Node
51}*/
52
53const noop = () => {}; // This is a temporary wrapper to compile a filter that defines $preset into a
54// filter that will work with our dataset, which currently uses categoryId to
55// define which preset applies. We will need to improve how this works in the
56// future once we start matching presets like we do with iD
57
58
59const createFilter = (filter
60/*: Filter | void*/
61) => {
62 if (!_Array$isArray(filter) || filter[0] !== 'all' || filter.length < 2) {
63 return () => true;
64 }
65
66 const presetFilter = _mapInstanceProperty(filter).call(filter, subFilter => {
67 if (!_Array$isArray(subFilter) || subFilter[1] !== '$preset' && !isEqual(subFilter[1], ['$preset'])) {
68 return subFilter;
69 }
70
71 return [subFilter[0], 'categoryId', ..._sliceInstanceProperty(subFilter).call(subFilter, 2)];
72 });
73
74 return createFilterOrig(presetFilter);
75};
76
77const WrappedMapView = (_ref) => {
78 let {
79 observations = [],
80 onUpdateObservation = noop,
81 onDeleteObservation = noop,
82 presets = [],
83 getMediaUrl,
84 filter,
85 children
86 }
87 /*: Props*/
88 = _ref,
89 otherProps = _objectWithoutPropertiesLoose(_ref, ["observations", "onUpdateObservation", "onDeleteObservation", "presets", "getMediaUrl", "filter", "children"]);
90
91 const stats = React.useMemo(() => getStats(observations), [observations]);
92 const [editingObservation, setEditingObservation] = React.useState(null);
93 const [editingInitialImageIndex, setEditingInitialImageIndex] = React.useState();
94 const getPresetWithFallback = React.useCallback((observation
95 /*: Observation*/
96 ) =>
97 /*: PresetWithAdditionalFields*/
98 {
99 var _context;
100
101 const preset = getPreset(observation, presets);
102 const defaultPreset = defaultGetPreset(observation, stats);
103 if (!preset) return defaultPreset;
104 return _Object$assign({}, preset, {
105 additionalFields: _filterInstanceProperty(_context = defaultPreset.additionalFields).call(_context, // Any fields that are not defined in the preset we show as 'additionalFields'
106 additionalField => {
107 var _context2;
108
109 return !_findInstanceProperty(_context2 = preset.fields).call(_context2, field => {
110 const fieldKey = _Array$isArray(field.key) ? field.key : [field.key];
111 const additionalFieldKey = _Array$isArray(additionalField.key) ? additionalField.key : [additionalField.key];
112 return isEqual(fieldKey, additionalFieldKey);
113 });
114 })
115 });
116 }, [presets, stats]);
117 const handleObservationClick = React.useCallback((observationId, imageIndex) => {
118 setEditingInitialImageIndex(imageIndex);
119 setEditingObservation(_findInstanceProperty(observations).call(observations, obs => obs.id === observationId));
120 }, [observations]);
121 const getMedia = React.useCallback((attachment, {
122 width = 800
123 } = {}) => {
124 const dpr = window.devicePixelRatio;
125 const size = width < 300 * dpr ? 'thumbnail' : width < 1200 * dpr ? 'preview' : 'original';
126 return {
127 src: getMediaUrl(attachment.id, size),
128 type: 'image'
129 };
130 }, [getMediaUrl]);
131 const filterFunction = React.useMemo(() => createFilter(filter), [filter]);
132 const filteredObservations = React.useMemo(() => filter ? _filterInstanceProperty(observations).call(observations, filterFunction) : observations, [observations, filterFunction, filter]);
133 return /*#__PURE__*/React.createElement(React.Fragment, null, children({
134 onClickObservation: handleObservationClick,
135 filteredObservations,
136 getPreset: getPresetWithFallback,
137 getMedia
138 }), /*#__PURE__*/React.createElement(ObservationDialog, {
139 open: !!editingObservation,
140 observation: editingObservation,
141 initialImageIndex: editingInitialImageIndex,
142 getPreset: getPresetWithFallback,
143 getMedia: getMedia,
144 onRequestClose: () => setEditingObservation(false),
145 onSave: onUpdateObservation,
146 onDelete: onDeleteObservation
147 }));
148};
149
150export default WrappedMapView; // TODO: Update this function to match presets like ID Editor
151
152function getPreset(observation
153/*: Observation*/
154, presets
155/*: PresetWithFields[]*/
156)
157/*: PresetWithFields | void*/
158{
159 const tags = observation.tags;
160 if (!tags || !tags.categoryId) return;
161
162 const preset = _findInstanceProperty(presets).call(presets, preset => preset.id === tags.categoryId);
163
164 return preset;
165}
166//# sourceMappingURL=ViewWrapper.js.map
\No newline at end of file