@ohif/app 3.8.0-beta.63 → 3.8.0-beta.65

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.
Files changed (33) hide show
  1. package/dist/{121.bundle.f6c25e845985d96c423c.js → 121.bundle.fda405f29003c308ce09.js} +4 -4
  2. package/dist/{155.bundle.9e3dd18c9a3961232504.js → 155.bundle.a57744809d0f46030ee0.js} +12 -7
  3. package/dist/{188.bundle.528e9ad81159c776affa.js → 188.bundle.c448aed48915741e9f97.js} +2 -2
  4. package/dist/{270.bundle.fd387adff5b064fca506.js → 270.bundle.16ac8114c5c4ce006f4a.js} +51 -28
  5. package/dist/{295.bundle.c132f53e1397ef9d432a.js → 295.bundle.57700cd41fd87e1521b4.js} +4 -4
  6. package/dist/{339.bundle.591a0a6075220b14c249.js → 339.bundle.57dac3644803cefe3e3d.js} +27 -69
  7. package/dist/{68.bundle.efc5ba2a44aa2b96ee1a.js → 41.bundle.58b85dd990fb6fac615e.js} +280 -494
  8. package/dist/{250.bundle.d8b502b7ef6afc79a87e.js → 448.bundle.d195aba3aef25ec286d1.js} +284 -388
  9. package/dist/{530.bundle.ef1ea9d98f7b377a9d3a.js → 530.bundle.72d9812f117036615a38.js} +2 -2
  10. package/dist/{544.bundle.05b543f28d0c124950ef.js → 544.bundle.c3009e245ceb1554c70a.js} +5 -17
  11. package/dist/{559.bundle.fc08eab02848a451ed34.js → 559.bundle.05bd51e94422a2cab116.js} +6 -10
  12. package/dist/{594.bundle.3a5fa2e7d5636ddccb32.js → 594.bundle.14b122ab995e4b13e652.js} +147 -188
  13. package/dist/{50.bundle.55ad62f1f656f5fd5a36.js → 638.bundle.a63003e18bed65f227bb.js} +159 -395
  14. package/dist/699.bundle.efc67171e6d212f25a24.js +774 -0
  15. package/dist/{963.bundle.874395d7b2d80f9e5831.js → 701.bundle.bc40f1a7d5d6b1a4dd38.js} +554 -215
  16. package/dist/{724.bundle.294a41af83a5af33f3cc.js → 724.bundle.3945f8d2e9c8b0b23628.js} +86 -164
  17. package/dist/{862.bundle.c8eba798644149650775.js → 862.bundle.d787dac01f4567560a42.js} +2 -2
  18. package/dist/{889.bundle.a776c87be9e3580f3437.js → 889.bundle.ffc727aa6d1a74f2138d.js} +180 -207
  19. package/dist/{704.bundle.842ada45436f1fb029aa.js → 90.bundle.abde898ebd3c74f521f9.js} +323 -334
  20. package/dist/{905.bundle.73a711d0255cb988fa6e.js → 905.bundle.6b5b42b2403e4676bb3a.js} +119 -89
  21. package/dist/{907.bundle.6932f0458b9e0143c18a.js → 907.bundle.fbd5768fa5b53f9d3f86.js} +2 -14
  22. package/dist/{961.bundle.6cf1599ed3a2871c040f.js → 961.bundle.8bb5a713fc5a3817c6a6.js} +2 -15
  23. package/dist/{987.bundle.e7c041a6dfb4ddb41813.js → 987.bundle.91d4867efedd5b4d84cb.js} +5 -1
  24. package/dist/{app.bundle.22ffa6050ebef98b2066.js → app.bundle.0c24b249dc8b631916ef.js} +2234 -980
  25. package/dist/app.bundle.css +1 -1
  26. package/dist/index.html +1 -1
  27. package/dist/{polySeg.bundle.99be036bab9b7f011b0c.js → polySeg.bundle.c1cec6312eb6c6dc3701.js} +1 -1
  28. package/dist/sw.js +1 -1
  29. package/package.json +17 -17
  30. package/dist/317.bundle.dd0879c5035c4b90fad3.js +0 -562
  31. /package/dist/{164.bundle.710b5db3fef4d536a59f.js → 164.bundle.ff12d6019a627cda2a6c.js} +0 -0
  32. /package/dist/{50.css → 638.css} +0 -0
  33. /package/dist/{963.css → 701.css} +0 -0
