@vitessce/vit-s 3.6.7 → 3.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  import { useState, useEffect, useMemo } from 'react';
2
2
  import { CoordinationType, DataType, STATUS } from '@vitessce/constants-internal';
3
3
  import { useQuery, useQueries } from '@tanstack/react-query';
4
- import { LoaderNotFoundError, } from '@vitessce/abstract';
5
- import { useMultiCoordinationValues, useComplexCoordination, useSetWarning, getMatchingLoader, } from './state/hooks.js';
6
- import { warn, useDataType, useDataTypeMulti, } from './data-hook-utils.js';
4
+ import { LoaderNotFoundError, } from '@vitessce/error';
5
+ import { useMultiCoordinationValues, useComplexCoordination, getMatchingLoader, } from './state/hooks.js';
6
+ import { useDataType, useDataTypeMulti, } from './data-hook-utils.js';
7
7
  /**
8
8
  * Get the dataset description string.
9
9
  * @param {object} loaders The object mapping
@@ -46,52 +46,190 @@ export function useDescription(loaders, dataset) {
46
46
  * @param {object} initialCoordinationValues Object where
47
47
  * keys are coordination type names with the prefix 'initialize',
48
48
  * values are initialization preferences as boolean values.
49
- * @returns {array} [cells, cellsCount] where
50
- * cells is an object and cellsCount is the
51
- * number of items in the cells object.
49
+ * @returns {array} [data, status, urls, error]
52
50
  */
53
51
  export function useObsEmbeddingData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
54
52
  return useDataType(DataType.OBS_EMBEDDING, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
55
53
  }
54
+ /**
55
+ * Wrapper around useDataType.
56
+ * @param {object} loaders
57
+ * @param {string} dataset
58
+ * @param {boolean} isRequired
59
+ * @param {object} coordinationSetters
60
+ * @param {object} initialCoordinationValues
61
+ * @param {object} matchOn
62
+ * @returns {array} [data, status, urls, error]
63
+ */
56
64
  export function useObsSpotsData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
57
65
  return useDataType(DataType.OBS_SPOTS, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
58
66
  }
67
+ /**
68
+ * Wrapper around useDataType.
69
+ * @param {object} loaders
70
+ * @param {string} dataset
71
+ * @param {boolean} isRequired
72
+ * @param {object} coordinationSetters
73
+ * @param {object} initialCoordinationValues
74
+ * @param {object} matchOn
75
+ * @returns {array} [data, status, urls, error]
76
+ */
59
77
  export function useObsPointsData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
60
78
  return useDataType(DataType.OBS_POINTS, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
61
79
  }
80
+ /**
81
+ * Wrapper around useDataType.
82
+ * @param {object} loaders
83
+ * @param {string} dataset
84
+ * @param {boolean} isRequired
85
+ * @param {object} coordinationSetters
86
+ * @param {object} initialCoordinationValues
87
+ * @param {object} matchOn
88
+ * @returns {array} [data, status, urls, error]
89
+ */
62
90
  export function useObsLocationsData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
63
91
  return useDataType(DataType.OBS_LOCATIONS, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
64
92
  }
93
+ /**
94
+ * Wrapper around useDataType.
95
+ * @param {object} loaders
96
+ * @param {string} dataset
97
+ * @param {boolean} isRequired
98
+ * @param {object} coordinationSetters
99
+ * @param {object} initialCoordinationValues
100
+ * @param {object} matchOn
101
+ * @returns {array} [data, status, urls, error]
102
+ */
65
103
  export function useObsLabelsData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
66
104
  return useDataType(DataType.OBS_LABELS, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
67
105
  }
106
+ /**
107
+ * Wrapper around useDataType.
108
+ * @param {object} loaders
109
+ * @param {string} dataset
110
+ * @param {boolean} isRequired
111
+ * @param {object} coordinationSetters
112
+ * @param {object} initialCoordinationValues
113
+ * @param {object} matchOn
114
+ * @returns {array} [data, status, urls, error]
115
+ */
68
116
  export function useObsSegmentationsData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
