Skip to content

Commit f36fe2f

Browse files
authored
refactor: store selected instance in awareness state (#4378)
For now sync awareness with selected instance selector. Added selectPage and selectInstance utilities to update awareness properly.
1 parent 4234f88 commit f36fe2f

File tree

26 files changed

+170
-147
lines changed

26 files changed

+170
-147
lines changed

apps/builder/app/builder/features/footer/breadcrumbs.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Fragment } from "react";
12
import { useStore } from "@nanostores/react";
23
import { ChevronRightIcon } from "@webstudio-is/icons";
34
import { theme, Button, Flex, Text } from "@webstudio-is/design-system";
@@ -9,7 +10,7 @@ import {
910
import { getAncestorInstanceSelector } from "~/shared/tree-utils";
1011
import { $textEditingInstanceSelector } from "~/shared/nano-states";
1112
import { getInstanceLabel } from "~/shared/instance-utils";
12-
import { Fragment } from "react";
13+
import { selectInstance } from "~/shared/awareness";
1314

1415
export const Breadcrumbs = () => {
1516
const instances = useStore($instances);
@@ -41,7 +42,7 @@ export const Breadcrumbs = () => {
4142
css={{ color: "inherit" }}
4243
key={instance.id}
4344
onClick={() => {
44-
$selectedInstanceSelector.set(
45+
selectInstance(
4546
getAncestorInstanceSelector(
4647
selectedInstanceSelector,
4748
instance.id

apps/builder/app/builder/features/marketplace/templates.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ import {
2727
updateWebstudioData,
2828
} from "~/shared/instance-utils";
2929
import { insertPageCopyMutable } from "~/shared/page-utils";
30-
import { switchPage } from "~/shared/pages";
3130
import { Card } from "./card";
3231
import type { MarketplaceOverviewItem } from "~/shared/marketplace/types";
32+
import { selectPage } from "~/shared/awareness";
3333

3434
/**
3535
* Insert page as a template.
@@ -65,7 +65,7 @@ const insertPage = ({
6565
});
6666
});
6767
if (newPageId) {
68-
switchPage(newPageId);
68+
selectPage(newPageId);
6969
}
7070
};
7171

apps/builder/app/builder/features/navigator/navigator-tree.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ import {
5555
} from "~/shared/instance-utils";
5656
import { emitCommand } from "~/builder/shared/commands";
5757
import { useContentEditable } from "~/shared/dom-hooks";
58-
import { $selectedPage } from "~/shared/awareness";
58+
import { $selectedPage, selectInstance } from "~/shared/awareness";
5959

6060
type TreeItem = {
6161
level: number;
@@ -485,8 +485,8 @@ export const NavigatorTree = () => {
485485
level={0}
486486
isSelected={selectedKey === ROOT_INSTANCE_ID}
487487
buttonProps={{
488-
onClick: () => $selectedInstanceSelector.set([ROOT_INSTANCE_ID]),
489-
onFocus: () => $selectedInstanceSelector.set([ROOT_INSTANCE_ID]),
488+
onClick: () => selectInstance([ROOT_INSTANCE_ID]),
489+
onFocus: () => selectInstance([ROOT_INSTANCE_ID]),
490490
}}
491491
action={
492492
<Tooltip
@@ -588,8 +588,8 @@ export const NavigatorTree = () => {
588588
onMouseEnter: () =>
589589
$hoveredInstanceSelector.set(item.selector),
590590
onMouseLeave: () => $hoveredInstanceSelector.set(undefined),
591-
onClick: () => $selectedInstanceSelector.set(item.selector),
592-
onFocus: () => $selectedInstanceSelector.set(item.selector),
591+
onClick: () => selectInstance(item.selector),
592+
onFocus: () => selectInstance(item.selector),
593593
onKeyDown: (event) => {
594594
if (event.key === "Enter") {
595595
emitCommand("editInstanceText");

apps/builder/app/builder/features/pages/page-settings.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ import {
7070
$assets,
7171
$instances,
7272
$pages,
73-
$selectedInstanceSelector,
7473
$dataSources,
7574
computeExpression,
7675
$dataSourceVariables,
@@ -108,6 +107,7 @@ import { $userPlanFeatures } from "~/builder/shared/nano-states";
108107
import type { UserPlanFeatures } from "~/shared/db/user-plan-features.server";
109108
import { useUnmount } from "~/shared/hook-utils/use-mount";
110109
import { Card } from "../marketplace/card";
110+
import { selectInstance } from "~/shared/awareness";
111111

112112
const fieldDefaultValues = {
113113
name: "Untitled",
@@ -1390,7 +1390,7 @@ const createPage = (pageId: Page["id"], values: Values) => {
13901390
});
13911391

13921392
registerFolderChildMutable(pages.folders, pageId, values.parentFolderId);
1393-
$selectedInstanceSelector.set(undefined);
1393+
selectInstance(undefined);
13941394
}
13951395
);
13961396
};

apps/builder/app/builder/features/pages/page-utils.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@ import {
2020
import {
2121
$dataSources,
2222
$pages,
23-
$selectedInstanceSelector,
2423
$variableValuesByInstanceSelector,
2524
} from "~/shared/nano-states";
2625
import { insertPageCopyMutable } from "~/shared/page-utils";
27-
import { $awareness, $selectedPage } from "~/shared/awareness";
26+
import { $selectedPage, selectPage } from "~/shared/awareness";
2827

2928
/**
3029
* When page or folder needs to be deleted or moved to a different parent,
@@ -205,9 +204,8 @@ export const getAllChildrenAndSelf = (
205204
export const deletePageMutable = (pageId: Page["id"], data: WebstudioData) => {
206205
const { pages } = data;
207206
// deselect page before deleting to avoid flash of content
208-
if ($awareness.get()?.pageId === pageId) {
209-
$awareness.set({ pageId: pages.homePage.id });
210-
$selectedInstanceSelector.set(undefined);
207+
if ($selectedPage.get()?.id === pageId) {
208+
selectPage(pages.homePage.id);
211209
}
212210
const rootInstanceId = findPageByIdOrPath(pageId, pages)?.rootInstanceId;
213211
if (rootInstanceId !== undefined) {

apps/builder/app/builder/features/pages/pages.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import {
2828
import { ExtendedPanel } from "../../shared/extended-sidebar-panel";
2929
import { NewPageSettings, PageSettings } from "./page-settings";
3030
import { $editingPageId, $pages } from "~/shared/nano-states";
31-
import { switchPage } from "~/shared/pages";
3231
import {
3332
getAllChildrenAndSelf,
3433
reparentOrphansMutable,
@@ -50,7 +49,7 @@ import {
5049
import { atom, computed } from "nanostores";
5150
import { isPathnamePattern } from "~/builder/shared/url-pattern";
5251
import { updateWebstudioData } from "~/shared/instance-utils";
53-
import { $selectedPage } from "~/shared/awareness";
52+
import { $selectedPage, selectPage } from "~/shared/awareness";
5453

5554
const ItemSuffix = ({
5655
isParentSelected,
@@ -448,7 +447,7 @@ const PageEditor = ({
448447
onClose={onClose}
449448
onSuccess={(pageId) => {
450449
onClose();
451-
switchPage(pageId);
450+
selectPage(pageId);
452451
}}
453452
/>
454453
);
@@ -463,13 +462,13 @@ const PageEditor = ({
463462
if (editingPageId === currentPage?.id) {
464463
const pages = $pages.get();
465464
if (pages) {
466-
switchPage(pages.homePage.id);
465+
selectPage(pages.homePage.id);
467466
}
468467
}
469468
}}
470469
onDuplicate={(newPageId) => {
471470
onClose();
472-
switchPage(newPageId);
471+
selectPage(newPageId);
473472
}}
474473
pageId={editingPageId}
475474
key={editingPageId}
@@ -560,14 +559,14 @@ export const PagesPanel = ({ onClose }: { onClose: () => void }) => {
560559
<PagesTree
561560
selectedPageId={currentPage.id}
562561
onSelect={(itemId) => {
563-
switchPage(itemId);
562+
selectPage(itemId);
564563
onClose();
565564
}}
566565
editingItemId={editingItemId}
567566
onEdit={(itemId) => {
568567
// always select page when edit its settings
569568
if (itemId && isFolder(itemId, pages.folders) === false) {
570-
switchPage(itemId);
569+
selectPage(itemId);
571570
}
572571
$editingPageId.set(itemId);
573572
}}

apps/builder/app/builder/features/settings-panel/variables-section.stories.tsx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import type { Meta, StoryObj } from "@storybook/react";
22
import { Box } from "@webstudio-is/design-system";
3-
import { VariablesSection as VariablesSectionComponent } from "./variables-section";
4-
import {
5-
$pages,
6-
$selectedInstanceSelector,
7-
$instances,
8-
} from "~/shared/nano-states";
9-
import { registerContainers } from "~/shared/sync";
103
import { createDefaultPages } from "@webstudio-is/project-build";
4+
import { $pages, $instances } from "~/shared/nano-states";
5+
import { registerContainers } from "~/shared/sync";
116
import { $userPlanFeatures } from "~/builder/shared/nano-states";
127
import { $awareness } from "~/shared/awareness";
8+
import { VariablesSection as VariablesSectionComponent } from "./variables-section";
139

1410
$userPlanFeatures.set({
1511
...$userPlanFeatures.get(),
@@ -22,16 +18,15 @@ export default {
2218
} satisfies Meta;
2319

2420
registerContainers();
25-
$selectedInstanceSelector.set(["root"]);
2621
$instances.set(
2722
new Map([
28-
["root", { id: "root", type: "instance", component: "Box", children: [] }],
23+
["box", { id: "box", type: "instance", component: "Box", children: [] }],
2924
])
3025
);
31-
$awareness.set({ pageId: "home" });
3226
$pages.set(
33-
createDefaultPages({ rootInstanceId: "root", systemDataSourceId: "system" })
27+
createDefaultPages({ rootInstanceId: "box", systemDataSourceId: "system" })
3428
);
29+
$awareness.set({ pageId: "home", instanceSelector: ["box"] });
3530

3631
export const VariablesSection: StoryObj = {
3732
render: () => (

apps/builder/app/builder/features/style-panel/sections/advanced/advanced.stories.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import { Section } from "./advanced";
44
import {
55
$breakpoints,
66
$selectedBreakpointId,
7-
$selectedInstanceSelector,
87
$styles,
98
$styleSourceSelections,
109
} from "~/shared/nano-states";
1110
import { setProperty } from "../../shared/use-style-data";
11+
import { $awareness } from "~/shared/awareness";
1212

1313
const backgroundImage: StyleDecl = {
1414
breakpointId: "base",
@@ -27,7 +27,10 @@ $styles.set(new Map([[getStyleDeclKey(backgroundImage), backgroundImage]]));
2727
$styleSourceSelections.set(
2828
new Map([["box", { instanceId: "box", values: ["local"] }]])
2929
);
30-
$selectedInstanceSelector.set(["box"]);
30+
$awareness.set({
31+
pageId: "",
32+
instanceSelector: ["box"],
33+
});
3134

3235
setProperty("accentColor")({ type: "keyword", value: "red" });
3336
setProperty("alignContent")({ type: "keyword", value: "normal" });

apps/builder/app/builder/features/style-panel/sections/backgrounds/background-content.stories.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import {
77
import {
88
$breakpoints,
99
$selectedBreakpointId,
10-
$selectedInstanceSelector,
1110
$styles,
1211
$styleSourceSelections,
1312
} from "~/shared/nano-states";
1413
import { registerContainers } from "~/shared/sync";
1514
import { BackgroundContent } from "./background-content";
15+
import { $awareness } from "~/shared/awareness";
1616

1717
const backgroundImage: StyleDecl = {
1818
breakpointId: "base",
@@ -31,7 +31,10 @@ $styles.set(new Map([[getStyleDeclKey(backgroundImage), backgroundImage]]));
3131
$styleSourceSelections.set(
3232
new Map([["box", { instanceId: "box", values: ["local"] }]])
3333
);
34-
$selectedInstanceSelector.set(["box"]);
34+
$awareness.set({
35+
pageId: "",
36+
instanceSelector: ["box"],
37+
});
3538

3639
export const BackgroundContentStory = () => {
3740
const elementRef = useRef<HTMLDivElement>(null);

apps/builder/app/builder/features/style-panel/sections/backgrounds/backgrounds.stories.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import { registerContainers } from "~/shared/sync";
44
import {
55
$breakpoints,
66
$selectedBreakpointId,
7-
$selectedInstanceSelector,
87
$styles,
98
$styleSourceSelections,
109
} from "~/shared/nano-states";
1110
import { Section } from "./backgrounds";
11+
import { $awareness } from "~/shared/awareness";
1212

1313
const backgroundImage: StyleDecl = {
1414
breakpointId: "base",
@@ -40,7 +40,10 @@ $styles.set(new Map([[getStyleDeclKey(backgroundImage), backgroundImage]]));
4040
$styleSourceSelections.set(
4141
new Map([["box", { instanceId: "box", values: ["local"] }]])
4242
);
43-
$selectedInstanceSelector.set(["box"]);
43+
$awareness.set({
44+
pageId: "",
45+
instanceSelector: ["box"],
46+
});
4447

4548
const Panel = styled("div", {
4649
width: theme.spacing[30],

0 commit comments

Comments
 (0)