@@ -23,10 +23,10 @@ var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
23
23
  var esm = __webpack_require__(20767);
24
24
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 383 modules
25
25
  var dist_esm = __webpack_require__(50719);
26
- // EXTERNAL MODULE: ../../core/src/index.ts + 66 modules
27
- var src = __webpack_require__(14283);
28
- // EXTERNAL MODULE: ../../ui/src/index.js + 489 modules
29
- var ui_src = __webpack_require__(6804);
26
+ // EXTERNAL MODULE: ../../core/src/index.ts + 67 modules
27
+ var src = __webpack_require__(78198);
28
+ // EXTERNAL MODULE: ../../ui/src/index.js + 497 modules
29
+ var ui_src = __webpack_require__(58046);
30
30
  // EXTERNAL MODULE: ../../../extensions/cornerstone/src/state.ts
31
31
  var state = __webpack_require__(71353);
32
32
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.css
@@ -262,78 +262,11 @@ function getCompression(imageId) {
262
262
 
263
263
 
264
264
  const EPSILON = 1e-4;
265
- /**
266
- * Window Level / Center Overlay item
267
- */
268
- function VOIOverlayItem({
269
- voi,
270
- customization
271
- }) {
272
- const {
273
- windowWidth,
274
- windowCenter
275
- } = voi;
276
- if (typeof windowCenter !== 'number' || typeof windowWidth !== 'number') {
277
- return null;
278
- }
279
- return /*#__PURE__*/react.createElement("div", {
280
- className: "overlay-item flex flex-row",
281
- style: {
282
- color: customization && customization.color || undefined
283
- }
284
- }, /*#__PURE__*/react.createElement("span", {
285
- className: "mr-1 shrink-0"
286
- }, "W:"), /*#__PURE__*/react.createElement("span", {
287
- className: "ml-1 mr-2 shrink-0 font-light"
288
- }, windowWidth.toFixed(0)), /*#__PURE__*/react.createElement("span", {
289
- className: "mr-1 shrink-0"
290
- }, "L:"), /*#__PURE__*/react.createElement("span", {
291
- className: "ml-1 shrink-0 font-light"
292
- }, windowCenter.toFixed(0)));
293
- }
294
-
295
- /**
296
- * Zoom Level Overlay item
297
- */
298
- function ZoomOverlayItem({
299
- scale,
300
- customization
301
- }) {
302
- return /*#__PURE__*/react.createElement("div", {
303
- className: "overlay-item flex flex-row",
304
- style: {
305
- color: customization && customization.color || undefined
306
- }
307
- }, /*#__PURE__*/react.createElement("span", {
308
- className: "mr-1 shrink-0"
309
- }, "Zoom:"), /*#__PURE__*/react.createElement("span", {
310
- className: "font-light"
311
- }, scale.toFixed(2), "x"));
312
- }
313
-
314
- /**
315
- * Instance Number Overlay Item
316
- */
317
- function InstanceNumberOverlayItem({
318
- instanceNumber,
319
- imageSliceData,
320
- customization
321
- }) {
322
- const {
323
- imageIndex,
324
- numberOfSlices
325
- } = imageSliceData;
326
- return /*#__PURE__*/react.createElement("div", {
327
- className: "overlay-item flex flex-row",
328
- style: {
329
- color: customization && customization.color || undefined
330
- }
331
- }, /*#__PURE__*/react.createElement("span", {
332
- className: "mr-1 shrink-0"
333
- }, "I:"), /*#__PURE__*/react.createElement("span", {
334
- className: "font-light"
335
- }, instanceNumber !== undefined && instanceNumber !== null ? `${instanceNumber} (${imageIndex + 1}/${numberOfSlices})` : `${imageIndex + 1}/${numberOfSlices}`));
336
- }
265
+ const OverlayItemComponents = {
266
+ 'ohif.overlayItem.windowLevel': VOIOverlayItem,
267
+ 'ohif.overlayItem.zoomLevel': ZoomOverlayItem,
268
+ 'ohif.overlayItem.instanceNumber': InstanceNumberOverlayItem
269
+ };
337
270
 
338
271
  /**
339
272
  * Customizable Viewport Overlay
@@ -346,16 +279,15 @@ function CustomizableViewportOverlay({
346
279
  servicesManager
347
280
  }) {
348
281
  const {
349
- toolbarService,
350
282
  cornerstoneViewportService,
351
- customizationService
283
+ customizationService,
284
+ toolGroupService
352
285
  } = servicesManager.services;
353
286
  const [voi, setVOI] = (0,react.useState)({
354
287
  windowCenter: null,
355
288
  windowWidth: null
356
289
  });
357
290
  const [scale, setScale] = (0,react.useState)(1);
358
- const [activeTools, setActiveTools] = (0,react.useState)([]);
359
291
  const {
360
292
  imageIndex
361
293
  } = imageSliceData;
@@ -363,26 +295,8 @@ function CustomizableViewportOverlay({
363
295
  const topRightCustomization = customizationService.getModeCustomization('cornerstoneOverlayTopRight');
364
296
  const bottomLeftCustomization = customizationService.getModeCustomization('cornerstoneOverlayBottomLeft');
365
297
  const bottomRightCustomization = customizationService.getModeCustomization('cornerstoneOverlayBottomRight');
366
- const instance = (0,react.useMemo)(() => {
367
- if (viewportData != null) {
368
- return _getViewportInstance(viewportData, imageIndex);
369
- } else {
370
- return null;
371
- }
372
- }, [viewportData, imageIndex]);
373
- const instanceNumber = (0,react.useMemo)(() => {
374
- if (viewportData != null) {
375
- return _getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService);
376
- }
377
- return null;
378
- }, [viewportData, viewportId, imageIndex, cornerstoneViewportService]);
379
-
380
- /**
381
- * Initial toolbar state
382
- */
383
- (0,react.useEffect)(() => {
384
- setActiveTools(toolbarService.getActiveTools());
385
- }, []);
298
+ const instance = (0,react.useMemo)(() => viewportData ? getViewportInstance(viewportData, imageIndex) : null, [viewportData, imageIndex]);
299
+ const instanceNumber = (0,react.useMemo)(() => viewportData ? getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService) : null, [viewportData, viewportId, imageIndex, cornerstoneViewportService]);
386
300
 
