Skip to content

Commit d6f37ef

Browse files
authored
fix: load resources when switch pages (#4994)
Fixes #4992
1 parent 9442afc commit d6f37ef

File tree

2 files changed

+42
-37
lines changed

2 files changed

+42
-37
lines changed

apps/builder/app/builder/features/settings-panel/variable-popover.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ import {
5555
$resources,
5656
$areResourcesLoading,
5757
invalidateResource,
58-
getComputedResource,
58+
getComputedResourceRequest,
5959
$userPlanFeatures,
6060
$instances,
6161
$props,
@@ -776,7 +776,7 @@ export const VariablePopoverTrigger = ({
776776
prefix={<CopyIcon />}
777777
color="ghost"
778778
onClick={() => {
779-
const resourceRequest = getComputedResource(
779+
const resourceRequest = getComputedResourceRequest(
780780
variable.resourceId
781781
);
782782
if (resourceRequest) {

apps/builder/app/shared/nano-states/props.ts

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
portalComponent,
1616
ROOT_INSTANCE_ID,
1717
SYSTEM_VARIABLE_ID,
18+
findTreeInstanceIds,
1819
} from "@webstudio-is/sdk";
1920
import { normalizeProps, textContentAttribute } from "@webstudio-is/react-sdk";
2021
import { mapGroupBy } from "~/shared/shim";
@@ -168,23 +169,19 @@ const $unscopedVariableValues = computed(
168169
* circular updates
169170
*/
170171
const $loaderVariableValues = computed(
171-
[$dataSources, $dataSourceVariables, $selectedPage, $currentSystem],
172-
(dataSources, dataSourceVariables, selectedPage, system) => {
172+
[$dataSources, $selectedPage, $currentSystem],
173+
(dataSources, selectedPage, system) => {
173174
const values = new Map<string, unknown>();
174175
values.set(SYSTEM_VARIABLE_ID, system);
175176
for (const [dataSourceId, dataSource] of dataSources) {
176177
if (dataSource.type === "variable") {
177-
values.set(
178-
dataSourceId,
179-
dataSourceVariables.get(dataSourceId) ?? dataSource.value.value
180-
);
178+
values.set(dataSourceId, dataSource.value.value);
181179
}
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);
188185
}
189186
}
190187
return values;
@@ -549,7 +546,7 @@ export const $variableValuesByInstanceSelector = computed(
549546
}
550547
);
551548

552-
const computeResource = (
549+
const computeResourceRequest = (
553550
resource: Resource,
554551
values: Map<DataSource["id"], unknown>
555552
): ResourceRequest => {
@@ -569,21 +566,31 @@ const computeResource = (
569566
return request;
570567
};
571568

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
577579
// action resources should not be loaded automatically
578580
for (const dataSource of dataSources.values()) {
579-
if (dataSource.type === "resource") {
581+
if (
582+
instanceIds.has(dataSource.scopeInstanceId ?? "") &&
583+
dataSource.type === "resource"
584+
) {
580585
const resource = resources.get(dataSource.resourceId);
581586
if (resource) {
582-
computedResources.push(computeResource(resource, values));
587+
computedResourceRequests.push(
588+
computeResourceRequest(resource, values)
589+
);
583590
}
584591
}
585592
}
586-
return computedResources;
593+
return computedResourceRequests;
587594
}
588595
);
589596

@@ -610,19 +617,19 @@ const cacheByKeys = new Map<string, unknown>();
610617

611618
const $invalidator = atom(0);
612619

613-
export const getComputedResource = (resourceId: Resource["id"]) => {
620+
export const getComputedResourceRequest = (resourceId: Resource["id"]) => {
614621
const resources = $resources.get();
615622
const resource = resources.get(resourceId);
616623
if (resource === undefined) {
617624
return;
618625
}
619626
const values = $loaderVariableValues.get();
620-
return computeResource(resource, values);
627+
return computeResourceRequest(resource, values);
621628
};
622629

623630
// bump index of resource to invaldate cache entry
624631
export const invalidateResource = (resourceId: Resource["id"]) => {
625-
const request = getComputedResource(resourceId);
632+
const request = getComputedResourceRequest(resourceId);
626633
if (request === undefined) {
627634
return;
628635
}
@@ -641,10 +648,10 @@ export const subscribeResources = () => {
641648
let frameId: undefined | number;
642649
// subscribe changing resources or global invalidation
643650
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]) => {
648655
if (frameId) {
649656
cancelAnimationFrame(frameId);
650657
}
@@ -653,7 +660,7 @@ export const subscribeResources = () => {
653660
frameId = requestAnimationFrame(async () => {
654661
const matched = new Map<Resource["id"], ResourceRequest>();
655662
const missing = new Map<Resource["id"], ResourceRequest>();
656-
for (const request of computedResources) {
663+
for (const request of computedResourceRequests) {
657664
const cacheKey = JSON.stringify(request);
658665
if (cacheByKeys.has(cacheKey)) {
659666
matched.set(request.id, request);
@@ -668,14 +675,12 @@ export const subscribeResources = () => {
668675
cacheByKeys.set(cacheKey, undefined);
669676
}
670677

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()));
674681
}
675-
676-
const result = await loadResources(missingValues);
677682
const newResourceValues = new Map();
678-
for (const request of computedResources) {
683+
for (const request of computedResourceRequests) {
679684
const cacheKey = JSON.stringify(request);
680685
// read from cache or store in cache
681686
const response = result.get(request.id) ?? cacheByKeys.get(cacheKey);

0 commit comments

Comments
 (0)