@@ -17,6 +17,7 @@ import {
17
17
import type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' ;
18
18
import type { NgtBranchingReturn , NgtLoaderExtensions , NgtLoaderResult , NgtObjectMap } from './types' ;
19
19
import { makeObjectGraph } from './utils/make' ;
20
+ import { safeDetectChanges } from './utils/safe-detect-changes' ;
20
21
21
22
interface NgtLoader {
22
23
< TReturnType , TUrl extends string | string [ ] | Record < string , string > > (
@@ -46,15 +47,13 @@ export type NgtLoaderResults<
46
47
47
48
const cached = new Map < string , Observable < any > > ( ) ;
48
49
49
- function injectLoader < TReturnType , TUrl extends string | string [ ] | Record < string , string > > (
50
+ function load < TReturnType , TUrl extends string | string [ ] | Record < string , string > > (
50
51
loaderConstructorFactory : ( inputs : TUrl ) => new ( ...args : any [ ] ) => NgtLoaderResult < TReturnType > ,
51
52
input : TUrl | Observable < TUrl > ,
52
53
extensions ?: NgtLoaderExtensions ,
53
54
onProgress ?: ( event : ProgressEvent ) => void
54
- ) : Observable < NgtLoaderResults < TUrl , NgtBranchingReturn < TReturnType , GLTF , GLTF & NgtObjectMap > > > {
55
+ ) {
55
56
const urls$ = isObservable ( input ) ? input : of ( input ) ;
56
- const cdr = inject ( ChangeDetectorRef ) ;
57
-
58
57
return urls$ . pipe (
59
58
map ( ( inputs ) => {
60
59
const loaderConstructor = loaderConstructorFactory ( inputs ) ;
@@ -83,7 +82,19 @@ function injectLoader<TReturnType, TUrl extends string | string[] | Record<strin
83
82
} ) ,
84
83
inputs ,
85
84
] as [ Array < Observable < any > > , TUrl | TUrl [ ] ] ;
86
- } ) ,
85
+ } )
86
+ ) ;
87
+ }
88
+
89
+ function injectLoader < TReturnType , TUrl extends string | string [ ] | Record < string , string > > (
90
+ loaderConstructorFactory : ( inputs : TUrl ) => new ( ...args : any [ ] ) => NgtLoaderResult < TReturnType > ,
91
+ input : TUrl | Observable < TUrl > ,
92
+ extensions ?: NgtLoaderExtensions ,
93
+ onProgress ?: ( event : ProgressEvent ) => void
94
+ ) : Observable < NgtLoaderResults < TUrl , NgtBranchingReturn < TReturnType , GLTF , GLTF & NgtObjectMap > > > {
95
+ const cdr = inject ( ChangeDetectorRef ) ;
96
+
97
+ return load ( loaderConstructorFactory , input , extensions , onProgress ) . pipe (
87
98
switchMap ( ( [ observables$ , inputs ] ) => {
88
99
return forkJoin ( observables$ ) . pipe (
89
100
map ( ( results ) => {
@@ -96,7 +107,7 @@ function injectLoader<TReturnType, TUrl extends string | string[] | Record<strin
96
107
} , { } as { [ key in keyof TUrl ] : NgtBranchingReturn < TReturnType , GLTF , GLTF & NgtObjectMap > } ) ;
97
108
} ) ,
98
109
tap ( ( ) => {
99
- requestAnimationFrame ( ( ) => cdr . detectChanges ( ) ) ;
110
+ requestAnimationFrame ( ( ) => void safeDetectChanges ( cdr ) ) ;
100
111
} )
101
112
) ;
102
113
} )
@@ -108,7 +119,7 @@ function injectLoader<TReturnType, TUrl extends string | string[] | Record<strin
108
119
} ;
109
120
110
121
( injectLoader as NgtLoader ) . preLoad = ( loaderConstructorFactory , inputs , extensions ) => {
111
- injectLoader ( loaderConstructorFactory , inputs , extensions ) . pipe ( take ( 1 ) ) . subscribe ( ) ;
122
+ load ( loaderConstructorFactory , inputs , extensions ) . pipe ( take ( 1 ) ) . subscribe ( ) ;
112
123
} ;
113
124
114
125
export const injectNgtLoader = injectLoader as NgtLoader ;
0 commit comments