import { correctNodes } from './utils/correctFocus'; import { pickFocusable } from './utils/firstFocus'; import { isGuard } from './utils/is'; export var NEW_FOCUS = 'NEW_FOCUS'; export var newFocus = function (innerNodes, outerNodes, activeElement, lastNode) { var cnt = innerNodes.length; var firstFocus = innerNodes[0]; var lastFocus = innerNodes[cnt - 1]; var isOnGuard = isGuard(activeElement); if (innerNodes.indexOf(activeElement) >= 0) { return undefined; } var activeIndex = outerNodes.indexOf(activeElement); var lastIndex = lastNode ? outerNodes.indexOf(lastNode) : activeIndex; var lastNodeInside = lastNode ? innerNodes.indexOf(lastNode) : -1; var indexDiff = activeIndex - lastIndex; var firstNodeIndex = outerNodes.indexOf(firstFocus); var lastNodeIndex = outerNodes.indexOf(lastFocus); var correctedNodes = correctNodes(outerNodes); var correctedIndexDiff = correctedNodes.indexOf(activeElement) - (lastNode ? correctedNodes.indexOf(lastNode) : activeIndex); var returnFirstNode = pickFocusable(innerNodes, 0); var returnLastNode = pickFocusable(innerNodes, cnt - 1); if (activeIndex === -1 || lastNodeInside === -1) { return NEW_FOCUS; } if (!indexDiff && lastNodeInside >= 0) { return lastNodeInside; } if (activeIndex <= firstNodeIndex && isOnGuard && Math.abs(indexDiff) > 1) { return returnLastNode; } if (activeIndex >= lastNodeIndex && isOnGuard && Math.abs(indexDiff) > 1) { return returnFirstNode; } if (indexDiff && Math.abs(correctedIndexDiff) > 1) { return lastNodeInside; } if (activeIndex <= firstNodeIndex) { return returnLastNode; } if (activeIndex > lastNodeIndex) { return returnFirstNode; } if (indexDiff) { if (Math.abs(indexDiff) > 1) { return lastNodeInside; } return (cnt + lastNodeInside + indexDiff) % cnt; } return undefined; };