69
117
  return useDataType(DataType.OBS_SEGMENTATIONS, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
70
118
  }
119
+ /**
120
+ * Wrapper around useDataType.
121
+ * @param {object} loaders
122
+ * @param {string} dataset
123
+ * @param {boolean} isRequired
124
+ * @param {object} coordinationSetters
125
+ * @param {object} initialCoordinationValues
126
+ * @param {object} matchOn
127
+ * @returns {array} [data, status, urls, error]
128
+ */
71
129
  export function useObsSetsData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
72
130
  return useDataType(DataType.OBS_SETS, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
73
131
  }
132
+ /**
133
+ * Wrapper around useDataType.
134
+ * @param {object} loaders
135
+ * @param {string} dataset
136
+ * @param {boolean} isRequired
137
+ * @param {object} coordinationSetters
138
+ * @param {object} initialCoordinationValues
139
+ * @param {object} matchOn
140
+ * @returns {array} [data, status, urls, error]
141
+ */
74
142
  export function useSampleSetsData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
75
143
  return useDataType(DataType.SAMPLE_SETS, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
76
144
  }
145
+ /**
146
+ * Wrapper around useDataType.
147
+ * @param {object} loaders
148
+ * @param {string} dataset
149
+ * @param {boolean} isRequired
150
+ * @param {object} coordinationSetters
151
+ * @param {object} initialCoordinationValues
152
+ * @param {object} matchOn
153
+ * @returns {array} [data, status, urls, error]
154
+ */
77
155
  export function useSampleEdgesData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
78
156
  return useDataType(DataType.SAMPLE_EDGES, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
79
157
  }
158
+ /**
159
+ * Wrapper around useDataType.
160
+ * @param {object} loaders
161
+ * @param {string} dataset
162
+ * @param {boolean} isRequired
163
+ * @param {object} coordinationSetters
164
+ * @param {object} initialCoordinationValues
165
+ * @param {object} matchOn
166
+ * @returns {array} [data, status, urls, error]
167
+ */
80
168
  export function useObsFeatureMatrixData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
81
169
  return useDataType(DataType.OBS_FEATURE_MATRIX, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
82
170
  }
171
+ /**
172
+ * Wrapper around useDataType.
173
+ * @param {object} loaders
174
+ * @param {string} dataset
175
+ * @param {boolean} isRequired
176
+ * @param {object} coordinationSetters
177
+ * @param {object} initialCoordinationValues
178
+ * @param {object} matchOn
179
+ * @returns {array} [data, status, urls, error]
180
+ */
83
181
  export function useFeatureLabelsData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
84
182
  return useDataType(DataType.FEATURE_LABELS, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
85
183
  }
184
+ /**
185
+ * Wrapper around useDataType.
186
+ * @param {object} loaders
187
+ * @param {string} dataset
188
+ * @param {boolean} isRequired
189
+ * @param {object} coordinationSetters
190
+ * @param {object} initialCoordinationValues
191
+ * @param {object} matchOn
192
+ * @returns {array} [data, status, urls, error]
193
+ */
86
194
  export function useImageData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
87
195
  return useDataType(DataType.IMAGE, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
88
196
  }
197
+ /**
198
+ * Wrapper around useDataType.
199
+ * @param {object} loaders
200
+ * @param {string} dataset
201
+ * @param {boolean} isRequired
202
+ * @param {object} coordinationSetters
203
+ * @param {object} initialCoordinationValues
204
+ * @param {object} matchOn
205
+ * @returns {array} [data, status, urls, error]
206
+ */
89
207
  export function useGenomicProfilesData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
90
208
  return useDataType(DataType.GENOMIC_PROFILES, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
91
209
  }
