UNPKG

vscroll

Version:
87 lines 2.79 kB
import { BaseProcessFactory, CommonProcess, ProcessStatus } from './misc/index'; import { Direction } from '../inputs/index'; export default class PreClip extends BaseProcessFactory(CommonProcess.preClip) { static run(scroller) { PreClip.prepareClip(scroller); scroller.workflow.call({ process: PreClip.process, status: ProcessStatus.next, payload: { doClip: scroller.state.clip.doClip } }); } static prepareClip(scroller) { const { fetch, clip } = scroller.state; if (PreClip.shouldNotClip(scroller)) { return; } const firstIndex = fetch.first.indexBuffer; const lastIndex = fetch.last.indexBuffer; scroller.logger.log(() => `looking for ${fetch.direction ? 'anti-' + fetch.direction + ' ' : ''}items ` + `that are out of [${firstIndex}..${lastIndex}] range`); if (PreClip.isBackward(scroller, firstIndex)) { PreClip.prepareClipByDirection(scroller, Direction.backward, firstIndex); } if (PreClip.isForward(scroller, lastIndex)) { PreClip.prepareClipByDirection(scroller, Direction.forward, lastIndex); } if (!clip.doClip) { scroller.logger.log('skipping clip [no items to clip]'); } return; } static shouldNotClip(scroller) { const { settings, buffer, state } = scroller; if (settings.infinite && !state.clip.force) { scroller.logger.log('skipping clip [infinite mode]'); return true; } if (!buffer.size) { scroller.logger.log('skipping clip [empty buffer]'); return true; } if (state.cycle.isInitial) { scroller.logger.log('skipping clip [initial cycle]'); return true; } return false; } static isBackward(scroller, firstIndex) { const { buffer, state } = scroller; const { clip, fetch } = state; if (clip.force) { return clip.forceBackward; } if (fetch.direction !== Direction.backward) { if (firstIndex - 1 >= buffer.absMinIndex) { return true; } } return false; } static isForward(scroller, lastIndex) { const { buffer, state } = scroller; const { clip, fetch } = state; if (clip.force) { return clip.forceForward; } if (fetch.direction !== Direction.forward) { if (lastIndex + 1 <= buffer.absMaxIndex) { return true; } } return false; } static prepareClipByDirection(scroller, direction, edgeIndex) { const forward = direction === Direction.forward; scroller.buffer.items.forEach(item => { if ((!forward && item.$index < edgeIndex) || (forward && item.$index > edgeIndex)) { item.toRemove = true; item.removeDirection = direction; scroller.state.clip.doClip = true; } }); } } //# sourceMappingURL=preClip.js.map