|
|
|
|
@ -15,12 +15,13 @@ import {
|
|
|
|
|
} from '../hydration.js';
|
|
|
|
|
import { empty } from '../operations.js';
|
|
|
|
|
import { insert, remove } from '../reconciler.js';
|
|
|
|
|
import { current_block } from '../../runtime.js';
|
|
|
|
|
import { current_block, untrack } from '../../runtime.js';
|
|
|
|
|
import {
|
|
|
|
|
destroy_effect,
|
|
|
|
|
pause_effect,
|
|
|
|
|
render_effect,
|
|
|
|
|
resume_effect
|
|
|
|
|
resume_effect,
|
|
|
|
|
user_effect
|
|
|
|
|
} from '../../reactivity/effects.js';
|
|
|
|
|
import { source, mutable_source, set } from '../../reactivity/sources.js';
|
|
|
|
|
import { is_array, is_frozen, map_get, map_set } from '../../utils.js';
|
|
|
|
|
@ -29,6 +30,14 @@ import { STATE_SYMBOL } from '../../constants.js';
|
|
|
|
|
var NEW_BLOCK = -1;
|
|
|
|
|
var LIS_BLOCK = -2;
|
|
|
|
|
|
|
|
|
|
/** @type {import('#client').EachItemBlock | null} */
|
|
|
|
|
export let current_each_item_block = null;
|
|
|
|
|
|
|
|
|
|
/** @param {import('#client').EachItemBlock | null} block */
|
|
|
|
|
export function set_current_each_item_block(block) {
|
|
|
|
|
current_each_item_block = block;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @template V
|
|
|
|
|
* @param {Element | Comment} anchor The next sibling node, or the parent node if this is a 'controlled' block
|
|
|
|
|
@ -316,13 +325,23 @@ function reconcile_tracked_array(array, each_block, anchor, render_fn, flags, ke
|
|
|
|
|
var b_blocks = Array(b);
|
|
|
|
|
|
|
|
|
|
var is_animated = (flags & EACH_IS_ANIMATED) !== 0;
|
|
|
|
|
var should_update = is_animated || (flags & (EACH_ITEM_REACTIVE | EACH_INDEX_REACTIVE)) !== 0;
|
|
|
|
|
var should_update = (flags & (EACH_ITEM_REACTIVE | EACH_INDEX_REACTIVE)) !== 0;
|
|
|
|
|
var start = 0;
|
|
|
|
|
var block;
|
|
|
|
|
|
|
|
|
|
/** @type {Array<import('#client').EachItemBlock>} */
|
|
|
|
|
var to_destroy = [];
|
|
|
|
|
|
|
|
|
|
/** @type {Array<import('#client').EachItemBlock>} */
|
|
|
|
|
var to_animate = [];
|
|
|
|
|
|
|
|
|
|
if (is_animated) {
|
|
|
|
|
for (block of a_blocks) {
|
|
|
|
|
// TODO can we avoid measuring blocks that will be destroyed?
|
|
|
|
|
block.a?.measure();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Step 1 — trim common suffix
|
|
|
|
|
while (a > 0 && b > 0 && a_blocks[a - 1].k === keys[b - 1]) {
|
|
|
|
|
block = b_blocks[--b] = a_blocks[--a];
|
|
|
|
|
@ -392,8 +411,7 @@ function reconcile_tracked_array(array, each_block, anchor, render_fn, flags, ke
|
|
|
|
|
b_blocks[index] = block;
|
|
|
|
|
|
|
|
|
|
if (is_animated) {
|
|
|
|
|
// If keys are animated, we need to do updates before actual moves
|
|
|
|
|
update_block(block, array[index], index, flags);
|
|
|
|
|
to_animate.push(block);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -424,6 +442,16 @@ function reconcile_tracked_array(array, each_block, anchor, render_fn, flags, ke
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (to_animate.length > 0) {
|
|
|
|
|
user_effect(() => {
|
|
|
|
|
untrack(() => {
|
|
|
|
|
for (block of to_animate) {
|
|
|
|
|
block.a?.apply();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var remaining = to_destroy.length;
|
|
|
|
|
if (remaining > 0) {
|
|
|
|
|
var clear = () => {
|
|
|
|
|
@ -602,6 +630,7 @@ function create_block(item, key, index, render_fn, flags) {
|
|
|
|
|
|
|
|
|
|
/** @type {import('#client').EachItemBlock} */
|
|
|
|
|
var block = {
|
|
|
|
|
a: null,
|
|
|
|
|
// dom
|
|
|
|
|
d: null,
|
|
|
|
|
// effect
|
|
|
|
|
@ -615,6 +644,11 @@ function create_block(item, key, index, render_fn, flags) {
|
|
|
|
|
v: item_value
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var previous_each_item_block = current_each_item_block;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
current_each_item_block = block;
|
|
|
|
|
|
|
|
|
|
block.e = render_effect(
|
|
|
|
|
() => {
|
|
|
|
|
render_fn(null, block.v, block.i);
|
|
|
|
|
@ -624,4 +658,7 @@ function create_block(item, key, index, render_fn, flags) {
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return block;
|
|
|
|
|
} finally {
|
|
|
|
|
current_each_item_block = previous_each_item_block;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|