@hello-pangea/dnd
Version: 
Beautiful and accessible drag and drop for lists with React
45 lines (36 loc) • 1.3 kB
text/typescript
import getPercentage from '../../get-percentage';
import { AutoScrollerOptions } from '../../auto-scroller-options-types';
import minScroll from './min-scroll';
export default (
  proposedScroll: number,
  dragStartTime: number,
  getAutoScrollerOptions: () => AutoScrollerOptions,
): number => {
  const autoScrollerOptions = getAutoScrollerOptions();
  const accelerateAt: number =
    autoScrollerOptions.durationDampening.accelerateAt;
  const stopAt: number = autoScrollerOptions.durationDampening.stopDampeningAt;
  const startOfRange: number = dragStartTime;
  const endOfRange: number = stopAt;
  const now: number = Date.now();
  const runTime: number = now - startOfRange;
  // we have finished the time dampening period
  if (runTime >= stopAt) {
    return proposedScroll;
  }
  // Up to this point we know there is a proposed scroll
  // but we have not reached our accelerate point
  // Return the minimum amount of scroll
  if (runTime < accelerateAt) {
    return minScroll;
  }
  const betweenAccelerateAtAndStopAtPercentage: number = getPercentage({
    startOfRange: accelerateAt,
    endOfRange,
    current: runTime,
  });
  const scroll: number =
    proposedScroll *
    autoScrollerOptions.ease(betweenAccelerateAtAndStopAtPercentage);
  return Math.ceil(scroll);
};