@makeswift/runtime 0.27.2 → 0.27.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/api/api-resources-client.js +160 -0
- package/dist/cjs/api/api-resources-client.js.map +1 -0
- package/dist/cjs/api-handler/handlers/manifest.js +1 -1
- package/dist/cjs/api-handler/handlers/webhook/diff-projection.js +62 -0
- package/dist/cjs/api-handler/handlers/webhook/diff-projection.js.map +1 -0
- package/dist/cjs/box-model.js +33 -0
- package/dist/cjs/box-model.js.map +1 -0
- package/dist/cjs/builder/serialization.js +78 -0
- package/dist/cjs/builder/serialization.js.map +1 -0
- package/dist/cjs/client/index.js +3 -3
- package/dist/cjs/components/builtin/index.js +84 -0
- package/dist/cjs/components/builtin/index.js.map +1 -0
- package/dist/cjs/components/index.js +25 -0
- package/dist/cjs/components/index.js.map +1 -0
- package/dist/cjs/controls/rich-text-v2/translation.js +187 -0
- package/dist/cjs/controls/rich-text-v2/translation.js.map +1 -0
- package/dist/cjs/controls/serialization/base/index.js +78 -0
- package/dist/cjs/controls/serialization/base/index.js.map +1 -0
- package/dist/cjs/controls/serialization/base/visitor.js +59 -0
- package/dist/cjs/controls/serialization/base/visitor.js.map +1 -0
- package/dist/cjs/controls/serialization/index.js +55 -0
- package/dist/cjs/controls/serialization/index.js.map +1 -0
- package/dist/cjs/controls/serialization/message-port/function-serialization.js +79 -0
- package/dist/cjs/controls/serialization/message-port/function-serialization.js.map +1 -0
- package/dist/cjs/controls/serialization/message-port/index.js +25 -0
- package/dist/cjs/controls/serialization/message-port/index.js.map +1 -0
- package/dist/cjs/controls/serialization/message-port/visitor.js +48 -0
- package/dist/cjs/controls/serialization/message-port/visitor.js.map +1 -0
- package/dist/cjs/core/index.js +57 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/cjs/next/api-handler/config/pages-router.js +1 -1
- package/dist/cjs/next/api-handler/config/pages-router.js.map +1 -1
- package/dist/cjs/next/fetch.js +30 -0
- package/dist/cjs/next/fetch.js.map +1 -0
- package/dist/cjs/prop-controllers/index.js +48 -0
- package/dist/cjs/prop-controllers/index.js.map +1 -0
- package/dist/cjs/prop-controllers/serialization.js +355 -0
- package/dist/cjs/prop-controllers/serialization.js.map +1 -0
- package/dist/cjs/react.js +40 -0
- package/dist/cjs/react.js.map +1 -0
- package/dist/cjs/runtimes/react/components/LiveProvider.js.map +1 -1
- package/dist/cjs/runtimes/react/components/MakeswiftFonts.js +33 -0
- package/dist/cjs/runtimes/react/components/MakeswiftFonts.js.map +1 -0
- package/dist/cjs/runtimes/react/components/PreviewProvider.js +3 -9
- package/dist/cjs/runtimes/react/components/PreviewProvider.js.map +1 -1
- package/dist/cjs/runtimes/react/components/hooks/use-builder-connection-ping.js +10 -5
- package/dist/cjs/runtimes/react/components/hooks/use-builder-connection-ping.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/use-current-breakpoint.js +39 -0
- package/dist/cjs/runtimes/react/hooks/use-current-breakpoint.js.map +1 -0
- package/dist/cjs/runtimes/react/lib/resolved-style-to-css.js +59 -0
- package/dist/cjs/runtimes/react/lib/resolved-style-to-css.js.map +1 -0
- package/dist/cjs/runtimes/react/resource-resolver.js +52 -0
- package/dist/cjs/runtimes/react/resource-resolver.js.map +1 -0
- package/dist/cjs/state/actions.js +423 -0
- package/dist/cjs/state/actions.js.map +1 -0
- package/dist/cjs/state/api-client/client-store.js +81 -0
- package/dist/cjs/state/api-client/client-store.js.map +1 -0
- package/dist/cjs/state/api-client/fetch-api-resource.js +125 -0
- package/dist/cjs/state/api-client/fetch-api-resource.js.map +1 -0
- package/dist/cjs/state/api-client/state.js +89 -0
- package/dist/cjs/state/api-client/state.js.map +1 -0
- package/dist/cjs/state/api-client/store.js +36 -0
- package/dist/cjs/state/api-client/store.js.map +1 -0
- package/dist/cjs/state/builder-api/api.js +17 -0
- package/dist/cjs/state/builder-api/api.js.map +1 -0
- package/dist/cjs/state/builder-api/navigation-listener.js +110 -0
- package/dist/cjs/state/builder-api/navigation-listener.js.map +1 -0
- package/dist/cjs/state/mixins/breakpoint-watch.js +72 -0
- package/dist/cjs/state/mixins/breakpoint-watch.js.map +1 -0
- package/dist/cjs/state/react-builder-preview.js +97 -73
- package/dist/cjs/state/react-builder-preview.js.map +1 -1
- package/dist/cjs/state/react-page.js +57 -15
- package/dist/cjs/state/react-page.js.map +1 -1
- package/dist/cjs/utils/ref-counted-map.js +120 -0
- package/dist/cjs/utils/ref-counted-map.js.map +1 -0
- package/dist/esm/api/api-resources-client.js +127 -0
- package/dist/esm/api/api-resources-client.js.map +1 -0
- package/dist/esm/api-handler/handlers/manifest.js +1 -1
- package/dist/esm/api-handler/handlers/webhook/diff-projection.js +38 -0
- package/dist/esm/api-handler/handlers/webhook/diff-projection.js.map +1 -0
- package/dist/esm/box-model.js +7 -0
- package/dist/esm/box-model.js.map +1 -0
- package/dist/esm/builder/serialization.js +59 -0
- package/dist/esm/builder/serialization.js.map +1 -0
- package/dist/esm/client/index.js +3 -3
- package/dist/esm/components/builtin/index.js +34 -0
- package/dist/esm/components/builtin/index.js.map +1 -0
- package/dist/esm/components/index.js +3 -0
- package/dist/esm/components/index.js.map +1 -0
- package/dist/esm/controls/rich-text-v2/translation.js +152 -0
- package/dist/esm/controls/rich-text-v2/translation.js.map +1 -0
- package/dist/esm/controls/serialization/base/index.js +78 -0
- package/dist/esm/controls/serialization/base/index.js.map +1 -0
- package/dist/esm/controls/serialization/base/visitor.js +39 -0
- package/dist/esm/controls/serialization/base/visitor.js.map +1 -0
- package/dist/esm/controls/serialization/index.js +30 -0
- package/dist/esm/controls/serialization/index.js.map +1 -0
- package/dist/esm/controls/serialization/message-port/function-serialization.js +52 -0
- package/dist/esm/controls/serialization/message-port/function-serialization.js.map +1 -0
- package/dist/esm/controls/serialization/message-port/index.js +3 -0
- package/dist/esm/controls/serialization/message-port/index.js.map +1 -0
- package/dist/esm/controls/serialization/message-port/visitor.js +24 -0
- package/dist/esm/controls/serialization/message-port/visitor.js.map +1 -0
- package/dist/esm/core/index.js +35 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/next/api-handler/config/pages-router.js +1 -1
- package/dist/esm/next/api-handler/config/pages-router.js.map +1 -1
- package/dist/esm/next/fetch.js +6 -0
- package/dist/esm/next/fetch.js.map +1 -0
- package/dist/esm/prop-controllers/index.js +11 -0
- package/dist/esm/prop-controllers/index.js.map +1 -0
- package/dist/esm/prop-controllers/serialization.js +338 -0
- package/dist/esm/prop-controllers/serialization.js.map +1 -0
- package/dist/esm/react.js +11 -0
- package/dist/esm/react.js.map +1 -0
- package/dist/esm/runtimes/react/components/LiveProvider.js.map +1 -1
- package/dist/esm/runtimes/react/components/MakeswiftFonts.js +9 -0
- package/dist/esm/runtimes/react/components/MakeswiftFonts.js.map +1 -0
- package/dist/esm/runtimes/react/components/PreviewProvider.js +3 -9
- package/dist/esm/runtimes/react/components/PreviewProvider.js.map +1 -1
- package/dist/esm/runtimes/react/components/hooks/use-builder-connection-ping.js +10 -5
- package/dist/esm/runtimes/react/components/hooks/use-builder-connection-ping.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-current-breakpoint.js +15 -0
- package/dist/esm/runtimes/react/hooks/use-current-breakpoint.js.map +1 -0
- package/dist/esm/runtimes/react/lib/resolved-style-to-css.js +38 -0
- package/dist/esm/runtimes/react/lib/resolved-style-to-css.js.map +1 -0
- package/dist/esm/runtimes/react/resource-resolver.js +28 -0
- package/dist/esm/runtimes/react/resource-resolver.js.map +1 -0
- package/dist/esm/state/actions.js +349 -0
- package/dist/esm/state/actions.js.map +1 -0
- package/dist/esm/state/api-client/client-store.js +49 -0
- package/dist/esm/state/api-client/client-store.js.map +1 -0
- package/dist/esm/state/api-client/fetch-api-resource.js +93 -0
- package/dist/esm/state/api-client/fetch-api-resource.js.map +1 -0
- package/dist/esm/state/api-client/state.js +52 -0
- package/dist/esm/state/api-client/state.js.map +1 -0
- package/dist/esm/state/api-client/store.js +12 -0
- package/dist/esm/state/api-client/store.js.map +1 -0
- package/dist/esm/state/builder-api/api.js +1 -0
- package/dist/esm/state/builder-api/api.js.map +1 -0
- package/dist/esm/state/builder-api/navigation-listener.js +86 -0
- package/dist/esm/state/builder-api/navigation-listener.js.map +1 -0
- package/dist/esm/state/mixins/breakpoint-watch.js +48 -0
- package/dist/esm/state/mixins/breakpoint-watch.js.map +1 -0
- package/dist/esm/state/react-builder-preview.js +115 -72
- package/dist/esm/state/react-builder-preview.js.map +1 -1
- package/dist/esm/state/react-page.js +62 -11
- package/dist/esm/state/react-page.js.map +1 -1
- package/dist/esm/utils/ref-counted-map.js +96 -0
- package/dist/esm/utils/ref-counted-map.js.map +1 -0
- package/dist/types/api/api-resources-client.d.ts +57 -0
- package/dist/types/api/api-resources-client.d.ts.map +1 -0
- package/dist/types/api-handler/handlers/webhook/diff-projection.d.ts +201 -0
- package/dist/types/api-handler/handlers/webhook/diff-projection.d.ts.map +1 -0
- package/dist/types/box-model.d.ts +3 -0
- package/dist/types/box-model.d.ts.map +1 -0
- package/dist/types/builder/serialization.d.ts +23 -0
- package/dist/types/builder/serialization.d.ts.map +1 -0
- package/dist/types/builder/serialization.test.d.ts +2 -0
- package/dist/types/builder/serialization.test.d.ts.map +1 -0
- package/dist/types/client/tests/client.get-component-snapshots.test.d.ts +2 -0
- package/dist/types/client/tests/client.get-component-snapshots.test.d.ts.map +1 -0
- package/dist/types/client/tests/client.introspect-many.test.d.ts +2 -0
- package/dist/types/client/tests/client.introspect-many.test.d.ts.map +1 -0
- package/dist/types/components/builtin/index.d.ts +17 -0
- package/dist/types/components/builtin/index.d.ts.map +1 -0
- package/dist/types/components/hooks/__tests__/useMediaQuery.test.d.ts +3 -0
- package/dist/types/components/hooks/__tests__/useMediaQuery.test.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +3 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/controls/rich-text-v2/translation.d.ts +6 -0
- package/dist/types/controls/rich-text-v2/translation.d.ts.map +1 -0
- package/dist/types/controls/serialization/base/index.d.ts +10 -0
- package/dist/types/controls/serialization/base/index.d.ts.map +1 -0
- package/dist/types/controls/serialization/base/visitor.d.ts +7 -0
- package/dist/types/controls/serialization/base/visitor.d.ts.map +1 -0
- package/dist/types/controls/serialization/index.d.ts +10 -0
- package/dist/types/controls/serialization/index.d.ts.map +1 -0
- package/dist/types/controls/serialization/message-port/function-serialization.d.ts +16 -0
- package/dist/types/controls/serialization/message-port/function-serialization.d.ts.map +1 -0
- package/dist/types/controls/serialization/message-port/function-serialization.test.d.ts +2 -0
- package/dist/types/controls/serialization/message-port/function-serialization.test.d.ts.map +1 -0
- package/dist/types/controls/serialization/message-port/index.d.ts +3 -0
- package/dist/types/controls/serialization/message-port/index.d.ts.map +1 -0
- package/dist/types/controls/serialization/message-port/visitor.d.ts +7 -0
- package/dist/types/controls/serialization/message-port/visitor.d.ts.map +1 -0
- package/dist/types/core/index.d.ts +2 -0
- package/dist/types/core/index.d.ts.map +1 -0
- package/dist/types/next/api-handler/config/pages-router.test.d.ts +2 -0
- package/dist/types/next/api-handler/config/pages-router.test.d.ts.map +1 -0
- package/dist/types/next/components/tests/controls/code-control.test.d.ts +2 -0
- package/dist/types/next/components/tests/controls/code-control.test.d.ts.map +1 -0
- package/dist/types/next/components/tests/makeswift-component-rendering.test.d.ts +3 -0
- package/dist/types/next/components/tests/makeswift-component-rendering.test.d.ts.map +1 -0
- package/dist/types/next/fetch.d.ts +3 -0
- package/dist/types/next/fetch.d.ts.map +1 -0
- package/dist/types/prop-controllers/index.d.ts +8 -0
- package/dist/types/prop-controllers/index.d.ts.map +1 -0
- package/dist/types/prop-controllers/serialization.d.ts +228 -0
- package/dist/types/prop-controllers/serialization.d.ts.map +1 -0
- package/dist/types/react.d.ts +4 -0
- package/dist/types/react.d.ts.map +1 -0
- package/dist/types/runtimes/react/components/LiveProvider.d.ts +2 -2
- package/dist/types/runtimes/react/components/LiveProvider.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/MakeswiftFonts.d.ts +7 -0
- package/dist/types/runtimes/react/components/MakeswiftFonts.d.ts.map +1 -0
- package/dist/types/runtimes/react/components/PreviewProvider.d.ts +2 -4
- package/dist/types/runtimes/react/components/PreviewProvider.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/hooks/use-builder-connection-ping.d.ts.map +1 -1
- package/dist/types/runtimes/react/hooks/use-current-breakpoint.d.ts +3 -0
- package/dist/types/runtimes/react/hooks/use-current-breakpoint.d.ts.map +1 -0
- package/dist/types/runtimes/react/lib/resolved-style-to-css.d.ts +4 -0
- package/dist/types/runtimes/react/lib/resolved-style-to-css.d.ts.map +1 -0
- package/dist/types/runtimes/react/resource-resolver.d.ts +10 -0
- package/dist/types/runtimes/react/resource-resolver.d.ts.map +1 -0
- package/dist/types/state/actions.d.ts +461 -0
- package/dist/types/state/actions.d.ts.map +1 -0
- package/dist/types/state/api-client/client-store.d.ts +6 -0
- package/dist/types/state/api-client/client-store.d.ts.map +1 -0
- package/dist/types/state/api-client/fetch-api-resource.d.ts +11 -0
- package/dist/types/state/api-client/fetch-api-resource.d.ts.map +1 -0
- package/dist/types/state/api-client/state.d.ts +30 -0
- package/dist/types/state/api-client/state.d.ts.map +1 -0
- package/dist/types/state/api-client/store.d.ts +18 -0
- package/dist/types/state/api-client/store.d.ts.map +1 -0
- package/dist/types/state/builder-api/api.d.ts +9 -0
- package/dist/types/state/builder-api/api.d.ts.map +1 -0
- package/dist/types/state/builder-api/navigation-listener.d.ts +3 -0
- package/dist/types/state/builder-api/navigation-listener.d.ts.map +1 -0
- package/dist/types/state/mixins/breakpoint-watch.d.ts +11 -0
- package/dist/types/state/mixins/breakpoint-watch.d.ts.map +1 -0
- package/dist/types/state/react-builder-preview.d.ts +7 -5
- package/dist/types/state/react-builder-preview.d.ts.map +1 -1
- package/dist/types/state/react-page.d.ts +3 -3
- package/dist/types/state/react-page.d.ts.map +1 -1
- package/dist/types/utils/__tests__/ref-counted-map.test.d.ts +2 -0
- package/dist/types/utils/__tests__/ref-counted-map.test.d.ts.map +1 -0
- package/dist/types/utils/ref-counted-map.d.ts +32 -0
- package/dist/types/utils/ref-counted-map.d.ts.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { combineReducers } from "@reduxjs/toolkit";
|
|
2
|
+
import * as SiteVersionState from "../modules/site-version";
|
|
3
|
+
import * as LocaleState from "../modules/locale";
|
|
4
|
+
import * as APIResources from "../modules/api-resources";
|
|
5
|
+
import * as LocalizedResourcesMap from "../modules/localized-resources-map";
|
|
6
|
+
import { APIResourceType } from "../../api";
|
|
7
|
+
const reducer = combineReducers({
|
|
8
|
+
siteVersion: SiteVersionState.reducer,
|
|
9
|
+
locale: LocaleState.reducer,
|
|
10
|
+
apiResources: APIResources.reducer,
|
|
11
|
+
localizedResourcesMap: LocalizedResourcesMap.reducer
|
|
12
|
+
});
|
|
13
|
+
function getLocalizedResourceId(state, locale, resourceId) {
|
|
14
|
+
return LocalizedResourcesMap.getLocalizedResourceId(
|
|
15
|
+
state.localizedResourcesMap,
|
|
16
|
+
locale,
|
|
17
|
+
resourceId
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
function getHasAPIResource(state, resourceType, resourceId, locale) {
|
|
21
|
+
switch (resourceType) {
|
|
22
|
+
case APIResourceType.LocalizedGlobalElement:
|
|
23
|
+
if (locale == null) {
|
|
24
|
+
console.error(`Attempt to access ${resourceType} ${resourceId} without a locale`);
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const localizedId = getLocalizedResourceId(state, locale, resourceId);
|
|
28
|
+
return localizedId != null && APIResources.getHasAPIResource(state.apiResources, resourceType, localizedId, locale);
|
|
29
|
+
default:
|
|
30
|
+
return APIResources.getHasAPIResource(state.apiResources, resourceType, resourceId, locale);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function getAPIResource(state, resourceType, resourceId, locale) {
|
|
34
|
+
switch (resourceType) {
|
|
35
|
+
case APIResourceType.LocalizedGlobalElement:
|
|
36
|
+
if (locale == null) {
|
|
37
|
+
console.error(`Attempt to access ${resourceType} ${resourceId} without a locale`);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const localizedId = getLocalizedResourceId(state, locale, resourceId);
|
|
41
|
+
return localizedId != null ? APIResources.getAPIResource(state.apiResources, resourceType, localizedId, locale) : null;
|
|
42
|
+
default:
|
|
43
|
+
return APIResources.getAPIResource(state.apiResources, resourceType, resourceId, locale);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
getAPIResource,
|
|
48
|
+
getHasAPIResource,
|
|
49
|
+
getLocalizedResourceId,
|
|
50
|
+
reducer
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/state/api-client/state.ts"],"sourcesContent":["import { combineReducers, type ThunkDispatch } from '@reduxjs/toolkit'\n\nimport * as SiteVersionState from '../modules/site-version'\nimport * as LocaleState from '../modules/locale'\nimport * as APIResources from '../modules/api-resources'\nimport * as LocalizedResourcesMap from '../modules/localized-resources-map'\n\nimport { type Action } from '../actions'\n\nimport { APIResourceType, type APIResource, type APIResourceLocale } from '../../api'\n\nexport const reducer = combineReducers({\n siteVersion: SiteVersionState.reducer,\n locale: LocaleState.reducer,\n apiResources: APIResources.reducer,\n localizedResourcesMap: LocalizedResourcesMap.reducer,\n})\n\nexport type State = ReturnType<typeof reducer>\nexport type Dispatch = ThunkDispatch<State, unknown, Action>\n\nexport type SerializedState = {\n apiResources: APIResources.SerializedState\n localizedResourcesMap: LocalizedResourcesMap.SerializedState\n}\n\nexport function getLocalizedResourceId(\n state: State,\n locale: string,\n resourceId: string,\n): string | undefined | null {\n return LocalizedResourcesMap.getLocalizedResourceId(\n state.localizedResourcesMap,\n locale,\n resourceId,\n )\n}\n\nexport function getHasAPIResource<T extends APIResourceType>(\n state: State,\n resourceType: APIResourceType,\n resourceId: string,\n locale?: APIResourceLocale<T>,\n): boolean {\n switch (resourceType) {\n case APIResourceType.LocalizedGlobalElement:\n if (locale == null) {\n console.error(`Attempt to access ${resourceType} ${resourceId} without a locale`)\n return false\n }\n\n const localizedId = getLocalizedResourceId(state, locale, resourceId)\n return (\n localizedId != null &&\n APIResources.getHasAPIResource(state.apiResources, resourceType, localizedId, locale)\n )\n\n default:\n return APIResources.getHasAPIResource(state.apiResources, resourceType, resourceId, locale)\n }\n}\n\nexport function getAPIResource<T extends APIResourceType>(\n state: State,\n resourceType: T,\n resourceId: string,\n locale?: APIResourceLocale<T>,\n): Extract<APIResource, { __typename: T }> | null {\n switch (resourceType) {\n case APIResourceType.LocalizedGlobalElement:\n if (locale == null) {\n console.error(`Attempt to access ${resourceType} ${resourceId} without a locale`)\n return null\n }\n\n const localizedId = getLocalizedResourceId(state, locale, resourceId)\n return localizedId != null\n ? APIResources.getAPIResource(state.apiResources, resourceType, localizedId, locale)\n : null\n\n default:\n return APIResources.getAPIResource(state.apiResources, resourceType, resourceId, locale)\n }\n}\n"],"mappings":"AAAA,SAAS,uBAA2C;AAEpD,YAAY,sBAAsB;AAClC,YAAY,iBAAiB;AAC7B,YAAY,kBAAkB;AAC9B,YAAY,2BAA2B;AAIvC,SAAS,uBAAiE;AAEnE,MAAM,UAAU,gBAAgB;AAAA,EACrC,aAAa,iBAAiB;AAAA,EAC9B,QAAQ,YAAY;AAAA,EACpB,cAAc,aAAa;AAAA,EAC3B,uBAAuB,sBAAsB;AAC/C,CAAC;AAUM,SAAS,uBACd,OACA,QACA,YAC2B;AAC3B,SAAO,sBAAsB;AAAA,IAC3B,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,kBACd,OACA,cACA,YACA,QACS;AACT,UAAQ,cAAc;AAAA,IACpB,KAAK,gBAAgB;AACnB,UAAI,UAAU,MAAM;AAClB,gBAAQ,MAAM,qBAAqB,YAAY,IAAI,UAAU,mBAAmB;AAChF,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,uBAAuB,OAAO,QAAQ,UAAU;AACpE,aACE,eAAe,QACf,aAAa,kBAAkB,MAAM,cAAc,cAAc,aAAa,MAAM;AAAA,IAGxF;AACE,aAAO,aAAa,kBAAkB,MAAM,cAAc,cAAc,YAAY,MAAM;AAAA,EAC9F;AACF;AAEO,SAAS,eACd,OACA,cACA,YACA,QACgD;AAChD,UAAQ,cAAc;AAAA,IACpB,KAAK,gBAAgB;AACnB,UAAI,UAAU,MAAM;AAClB,gBAAQ,MAAM,qBAAqB,YAAY,IAAI,UAAU,mBAAmB;AAChF,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,uBAAuB,OAAO,QAAQ,UAAU;AACpE,aAAO,eAAe,OAClB,aAAa,eAAe,MAAM,cAAc,cAAc,aAAa,MAAM,IACjF;AAAA,IAEN;AACE,aAAO,aAAa,eAAe,MAAM,cAAc,cAAc,YAAY,MAAM;AAAA,EAC3F;AACF;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { configureStore as configureReduxStore } from "@reduxjs/toolkit";
|
|
2
|
+
import { reducer } from "./state";
|
|
3
|
+
function configureStore({ preloadedState }) {
|
|
4
|
+
return configureReduxStore({
|
|
5
|
+
reducer,
|
|
6
|
+
preloadedState
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
configureStore
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/state/api-client/store.ts"],"sourcesContent":["import { configureStore as configureReduxStore } from '@reduxjs/toolkit'\n\nimport { type State, reducer } from './state'\n\nexport function configureStore({ preloadedState }: { preloadedState: Partial<State> }) {\n return configureReduxStore({\n reducer,\n preloadedState,\n })\n}\n\nexport type Store = ReturnType<typeof configureStore>\n"],"mappings":"AAAA,SAAS,kBAAkB,2BAA2B;AAEtD,SAAqB,eAAe;AAE7B,SAAS,eAAe,EAAE,eAAe,GAAuC;AACrF,SAAO,oBAAoB;AAAA,IACzB;AAAA,IACA;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
const CLICK_NAVIGATION_THRESHOLD_MS = 100;
|
|
2
|
+
const CLICK_NAVIGATION_CHECK_INTERVAL_MS = 200;
|
|
3
|
+
const CLICK_NAVIGATION_MAX_CHECKS = 20;
|
|
4
|
+
function setupNavigationListener(callback) {
|
|
5
|
+
let previousLocation = null;
|
|
6
|
+
const handleNavigate = (event) => {
|
|
7
|
+
if (!event.navigationCompleted && event.url === previousLocation)
|
|
8
|
+
return;
|
|
9
|
+
callback(event);
|
|
10
|
+
previousLocation = event.url;
|
|
11
|
+
};
|
|
12
|
+
handleNavigate({ url: windowLocation(), navigationCompleted: "initial-page-load" });
|
|
13
|
+
if (typeof window === "undefined") {
|
|
14
|
+
return () => {
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const unsubscribes = [];
|
|
18
|
+
if ("navigation" in window && window.navigation) {
|
|
19
|
+
const navigation = window.navigation;
|
|
20
|
+
const navigateHandler = ({ destination }) => handleNavigate({ url: destination.url });
|
|
21
|
+
const navigateSuccessHandler = () => {
|
|
22
|
+
handleNavigate({
|
|
23
|
+
url: navigation.currentEntry.url,
|
|
24
|
+
navigationCompleted: "client-side-navigation"
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
navigation.addEventListener("navigate", navigateHandler);
|
|
28
|
+
navigation.addEventListener("navigatesuccess", navigateSuccessHandler);
|
|
29
|
+
unsubscribes.push(() => navigation.removeEventListener("navigate", navigateHandler));
|
|
30
|
+
unsubscribes.push(
|
|
31
|
+
() => navigation.removeEventListener("navigatesuccess", navigateSuccessHandler)
|
|
32
|
+
);
|
|
33
|
+
return () => {
|
|
34
|
+
unsubscribes.forEach((u) => u());
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
let lastClickEvent = null;
|
|
38
|
+
const clickHandler = (e) => {
|
|
39
|
+
const a = e.composedPath?.()?.find((n) => n instanceof HTMLAnchorElement) ?? (e.target instanceof Element && e.target.closest?.("a"));
|
|
40
|
+
if (!a)
|
|
41
|
+
return;
|
|
42
|
+
lastClickEvent = { href: a.href, timestamp: Date.now() };
|
|
43
|
+
const pageUrlBeforeClick = windowLocation();
|
|
44
|
+
let navigationCheckCounter = 0;
|
|
45
|
+
const checkIfNavigationOccurred = () => {
|
|
46
|
+
const url = windowLocation();
|
|
47
|
+
if (url !== pageUrlBeforeClick) {
|
|
48
|
+
handleNavigate({ url, polyfilled: true });
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (++navigationCheckCounter < CLICK_NAVIGATION_MAX_CHECKS) {
|
|
52
|
+
window.setTimeout(checkIfNavigationOccurred, CLICK_NAVIGATION_CHECK_INTERVAL_MS);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
window.setTimeout(checkIfNavigationOccurred, CLICK_NAVIGATION_CHECK_INTERVAL_MS);
|
|
56
|
+
};
|
|
57
|
+
window.document.addEventListener(
|
|
58
|
+
"click",
|
|
59
|
+
clickHandler,
|
|
60
|
+
{ capture: true }
|
|
61
|
+
// run before bubbling to fortify against `stopPropagation()` calls
|
|
62
|
+
);
|
|
63
|
+
unsubscribes.push(
|
|
64
|
+
() => window.document.removeEventListener("click", clickHandler, { capture: true })
|
|
65
|
+
);
|
|
66
|
+
const unloadHandler = () => {
|
|
67
|
+
if (!lastClickEvent)
|
|
68
|
+
return;
|
|
69
|
+
const msSinceLastClick = Date.now() - lastClickEvent.timestamp;
|
|
70
|
+
handleNavigate({
|
|
71
|
+
url: msSinceLastClick < CLICK_NAVIGATION_THRESHOLD_MS ? lastClickEvent.href ?? null : null,
|
|
72
|
+
polyfilled: true
|
|
73
|
+
});
|
|
74
|
+
lastClickEvent = null;
|
|
75
|
+
};
|
|
76
|
+
window.addEventListener("beforeunload", unloadHandler);
|
|
77
|
+
unsubscribes.push(() => window.removeEventListener("beforeunload", unloadHandler));
|
|
78
|
+
return () => {
|
|
79
|
+
unsubscribes.forEach((u) => u());
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const windowLocation = () => typeof window !== "undefined" ? window.location.href : null;
|
|
83
|
+
export {
|
|
84
|
+
setupNavigationListener
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=navigation-listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/state/builder-api/navigation-listener.ts"],"sourcesContent":["import { type HostNavigationEvent } from './api'\n\ntype ClickEvent = {\n href: string\n timestamp: number\n}\n\nconst CLICK_NAVIGATION_THRESHOLD_MS = 100\nconst CLICK_NAVIGATION_CHECK_INTERVAL_MS = 200\nconst CLICK_NAVIGATION_MAX_CHECKS = 20\n\nexport function setupNavigationListener(\n callback: (args: HostNavigationEvent) => void,\n): VoidFunction {\n let previousLocation: string | null = null\n\n const handleNavigate = (event: HostNavigationEvent) => {\n if (!event.navigationCompleted && event.url === previousLocation) return\n\n callback(event)\n previousLocation = event.url\n }\n\n // trigger navigation callback on initial page load\n handleNavigate({ url: windowLocation(), navigationCompleted: 'initial-page-load' })\n\n if (typeof window === 'undefined') {\n return () => {}\n }\n\n const unsubscribes: (() => void)[] = []\n\n // check for availability of the Navigation API (baseline feature since January 2026),\n // see https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API\n if ('navigation' in window && window.navigation) {\n const navigation = window.navigation\n\n const navigateHandler = ({ destination }: NavigateEvent) =>\n handleNavigate({ url: destination.url })\n\n const navigateSuccessHandler = () => {\n handleNavigate({\n url: navigation.currentEntry.url,\n navigationCompleted: 'client-side-navigation',\n })\n }\n\n // note that in order to capture destination URLs that might not be Makeswift-enabled,\n // we send a `SiteNavigationEvent` at the start of navigation, but do not track whether\n // the navigation was successful or not (possible future improvement)\n navigation.addEventListener('navigate', navigateHandler)\n navigation.addEventListener('navigatesuccess', navigateSuccessHandler)\n unsubscribes.push(() => navigation.removeEventListener('navigate', navigateHandler))\n unsubscribes.push(() =>\n navigation.removeEventListener('navigatesuccess', navigateSuccessHandler),\n )\n\n return () => {\n unsubscribes.forEach(u => u())\n }\n }\n\n // for browsers lacking Navigation API support, we manually track:\n // - link clicks to capture destination URLs\n // - page unload events to detect cross-page navigation\n //\n // this works well enough to keep this polyfill in place for now, but not nearly as\n // reliably as the Navigation API\n let lastClickEvent: ClickEvent | null = null\n\n const clickHandler = (e: MouseEvent) => {\n const a =\n e.composedPath?.()?.find(n => n instanceof HTMLAnchorElement) ??\n (e.target instanceof Element && e.target.closest?.('a'))\n\n if (!a) return\n\n lastClickEvent = { href: a.href, timestamp: Date.now() }\n\n const pageUrlBeforeClick = windowLocation()\n let navigationCheckCounter = 0\n\n // handle navigation between pages in the host; note that we intentionally are\n // not cancelling the timer on cleanup to ensure we report the navigation\n const checkIfNavigationOccurred = () => {\n const url = windowLocation()\n\n if (url !== pageUrlBeforeClick) {\n // the host navigated to a different page, report the new URL to the builder\n handleNavigate({ url, polyfilled: true })\n return\n }\n\n // we're still on the same page, recheck until the max number of checks is reached\n if (++navigationCheckCounter < CLICK_NAVIGATION_MAX_CHECKS) {\n window.setTimeout(checkIfNavigationOccurred, CLICK_NAVIGATION_CHECK_INTERVAL_MS)\n }\n }\n\n window.setTimeout(checkIfNavigationOccurred, CLICK_NAVIGATION_CHECK_INTERVAL_MS)\n }\n\n window.document.addEventListener(\n 'click',\n clickHandler,\n { capture: true }, // run before bubbling to fortify against `stopPropagation()` calls\n )\n\n unsubscribes.push(() =>\n window.document.removeEventListener('click', clickHandler, { capture: true }),\n )\n\n // handle external navigation\n const unloadHandler = () => {\n if (!lastClickEvent) return\n\n const msSinceLastClick = Date.now() - lastClickEvent.timestamp\n handleNavigate({\n url: msSinceLastClick < CLICK_NAVIGATION_THRESHOLD_MS ? (lastClickEvent.href ?? null) : null,\n polyfilled: true,\n })\n\n lastClickEvent = null\n }\n\n window.addEventListener('beforeunload', unloadHandler)\n unsubscribes.push(() => window.removeEventListener('beforeunload', unloadHandler))\n\n return () => {\n unsubscribes.forEach(u => u())\n }\n}\n\nconst windowLocation = (): string | null =>\n typeof window !== 'undefined' ? window.location.href : null\n"],"mappings":"AAOA,MAAM,gCAAgC;AACtC,MAAM,qCAAqC;AAC3C,MAAM,8BAA8B;AAE7B,SAAS,wBACd,UACc;AACd,MAAI,mBAAkC;AAEtC,QAAM,iBAAiB,CAAC,UAA+B;AACrD,QAAI,CAAC,MAAM,uBAAuB,MAAM,QAAQ;AAAkB;AAElE,aAAS,KAAK;AACd,uBAAmB,MAAM;AAAA,EAC3B;AAGA,iBAAe,EAAE,KAAK,eAAe,GAAG,qBAAqB,oBAAoB,CAAC;AAElF,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AAEA,QAAM,eAA+B,CAAC;AAItC,MAAI,gBAAgB,UAAU,OAAO,YAAY;AAC/C,UAAM,aAAa,OAAO;AAE1B,UAAM,kBAAkB,CAAC,EAAE,YAAY,MACrC,eAAe,EAAE,KAAK,YAAY,IAAI,CAAC;AAEzC,UAAM,yBAAyB,MAAM;AACnC,qBAAe;AAAA,QACb,KAAK,WAAW,aAAa;AAAA,QAC7B,qBAAqB;AAAA,MACvB,CAAC;AAAA,IACH;AAKA,eAAW,iBAAiB,YAAY,eAAe;AACvD,eAAW,iBAAiB,mBAAmB,sBAAsB;AACrE,iBAAa,KAAK,MAAM,WAAW,oBAAoB,YAAY,eAAe,CAAC;AACnF,iBAAa;AAAA,MAAK,MAChB,WAAW,oBAAoB,mBAAmB,sBAAsB;AAAA,IAC1E;AAEA,WAAO,MAAM;AACX,mBAAa,QAAQ,OAAK,EAAE,CAAC;AAAA,IAC/B;AAAA,EACF;AAQA,MAAI,iBAAoC;AAExC,QAAM,eAAe,CAAC,MAAkB;AACtC,UAAM,IACJ,EAAE,eAAe,GAAG,KAAK,OAAK,aAAa,iBAAiB,MAC3D,EAAE,kBAAkB,WAAW,EAAE,OAAO,UAAU,GAAG;AAExD,QAAI,CAAC;AAAG;AAER,qBAAiB,EAAE,MAAM,EAAE,MAAM,WAAW,KAAK,IAAI,EAAE;AAEvD,UAAM,qBAAqB,eAAe;AAC1C,QAAI,yBAAyB;AAI7B,UAAM,4BAA4B,MAAM;AACtC,YAAM,MAAM,eAAe;AAE3B,UAAI,QAAQ,oBAAoB;AAE9B,uBAAe,EAAE,KAAK,YAAY,KAAK,CAAC;AACxC;AAAA,MACF;AAGA,UAAI,EAAE,yBAAyB,6BAA6B;AAC1D,eAAO,WAAW,2BAA2B,kCAAkC;AAAA,MACjF;AAAA,IACF;AAEA,WAAO,WAAW,2BAA2B,kCAAkC;AAAA,EACjF;AAEA,SAAO,SAAS;AAAA,IACd;AAAA,IACA;AAAA,IACA,EAAE,SAAS,KAAK;AAAA;AAAA,EAClB;AAEA,eAAa;AAAA,IAAK,MAChB,OAAO,SAAS,oBAAoB,SAAS,cAAc,EAAE,SAAS,KAAK,CAAC;AAAA,EAC9E;AAGA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAAC;AAAgB;AAErB,UAAM,mBAAmB,KAAK,IAAI,IAAI,eAAe;AACrD,mBAAe;AAAA,MACb,KAAK,mBAAmB,gCAAiC,eAAe,QAAQ,OAAQ;AAAA,MACxF,YAAY;AAAA,IACd,CAAC;AAED,qBAAiB;AAAA,EACnB;AAEA,SAAO,iBAAiB,gBAAgB,aAAa;AACrD,eAAa,KAAK,MAAM,OAAO,oBAAoB,gBAAgB,aAAa,CAAC;AAEjF,SAAO,MAAM;AACX,iBAAa,QAAQ,OAAK,EAAE,CAAC;AAAA,EAC/B;AACF;AAEA,MAAM,iBAAiB,MACrB,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;","names":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { updateClientBreakpoint } from "../actions/internal/read-only-actions";
|
|
2
|
+
import { getDeviceQueries } from "../modules/breakpoints";
|
|
3
|
+
import { getBreakpoints } from "../read-only-state";
|
|
4
|
+
function breakpointWatchMixin({
|
|
5
|
+
dispatch,
|
|
6
|
+
getState,
|
|
7
|
+
subscribe: storeSubscribe
|
|
8
|
+
}) {
|
|
9
|
+
let mediaQueryUnsubscribes = [];
|
|
10
|
+
let storeUnsubscribe = null;
|
|
11
|
+
let watchedBreakpoints = [];
|
|
12
|
+
const startWatch = (breakpoints) => {
|
|
13
|
+
mediaQueryUnsubscribes.forEach((fn) => fn());
|
|
14
|
+
const updateState = () => dispatch(updateClientBreakpoint());
|
|
15
|
+
mediaQueryUnsubscribes = getDeviceQueries(breakpoints).map((q) => {
|
|
16
|
+
const mediaQueryList = window.matchMedia(q.query);
|
|
17
|
+
mediaQueryList.addEventListener("change", updateState);
|
|
18
|
+
return () => mediaQueryList.removeEventListener("change", updateState);
|
|
19
|
+
});
|
|
20
|
+
watchedBreakpoints = breakpoints;
|
|
21
|
+
updateState();
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
startBreakpointWatch: () => {
|
|
25
|
+
if (storeUnsubscribe !== null) {
|
|
26
|
+
console.warn("Unexpected `BreakpointWatch.startBreakpointWatch` call, already watching");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
startWatch(getBreakpoints(getState()));
|
|
30
|
+
storeUnsubscribe = storeSubscribe(() => {
|
|
31
|
+
const breakpoints = getBreakpoints(getState());
|
|
32
|
+
if (breakpoints !== watchedBreakpoints) {
|
|
33
|
+
startWatch(breakpoints);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
stopBreakpointWatch: () => {
|
|
38
|
+
mediaQueryUnsubscribes.forEach((fn) => fn());
|
|
39
|
+
mediaQueryUnsubscribes = [];
|
|
40
|
+
storeUnsubscribe?.();
|
|
41
|
+
storeUnsubscribe = null;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
breakpointWatchMixin
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=breakpoint-watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/state/mixins/breakpoint-watch.ts"],"sourcesContent":["import { updateClientBreakpoint } from '../actions/internal/read-only-actions'\nimport { Breakpoints, getDeviceQueries } from '../modules/breakpoints'\n\nimport { type State, type Dispatch } from '../unified-state'\nimport { getBreakpoints } from '../read-only-state'\n\nexport interface BreakpointWatch {\n startBreakpointWatch(): void\n stopBreakpointWatch(): void\n}\n\nexport function breakpointWatchMixin({\n dispatch,\n getState,\n subscribe: storeSubscribe,\n}: {\n dispatch: Dispatch\n getState: () => State\n subscribe: (listener: VoidFunction) => VoidFunction\n}): BreakpointWatch {\n let mediaQueryUnsubscribes: VoidFunction[] = []\n let storeUnsubscribe: VoidFunction | null = null\n let watchedBreakpoints: Breakpoints = []\n\n // client-side breakpoint watch\n const startWatch = (breakpoints: Breakpoints) => {\n mediaQueryUnsubscribes.forEach(fn => fn())\n\n const updateState = () => dispatch(updateClientBreakpoint())\n\n mediaQueryUnsubscribes = getDeviceQueries(breakpoints).map(q => {\n const mediaQueryList = window.matchMedia(q.query)\n mediaQueryList.addEventListener('change', updateState)\n return () => mediaQueryList.removeEventListener('change', updateState)\n })\n\n watchedBreakpoints = breakpoints\n\n // reconcile the store with the current client breakpoint after subscribing;\n // this heals any stale breakpoint state from changes that happened\n // after the store was created or updated but before the listeners were attached\n updateState()\n }\n\n return {\n startBreakpointWatch: () => {\n if (storeUnsubscribe !== null) {\n console.warn('Unexpected `BreakpointWatch.startBreakpointWatch` call, already watching')\n return\n }\n\n startWatch(getBreakpoints(getState()))\n\n storeUnsubscribe = storeSubscribe(() => {\n const breakpoints = getBreakpoints(getState())\n if (breakpoints !== watchedBreakpoints) {\n startWatch(breakpoints)\n }\n })\n },\n\n stopBreakpointWatch: () => {\n mediaQueryUnsubscribes.forEach(fn => fn())\n mediaQueryUnsubscribes = []\n\n storeUnsubscribe?.()\n storeUnsubscribe = null\n },\n }\n}\n"],"mappings":"AAAA,SAAS,8BAA8B;AACvC,SAAsB,wBAAwB;AAG9C,SAAS,sBAAsB;AAOxB,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAIoB;AAClB,MAAI,yBAAyC,CAAC;AAC9C,MAAI,mBAAwC;AAC5C,MAAI,qBAAkC,CAAC;AAGvC,QAAM,aAAa,CAAC,gBAA6B;AAC/C,2BAAuB,QAAQ,QAAM,GAAG,CAAC;AAEzC,UAAM,cAAc,MAAM,SAAS,uBAAuB,CAAC;AAE3D,6BAAyB,iBAAiB,WAAW,EAAE,IAAI,OAAK;AAC9D,YAAM,iBAAiB,OAAO,WAAW,EAAE,KAAK;AAChD,qBAAe,iBAAiB,UAAU,WAAW;AACrD,aAAO,MAAM,eAAe,oBAAoB,UAAU,WAAW;AAAA,IACvE,CAAC;AAED,yBAAqB;AAKrB,gBAAY;AAAA,EACd;AAEA,SAAO;AAAA,IACL,sBAAsB,MAAM;AAC1B,UAAI,qBAAqB,MAAM;AAC7B,gBAAQ,KAAK,0EAA0E;AACvF;AAAA,MACF;AAEA,iBAAW,eAAe,SAAS,CAAC,CAAC;AAErC,yBAAmB,eAAe,MAAM;AACtC,cAAM,cAAc,eAAe,SAAS,CAAC;AAC7C,YAAI,gBAAgB,oBAAoB;AACtC,qBAAW,WAAW;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,qBAAqB,MAAM;AACzB,6BAAuB,QAAQ,QAAM,GAAG,CAAC;AACzC,+BAAyB,CAAC;AAE1B,yBAAmB;AACnB,yBAAmB;AAAA,IACrB;AAAA,EACF;AACF;","names":[]}
|
|
@@ -18,15 +18,29 @@ import * as ElementImperativeHandles from "./modules/element-imperative-handles"
|
|
|
18
18
|
import * as Breakpoints from "./modules/breakpoints";
|
|
19
19
|
import { withSetupTeardown } from "./mixins/setup-teardown";
|
|
20
20
|
import * as ReactPage from "./react-page";
|
|
21
|
-
import
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
import {
|
|
22
|
+
ActionTypes,
|
|
23
|
+
changeDocumentElementSize,
|
|
24
|
+
changeElementBoxModels,
|
|
25
|
+
elementFromPointChange,
|
|
26
|
+
handleWheel,
|
|
27
|
+
handlePointerMove,
|
|
28
|
+
messageBuilderPropController,
|
|
29
|
+
registerBuilderComponent,
|
|
30
|
+
registerMeasurable,
|
|
31
|
+
registerPropControllers,
|
|
32
|
+
registerPropControllersHandle,
|
|
33
|
+
setBreakpoints,
|
|
34
|
+
setIsInBuilder,
|
|
35
|
+
unregisterBuilderComponent,
|
|
36
|
+
unregisterBuilderDocument,
|
|
37
|
+
unregisterMeasurable,
|
|
38
|
+
unregisterPropControllers,
|
|
39
|
+
registerBuilderDocument
|
|
40
|
+
} from "./actions";
|
|
26
41
|
import { actionMiddleware, middlewareOptions, devToolsConfig } from "./toolkit";
|
|
27
42
|
import { createPropController } from "../prop-controllers/instances";
|
|
28
43
|
import { serializeControls } from "../builder";
|
|
29
|
-
import { HostActionTypes } from "./host-api";
|
|
30
44
|
import { createBox, getBox, parse } from "./modules/box-models";
|
|
31
45
|
const reducer = combineReducers({
|
|
32
46
|
documents: Documents.reducer,
|
|
@@ -140,7 +154,7 @@ function measureElements() {
|
|
|
140
154
|
}
|
|
141
155
|
});
|
|
142
156
|
if (changedBoxModels.size > 0)
|
|
143
|
-
dispatch(
|
|
157
|
+
dispatch(changeElementBoxModels(changedBoxModels));
|
|
144
158
|
};
|
|
145
159
|
}
|
|
146
160
|
function startMeasuringElements() {
|
|
@@ -177,7 +191,7 @@ function lockDocumentScroll() {
|
|
|
177
191
|
window.document.documentElement.removeEventListener("wheel", handleWheelEvent);
|
|
178
192
|
};
|
|
179
193
|
function handleWheelEvent({ deltaX, deltaY }) {
|
|
180
|
-
dispatch(
|
|
194
|
+
dispatch(handleWheel({ deltaX, deltaY }));
|
|
181
195
|
}
|
|
182
196
|
};
|
|
183
197
|
}
|
|
@@ -188,7 +202,7 @@ function startHandlingPointerMoveEvent() {
|
|
|
188
202
|
window.document.documentElement.removeEventListener("pointermove", handlePointerMoveEvent);
|
|
189
203
|
};
|
|
190
204
|
function handlePointerMoveEvent({ clientX, clientY }) {
|
|
191
|
-
dispatch(
|
|
205
|
+
dispatch(handlePointerMove({ clientX, clientY }));
|
|
192
206
|
}
|
|
193
207
|
};
|
|
194
208
|
}
|
|
@@ -229,7 +243,7 @@ function startMeasuringDocumentElement() {
|
|
|
229
243
|
const nextSize = getElementSize(window.document.documentElement);
|
|
230
244
|
if (!deepEqual(lastSize, nextSize)) {
|
|
231
245
|
lastSize = nextSize;
|
|
232
|
-
dispatch(
|
|
246
|
+
dispatch(changeDocumentElementSize(nextSize));
|
|
233
247
|
}
|
|
234
248
|
animationFrameHandle = requestAnimationFrame(handleAnimationFrameRequest);
|
|
235
249
|
}
|
|
@@ -276,7 +290,7 @@ function startPollingElementFromPoint() {
|
|
|
276
290
|
if (elementFromPoint !== lastElementFromPoint) {
|
|
277
291
|
lastElementFromPoint = elementFromPoint;
|
|
278
292
|
const keys = dispatch(elementKeysFromElementFromPoint(elementFromPoint));
|
|
279
|
-
dispatch(
|
|
293
|
+
dispatch(elementFromPointChange(keys));
|
|
280
294
|
}
|
|
281
295
|
animationFrameRequestId = requestAnimationFrame(handleAnimationFrameRequest);
|
|
282
296
|
}
|
|
@@ -290,14 +304,12 @@ function registerBuilderComponents() {
|
|
|
290
304
|
const descriptors = getComponentPropControllerDescriptors(state, type);
|
|
291
305
|
if (descriptors != null) {
|
|
292
306
|
const [serializedControls, transferables] = serializeControls(descriptors);
|
|
293
|
-
dispatch(
|
|
294
|
-
Builder.registerBuilderComponent({ type, meta, serializedControls }, transferables)
|
|
295
|
-
);
|
|
307
|
+
dispatch(registerBuilderComponent({ type, meta, serializedControls }, transferables));
|
|
296
308
|
}
|
|
297
309
|
});
|
|
298
310
|
return () => {
|
|
299
311
|
componentsMeta.forEach((_, type) => {
|
|
300
|
-
dispatch(
|
|
312
|
+
dispatch(unregisterBuilderComponent({ type }));
|
|
301
313
|
});
|
|
302
314
|
};
|
|
303
315
|
};
|
|
@@ -306,16 +318,16 @@ function registerBuilderDocuments() {
|
|
|
306
318
|
return (dispatch, getState) => {
|
|
307
319
|
const documents = Documents.getDocuments(getDocumentsStateSlice(getState()));
|
|
308
320
|
documents.forEach((document2) => {
|
|
309
|
-
dispatch(
|
|
321
|
+
dispatch(registerBuilderDocument(document2));
|
|
310
322
|
});
|
|
311
323
|
return () => {
|
|
312
324
|
documents.forEach((_document, documentKey) => {
|
|
313
|
-
dispatch(
|
|
325
|
+
dispatch(unregisterBuilderDocument(documentKey));
|
|
314
326
|
});
|
|
315
327
|
};
|
|
316
328
|
};
|
|
317
329
|
}
|
|
318
|
-
function initialize(
|
|
330
|
+
function initialize(channel) {
|
|
319
331
|
return (dispatch, getState) => {
|
|
320
332
|
const unregisterBuilderDocuments = dispatch(registerBuilderDocuments());
|
|
321
333
|
const stopMeasuringElements = dispatch(startMeasuringElements());
|
|
@@ -326,9 +338,9 @@ function initialize(builderProxy) {
|
|
|
326
338
|
const stopPollingElementFromPoint = dispatch(startPollingElementFromPoint());
|
|
327
339
|
const unregisterBuilderComponents = dispatch(registerBuilderComponents());
|
|
328
340
|
const breakpoints = ReactPage.getBreakpoints(getState());
|
|
329
|
-
dispatch(
|
|
330
|
-
dispatch(
|
|
331
|
-
|
|
341
|
+
dispatch(setBreakpoints(breakpoints));
|
|
342
|
+
dispatch(setIsInBuilder(true));
|
|
343
|
+
channel.dispatchBuffered();
|
|
332
344
|
return () => {
|
|
333
345
|
unregisterBuilderDocuments();
|
|
334
346
|
stopMeasuringElements();
|
|
@@ -338,7 +350,7 @@ function initialize(builderProxy) {
|
|
|
338
350
|
stopHandlingPointerMoveEvent();
|
|
339
351
|
stopPollingElementFromPoint();
|
|
340
352
|
unregisterBuilderComponents();
|
|
341
|
-
dispatch(
|
|
353
|
+
dispatch(setIsInBuilder(false));
|
|
342
354
|
};
|
|
343
355
|
};
|
|
344
356
|
}
|
|
@@ -346,10 +358,10 @@ function measureBoxModelsMiddleware() {
|
|
|
346
358
|
return actionMiddleware(({ dispatch }) => (next) => {
|
|
347
359
|
return (action) => {
|
|
348
360
|
switch (action.type) {
|
|
349
|
-
case
|
|
361
|
+
case ActionTypes.REGISTER_COMPONENT_HANDLE: {
|
|
350
362
|
if (BoxModels.isMeasurable(action.payload.componentHandle)) {
|
|
351
363
|
dispatch(
|
|
352
|
-
|
|
364
|
+
registerMeasurable(
|
|
353
365
|
action.payload.documentKey,
|
|
354
366
|
action.payload.elementKey,
|
|
355
367
|
action.payload.componentHandle
|
|
@@ -358,17 +370,15 @@ function measureBoxModelsMiddleware() {
|
|
|
358
370
|
}
|
|
359
371
|
break;
|
|
360
372
|
}
|
|
361
|
-
case
|
|
362
|
-
dispatch(
|
|
363
|
-
Internal.unregisterMeasurable(action.payload.documentKey, action.payload.elementKey)
|
|
364
|
-
);
|
|
373
|
+
case ActionTypes.UNREGISTER_COMPONENT_HANDLE:
|
|
374
|
+
dispatch(unregisterMeasurable(action.payload.documentKey, action.payload.elementKey));
|
|
365
375
|
break;
|
|
366
376
|
}
|
|
367
377
|
return next(action);
|
|
368
378
|
};
|
|
369
379
|
});
|
|
370
380
|
}
|
|
371
|
-
function
|
|
381
|
+
function messageChannelMiddleware(channel) {
|
|
372
382
|
return actionMiddleware(({ dispatch }) => (next) => {
|
|
373
383
|
if (typeof window === "undefined")
|
|
374
384
|
return (action) => next(action);
|
|
@@ -376,35 +386,42 @@ function builderAPIMiddleware(builderProxy) {
|
|
|
376
386
|
};
|
|
377
387
|
return (action) => {
|
|
378
388
|
switch (action.type) {
|
|
379
|
-
case
|
|
380
|
-
case
|
|
381
|
-
case
|
|
382
|
-
case
|
|
383
|
-
case
|
|
384
|
-
case
|
|
385
|
-
case
|
|
386
|
-
case
|
|
387
|
-
case
|
|
388
|
-
case
|
|
389
|
-
case
|
|
390
|
-
case
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
389
|
+
case ActionTypes.CHANGE_ELEMENT_BOX_MODELS:
|
|
390
|
+
case ActionTypes.MOUNT_COMPONENT:
|
|
391
|
+
case ActionTypes.UNMOUNT_COMPONENT:
|
|
392
|
+
case ActionTypes.CHANGE_DOCUMENT_ELEMENT_SIZE:
|
|
393
|
+
case ActionTypes.MESSAGE_BUILDER_PROP_CONTROLLER:
|
|
394
|
+
case ActionTypes.HANDLE_WHEEL:
|
|
395
|
+
case ActionTypes.HANDLE_POINTER_MOVE:
|
|
396
|
+
case ActionTypes.ELEMENT_FROM_POINT_CHANGE:
|
|
397
|
+
case ActionTypes.SET_LOCALE:
|
|
398
|
+
case ActionTypes.SET_BREAKPOINTS:
|
|
399
|
+
case ActionTypes.REGISTER_BUILDER_DOCUMENT:
|
|
400
|
+
case ActionTypes.UNREGISTER_BUILDER_DOCUMENT:
|
|
401
|
+
channel.postMessage(action);
|
|
402
|
+
break;
|
|
403
|
+
case ActionTypes.REGISTER_BUILDER_COMPONENT: {
|
|
404
|
+
const { transferables, ...forwardedAction } = action;
|
|
405
|
+
channel.postMessage(forwardedAction, transferables);
|
|
394
406
|
break;
|
|
395
|
-
|
|
407
|
+
}
|
|
408
|
+
case ActionTypes.UNREGISTER_BUILDER_COMPONENT:
|
|
409
|
+
channel.postMessage(action);
|
|
410
|
+
break;
|
|
411
|
+
case ActionTypes.CHANGE_DOCUMENT_ELEMENT_SCROLL_TOP:
|
|
396
412
|
window.document.documentElement.scrollTop = action.payload.scrollTop;
|
|
397
413
|
break;
|
|
398
|
-
case
|
|
414
|
+
case ActionTypes.SCROLL_DOCUMENT_ELEMENT:
|
|
399
415
|
window.document.documentElement.scrollTop += action.payload.scrollTopDelta;
|
|
400
416
|
break;
|
|
401
|
-
case
|
|
417
|
+
case ActionTypes.SET_BUILDER_EDIT_MODE:
|
|
418
|
+
channel.postMessage(action);
|
|
402
419
|
window.getSelection()?.removeAllRanges();
|
|
403
420
|
break;
|
|
404
|
-
case
|
|
405
|
-
cleanUp = dispatch(initialize(
|
|
421
|
+
case ActionTypes.INIT:
|
|
422
|
+
cleanUp = dispatch(initialize(channel));
|
|
406
423
|
break;
|
|
407
|
-
case
|
|
424
|
+
case ActionTypes.CLEAN_UP:
|
|
408
425
|
cleanUp();
|
|
409
426
|
break;
|
|
410
427
|
}
|
|
@@ -425,15 +442,13 @@ function createAndRegisterPropControllers(documentKey, elementKey) {
|
|
|
425
442
|
(acc, [propName, descriptor]) => {
|
|
426
443
|
const propController = createPropController(
|
|
427
444
|
descriptor,
|
|
428
|
-
(message) => dispatch(
|
|
429
|
-
Builder.messageBuilderPropController(documentKey, elementKey, propName, message)
|
|
430
|
-
)
|
|
445
|
+
(message) => dispatch(messageBuilderPropController(documentKey, elementKey, propName, message))
|
|
431
446
|
);
|
|
432
447
|
return { ...acc, [propName]: propController };
|
|
433
448
|
},
|
|
434
449
|
{}
|
|
435
450
|
);
|
|
436
|
-
dispatch(
|
|
451
|
+
dispatch(registerPropControllers(documentKey, elementKey, propControllers));
|
|
437
452
|
return propControllers;
|
|
438
453
|
};
|
|
439
454
|
}
|
|
@@ -441,21 +456,19 @@ function propControllerHandlesMiddleware() {
|
|
|
441
456
|
return actionMiddleware(({ dispatch, getState }) => (next) => {
|
|
442
457
|
return (action) => {
|
|
443
458
|
switch (action.type) {
|
|
444
|
-
case
|
|
459
|
+
case ActionTypes.REGISTER_COMPONENT_HANDLE: {
|
|
445
460
|
const { documentKey, elementKey, componentHandle } = action.payload;
|
|
446
461
|
const element = ReactPage.getElement(getState(), documentKey, elementKey);
|
|
447
462
|
const propControllers = dispatch(
|
|
448
463
|
createAndRegisterPropControllers(documentKey, elementKey)
|
|
449
464
|
);
|
|
450
465
|
if (element != null && !ReactPage.isElementReference(element) && PropControllerHandles.isPropControllersHandle(componentHandle)) {
|
|
451
|
-
dispatch(
|
|
452
|
-
Internal.registerPropControllersHandle(documentKey, elementKey, componentHandle)
|
|
453
|
-
);
|
|
466
|
+
dispatch(registerPropControllersHandle(documentKey, elementKey, componentHandle));
|
|
454
467
|
componentHandle.setPropControllers(propControllers);
|
|
455
468
|
}
|
|
456
469
|
break;
|
|
457
470
|
}
|
|
458
|
-
case
|
|
471
|
+
case ActionTypes.UNREGISTER_COMPONENT_HANDLE: {
|
|
459
472
|
const { documentKey, elementKey } = action.payload;
|
|
460
473
|
const handle = PropControllerHandles.getPropControllersHandle(
|
|
461
474
|
getPropControllerHandlesStateSlice(getState()),
|
|
@@ -463,10 +476,10 @@ function propControllerHandlesMiddleware() {
|
|
|
463
476
|
elementKey
|
|
464
477
|
);
|
|
465
478
|
handle?.setPropControllers(null);
|
|
466
|
-
dispatch(
|
|
479
|
+
dispatch(unregisterPropControllers(documentKey, elementKey));
|
|
467
480
|
break;
|
|
468
481
|
}
|
|
469
|
-
case
|
|
482
|
+
case ActionTypes.MESSAGE_HOST_PROP_CONTROLLER: {
|
|
470
483
|
const propController = PropControllerHandles.getPropController(
|
|
471
484
|
getPropControllerHandlesStateSlice(getState()),
|
|
472
485
|
action.payload.documentKey,
|
|
@@ -489,27 +502,57 @@ function makeswiftApiClientSyncMiddleware(client) {
|
|
|
489
502
|
};
|
|
490
503
|
});
|
|
491
504
|
}
|
|
492
|
-
|
|
505
|
+
class MessageChannel {
|
|
506
|
+
channel = null;
|
|
507
|
+
bufferedMessages = [];
|
|
508
|
+
postMessage(message, transferables) {
|
|
509
|
+
if (this.channel) {
|
|
510
|
+
this.channel.postMessage(message, transferables ?? []);
|
|
511
|
+
} else {
|
|
512
|
+
this.bufferedMessages.push([message, transferables]);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
setup(onMessage) {
|
|
516
|
+
const channel = new window.MessageChannel();
|
|
517
|
+
channel.port1.onmessage = onMessage;
|
|
518
|
+
window.parent.postMessage(channel.port2, "*", [channel.port2]);
|
|
519
|
+
this.channel = channel.port1;
|
|
520
|
+
}
|
|
521
|
+
dispatchBuffered() {
|
|
522
|
+
console.assert(this.channel != null, "channel is not setup");
|
|
523
|
+
this.bufferedMessages.forEach(([message, transferables]) => {
|
|
524
|
+
this.channel?.postMessage(message, transferables ?? []);
|
|
525
|
+
});
|
|
526
|
+
this.bufferedMessages = [];
|
|
527
|
+
}
|
|
528
|
+
teardown() {
|
|
529
|
+
if (this.channel) {
|
|
530
|
+
this.channel.onmessage = null;
|
|
531
|
+
this.channel.close();
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
function setupMessageChannel(channel) {
|
|
493
536
|
return (dispatch) => {
|
|
494
|
-
|
|
537
|
+
channel.setup((event) => dispatch(event.data));
|
|
495
538
|
};
|
|
496
539
|
}
|
|
497
540
|
function configureStore({
|
|
498
541
|
preloadedState,
|
|
499
|
-
client
|
|
500
|
-
builderProxy
|
|
542
|
+
client
|
|
501
543
|
}) {
|
|
502
544
|
const initialState = {
|
|
503
545
|
...preloadedState,
|
|
504
546
|
isPreview: IsPreview.getInitialState(true)
|
|
505
547
|
};
|
|
548
|
+
const channel = new MessageChannel();
|
|
506
549
|
const store = configureReduxStore({
|
|
507
550
|
reducer,
|
|
508
551
|
preloadedState: initialState,
|
|
509
552
|
middleware: (getDefaultMiddleware) => getDefaultMiddleware(middlewareOptions).concat(
|
|
510
553
|
ReactPage.elementTreeMiddleware(),
|
|
511
554
|
measureBoxModelsMiddleware(),
|
|
512
|
-
|
|
555
|
+
messageChannelMiddleware(channel),
|
|
513
556
|
propControllerHandlesMiddleware(),
|
|
514
557
|
makeswiftApiClientSyncMiddleware(client)
|
|
515
558
|
),
|
|
@@ -517,28 +560,28 @@ function configureStore({
|
|
|
517
560
|
withSetupTeardown(
|
|
518
561
|
() => {
|
|
519
562
|
const dispatch = store.dispatch;
|
|
520
|
-
dispatch(
|
|
563
|
+
dispatch(setupMessageChannel(channel));
|
|
521
564
|
},
|
|
522
|
-
() =>
|
|
565
|
+
() => channel.teardown()
|
|
523
566
|
)
|
|
524
567
|
),
|
|
525
568
|
devTools: devToolsConfig({
|
|
526
569
|
name: `Host store (${(/* @__PURE__ */ new Date()).toISOString()})`,
|
|
527
570
|
actionsDenylist: [
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
571
|
+
ActionTypes.BUILDER_POINTER_MOVE,
|
|
572
|
+
ActionTypes.HANDLE_POINTER_MOVE,
|
|
573
|
+
ActionTypes.ELEMENT_FROM_POINT_CHANGE
|
|
531
574
|
]
|
|
532
575
|
})
|
|
533
576
|
});
|
|
534
577
|
return store;
|
|
535
578
|
}
|
|
536
579
|
export {
|
|
537
|
-
builderAPIMiddleware,
|
|
538
580
|
configureStore,
|
|
539
581
|
createBox,
|
|
540
582
|
getBox,
|
|
541
583
|
initialize,
|
|
584
|
+
messageChannelMiddleware,
|
|
542
585
|
parse,
|
|
543
586
|
propControllerHandlesMiddleware,
|
|
544
587
|
reducer,
|