1
- import { ViewBase , View , NavigatedData , NavigationTransition , Frame , BackstackEntry , Application } from "@nativescript/core" ;
1
+ import { ViewBase , View , NavigatedData , NavigationTransition , Frame , BackstackEntry , Application , Page } from "@nativescript/core" ;
2
2
import FrameElement from "./native/FrameElement" ;
3
3
import { createElement , DocumentNode , logger as log } from "./basicdom" ;
4
4
import PageElement from "./native/PageElement" ;
@@ -39,18 +39,28 @@ export function resolveTarget(viewSpec: ViewSpec): View {
39
39
}
40
40
return viewSpec ?. nativeView ;
41
41
}
42
+ // interface ComponentInstanceInfo<T = any> { element: NativeViewElementNode<View>, pageInstance: SvelteComponent<T> }
42
43
43
- export interface ComponentInstanceInfo < T = any > { element : NativeViewElementNode < View > , pageInstance : SvelteComponent < T > }
44
+ export interface ComponentInstanceInfo < T extends ViewBase = View , U = SvelteComponent > {
45
+ element : NativeViewElementNode < T > ;
46
+ viewInstance : U ;
47
+ }
44
48
45
- export function resolveComponentElement < T > ( pageSpec : PageSpec < T > , props ?: T ) : ComponentInstanceInfo < T > {
46
- let dummy = createElement ( 'fragment' , window . document as unknown as DocumentNode ) ;
47
- let pageInstance = new pageSpec ( { target : dummy , props : props } ) ;
48
- let element = dummy . firstElement ( ) as NativeViewElementNode < View > ;
49
- return { element, pageInstance }
49
+ export function resolveComponentElement < T , U extends ViewBase = View > ( viewSpec : typeof SvelteComponent < T > , props ?: T ) : ComponentInstanceInfo < U , SvelteComponent < T > > {
50
+ const dummy = createElement ( 'fragment' , window . document as any ) ;
51
+ const viewInstance = new viewSpec ( { target : dummy , props } ) ;
52
+ const element = dummy . firstElement ( ) as NativeViewElementNode < U > ;
53
+ return { element, viewInstance } ;
50
54
}
55
+ // export function resolveComponentElement<T>(pageSpec: PageSpec<T>, props?: T): ComponentInstanceInfo<T> {
56
+ // let dummy = createElement('fragment', window.document as unknown as DocumentNode);
57
+ // let pageInstance = new pageSpec({ target: dummy, props });
58
+ // let element = dummy.firstElement() as NativeViewElementNode<View>;
59
+ // return { element, pageInstance }
60
+ // }
51
61
52
62
export function navigate < T > ( options : NavigationOptions < T > ) : SvelteComponent < T > {
53
- let { frame, page, props = { } , ...navOptions } = options ;
63
+ let { frame, page, props, ...navOptions } = options ;
54
64
55
65
let targetFrame = resolveFrame ( frame ) ;
56
66
@@ -61,7 +71,7 @@ export function navigate<T>(options: NavigationOptions<T>): SvelteComponent<T> {
61
71
throw new Error ( "navigate requires page to be set to the svelte component class that implements the page or reference to a page element" ) ;
62
72
}
63
73
64
- let { element, pageInstance } = resolveComponentElement ( page , props ) ;
74
+ let { element, viewInstance } = resolveComponentElement < T , Page > ( page , props ) ;
65
75
66
76
if ( ! ( element instanceof PageElement ) )
67
77
throw new Error ( "navigate requires a svelte component with a page element at the root" ) ;
@@ -74,7 +84,7 @@ export function navigate<T>(options: NavigationOptions<T>): SvelteComponent<T> {
74
84
// will remove all set `navigatedFrom` while we are enumerating to actually send them
75
85
setTimeout ( ( ) => {
76
86
nativePage . off ( 'navigatedFrom' , handler ) ;
77
- pageInstance ?. $destroy ( ) ;
87
+ viewInstance ?. $destroy ( ) ;
78
88
} , 0 ) ;
79
89
}
80
90
} ;
@@ -89,7 +99,7 @@ export function navigate<T>(options: NavigationOptions<T>): SvelteComponent<T> {
89
99
create : ( ) => nativePage
90
100
} ) ;
91
101
92
- return pageInstance ;
102
+ return viewInstance ;
93
103
}
94
104
95
105
export interface BackNavigationOptions {
@@ -151,7 +161,7 @@ export function showModal<T, U>(modalOptions: ShowModalOptions<U>): Promise<T> {
151
161
if ( resolved ) return ;
152
162
resolved = true ;
153
163
try {
154
- componentInstanceInfo . pageInstance . $destroy ( ) ; //don't let an exception in destroy kill the promise callback
164
+ componentInstanceInfo . viewInstance . $destroy ( ) ; //don't let an exception in destroy kill the promise callback
155
165
} finally {
156
166
resolve ( result ) ;
157
167
}
0 commit comments