vscroll
Version:
Virtual scroll engine
44 lines • 1.98 kB
JavaScript
import { BaseAdapterProcessFactory, AdapterProcess, ProcessStatus } from '../misc/index';
import { Item } from '../../classes/item';
import { Direction } from '../../inputs/index';
export default class Update extends BaseAdapterProcessFactory(AdapterProcess.update) {
static run(scroller, options) {
const { params } = Update.parseInput(scroller, options);
if (!params) {
return;
}
const shouldUpdate = Update.doUpdate(scroller, params);
scroller.workflow.call({
process: Update.process,
status: shouldUpdate ? ProcessStatus.next : ProcessStatus.done
});
}
static doUpdate(scroller, params) {
const { buffer, viewport, state: { fetch }, routines, logger } = scroller;
if (!buffer.items) {
logger.log(() => 'no items in Buffer');
return false;
}
const { item: firstItem, index: firstIndex, diff: firstItemDiff } = viewport.getEdgeVisibleItem(buffer.items, Direction.backward);
const { trackedIndex, toRemove } = buffer.updateItems(params.predicate, (index, data) => new Item(index, data, routines), firstIndex, !!params.fixRight);
let delta = 0;
const trackedItem = buffer.get(trackedIndex);
if (firstItem && firstItem === trackedItem) {
delta = -buffer.getSizeByIndex(trackedIndex) + firstItemDiff;
}
toRemove.forEach(item => item.hide());
logger.log(() => toRemove.length
? 'items to remove: [' + toRemove.map(({ $index }) => $index).join(',') + ']'
: 'no items to remove');
if (toRemove.length) { // insertions will be processed on render
buffer.checkDefaultSize();
}
const toRender = buffer.items.filter(({ toInsert }) => toInsert);
logger.log(() => toRender.length
? 'items to render: [' + toRender.map(({ $index }) => $index).join(',') + ']'
: 'no items to render');
fetch.update(trackedIndex, delta, toRender, toRemove);
return !!toRemove.length || !!toRender.length;
}
}
//# sourceMappingURL=update.js.map