export function preventOverlap()

in src/lib/shared/helpers/labelsUtil.js [12:59]


export function preventOverlap(
  labelPositions,
  iteration = 0,
  labelSize = 12,
  coordinate = "y",
  moveBothLabels = true,
) {
  const maxIterations = 10
  let totalOverlap = 0

  if (!isArrayWithCoordinates(labelPositions, coordinate)) return labelPositions

  for (let index = 1; index < labelPositions.length; index++) {
    const previousElement = labelPositions[index - 1]
    const element = labelPositions[index]

    const overlap =
      previousElement[coordinate] - (element[coordinate] - labelSize)
    if (overlap < 0) {
      // no overlap, continue
      continue
    }

    if (moveBothLabels) {
      // @ts-ignore
      previousElement[coordinate] -= overlap / 2
      // @ts-ignore
      element[coordinate] += overlap / 2
    } else {
      // @ts-ignore
      previousElement[coordinate] -= overlap
    }

    totalOverlap += overlap
  }

  if (totalOverlap > 0 && iteration < maxIterations) {
    return preventOverlap(
      labelPositions,
      iteration + 1,
      labelSize,
      coordinate,
      moveBothLabels,
    )
  }

  return labelPositions
}