mirror of
https://github.com/webstudio-is/webstudio.git
synced 2026-10-29 16:17:39 +09:00
## Description 1. What is this PR about (link the issue and add a short description) ## Steps for reproduction 1. click button 2. expect xyz ## Code Review - [ ] hi @kof, I need you to do - conceptual review (architecture, feature-correctness) - detailed review (read every line) - test it on preview ## Before requesting a review - [ ] made a self-review - [ ] added inline comments where things may be not obvious (the "why", not "what") ## Before merging - [ ] tested locally and on preview environment (preview dev login: 0000) - [ ] updated [test cases](https://github.com/webstudio-is/webstudio/blob/main/apps/builder/docs/test-cases.md) document - [ ] added tests - [ ] if any new env variables are added, added them to `.env` file
194 lines
6.3 KiB
TypeScript
194 lines
6.3 KiB
TypeScript
import { Store } from "immerhin";
|
|
import { enableMapSet, setAutoFreeze } from "immer";
|
|
import { useEffect } from "react";
|
|
import {
|
|
$project,
|
|
$pages,
|
|
$instances,
|
|
$props,
|
|
$dataSources,
|
|
$breakpoints,
|
|
$styles,
|
|
$styleSources,
|
|
$styleSourceSelections,
|
|
$assets,
|
|
$resources,
|
|
$marketplaceProduct,
|
|
} from "./data-stores";
|
|
import {
|
|
$selectedPageHash,
|
|
$selectedInstanceSizes,
|
|
$selectedInstanceRenderState,
|
|
$hoveredInstanceSelector,
|
|
$authTokenPermissions,
|
|
$toastErrors,
|
|
$selectedStyleSources,
|
|
$selectedStyleState,
|
|
$dataSourceVariables,
|
|
$dragAndDropState,
|
|
$selectedInstanceStates,
|
|
$canvasIframeState,
|
|
$uploadingFilesDataStore,
|
|
$memoryProps,
|
|
$detectedFontsWeights,
|
|
$builderMode,
|
|
$selectedBreakpointId,
|
|
$textEditingInstanceSelector,
|
|
$textEditorContextMenu,
|
|
$textEditorContextMenuCommand,
|
|
$isResizingCanvas,
|
|
$collaborativeInstanceRect,
|
|
$collaborativeInstanceSelector,
|
|
$hoveredInstanceOutline,
|
|
$selectedInstanceOutline,
|
|
$blockChildOutline,
|
|
$textToolbar,
|
|
$gridCellData,
|
|
$registeredComponentMetas,
|
|
$registeredTemplates,
|
|
$modifierKeys,
|
|
$instanceContextMenu,
|
|
} from "~/shared/nano-states";
|
|
import { $ephemeralStyles } from "~/canvas/stores";
|
|
import {
|
|
ImmerhinSyncObject,
|
|
NanostoresSyncObject,
|
|
SyncClient,
|
|
SyncObjectPool,
|
|
type SyncEmitter,
|
|
} from "../sync-client";
|
|
import { $canvasScrollbarSize } from "~/builder/shared/nano-states";
|
|
import { $awareness, $temporaryInstances } from "../awareness";
|
|
import { $systemDataByPage } from "../system";
|
|
import { $resourcesCache } from "../resources";
|
|
|
|
enableMapSet();
|
|
// safari structuredClone fix
|
|
setAutoFreeze(false);
|
|
|
|
export const clientSyncStore = new Store();
|
|
export const serverSyncStore = new Store();
|
|
|
|
export const registerContainers = () => {
|
|
// synchronize patches
|
|
serverSyncStore.register("pages", $pages);
|
|
serverSyncStore.register("breakpoints", $breakpoints);
|
|
serverSyncStore.register("instances", $instances);
|
|
serverSyncStore.register("styles", $styles);
|
|
serverSyncStore.register("styleSources", $styleSources);
|
|
serverSyncStore.register("styleSourceSelections", $styleSourceSelections);
|
|
serverSyncStore.register("props", $props);
|
|
serverSyncStore.register("dataSources", $dataSources);
|
|
serverSyncStore.register("resources", $resources);
|
|
serverSyncStore.register("assets", $assets);
|
|
serverSyncStore.register("marketplaceProduct", $marketplaceProduct);
|
|
};
|
|
|
|
export const createObjectPool = () => {
|
|
return new SyncObjectPool([
|
|
new ImmerhinSyncObject("server", serverSyncStore),
|
|
new ImmerhinSyncObject("client", clientSyncStore),
|
|
new NanostoresSyncObject("awareness", $awareness),
|
|
new NanostoresSyncObject("temporaryInstances", $temporaryInstances),
|
|
|
|
new NanostoresSyncObject("project", $project),
|
|
new NanostoresSyncObject("dataSourceVariables", $dataSourceVariables),
|
|
new NanostoresSyncObject("resourcesCache", $resourcesCache),
|
|
new NanostoresSyncObject("selectedPageHash", $selectedPageHash),
|
|
new NanostoresSyncObject("selectedInstanceSizes", $selectedInstanceSizes),
|
|
new NanostoresSyncObject(
|
|
"selectedInstanceRenderState",
|
|
$selectedInstanceRenderState
|
|
),
|
|
new NanostoresSyncObject(
|
|
"hoveredInstanceSelector",
|
|
$hoveredInstanceSelector
|
|
),
|
|
new NanostoresSyncObject("builderMode", $builderMode),
|
|
new NanostoresSyncObject("authTokenPermissions", $authTokenPermissions),
|
|
new NanostoresSyncObject("toastErrors", $toastErrors),
|
|
new NanostoresSyncObject("selectedStyleSources", $selectedStyleSources),
|
|
new NanostoresSyncObject("selectedStyleState", $selectedStyleState),
|
|
new NanostoresSyncObject("dragAndDropState", $dragAndDropState),
|
|
new NanostoresSyncObject("ephemeralStyles", $ephemeralStyles),
|
|
new NanostoresSyncObject("selectedInstanceStates", $selectedInstanceStates),
|
|
new NanostoresSyncObject("canvasIframeState", $canvasIframeState),
|
|
new NanostoresSyncObject(
|
|
"uploadingFilesDataStore",
|
|
$uploadingFilesDataStore
|
|
),
|
|
new NanostoresSyncObject("memoryProps", $memoryProps),
|
|
new NanostoresSyncObject("detectedFontsWeights", $detectedFontsWeights),
|
|
new NanostoresSyncObject("selectedBreakpointId", $selectedBreakpointId),
|
|
new NanostoresSyncObject(
|
|
"textEditingInstanceSelector",
|
|
$textEditingInstanceSelector
|
|
),
|
|
new NanostoresSyncObject("textEditorContextMenu", $textEditorContextMenu),
|
|
new NanostoresSyncObject(
|
|
"textEditorContextMenuCommand",
|
|
$textEditorContextMenuCommand
|
|
),
|
|
new NanostoresSyncObject("isResizingCanvas", $isResizingCanvas),
|
|
new NanostoresSyncObject("textToolbar", $textToolbar),
|
|
new NanostoresSyncObject(
|
|
"selectedInstanceOutline",
|
|
$selectedInstanceOutline
|
|
),
|
|
new NanostoresSyncObject("hoveredInstanceOutline", $hoveredInstanceOutline),
|
|
new NanostoresSyncObject("blockChildOutline", $blockChildOutline),
|
|
new NanostoresSyncObject("instanceContextMenu", $instanceContextMenu),
|
|
new NanostoresSyncObject("modifierKeys", $modifierKeys),
|
|
new NanostoresSyncObject("gridCellData", $gridCellData),
|
|
new NanostoresSyncObject(
|
|
"collaborativeInstanceSelector",
|
|
$collaborativeInstanceSelector
|
|
),
|
|
new NanostoresSyncObject(
|
|
"collaborativeInstanceRect",
|
|
$collaborativeInstanceRect
|
|
),
|
|
new NanostoresSyncObject(
|
|
"registeredComponentMetas",
|
|
$registeredComponentMetas
|
|
),
|
|
new NanostoresSyncObject("registeredTemplates", $registeredTemplates),
|
|
new NanostoresSyncObject("canvasScrollbarWidth", $canvasScrollbarSize),
|
|
new NanostoresSyncObject("systemDataByPage", $systemDataByPage),
|
|
]);
|
|
};
|
|
|
|
declare global {
|
|
interface Window {
|
|
__webstudioSharedSyncEmitter__: SyncEmitter | undefined;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* prevent syncEmitter interception from embedded scripts on canvas
|
|
* i.e., `globalThis.syncEmitter = () => console.log('INTERCEPTED');`,
|
|
*/
|
|
const sharedSyncEmitter =
|
|
typeof window === "undefined"
|
|
? undefined
|
|
: window.__webstudioSharedSyncEmitter__;
|
|
if (typeof window !== "undefined") {
|
|
delete window.__webstudioSharedSyncEmitter__;
|
|
}
|
|
|
|
export const useCanvasStore = () => {
|
|
useEffect(() => {
|
|
const canvasClient = new SyncClient({
|
|
role: "follower",
|
|
object: createObjectPool(),
|
|
emitter: sharedSyncEmitter,
|
|
});
|
|
|
|
const controller = new AbortController();
|
|
canvasClient.connect({ signal: controller.signal });
|
|
return () => {
|
|
controller.abort();
|
|
};
|
|
}, []);
|
|
};
|