SpeedLimitSection/utils/milepostsUtil.ts

src/ui/components/widgets/SpeedLimitSection/utils/milepostsUtil.ts
 avatar
unknown
typescript
a year ago
2.4 kB
7
Indexable
import _ from 'lodash'

export const checkOverlapMileposts = (
  newSpeedLimit: any,
  existingSpeedLimits: any[],
  subdivision: string,
  idSpeedLimitItem?: string
): boolean => {
  // Get the speed limits within the same subdivision
  const speedLimitsOfSameDivision = existingSpeedLimits?.filter(
    item =>
      item?.subdivision === subdivision &&
      item?.temporary_speed_limit_id !== idSpeedLimitItem
  )

  // Append the new speed limit to the existing speed limit
  const newSpeedLimits = [
    ...speedLimitsOfSameDivision,
    { start_mile: newSpeedLimit.startMile, end_mile: newSpeedLimit.endMile }
  ]

  // Normalize the new speed limits
  let normalizedSpeedLimits = newSpeedLimits.map(speedLimit => {
    if (speedLimit.start_mile > speedLimit.end_mile) {
      return {
        start_mile: speedLimit.end_mile,
        end_mile: speedLimit.start_mile
      }
    }
    return speedLimit
  })

  // Sort speed limits by start mile
  normalizedSpeedLimits.sort((a, b) => a.start_mile - b.start_mile)

  // Check for overlaps
  for (let i = 0; i < normalizedSpeedLimits.length - 1; i++) {
    if (
      normalizedSpeedLimits[i].end_mile >
      normalizedSpeedLimits[i + 1].start_mile
    ) {
      return false
    }
  }

  return true
}

export const checkInvalidMileposts = (
  newSpeedLimit: { startMile: number; endMile: number },
  startLimit: string,
  endLimit: string
): boolean => {
  const { startMile, endMile } = newSpeedLimit
  const startLimitNum = Number(startLimit)
  const endLimitNum = Number(endLimit)

  if (startMile === undefined || endMile === undefined) {
    return true
  }

  return !(
    (startLimitNum < endLimitNum &&
      startMile <= endMile &&
      startMile >= startLimitNum &&
      endMile <= endLimitNum) ||
    (startLimitNum > endLimitNum &&
      startMile >= endMile &&
      startMile <= startLimitNum &&
      endMile >= endLimitNum)
  )
}

export const getWholeMileposts = (trackCoordinatesData: any[]) => {
  // Get unique track coords by milepost and lat, lng
  const uniqueTrackCoords = _.uniqBy(trackCoordinatesData, coord =>
    [
      coord.milepost,
      coord.gps_coordinates.lat,
      coord.gps_coordinates.lng
    ].join()
  )
  const wholeMilepostTrackCoords = uniqueTrackCoords.filter(
    (coord: any) => coord.milepost % 10 === 0
  )
  return wholeMilepostTrackCoords
}
Editor is loading...
Leave a Comment