387
301
  /**
388
302
  * Updating the VOI when the viewport changes its voi
@@ -449,21 +363,6 @@ function CustomizableViewportOverlay({
449
363
  element.removeEventListener(dist_esm.Enums.Events.CAMERA_MODIFIED, updateScale);
450
364
  };
451
365
  }, [viewportId, viewportData, cornerstoneViewportService, element]);
452
-
453
- /**
454
- * Updating the active tools when the toolbar changes
455
- */
456
- // Todo: this should act on the toolGroups instead of the toolbar state
457
- (0,react.useEffect)(() => {
458
- const {
459
- unsubscribe
460
- } = toolbarService.subscribe(toolbarService.EVENTS.TOOL_BAR_STATE_MODIFIED, () => {
461
- setActiveTools(toolbarService.getActiveTools());
462
- });
463
- return () => {
464
- unsubscribe();
465
- };
466
- }, [toolbarService]);
467
366
  const _renderOverlayItem = (0,react.useCallback)(item => {
468
367
  const overlayItemProps = {
469
368
  element,
@@ -479,17 +378,19 @@ function CustomizableViewportOverlay({
479
378
  formatNumberPrecision: formatNumberPrecision
480
379
  },
481
380
  instance,
482
- // calculated
483
381
  voi,
484
382
  scale,
485
383
  instanceNumber
486
384
  };
487
- if (item.customizationType === 'ohif.overlayItem.windowLevel') {
488
- return /*#__PURE__*/react.createElement(VOIOverlayItem, overlayItemProps);
489
- } else if (item.customizationType === 'ohif.overlayItem.zoomLevel') {
490
- return /*#__PURE__*/react.createElement(ZoomOverlayItem, overlayItemProps);
491
- } else if (item.customizationType === 'ohif.overlayItem.instanceNumber') {
492
- return /*#__PURE__*/react.createElement(InstanceNumberOverlayItem, overlayItemProps);
385
+ if (!item) {
386
+ return null;
387
+ }
388
+ const {
389
+ customizationType
390
+ } = item;
391
+ const OverlayItemComponent = OverlayItemComponents[customizationType];
392
+ if (OverlayItemComponent) {
393
+ return /*#__PURE__*/react.createElement(OverlayItemComponent, overlayItemProps);
493
394
  } else {
494
395
  const renderItem = customizationService.transform(item);
495
396
  if (typeof renderItem.content === 'function') {
@@ -497,68 +398,68 @@ function CustomizableViewportOverlay({
497
398
  }
498
399
  }
499
400
  }, [element, viewportData, imageSliceData, viewportId, servicesManager, customizationService, instance, voi, scale, instanceNumber]);
500
- const getTopLeftContent = (0,react.useCallback)(() => {
501
- const items = topLeftCustomization?.items || [{
401
+ const getContent = (0,react.useCallback)((customization, defaultItems, keyPrefix) => {
402
+ const items = customization?.items ?? defaultItems;
403
+ return /*#__PURE__*/react.createElement(react.Fragment, null, items.map((item, index) => /*#__PURE__*/react.createElement("div", {
404
+ key: `${keyPrefix}_${index}`
405
+ }, item?.condition ? item.condition() ? _renderOverlayItem(item) : null : _renderOverlayItem(item))));
406
+ }, [_renderOverlayItem]);
407
+ return /*#__PURE__*/react.createElement(ui_src/* ViewportOverlay */.pU, {
408
+ topLeft:
409
+ /**
410
+ * Inline default overlay items for a more standard expansion
411
+ */
412
+ getContent(topLeftCustomization, [{
502
413
  id: 'WindowLevel',
503
414
  customizationType: 'ohif.overlayItem.windowLevel'
504
- }];
505
- return /*#__PURE__*/react.createElement(react.Fragment, null, items.map((item, i) => /*#__PURE__*/react.createElement("div", {
506
- key: `topLeftOverlayItem_${i}`
507
- }, _renderOverlayItem(item))));
508
- }, [topLeftCustomization, _renderOverlayItem]);
509
- const getTopRightContent = (0,react.useCallback)(() => {
510
- const items = topRightCustomization?.items || [{
511
- id: 'InstanceNmber',
415
+ }, {
416
+ id: 'ZoomLevel',
417
+ customizationType: 'ohif.overlayItem.zoomLevel',
418
+ condition: () => {
419
+ const activeToolName = toolGroupService.getActiveToolForViewport(viewportId);
420
+ return activeToolName === 'Zoom';
421
+ }
422
+ }], 'topLeftOverlayItem'),
423
+ topRight: getContent(topRightCustomization, [{
424
+ id: 'InstanceNumber',
512
425
  customizationType: 'ohif.overlayItem.instanceNumber'
513
- }];
514
- return /*#__PURE__*/react.createElement(react.Fragment, null, items.map((item, i) => /*#__PURE__*/react.createElement("div", {
515
- key: `topRightOverlayItem_${i}`
516
- }, _renderOverlayItem(item))));
517
- }, [topRightCustomization, _renderOverlayItem]);
518
- const getBottomLeftContent = (0,react.useCallback)(() => {
519
- const items = bottomLeftCustomization?.items || [];
520
- return /*#__PURE__*/react.createElement(react.Fragment, null, items.map((item, i) => /*#__PURE__*/react.createElement("div", {
521
- key: `bottomLeftOverlayItem_${i}`
522
- }, _renderOverlayItem(item))));
523
- }, [bottomLeftCustomization, _renderOverlayItem]);
524
- const getBottomRightContent = (0,react.useCallback)(() => {
525
- const items = bottomRightCustomization?.items || [];
526
- return /*#__PURE__*/react.createElement(react.Fragment, null, items.map((item, i) => /*#__PURE__*/react.createElement("div", {
527
- key: `bottomRightOverlayItem_${i}`
528
- }, _renderOverlayItem(item))));
529
- }, [bottomRightCustomization, _renderOverlayItem]);
530
- return /*#__PURE__*/react.createElement(ui_src/* ViewportOverlay */.pU, {
531
- topLeft: getTopLeftContent(),
532
- topRight: getTopRightContent(),
533
- bottomLeft: getBottomLeftContent(),
534
- bottomRight: getBottomRightContent()
426
+ }], 'topRightOverlayItem'),
427
+ bottomLeft: getContent(bottomLeftCustomization, [null], 'bottomLeftOverlayItem'),
428
+ bottomRight: getContent(bottomRightCustomization, [null], 'bottomRightOverlayItem')
535
429
  });
536
430
  }
537
- function _getViewportInstance(viewportData, imageIndex) {
431
+ const getViewportInstance = (viewportData, imageIndex) => {
432
+ const {
433
+ viewportType,
434
+ data
435
+ } = viewportData;
538
436
  let imageId = null;
539
- if (viewportData.viewportType === dist_esm.Enums.ViewportType.STACK) {
540
- imageId = viewportData.data.imageIds[imageIndex];
541
- } else if (viewportData.viewportType === dist_esm.Enums.ViewportType.ORTHOGRAPHIC) {
542
- const volumes = viewportData.data;
543
- if (volumes && volumes.length == 1) {
544
- const volume = volumes[0];
545
- imageId = volume.imageIds[imageIndex];
546
- }
437
+ switch (viewportType) {
438
+ case dist_esm.Enums.ViewportType.STACK:
439
+ imageId = data.imageIds[imageIndex];
440
+ break;
441
+ case dist_esm.Enums.ViewportType.ORTHOGRAPHIC:
442
+ if (data?.length === 1) {
443
+ imageId = data[0].imageIds[imageIndex];
444
+ }
445
+ break;
446
+ default:
447
+ break;
547
448
  }
548
449
  return imageId ? dist_esm.metaData.get('instance', imageId) || {} : {};
549
- }
550
- function _getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService) {
450
+ };
451
+ const getInstanceNumber = (viewportData, viewportId, imageIndex, cornerstoneViewportService) => {
551
452
  let instanceNumber;
552
- if (viewportData.viewportType === dist_esm.Enums.ViewportType.STACK) {
553
- instanceNumber = _getInstanceNumberFromStack(viewportData, imageIndex);
554
- if (!instanceNumber && instanceNumber !== 0) {
555
- return null;
556
- }
557
- } else if (viewportData.viewportType === dist_esm.Enums.ViewportType.ORTHOGRAPHIC) {
558
- instanceNumber = _getInstanceNumberFromVolume(viewportData, imageIndex, viewportId, cornerstoneViewportService);
453
+ switch (viewportData.viewportType) {
454
+ case dist_esm.Enums.ViewportType.STACK:
455
+ instanceNumber = _getInstanceNumberFromStack(viewportData, imageIndex);
456
+ break;
457
+ case dist_esm.Enums.ViewportType.ORTHOGRAPHIC:
458
+ instanceNumber = _getInstanceNumberFromVolume(viewportData, viewportId, cornerstoneViewportService);
459
+ break;
559
460
  }
560
- return instanceNumber;
561
- }
461
+ return instanceNumber ?? null;
462
+ };
562
463
  function _getInstanceNumberFromStack(viewportData, imageIndex) {
563
464
  const imageIds = viewportData.data.imageIds;
564
465
  const imageId = imageIds[imageIndex];
@@ -617,6 +518,79 @@ function _getInstanceNumberFromVolume(viewportData, viewportId, cornerstoneViewp
617
518
  return parseInt(instanceNumber);
618
519
  }
619
520
  }
521
+
522
+ /**
523
+ * Window Level / Center Overlay item
524
+ */
525
+ function VOIOverlayItem({
526
+ voi,
527
+ customization
528
+ }) {
529
+ const {
530
+ windowWidth,
531
+ windowCenter
532
+ } = voi;
533
+ if (typeof windowCenter !== 'number' || typeof windowWidth !== 'number') {
534
+ return null;
535
+ }
536
+ return /*#__PURE__*/react.createElement("div", {
537
+ className: "overlay-item flex flex-row",
538
+ style: {
539
+ color: customization && customization.color || undefined
540
+ }
541
+ }, /*#__PURE__*/react.createElement("span", {
542
+ className: "mr-1 shrink-0"
543
+ }, "W:"), /*#__PURE__*/react.createElement("span", {
544
+ className: "ml-1 mr-2 shrink-0 font-light"
545
+ }, windowWidth.toFixed(0)), /*#__PURE__*/react.createElement("span", {
546
+ className: "mr-1 shrink-0"
547
+ }, "L:"), /*#__PURE__*/react.createElement("span", {
548
+ className: "ml-1 shrink-0 font-light"
549
+ }, windowCenter.toFixed(0)));
550
+ }
551
+
552
+ /**
553
+ * Zoom Level Overlay item
554
+ */
555
+ function ZoomOverlayItem({
556
+ scale,
557
+ customization
558
+ }) {
559
+ return /*#__PURE__*/react.createElement("div", {
560
+ className: "overlay-item flex flex-row",
561
+ style: {
562
+ color: customization && customization.color || undefined
563
+ }
564
+ }, /*#__PURE__*/react.createElement("span", {
565
+ className: "mr-1 shrink-0"
566
+ }, "Zoom:"), /*#__PURE__*/react.createElement("span", {
567
+ className: "font-light"
568
+ }, scale.toFixed(2), "x"));
569
+ }
570
+
571
+ /**
572
+ * Instance Number Overlay Item
573
+ */
574
+ function InstanceNumberOverlayItem({
575
+ instanceNumber,
576
+ imageSliceData,
577
+ customization
578
+ }) {
579
+ const {
580
+ imageIndex,
581
+ numberOfSlices
582
+ } = imageSliceData;
583
+ return /*#__PURE__*/react.createElement("div", {
584
+ className: "overlay-item flex flex-row",
585
+ style: {
586
+ color: customization && customization.color || undefined
587
+ }
588
+ }, /*#__PURE__*/react.createElement("span", {
589
+ className: "mr-1 shrink-0"
590
+ }, "I:"), /*#__PURE__*/react.createElement("span", {
591
+ className: "font-light"
592
+ }, instanceNumber !== undefined && instanceNumber !== null ? `${instanceNumber} (${imageIndex + 1}/${numberOfSlices})` : `${imageIndex + 1}/${numberOfSlices}`));
593
+ }
620
594
  CustomizableViewportOverlay.propTypes = {
621
595
  viewportData: (prop_types_default()).object,
622
596
  imageIndex: (prop_types_default()).number,
@@ -965,33 +939,20 @@ function WrappedCinePlayer({
965
939
  servicesManager
966
940
  }) {
967
941
  const {
968
- toolbarService,
969
942
  customizationService,
970
943
  displaySetService,
971
- viewportGridService,
972
- cineService
944
+ viewportGridService
973
945
  } = servicesManager.services;
974
946
  const [{
975
947
  isCineEnabled,
976
948
  cines
977
- }] = (0,ui_src/* useCine */.tq)();
949
+ }, api] = (0,ui_src/* useCine */.tq)();
978
950
  const [newStackFrameRate, setNewStackFrameRate] = (0,react.useState)(24);
979
951
  const [appConfig] = (0,state_0/* useAppConfig */.r)();
952
+ const isMountedRef = (0,react.useRef)(null);
980
953
  const {
981
954
  component: CinePlayerComponent = ui_src/* CinePlayer */.F0
982
955
  } = customizationService.get('cinePlayer') ?? {};
983
- const handleCineClose = () => {
984
- toolbarService.recordInteraction({
985
- groupId: 'MoreTools',
986
- interactionType: 'toggle',
987
- commands: [{
988
- commandName: 'toggleCine',
989
- commandOptions: {},
990
- toolName: 'cine',
991
- context: 'CORNERSTONE'
992
- }]
993
- });
994
- };
995
956
  const cineHandler = () => {
996
957
  if (!cines || !cines[viewportId] || !enabledVPElement) {
997
958
  return;
@@ -1001,11 +962,11 @@ function WrappedCinePlayer({
1001
962
  const frameRate = cine.frameRate || 24;
1002
963
  const validFrameRate = Math.max(frameRate, 1);
1003
964
  if (isPlaying) {
1004
- cineService.playClip(enabledVPElement, {
965
+ api.playClip(enabledVPElement, {
1005
966
  framesPerSecond: validFrameRate
1006
967
  });
1007
968
  } else {
1008
- cineService.stopClip(enabledVPElement);
969
+ api.stopClip(enabledVPElement);
1009
970
  }
1010
971
  };
1011
972
  const newStackCineHandler = (0,react.useCallback)(() => {
@@ -1027,19 +988,22 @@ function WrappedCinePlayer({
1027
988
  }
1028
989
  });
1029
990
  if (isPlaying) {
1030
- cineService.setIsCineEnabled(isPlaying);
991
+ api.setIsCineEnabled(isPlaying);
1031
992
  }
1032
- cineService.setCine({
993
+ api.setCine({
1033
994
  id: viewportId,
1034
995
  isPlaying,
1035
996
  frameRate
1036
997
  });
1037
998
  setNewStackFrameRate(frameRate);
1038
- }, [cineService, displaySetService, viewportId, viewportGridService, cines]);
999
+ }, [displaySetService, viewportId, viewportGridService, cines]);
1039
1000
  (0,react.useEffect)(() => {
1001
+ isMountedRef.current = true;
1040
1002
  dist_esm.eventTarget.addEventListener(dist_esm.Enums.Events.STACK_VIEWPORT_NEW_STACK, newStackCineHandler);
1041
1003
  return () => {
1042
- cineService.setCine({
1004
+ isMountedRef.current = false;
1005
+ api.stopClip(enabledVPElement);
1006
+ api.setCine({
1043
1007
  id: viewportId,
1044
1008
  isPlaying: false
1045
1009
  });
@@ -1047,28 +1011,35 @@ function WrappedCinePlayer({
1047
1011
  };
1048
1012
  }, [enabledVPElement, newStackCineHandler]);
1049
1013
  (0,react.useEffect)(() => {
1050
- if (!cines || !cines[viewportId] || !enabledVPElement) {
1014
+ if (!cines || !cines[viewportId] || !enabledVPElement || !isMountedRef.current) {
1051
1015
  return;
1052
1016
  }
1053
1017
  cineHandler();
1054
1018
  return () => {
1055
- if (enabledVPElement && cines?.[viewportId]?.isPlaying) {
1056
- cineService.stopClip(enabledVPElement);
1057
- }
1019
+ api.stopClip(enabledVPElement);
1058
1020
  };
1059
- }, [cines, viewportId, cineService, enabledVPElement, cineHandler]);
1021
+ }, [cines, viewportId, enabledVPElement, cineHandler]);
1060
1022
  const cine = cines[viewportId];
1061
1023
  const isPlaying = cine && cine.isPlaying || false;
1062
1024
  return isCineEnabled && /*#__PURE__*/react.createElement(CinePlayerComponent, {
1063
1025
  className: "absolute left-1/2 bottom-3 -translate-x-1/2",
1064
1026
  frameRate: newStackFrameRate,
1065
1027
  isPlaying: isPlaying,
1066
- onClose: handleCineClose,
1067
- onPlayPauseChange: isPlaying => cineService.setCine({
1068
- id: viewportId,
1069
- isPlaying
1070
- }),
1071
- onFrameRateChange: frameRate => cineService.setCine({
1028
+ onClose: () => {
1029
+ // also stop the clip
1030
+ api.setCine({
1031
+ id: viewportId,
1032
+ isPlaying: false
1033
+ });
1034
+ api.setIsCineEnabled(false);
1035
+ },
1036
+ onPlayPauseChange: isPlaying => {
1037
+ api.setCine({
1038
+ id: viewportId,
1039
+ isPlaying
1040
+ });
1041
+ },
1042
+ onFrameRateChange: frameRate => api.setCine({
1072
1043
  id: viewportId,
1073
1044
  frameRate
1074
1045
  })
@@ -1161,7 +1132,8 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
1161
1132
  // Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation
1162
1133
  // of the imageData in the OHIFCornerstoneViewport. This prop is used
1163
1134
  // to set the initial state of the viewport's first image to render
1164
- initialImageIndex
1135
+ initialImageIndex,
1136
+ onReady
1165
1137
  } = props;
1166
1138
  const viewportId = viewportOptions.viewportId;
1167
1139
  const [scrollbarHeight, setScrollbarHeight] = (0,react.useState)('100px');
@@ -1222,6 +1194,7 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
1222
1194
  }
1223
1195
  if (onElementEnabled) {
1224
1196
  onElementEnabled(evt);
1197
+ onReady?.(evt);
1225
1198
  }
1226
1199
  }, [viewportId, onElementEnabled, toolGroupService]);
1227
1200