All files / src/stores data-overlay.store.ts

100% Statements 25/25
100% Branches 11/11
100% Functions 16/16
100% Lines 25/25

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109                                      14x           1x           11x       9x                   1x           2x     20x 25x   25x   25x 5x   1x     25x 28x 28x     25x 5x   1x     25x 22x 22x       2x       2x             2x     25x                        
import { defineStore } from 'pinia';
import { computed, ref } from 'vue';
import {
  CurrentDataOverlayState,
  DataOverlayType,
  InitialDataOverlayState,
} from '@3cr/types-ts';
import { inflateInitialDataOverlayState } from '@/functions/modelHelper';
import { parseDataOverlayData } from '@/functions/parsers/parseDataOverlayData';
import { parseDataOverlayEvent } from '@/functions/parsers/parseDataOverlayEvent';
import {
  DataOverlayAnnotation,
  DataOverlayDataRaw,
  DataOverlayEvent,
  DataOverlayData,
  DataOverlayMeasurement,
} from '@3cr/viewer-types-ts';
 
function isAnnotation(data: DataOverlayDataRaw): boolean {
  return data.DataType === DataOverlayType.Annotation;
}
 
function toAnnotation(
  data: DataOverlayDataRaw,
): DataOverlayData<DataOverlayAnnotation> {
  return parseDataOverlayData<DataOverlayAnnotation>(data);
}
 
function toAnnotationEvent(
  data: DataOverlayDataRaw,
): DataOverlayEvent<DataOverlayAnnotation> {
  return parseDataOverlayEvent<DataOverlayAnnotation>(data);
}
 
function isMeasurement(data: DataOverlayDataRaw): boolean {
  return (
    data.DataType === DataOverlayType.Length ||
    data.DataType === DataOverlayType.Polygon ||
    data.DataType === DataOverlayType.Angle
  );
}
 
function toMeasurement(
  data: DataOverlayDataRaw,
): DataOverlayData<DataOverlayMeasurement> {
  return parseDataOverlayData<DataOverlayMeasurement>(data);
}
 
function toMeasurementEvent(
  data: DataOverlayDataRaw,
): DataOverlayEvent<DataOverlayMeasurement> {
  return parseDataOverlayEvent<DataOverlayMeasurement>(data);
}
 
export const useDataOverlayStore = defineStore('data-overlay', () => {
  const state = ref<InitialDataOverlayState>(inflateInitialDataOverlayState());
 
  const event = ref<DataOverlayDataRaw | null>(null);
 
  const annotations = computed(() => {
    return state.value.DataOverlay.DataOverlay.filter(isAnnotation)
      .map(toAnnotation)
      .map((data) => data.Data);
  });
 
  const annotationEvent = computed(() => {
    const value = event.value;
    return value && isAnnotation(value) ? toAnnotationEvent(value) : null;
  });
 
  const measurements = computed(() => {
    return state.value.DataOverlay.DataOverlay.filter(isMeasurement)
      .map(toMeasurement)
      .map((data) => data.Data);
  });
 
  const measurementEvent = computed(() => {
    const value = event.value;
    return value && isMeasurement(value) ? toMeasurementEvent(value) : null;
  });
 
  function setInitialDataOverlayState(message: string): void {
    state.value = JSON.parse(message) as InitialDataOverlayState;
  }
 
  function setDataOverlayState(message: string): void {
    state.value = {
      Version: '1.1.0',
      DataOverlay: JSON.parse(message) as CurrentDataOverlayState,
    };
  }
 
  function setDataOverlayEvent(message: string): void {
    event.value = JSON.parse(message) as DataOverlayDataRaw;
  }
 
  return {
    state,
    event,
    annotations,
    annotationEvent,
    measurements,
    measurementEvent,
    setInitialDataOverlayState,
    setDataOverlayState,
    setDataOverlayEvent,
  };
});