@@ -15,6 +15,7 @@ import {
15
15
portalComponent ,
16
16
ROOT_INSTANCE_ID ,
17
17
SYSTEM_VARIABLE_ID ,
18
+ findTreeInstanceIds ,
18
19
} from "@webstudio-is/sdk" ;
19
20
import { normalizeProps , textContentAttribute } from "@webstudio-is/react-sdk" ;
20
21
import { mapGroupBy } from "~/shared/shim" ;
@@ -168,23 +169,19 @@ const $unscopedVariableValues = computed(
168
169
* circular updates
169
170
*/
170
171
const $loaderVariableValues = computed (
171
- [ $dataSources , $dataSourceVariables , $ selectedPage, $currentSystem ] ,
172
- ( dataSources , dataSourceVariables , selectedPage , system ) => {
172
+ [ $dataSources , $selectedPage , $currentSystem ] ,
173
+ ( dataSources , selectedPage , system ) => {
173
174
const values = new Map < string , unknown > ( ) ;
174
175
values . set ( SYSTEM_VARIABLE_ID , system ) ;
175
176
for ( const [ dataSourceId , dataSource ] of dataSources ) {
176
177
if ( dataSource . type === "variable" ) {
177
- values . set (
178
- dataSourceId ,
179
- dataSourceVariables . get ( dataSourceId ) ?? dataSource . value . value
180
- ) ;
178
+ values . set ( dataSourceId , dataSource . value . value ) ;
181
179
}
182
- if ( dataSource . type === "parameter" ) {
183
- let value = dataSourceVariables . get ( dataSourceId ) ;
184
- if ( dataSource . id === selectedPage ?. systemDataSourceId ) {
185
- value = system ;
186
- }
187
- values . set ( dataSourceId , value ) ;
180
+ if (
181
+ dataSource . type === "parameter" ||
182
+ dataSource . id === selectedPage ?. systemDataSourceId
183
+ ) {
184
+ values . set ( dataSourceId , system ) ;
188
185
}
189
186
}
190
187
return values ;
@@ -549,7 +546,7 @@ export const $variableValuesByInstanceSelector = computed(
549
546
}
550
547
) ;
551
548
552
- const computeResource = (
549
+ const computeResourceRequest = (
553
550
resource : Resource ,
554
551
values : Map < DataSource [ "id" ] , unknown >
555
552
) : ResourceRequest => {
@@ -569,21 +566,31 @@ const computeResource = (
569
566
return request ;
570
567
} ;
571
568
572
- const $computedResources = computed (
573
- [ $dataSources , $resources , $loaderVariableValues ] ,
574
- ( dataSources , resources , values ) => {
575
- const computedResources : ResourceRequest [ ] = [ ] ;
576
- // load only resources bound to variables
569
+ const $computedResourceRequests = computed (
570
+ [ $selectedPage , $instances , $dataSources , $resources , $loaderVariableValues ] ,
571
+ ( page , instances , dataSources , resources , values ) => {
572
+ const computedResourceRequests : ResourceRequest [ ] = [ ] ;
573
+ if ( page === undefined ) {
574
+ return computedResourceRequests ;
575
+ }
576
+ const instanceIds = findTreeInstanceIds ( instances , page . rootInstanceId ) ;
577
+ instanceIds . add ( ROOT_INSTANCE_ID ) ;
578
+ // load only resources bound to variables on current page
577
579
// action resources should not be loaded automatically
578
580
for ( const dataSource of dataSources . values ( ) ) {
579
- if ( dataSource . type === "resource" ) {
581
+ if (
582
+ instanceIds . has ( dataSource . scopeInstanceId ?? "" ) &&
583
+ dataSource . type === "resource"
584
+ ) {
580
585
const resource = resources . get ( dataSource . resourceId ) ;
581
586
if ( resource ) {
582
- computedResources . push ( computeResource ( resource , values ) ) ;
587
+ computedResourceRequests . push (
588
+ computeResourceRequest ( resource , values )
589
+ ) ;
583
590
}
584
591
}
585
592
}
586
- return computedResources ;
593
+ return computedResourceRequests ;
587
594
}
588
595
) ;
589
596
@@ -610,19 +617,19 @@ const cacheByKeys = new Map<string, unknown>();
610
617
611
618
const $invalidator = atom ( 0 ) ;
612
619
613
- export const getComputedResource = ( resourceId : Resource [ "id" ] ) => {
620
+ export const getComputedResourceRequest = ( resourceId : Resource [ "id" ] ) => {
614
621
const resources = $resources . get ( ) ;
615
622
const resource = resources . get ( resourceId ) ;
616
623
if ( resource === undefined ) {
617
624
return ;
618
625
}
619
626
const values = $loaderVariableValues . get ( ) ;
620
- return computeResource ( resource , values ) ;
627
+ return computeResourceRequest ( resource , values ) ;
621
628
} ;
622
629
623
630
// bump index of resource to invaldate cache entry
624
631
export const invalidateResource = ( resourceId : Resource [ "id" ] ) => {
625
- const request = getComputedResource ( resourceId ) ;
632
+ const request = getComputedResourceRequest ( resourceId ) ;
626
633
if ( request === undefined ) {
627
634
return ;
628
635
}
@@ -641,10 +648,10 @@ export const subscribeResources = () => {
641
648
let frameId : undefined | number ;
642
649
// subscribe changing resources or global invalidation
643
650
return computed (
644
- [ $computedResources , $invalidator ] ,
645
- ( computedResources , invalidator ) =>
646
- [ computedResources , invalidator ] as const
647
- ) . subscribe ( ( [ computedResources ] ) => {
651
+ [ $computedResourceRequests , $invalidator ] ,
652
+ ( computedResourceRequests , invalidator ) =>
653
+ [ computedResourceRequests , invalidator ] as const
654
+ ) . subscribe ( ( [ computedResourceRequests ] ) => {
648
655
if ( frameId ) {
649
656
cancelAnimationFrame ( frameId ) ;
650
657
}
@@ -653,7 +660,7 @@ export const subscribeResources = () => {
653
660
frameId = requestAnimationFrame ( async ( ) => {
654
661
const matched = new Map < Resource [ "id" ] , ResourceRequest > ( ) ;
655
662
const missing = new Map < Resource [ "id" ] , ResourceRequest > ( ) ;
656
- for ( const request of computedResources ) {
663
+ for ( const request of computedResourceRequests ) {
657
664
const cacheKey = JSON . stringify ( request ) ;
658
665
if ( cacheByKeys . has ( cacheKey ) ) {
659
666
matched . set ( request . id , request ) ;
@@ -668,14 +675,12 @@ export const subscribeResources = () => {
668
675
cacheByKeys . set ( cacheKey , undefined ) ;
669
676
}
670
677
671
- const missingValues = Array . from ( missing . values ( ) ) ;
672
- if ( missingValues . length === 0 ) {
673
- return ;
678
+ let result = new Map < string , unknown > ( ) ;
679
+ if ( missing . size > 0 ) {
680
+ result = await loadResources ( Array . from ( missing . values ( ) ) ) ;
674
681
}
675
-
676
- const result = await loadResources ( missingValues ) ;
677
682
const newResourceValues = new Map ( ) ;
678
- for ( const request of computedResources ) {
683
+ for ( const request of computedResourceRequests ) {
679
684
const cacheKey = JSON . stringify ( request ) ;
680
685
// read from cache or store in cache
681
686
const response = result . get ( request . id ) ?? cacheByKeys . get ( cacheKey ) ;
0 commit comments