mirror of https://github.com/sveltejs/svelte
parent
aa67f8b8c4
commit
45a9ce056d
@ -1,52 +1,77 @@
|
|||||||
import deindent from '../../../../utils/deindent.js';
|
import deindent from '../../../../utils/deindent.js';
|
||||||
|
|
||||||
export default function addTransitions ( generator, block, state, node, intro, outro ) {
|
export default function addTransitions ( generator, block, state, node, intro, outro ) {
|
||||||
const introName = intro && block.getUniqueName( `${state.name}_intro` );
|
|
||||||
const outroName = outro && block.getUniqueName( `${state.name}_outro` );
|
|
||||||
|
|
||||||
const introSnippet = intro && intro.expression ? block.contextualise( intro.expression ).snippet : '{}';
|
|
||||||
|
|
||||||
const outroSnippet = outro === intro ?
|
|
||||||
introSnippet :
|
|
||||||
outro && outro.expression ? block.contextualise( outro.expression ).snippet : '{}';
|
|
||||||
|
|
||||||
const wrapTransition = generator.helper( 'wrapTransition' );
|
const wrapTransition = generator.helper( 'wrapTransition' );
|
||||||
|
|
||||||
if ( intro ) {
|
if ( intro === outro ) {
|
||||||
block.addVariable( introName );
|
const name = block.getUniqueName( `${state.name}_transition` );
|
||||||
|
const snippet = intro.expression ? block.contextualise( intro.expression ).snippet : '{}';
|
||||||
|
|
||||||
const fn = `${generator.alias( 'template' )}.transitions.${intro.name}`; // TODO add built-in transitions?
|
block.addVariable( name );
|
||||||
|
|
||||||
if ( outro ) {
|
const fn = `${generator.alias( 'template' )}.transitions.${intro.name}`;
|
||||||
block.builders.intro.addBlock( `if ( ${outroName} ) ${outroName}.abort();` );
|
|
||||||
}
|
|
||||||
|
|
||||||
block.builders.intro.addBlock( deindent`
|
block.builders.intro.addBlock( deindent`
|
||||||
${block.component}._renderHooks.push( function () {
|
${block.component}._renderHooks.push( function () {
|
||||||
${introName} = ${wrapTransition}( ${state.name}, ${fn}, ${introSnippet}, true, null, function () {
|
if ( !${name} ) ${name} = ${wrapTransition}( ${state.name}, ${fn}, ${snippet}, true, null );
|
||||||
|
${name}.run( ${name}.t, 1, function () {
|
||||||
${block.component}.fire( 'intro.end', { node: ${state.name} });
|
${block.component}.fire( 'intro.end', { node: ${state.name} });
|
||||||
});
|
});
|
||||||
${generator.helper( 'transitionManager' )}.add( ${introName} );
|
|
||||||
});
|
});
|
||||||
` );
|
` );
|
||||||
}
|
|
||||||
|
|
||||||
if ( outro ) {
|
|
||||||
block.addVariable( outroName );
|
|
||||||
|
|
||||||
const fn = `${generator.alias( 'template' )}.transitions.${outro.name}`;
|
|
||||||
|
|
||||||
if ( intro ) {
|
|
||||||
block.builders.outro.addBlock( `${introName}.abort();` );
|
|
||||||
}
|
|
||||||
|
|
||||||
block.builders.outro.addBlock( deindent`
|
block.builders.outro.addBlock( deindent`
|
||||||
${outroName} = ${wrapTransition}( ${state.name}, ${fn}, ${outroSnippet}, false, null, function () {
|
${name}.run( ${name}.t, 0, function () {
|
||||||
detachNode( div );
|
detachNode( ${state.name} );
|
||||||
${block.component}.fire( 'outro.end', { node: ${state.name} });
|
${block.component}.fire( 'outro.end', { node: ${state.name} });
|
||||||
if ( --${block.alias( 'outros' )} === 0 ) ${block.alias( 'outrocallback' )}();
|
if ( --${block.alias( 'outros' )} === 0 ) ${block.alias( 'outrocallback' )}();
|
||||||
|
${name} = null;
|
||||||
});
|
});
|
||||||
transitionManager.add( ${outroName} );
|
|
||||||
` );
|
` );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
const introName = intro && block.getUniqueName( `${state.name}_intro` );
|
||||||
|
const outroName = outro && block.getUniqueName( `${state.name}_outro` );
|
||||||
|
|
||||||
|
if ( intro ) {
|
||||||
|
block.addVariable( introName );
|
||||||
|
const snippet = intro.expression ? block.contextualise( intro.expression ).snippet : '{}';
|
||||||
|
|
||||||
|
const fn = `${generator.alias( 'template' )}.transitions.${intro.name}`; // TODO add built-in transitions?
|
||||||
|
|
||||||
|
if ( outro ) {
|
||||||
|
block.builders.intro.addBlock( `if ( ${outroName} ) ${outroName}.abort();` );
|
||||||
|
}
|
||||||
|
|
||||||
|
block.builders.intro.addBlock( deindent`
|
||||||
|
${block.component}._renderHooks.push( function () {
|
||||||
|
${introName} = ${wrapTransition}( ${state.name}, ${fn}, ${snippet}, true, null );
|
||||||
|
${introName}.run( 0, 1, function () {
|
||||||
|
${block.component}.fire( 'intro.end', { node: ${state.name} });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
` );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( outro ) {
|
||||||
|
block.addVariable( outroName );
|
||||||
|
const snippet = outro.expression ? block.contextualise( outro.expression ).snippet : '{}';
|
||||||
|
|
||||||
|
const fn = `${generator.alias( 'template' )}.transitions.${outro.name}`;
|
||||||
|
|
||||||
|
if ( intro ) {
|
||||||
|
block.builders.outro.addBlock( `${introName}.abort();` );
|
||||||
|
}
|
||||||
|
|
||||||
|
block.builders.outro.addBlock( deindent`
|
||||||
|
${outroName} = ${wrapTransition}( ${state.name}, ${fn}, ${snippet}, false, null );
|
||||||
|
${outroName}.run( 1, 0, function () {
|
||||||
|
detachNode( ${state.name} );
|
||||||
|
${block.component}.fire( 'outro.end', { node: ${state.name} });
|
||||||
|
if ( --${block.alias( 'outros' )} === 0 ) ${block.alias( 'outrocallback' )}();
|
||||||
|
});
|
||||||
|
` );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in new issue