44 SharedElementsConfig ,
55 SharedElementAnimatedValue ,
66 SharedElementTransitionProps ,
7+ NavigationProp ,
78} from './types' ;
9+ import { normalizeSharedElementsConfig } from './utils' ;
810
911export type SharedElementRendererUpdateHandler = ( ) => any ;
1012
@@ -13,16 +15,33 @@ export interface ISharedElementRendererData {
1315 endTransition ( ) : void ;
1416 willActivateScene (
1517 sceneData : SharedElementSceneData ,
16- sharedElements : SharedElementsConfig ,
17- animValue ?: SharedElementAnimatedValue
18+ navigation : NavigationProp
1819 ) : void ;
19- didActivateScene ( sceneData : SharedElementSceneData ) : void ;
20+ didActivateScene (
21+ sceneData : SharedElementSceneData ,
22+ navigation : NavigationProp
23+ ) : void ;
24+ }
25+
26+ function getSharedElements (
27+ sceneData : SharedElementSceneData ,
28+ navigation : NavigationProp ,
29+ otherNavigation : NavigationProp ,
30+ show : boolean
31+ ) : SharedElementsConfig | null {
32+ const { sharedElements } = sceneData . Component ;
33+ if ( ! sharedElements ) return null ;
34+ // TODO push/pop distinction?
35+ return normalizeSharedElementsConfig (
36+ sharedElements ( navigation , otherNavigation , show )
37+ ) ;
2038}
2139
2240export default class SharedElementRendererData
2341 implements ISharedElementRendererData {
2442 private sceneData : SharedElementSceneData | null = null ;
2543 private prevSceneData : SharedElementSceneData | null = null ;
44+ private prevNavigation : NavigationProp | null = null ;
2645 private updateSubscribers = new Set < SharedElementRendererUpdateHandler > ( ) ;
2746 private sceneSubscription : SharedElementEventSubscription | null = null ;
2847 private sharedElements : SharedElementsConfig = [ ] ;
@@ -38,22 +57,27 @@ export default class SharedElementRendererData
3857
3958 willActivateScene (
4059 sceneData : SharedElementSceneData ,
41- sharedElements : SharedElementsConfig ,
42- animValue ?: SharedElementAnimatedValue
60+ navigation : NavigationProp
4361 ) : void {
4462 /*console.log(
4563 'SharedElementRendererData.willActivateScene: ',
4664 sceneData.name,
4765 ', previous: ',
48- this.prevSceneData ? this.prevSceneData.name : '',
49- ', sharedElements: ',
50- sharedElements
66+ this.prevSceneData ? this.prevSceneData.name : ''
5167 );*/
52- this . sceneData = sceneData ;
53- if ( ! this . prevSceneData ) return ;
54- this . sharedElements = sharedElements ;
55- if ( animValue ) this . animValue = animValue ;
56- if ( sharedElements . length ) {
68+ if ( ! this . prevSceneData || ! this . prevNavigation ) return ;
69+ const sharedElements =
70+ getSharedElements ( sceneData , navigation , this . prevNavigation , true ) ||
71+ getSharedElements (
72+ this . prevSceneData ,
73+ this . prevNavigation ,
74+ navigation ,
75+ false
76+ ) ;
77+ if ( sharedElements && sharedElements . length ) {
78+ // console.log('sharedElements: ', sharedElements, sceneData);
79+ this . sceneData = sceneData ;
80+ this . sharedElements = sharedElements ;
5781 this . sceneSubscription = this . sceneData . addUpdateListener ( ( ) => {
5882 // TODO optimize
5983 this . emitUpdateEvent ( ) ;
@@ -62,13 +86,17 @@ export default class SharedElementRendererData
6286 }
6387 }
6488
65- didActivateScene ( sceneData : SharedElementSceneData ) : void {
66- // console.log('SharedElementRendererData.didActivateScene: ', sceneData.name);
89+ didActivateScene (
90+ sceneData : SharedElementSceneData ,
91+ navigation : NavigationProp
92+ ) : void {
93+ //console.log('SharedElementRendererData.didActivateScene: ', sceneData.name);
6794 if ( this . sceneSubscription ) {
6895 this . sceneSubscription . remove ( ) ;
6996 this . sceneSubscription = null ;
7097 }
7198 this . prevSceneData = sceneData ;
99+ this . prevNavigation = navigation ;
72100 if ( this . sceneData ) {
73101 this . sceneData = null ;
74102 if ( this . sharedElements . length ) {
@@ -93,20 +121,24 @@ export default class SharedElementRendererData
93121
94122 getTransitions ( ) : SharedElementTransitionProps [ ] {
95123 const { prevSceneData, sceneData } = this ;
96- return this . sharedElements . map ( ( { id, sourceId, animation, debug } ) => ( {
97- position : this . animValue ,
98- start : {
99- ancestor :
100- ( prevSceneData ? prevSceneData . getAncestor ( ) : undefined ) || null ,
101- node :
102- ( prevSceneData ? prevSceneData . getNode ( sourceId ) : undefined ) || null ,
103- } ,
104- end : {
105- ancestor : ( sceneData ? sceneData . getAncestor ( ) : undefined ) || null ,
106- node : ( sceneData ? sceneData . getNode ( id ) : undefined ) || null ,
107- } ,
108- ...animation ,
109- debug,
110- } ) ) ;
124+ // console.log('getTransitions: ', sceneData, prevSceneData);
125+ return this . sharedElements . map ( ( { id, sourceId, animation, debug } ) => {
126+ return {
127+ position : this . animValue ,
128+ start : {
129+ ancestor :
130+ ( prevSceneData ? prevSceneData . getAncestor ( ) : undefined ) || null ,
131+ node :
132+ ( prevSceneData ? prevSceneData . getNode ( sourceId ) : undefined ) ||
133+ null ,
134+ } ,
135+ end : {
136+ ancestor : ( sceneData ? sceneData . getAncestor ( ) : undefined ) || null ,
137+ node : ( sceneData ? sceneData . getNode ( id ) : undefined ) || null ,
138+ } ,
139+ ...animation ,
140+ debug,
141+ } ;
142+ } ) ;
111143 }
112144}
0 commit comments