210
+ /**
211
+ * Wrapper around useDataType.
212
+ * @param {object} loaders
213
+ * @param {string} dataset
214
+ * @param {boolean} isRequired
215
+ * @param {object} coordinationSetters
216
+ * @param {object} initialCoordinationValues
217
+ * @param {object} matchOn
218
+ * @returns {array} [data, status, urls, error]
219
+ */
92
220
  export function useNeighborhoodsData(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
93
221
  return useDataType(DataType.NEIGHBORHOODS, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
94
222
  }
223
+ /**
224
+ * Wrapper around useDataType.
225
+ * @param {object} loaders
226
+ * @param {string} dataset
227
+ * @param {boolean} isRequired
228
+ * @param {object} coordinationSetters
229
+ * @param {object} initialCoordinationValues
230
+ * @param {object} matchOn
231
+ * @returns {array} [data, status, urls, error]
232
+ */
95
233
  export function useComparisonMetadata(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
96
234
  return useDataType(DataType.COMPARISON_METADATA, loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn);
97
235
  }
@@ -106,11 +244,12 @@ export function useComparisonMetadata(loaders, dataset, isRequired, coordination
106
244
  * @param {boolean} isRequired Should a warning be thrown if
107
245
  * loading is unsuccessful?
108
246
  * @param {boolean} selection A list of gene names to get expression data for.
109
- * @returns {array} [geneData] where geneData is an array [Uint8Array, ..., Uint8Array]
247
+ * @param {object} matchOn Coordination values used to obtain a matching loader.
248
+ * @returns {array} [geneData, geneName, status, errors]
249
+ * where geneData is an array [Uint8Array, ..., Uint8Array]
110
250
  * for however many genes are in the selection.
111
251
  */
112
252
  export function useFeatureSelection(loaders, dataset, isRequired, selection, matchOn) {
113
- const setWarning = useSetWarning();
114
253
  const featureQueries = useQueries({
115
254
  queries: selection?.map(featureId => ({
116
255
  structuralSharing: false,
@@ -147,7 +286,7 @@ export function useFeatureSelection(loaders, dataset, isRequired, selection, mat
147
286
  }
148
287
  // No loader was found.
149
288
  if (isRequired) {
150
- throw new LoaderNotFoundError(loaders, dataset, DataType.OBS_FEATURE_MATRIX, matchOn);
289
+ throw new LoaderNotFoundError(`Loader not found for parameters: ${dataset}, ${DataType.OBS_FEATURE_MATRIX}, ${JSON.stringify(matchOn)}`);
151
290
  }
152
291
  else {
153
292
  return { data: null, dataKey: null };
@@ -158,6 +297,7 @@ export function useFeatureSelection(loaders, dataset, isRequired, selection, mat
158
297
  });
159
298
  const anyLoading = featureQueries.some(q => q.isFetching);
160
299
  const anyError = featureQueries.some(q => q.isError);
300
+ const errors = anyError ? featureQueries.filter(q => q.isError).map(q => q.error) : [];
161
301
  // eslint-disable-next-line no-nested-ternary
162
302
  const dataStatus = anyLoading
163
303
  ? STATUS.LOADING
@@ -165,17 +305,7 @@ export function useFeatureSelection(loaders, dataset, isRequired, selection, mat
165
305
  const isSuccess = dataStatus === STATUS.SUCCESS;
166
306
  const geneData = useMemo(() => (isSuccess ? featureQueries.map(q => q.data?.data || null) : null), [isSuccess, selection, dataset]);
167
307
  const loadedGeneName = useMemo(() => (isSuccess ? featureQueries.map(q => q.data?.dataKey || null) : null), [isSuccess, selection, dataset]);
168
- useEffect(() => {
169
- featureQueries
170
- .map(q => q.error)
171
- .filter(e => Boolean(e))
172
- .forEach((error) => {
173
- warn(error, setWarning);
174
- });
175
- // Deliberate dependency omissions: use indirect dependencies for efficiency.
176
- // eslint-disable-next-line react-hooks/exhaustive-deps
177
- }, [anyError, setWarning]);
178
- return [geneData, loadedGeneName, dataStatus];
308
+ return [geneData, loadedGeneName, dataStatus, errors];
179
309
  }
180
310
  /**
181
311
  * Utility hook function which can be used to define
@@ -191,11 +321,12 @@ export function useFeatureSelection(loaders, dataset, isRequired, selection, mat
191
321
  * @param {object} matchOn Coordination values used to obtain a matching loader.
192
322
  * @param {object} volcanoOptions Options to pass to the loadMulti function of the loader.
193
323
  * @param {string} dataType A data type.
194
- * @returns {array} [{ df, metadata }] Array of dataframes and their metadata, where
195
- * df is an object in which each column is stored as an array like { col1: arr1, col2: arr2 }.
324
+ * @returns {array} [{ df, metadata }, status, urls, error]
325
+ * Array of dataframes and their metadata, where
326
+ * df is an object in which each column is stored
327
+ * as an array like { col1: arr1, col2: arr2 }.
196
328
  */
197
329
  export function useComparativeDataType(loaders, dataset, isRequired, matchOn, volcanoOptions, dataType) {
198
- const setWarning = useSetWarning();
199
330
  const placeholderObject = useMemo(() => ({}), []);
200
331
  const statsQuery = useQuery({
201
332
  // TODO: only enable once `loaders` is available?
@@ -235,7 +366,7 @@ export function useComparativeDataType(loaders, dataset, isRequired, matchOn, vo
235
366
  // No loader was found.
236
367
  if (isRequired) {
237
368
  // Status: error
238
- throw new LoaderNotFoundError(loaders, dataset, dataType, matchOn);
369
+ throw new LoaderNotFoundError(`Loader not found for parameters: ${dataset}, ${dataType}, ${JSON.stringify(matchOn)}`);
239
370
  }
240
371
  else {
241
372
  // Status: success
@@ -248,19 +379,41 @@ export function useComparativeDataType(loaders, dataset, isRequired, matchOn, vo
248
379
  const loadedData = data?.data || placeholderObject;
249
380
  const dataStatus = isFetching ? STATUS.LOADING : status;
250
381
  const urls = data?.urls;
251
- useEffect(() => {
252
- if (error) {
253
- setWarning(error.message);
254
- }
255
- }, [error, setWarning]);
256
- return [loadedData, dataStatus, urls];
382
+ return [loadedData, dataStatus, urls, error];
257
383
  }
384
+ /**
385
+ * Wrapper around useComparativeDataType.
386
+ * @param {object} loaders
387
+ * @param {string} dataset
388
+ * @param {boolean} isRequired
389
+ * @param {object} matchOn
390
+ * @param {object} volcanoOptions
391
+ * @returns {array} [data, status, urls, error].
392
+ */
258
393
  export function useFeatureStatsData(loaders, dataset, isRequired, matchOn, volcanoOptions) {
259
394
  return useComparativeDataType(loaders, dataset, isRequired, matchOn, volcanoOptions, DataType.FEATURE_STATS);
260
395
  }
396
+ /**
397
+ * Wrapper around useComparativeDataType.
398
+ * @param {object} loaders
399
+ * @param {string} dataset
400
+ * @param {boolean} isRequired
401
+ * @param {object} matchOn
402
+ * @param {object} volcanoOptions
403
+ * @returns {array} [data, status, urls, error].
404
+ */
261
405
  export function useFeatureSetStatsData(loaders, dataset, isRequired, matchOn, volcanoOptions) {
262
406
  return useComparativeDataType(loaders, dataset, isRequired, matchOn, volcanoOptions, DataType.FEATURE_SET_STATS);
263
407
  }
408
+ /**
409
+ * Wrapper around useComparativeDataType.
410
+ * @param {object} loaders
411
+ * @param {string} dataset
412
+ * @param {boolean} isRequired
413
+ * @param {object} matchOn
414
+ * @param {object} volcanoOptions
415
+ * @returns {array} [data, status, urls, error].
416
+ */
264
417
  export function useObsSetStatsData(loaders, dataset, isRequired, matchOn, volcanoOptions) {
265
418
  return useComparativeDataType(loaders, dataset, isRequired, matchOn, volcanoOptions, DataType.OBS_SET_STATS);
266
419
  }
@@ -276,10 +429,11 @@ export function useObsSetStatsData(loaders, dataset, isRequired, matchOn, volcan
276
429
  * used to identify which loader to use.
277
430
  * @param {boolean} isRequired Should a warning be thrown if
278
431
  * loading is unsuccessful?
279
- * @returns {object} [attrs] { rows, cols } object containing cell and gene names.
432
+ * @param {object} matchOn Coordination values used to obtain a matching loader.
433
+ * @returns {object} [attrs, status, urls, error]
434
+ * where attrs is { rows, cols } object containing cell and gene names.
280
435
  */
281
436
  export function useObsFeatureMatrixIndices(loaders, dataset, isRequired, matchOn) {
282
- const setWarning = useSetWarning();
283
437
  const placeholderObject = useMemo(() => ({}), []);
284
438
  const indicesQuery = useQuery({
285
439
  // TODO: only enable once `loaders` is available?
@@ -327,7 +481,7 @@ export function useObsFeatureMatrixIndices(loaders, dataset, isRequired, matchOn
327
481
  // No loader was found.
328
482
  if (isRequired) {
329
483
  // Status: error
330
- throw new LoaderNotFoundError(loaders, dataset, DataType.OBS_FEATURE_MATRIX, matchOn);
484
+ throw new LoaderNotFoundError(`Loader not found for parameters: ${dataset}, ${DataType.OBS_FEATURE_MATRIX}, ${JSON.stringify(matchOn)}`);
331
485
  }
332
486
  else {
333
487
  // Status: success
@@ -340,13 +494,18 @@ export function useObsFeatureMatrixIndices(loaders, dataset, isRequired, matchOn
340
494
  const loadedData = data?.data || placeholderObject;
341
495
  const dataStatus = isFetching ? STATUS.LOADING : status;
342
496
  const urls = data?.urls;
343
- useEffect(() => {
344
- if (error) {
345
- setWarning(error.message);
346
- }
347
- }, [error, setWarning]);
348
- return [loadedData, dataStatus, urls];
497
+ return [loadedData, dataStatus, urls, error];
349
498
  }
499
+ /**
500
+ * Wrapper around useDataTypeMulti.
501
+ * @param {object} coordinationScopes
502
+ * @param {object} coordinationScopesBy
503
+ * @param {object} loaders
504
+ * @param {string} dataset
505
+ * @param {function} mergeCoordination
506
+ * @param {string} viewUid
507
+ * @returns {array} [data, status, urls, errors]
508
+ */
350
509
  export function useMultiObsPoints(coordinationScopes, coordinationScopesBy, loaders, dataset, mergeCoordination, viewUid) {
351
510
  const obsTypeCoordination = useComplexCoordination([
352
511
  CoordinationType.OBS_TYPE,
@@ -356,9 +515,19 @@ export function useMultiObsPoints(coordinationScopes, coordinationScopesBy, load
356
515
  // use coordinationScopes and coordinationScopesBy which are
357
516
  // indirect dependencies here.
358
517
  [coordinationScopes, coordinationScopesBy]);
359
- const [obsPointsData, obsPointsDataStatus, obsPointsUrls] = useDataTypeMulti(DataType.OBS_POINTS, loaders, dataset, false, {}, {}, matchOnObj, mergeCoordination, viewUid);
360
- return [obsPointsData, obsPointsDataStatus, obsPointsUrls];
518
+ const [obsPointsData, obsPointsDataStatus, obsPointsUrls, obsPointsErrors] = useDataTypeMulti(DataType.OBS_POINTS, loaders, dataset, false, {}, {}, matchOnObj, mergeCoordination, viewUid);
519
+ return [obsPointsData, obsPointsDataStatus, obsPointsUrls, obsPointsErrors];
361
520
  }
521
+ /**
522
+ * Wrapper around useDataTypeMulti.
523
+ * @param {object} coordinationScopes
524
+ * @param {object} coordinationScopesBy
525
+ * @param {object} loaders
526
+ * @param {string} dataset
527
+ * @param {function} mergeCoordination
528
+ * @param {string} viewUid
529
+ * @returns {array} [data, status, urls, errors]
530
+ */
362
531
  export function useMultiObsSpots(coordinationScopes, coordinationScopesBy, loaders, dataset, mergeCoordination, viewUid) {
363
532
  const obsTypeCoordination = useComplexCoordination([
364
533
  CoordinationType.OBS_TYPE,
@@ -368,9 +537,19 @@ export function useMultiObsSpots(coordinationScopes, coordinationScopesBy, loade
368
537
  // use coordinationScopes and coordinationScopesBy which are
369
538
  // indirect dependencies here.
370
539
  [coordinationScopes, coordinationScopesBy]);
371
- const [obsSpotsData, obsSpotsDataStatus, obsSpotsUrls] = useDataTypeMulti(DataType.OBS_SPOTS, loaders, dataset, false, {}, {}, matchOnObj, mergeCoordination, viewUid);
372
- return [obsSpotsData, obsSpotsDataStatus, obsSpotsUrls];
540
+ const [obsSpotsData, obsSpotsDataStatus, obsSpotsUrls, obsSpotsErrors] = useDataTypeMulti(DataType.OBS_SPOTS, loaders, dataset, false, {}, {}, matchOnObj, mergeCoordination, viewUid);
541
+ return [obsSpotsData, obsSpotsDataStatus, obsSpotsUrls, obsSpotsErrors];
373
542
  }
543
+ /**
544
+ * Wrapper around useDataTypeMulti.
545
+ * @param {object} coordinationScopes
546
+ * @param {object} coordinationScopesBy
547
+ * @param {object} loaders
548
+ * @param {string} dataset
549
+ * @param {function} mergeCoordination
550
+ * @param {string} viewUid
551
+ * @returns {array} [data, status, urls, errors]
552
+ */
374
553
  export function useSpotMultiObsSets(coordinationScopes, coordinationScopesBy, loaders, dataset) {
375
554
  const obsTypeCoordination = useComplexCoordination([
376
555
  CoordinationType.OBS_TYPE,
@@ -380,9 +559,19 @@ export function useSpotMultiObsSets(coordinationScopes, coordinationScopesBy, lo
380
559
  // use coordinationScopes and coordinationScopesBy which are
381
560
  // indirect dependencies here.
382
561
  [coordinationScopes, coordinationScopesBy]);
383
- const [obsSetsData, obsSetsDataStatus, obsSetsUrls] = useDataTypeMulti(DataType.OBS_SETS, loaders, dataset, false, {}, {}, matchOnObj);
384
- return [obsSetsData, obsSetsDataStatus, obsSetsUrls];
562
+ const [obsSetsData, obsSetsDataStatus, obsSetsUrls, obsSetsErrors] = useDataTypeMulti(DataType.OBS_SETS, loaders, dataset, false, {}, {}, matchOnObj);
563
+ return [obsSetsData, obsSetsDataStatus, obsSetsUrls, obsSetsErrors];
385
564
  }
565
+ /**
566
+ * Wrapper around useDataTypeMulti.
567
+ * @param {object} coordinationScopes
568
+ * @param {object} coordinationScopesBy
569
+ * @param {object} loaders
570
+ * @param {string} dataset
571
+ * @param {function} mergeCoordination
572
+ * @param {string} viewUid
573
+ * @returns {array} [data, status, urls, errors]
574
+ */
386
575
  export function useSpotMultiFeatureLabels(coordinationScopes, coordinationScopesBy, loaders, dataset) {
387
576
  const featureTypeCoordination = useComplexCoordination([
388
577
  CoordinationType.FEATURE_TYPE,
@@ -392,18 +581,43 @@ export function useSpotMultiFeatureLabels(coordinationScopes, coordinationScopes
392
581
  // use coordinationScopes and coordinationScopesBy which are
393
582
  // indirect dependencies here.
394
583
  [coordinationScopes, coordinationScopesBy]);
395
- const [featureLabelsData, featureLabelsStatus, featureLabelsUrls] = useDataTypeMulti(DataType.FEATURE_LABELS, loaders, dataset, false, {}, {}, matchOnObj);
396
- return [featureLabelsData, featureLabelsStatus, featureLabelsUrls];
584
+ const [featureLabelsData, featureLabelsStatus, featureLabelsUrls, featureLabelsErrors,] = useDataTypeMulti(DataType.FEATURE_LABELS, loaders, dataset, false, {}, {}, matchOnObj);
585
+ return [
586
+ featureLabelsData,
587
+ featureLabelsStatus,
588
+ featureLabelsUrls,
589
+ featureLabelsErrors,
590
+ ];
397
591
  }
592
+ /**
593
+ * Wrapper around useDataTypeMulti.
594
+ * @param {object} coordinationScopes
595
+ * @param {object} coordinationScopesBy
596
+ * @param {object} loaders
597
+ * @param {string} dataset
598
+ * @param {function} mergeCoordination
599
+ * @param {string} viewUid
600
+ * @returns {array} [labelsTypes, data, status, urls, errors]
601
+ */
398
602
  export function useMultiObsLabels(coordinationScopes, obsType, loaders, dataset) {
399
603
  const obsLabelsTypes = useMultiCoordinationValues(CoordinationType.OBS_LABELS_TYPE, coordinationScopes);
400
604
  const obsLabelsMatchOnObj = useMemo(() => Object.fromEntries(Object.entries(obsLabelsTypes).map(([scope, obsLabelsType]) => ([
401
605
  scope,
402
606
  { obsLabelsType, obsType },
403
607
  ]))), [obsLabelsTypes, obsType]);
404
- const [obsLabelsData, obsLabelsDataStatus, obsLabelsUrls] = useDataTypeMulti(DataType.OBS_LABELS, loaders, dataset, false, {}, {}, obsLabelsMatchOnObj);
405
- return [obsLabelsTypes, obsLabelsData, obsLabelsDataStatus, obsLabelsUrls];
608
+ const [obsLabelsData, obsLabelsDataStatus, obsLabelsUrls, obsLabelsErrors] = useDataTypeMulti(DataType.OBS_LABELS, loaders, dataset, false, {}, {}, obsLabelsMatchOnObj);
609
+ return [obsLabelsTypes, obsLabelsData, obsLabelsDataStatus, obsLabelsUrls, obsLabelsErrors];
406
610
  }
611
+ /**
612
+ * Wrapper around useDataTypeMulti.
613
+ * @param {object} coordinationScopes
614
+ * @param {object} coordinationScopesBy
615
+ * @param {object} loaders
616
+ * @param {string} dataset
617
+ * @param {function} mergeCoordination
618
+ * @param {string} viewUid
619
+ * @returns {array} [data, status, urls, errors]
620
+ */
407
621
  export function useMultiObsSegmentations(coordinationScopes, coordinationScopesBy, loaders, dataset, mergeCoordination, viewUid) {
408
622
  const imageCoordination = useComplexCoordination([
409
623
  CoordinationType.FILE_UID,
@@ -413,9 +627,24 @@ export function useMultiObsSegmentations(coordinationScopes, coordinationScopesB
413
627
  // use coordinationScopes and coordinationScopesBy which are
414
628
  // indirect dependencies here.
415
629
  [coordinationScopes, coordinationScopesBy]);
416
- const [obsSegmentationsData, obsSegmentationsDataStatus, obsSegmentationsUrls,] = useDataTypeMulti(DataType.OBS_SEGMENTATIONS, loaders, dataset, false, {}, {}, matchOnObj, mergeCoordination, viewUid);
417
- return [obsSegmentationsData, obsSegmentationsDataStatus, obsSegmentationsUrls];
630
+ const [obsSegmentationsData, obsSegmentationsDataStatus, obsSegmentationsUrls, obsSegmentationsErrors,] = useDataTypeMulti(DataType.OBS_SEGMENTATIONS, loaders, dataset, false, {}, {}, matchOnObj, mergeCoordination, viewUid);
631
+ return [
632
+ obsSegmentationsData,
633
+ obsSegmentationsDataStatus,
634
+ obsSegmentationsUrls,
635
+ obsSegmentationsErrors,
636
+ ];
418
637
  }
638
+ /**
639
+ * Wrapper around useDataTypeMulti.
640
+ * @param {object} coordinationScopes
641
+ * @param {object} coordinationScopesBy
642
+ * @param {object} loaders
643
+ * @param {string} dataset
644
+ * @param {function} mergeCoordination
645
+ * @param {string} viewUid
646
+ * @returns {array} [data, status, urls, errors]
647
+ */
419
648
  export function useMultiImages(coordinationScopes, coordinationScopesBy, loaders, dataset, mergeCoordination, viewUid) {
420
649
  // TODO: delegate the generation of matchOnObj to a different hoook and pass as a parameter?
421
650
  // (in all of the useMulti data hooks)?
@@ -427,6 +656,6 @@ export function useMultiImages(coordinationScopes, coordinationScopesBy, loaders
427
656
  // use coordinationScopes and coordinationScopesBy which are
428
657
  // indirect dependencies here.
429
658
  [coordinationScopes, coordinationScopesBy]);
430
- const [imageData, imageDataStatus, imageUrls] = useDataTypeMulti(DataType.IMAGE, loaders, dataset, false, {}, {}, matchOnObj, mergeCoordination, viewUid);
431
- return [imageData, imageDataStatus, imageUrls];
659
+ const [imageData, imageDataStatus, imageUrls, imageErrors] = useDataTypeMulti(DataType.IMAGE, loaders, dataset, false, {}, {}, matchOnObj, mergeCoordination, viewUid);
660
+ return [imageData, imageDataStatus, imageUrls, imageErrors];
432
661
  }
package/dist-tsc/hooks.js CHANGED
@@ -306,7 +306,7 @@ export function useExpandedFeatureLabelsMap(featureType, featureLabelsMap, optio
306
306
  ...(stripCuriePrefixes
307
307
  ? Array.from(fetchedMapping).map(([k, v]) => ([k.split(':')[1], v.split(':')[1]]))
308
308
  : fetchedMapping),
309
- ...(featureLabelsMap || []),
309
+ ...Array.from(featureLabelsMap?.entries() || []),
310
310
  ]);
311
311
  }, [fetchedMapping, featureLabelsMap, stripCuriePrefixes]);
312
312
  // If not enabled, return success
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitessce/vit-s",
3
- "version": "3.6.7",
3
+ "version": "3.6.8",
4
4
  "author": "HIDIVE Lab at HMS",
5
5
  "homepage": "http://vitessce.io",
6
6
  "repository": {
@@ -28,15 +28,16 @@
28
28
  "zustand": "^5.0.4",
29
29
  "react-aria": "^3.28.0",
30
30
  "react-error-boundary": "^5.0.0",
31
- "@vitessce/styles": "3.6.7",
32
- "@vitessce/abstract": "3.6.7",
33
- "@vitessce/constants-internal": "3.6.7",
34
- "@vitessce/plugins": "3.6.7",
35
- "@vitessce/schemas": "3.6.7",
36
- "@vitessce/utils": "3.6.7",
37
- "@vitessce/sets-utils": "3.6.7",
38
- "@vitessce/config": "3.6.7",
39
- "@vitessce/globals": "3.6.7"
31
+ "@vitessce/styles": "3.6.8",
32
+ "@vitessce/abstract": "3.6.8",
33
+ "@vitessce/constants-internal": "3.6.8",
34
+ "@vitessce/plugins": "3.6.8",
35
+ "@vitessce/schemas": "3.6.8",
36
+ "@vitessce/error": "3.6.8",
37
+ "@vitessce/utils": "3.6.8",
38
+ "@vitessce/sets-utils": "3.6.8",
39
+ "@vitessce/config": "3.6.8",
40
+ "@vitessce/globals": "3.6.8"
40
41
  },
41
42
  "devDependencies": {
42
43
  "@testing-library/jest-dom": "^6.6.3",
@@ -45,7 +46,7 @@
45
46
  "react-dom": "^18.0.0",
46
47
  "vite": "^6.3.5",
47
48
  "vitest": "^3.1.4",
48
- "@vitessce/types": "3.6.7"
49
+ "@vitessce/types": "3.6.8"
49
50
  },
50
51
  "peerDependencies": {
51
52
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"