@@ -17,6 +17,7 @@ import {
1717import type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' ;
1818import type { NgtBranchingReturn , NgtLoaderExtensions , NgtLoaderResult , NgtObjectMap } from './types' ;
1919import { makeObjectGraph } from './utils/make' ;
20+ import { safeDetectChanges } from './utils/safe-detect-changes' ;
2021
2122interface NgtLoader {
2223 < TReturnType , TUrl extends string | string [ ] | Record < string , string > > (
@@ -46,15 +47,13 @@ export type NgtLoaderResults<
4647
4748const cached = new Map < string , Observable < any > > ( ) ;
4849
49- function injectLoader < TReturnType , TUrl extends string | string [ ] | Record < string , string > > (
50+ function load < TReturnType , TUrl extends string | string [ ] | Record < string , string > > (
5051 loaderConstructorFactory : ( inputs : TUrl ) => new ( ...args : any [ ] ) => NgtLoaderResult < TReturnType > ,
5152 input : TUrl | Observable < TUrl > ,
5253 extensions ?: NgtLoaderExtensions ,
5354 onProgress ?: ( event : ProgressEvent ) => void
54- ) : Observable < NgtLoaderResults < TUrl , NgtBranchingReturn < TReturnType , GLTF , GLTF & NgtObjectMap > > > {
55+ ) {
5556 const urls$ = isObservable ( input ) ? input : of ( input ) ;
56- const cdr = inject ( ChangeDetectorRef ) ;
57-
5857 return urls$ . pipe (
5958 map ( ( inputs ) => {
6059 const loaderConstructor = loaderConstructorFactory ( inputs ) ;
@@ -83,7 +82,19 @@ function injectLoader<TReturnType, TUrl extends string | string[] | Record<strin
8382 } ) ,
8483 inputs ,
8584 ] 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 (
8798 switchMap ( ( [ observables$ , inputs ] ) => {
8899 return forkJoin ( observables$ ) . pipe (
89100 map ( ( results ) => {
@@ -96,7 +107,7 @@ function injectLoader<TReturnType, TUrl extends string | string[] | Record<strin
96107 } , { } as { [ key in keyof TUrl ] : NgtBranchingReturn < TReturnType , GLTF , GLTF & NgtObjectMap > } ) ;
97108 } ) ,
98109 tap ( ( ) => {
99- requestAnimationFrame ( ( ) => cdr . detectChanges ( ) ) ;
110+ requestAnimationFrame ( ( ) => void safeDetectChanges ( cdr ) ) ;
100111 } )
101112 ) ;
102113 } )
@@ -108,7 +119,7 @@ function injectLoader<TReturnType, TUrl extends string | string[] | Record<strin
108119} ;
109120
110121( 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 ( ) ;
112123} ;
113124
114125export const injectNgtLoader = injectLoader as NgtLoader ;
0 commit comments