From f1a3d98bcb6d06ae57fa3739fc011811ec4d9403 Mon Sep 17 00:00:00 2001
From: hufeixiong <673632758@qq.com>
Date: Sat, 17 Jul 2021 22:15:30 +0800
Subject: [PATCH] start iframe
---
packages/dooringx-example/.umirc.ts | 4 +-
.../src/pages/container/index.tsx | 22 +++
.../dooringx-example/src/pages/iframeTest.tsx | 125 ++++++++++++
packages/dooringx-example/src/pages/index.tsx | 3 +-
packages/dooringx-lib/package.json | 2 +-
.../src/components/IframeWrapperMove/event.ts | 77 ++++++++
.../components/IframeWrapperMove/index.tsx | 86 ++++++++
.../components/IframeWrapperMove/ticker.tsx | 156 +++++++++++++++
.../dooringx-lib/src/components/container.tsx | 1 +
.../src/components/iframeContainer.tsx | 184 ++++++++++++++++++
packages/dooringx-lib/src/config/index.tsx | 20 +-
.../dooringx-lib/src/core/innerDrag/index.ts | 6 +-
packages/dooringx-lib/src/core/scale/index.ts | 47 ++++-
.../src/core/selectRange/index.ts | 31 ++-
packages/dooringx-lib/src/core/utils/index.ts | 9 +
packages/dooringx-lib/src/hooks/index.ts | 55 +++++-
packages/dooringx-lib/src/index.tsx | 8 +-
17 files changed, 825 insertions(+), 11 deletions(-)
create mode 100644 packages/dooringx-example/src/pages/container/index.tsx
create mode 100644 packages/dooringx-example/src/pages/iframeTest.tsx
create mode 100644 packages/dooringx-lib/src/components/IframeWrapperMove/event.ts
create mode 100644 packages/dooringx-lib/src/components/IframeWrapperMove/index.tsx
create mode 100644 packages/dooringx-lib/src/components/IframeWrapperMove/ticker.tsx
create mode 100644 packages/dooringx-lib/src/components/iframeContainer.tsx
diff --git a/packages/dooringx-example/.umirc.ts b/packages/dooringx-example/.umirc.ts
index dd1e5e1..cebd780 100644
--- a/packages/dooringx-example/.umirc.ts
+++ b/packages/dooringx-example/.umirc.ts
@@ -2,7 +2,7 @@
* @Author: yehuozhili
* @Date: 2021-07-07 11:11:52
* @LastEditors: yehuozhili
- * @LastEditTime: 2021-07-12 13:58:33
+ * @LastEditTime: 2021-07-17 10:15:46
* @FilePath: \dooringx\packages\dooringx-example\.umirc.ts
*/
import { defineConfig } from 'umi';
@@ -26,6 +26,8 @@ export default defineConfig({
component: '@/layouts/index',
routes: [
{ path: '/', component: '@/pages/index' },
+ { path: '/iframeTest', component: '@/pages/iframeTest' },
+ { path: '/container', component: '@/pages/container' },
{ path: '/preview', component: '@/pages/preview' },
{ path: '/iframe', component: '@/pages/iframe' },
],
diff --git a/packages/dooringx-example/src/pages/container/index.tsx b/packages/dooringx-example/src/pages/container/index.tsx
new file mode 100644
index 0000000..61a3c7a
--- /dev/null
+++ b/packages/dooringx-example/src/pages/container/index.tsx
@@ -0,0 +1,22 @@
+/*
+ * @Author: yehuozhili
+ * @Date: 2021-07-16 20:55:50
+ * @LastEditors: yehuozhili
+ * @LastEditTime: 2021-07-17 14:02:12
+ * @FilePath: \dooringx\packages\dooringx-example\src\pages\container\index.tsx
+ */
+
+import { configContext } from '@/layouts';
+import { useContext } from 'react';
+import { IframeContainer } from '../../../../dooringx-lib/dist';
+
+function ContainerPage() {
+ const config = useContext(configContext);
+ return (
+
+
+
+ );
+}
+
+export default ContainerPage;
diff --git a/packages/dooringx-example/src/pages/iframeTest.tsx b/packages/dooringx-example/src/pages/iframeTest.tsx
new file mode 100644
index 0000000..92a156c
--- /dev/null
+++ b/packages/dooringx-example/src/pages/iframeTest.tsx
@@ -0,0 +1,125 @@
+/*
+ * @Author: yehuozhili
+ * @Date: 2021-07-17 10:12:11
+ * @LastEditors: yehuozhili
+ * @LastEditTime: 2021-07-17 22:13:20
+ * @FilePath: \dooringx\packages\dooringx-example\src\pages\iframeTest.tsx
+ */
+
+import {
+ RightConfig,
+ Container,
+ useStoreState,
+ innerContainerDragUp,
+ LeftConfig,
+ IframeContainerWrapper,
+ Control,
+ postMessage,
+ useIframePostMessage,
+} from 'dooringx-lib';
+import { useContext, useState } from 'react';
+import { configContext } from '@/layouts';
+import { useCallback } from 'react';
+import { PREVIEWSTATE } from '@/constant';
+import { useEffect } from 'react';
+
+export const HeaderHeight = '40px';
+
+export default function IndexPage() {
+ const config = useContext(configContext);
+
+ const everyFn = () => {};
+
+ const subscribeFn = useCallback(() => {
+ localStorage.setItem(PREVIEWSTATE, JSON.stringify(config.getStore().getData()));
+ }, [config]);
+
+ const [state] = useStoreState(config, subscribeFn, everyFn);
+
+ const [iframeReady, setIframeReady] = useState(false);
+ const [fnx] = useIframePostMessage(`${location.origin}/container`, config, iframeReady);
+ useEffect(() => {
+ const fn = (e: MessageEvent) => {
+ console.log(e, '收到');
+ if (e.data === 'ready') {
+ setIframeReady(true);
+ fnx();
+ }
+ if (typeof e.data === 'object') {
+ if (e.data.type === 'update') {
+ if (e.data.column === 'scale') {
+ config.scaleState = e.data.data;
+ config.getStore().forceUpdate();
+ config.refreshIframe();
+ }
+ }
+ }
+ };
+ window.addEventListener('message', fn);
+ return () => {
+ window.removeEventListener('message', fn);
+ };
+ }, []);
+
+ const scaleState = config.getScaleState();
+ return (
+
+
+ head
+
+
+
+
+
+
+
+
+
+ }
+ >
+ <>
+
+ >
+
+
+
+
+
+
+ );
+}
diff --git a/packages/dooringx-example/src/pages/index.tsx b/packages/dooringx-example/src/pages/index.tsx
index 2a812ee..a9b996b 100644
--- a/packages/dooringx-example/src/pages/index.tsx
+++ b/packages/dooringx-example/src/pages/index.tsx
@@ -2,7 +2,7 @@
* @Author: yehuozhili
* @Date: 2021-05-15 12:49:28
* @LastEditors: yehuozhili
- * @LastEditTime: 2021-07-12 20:19:38
+ * @LastEditTime: 2021-07-17 10:12:53
* @FilePath: \dooringx\packages\dooringx-example\src\pages\index.tsx
*/
import {
@@ -13,6 +13,7 @@ import {
LeftConfig,
ContainerWrapper,
Control,
+ postMessage,
} from 'dooringx-lib';
import { useContext } from 'react';
import { configContext } from '@/layouts';
diff --git a/packages/dooringx-lib/package.json b/packages/dooringx-lib/package.json
index 15e08d7..cb4dbf0 100644
--- a/packages/dooringx-lib/package.json
+++ b/packages/dooringx-lib/package.json
@@ -1,5 +1,5 @@
{
- "version": "0.5.0",
+ "version": "0.6.0",
"license": "MIT",
"main": "dist/index.js",
"module": "dist/dooringx-lib.esm.js",
diff --git a/packages/dooringx-lib/src/components/IframeWrapperMove/event.ts b/packages/dooringx-lib/src/components/IframeWrapperMove/event.ts
new file mode 100644
index 0000000..8563fa7
--- /dev/null
+++ b/packages/dooringx-lib/src/components/IframeWrapperMove/event.ts
@@ -0,0 +1,77 @@
+/*
+ * @Author: yehuozhili
+ * @Date: 2021-02-21 22:17:29
+ * @LastEditors: yehuozhili
+ * @LastEditTime: 2021-07-17 11:24:59
+ * @FilePath: \dooringx\packages\dooringx-lib\src\components\IframeWrapperMove\event.ts
+ */
+import { RefObject } from 'react';
+import { containerResizer } from '../../core/resizeHandler/containerResizer';
+import { contextMenuState } from '../../core/contextMenu';
+import UserConfig from '../../config';
+
+export interface WrapperMoveStateProps {
+ isDrag: boolean;
+ startX: number;
+ startY: number;
+ needX: number;
+ needY: number;
+}
+
+export interface WrapperMoveRef {
+ ref: null | RefObject;
+}
+
+export const wrapperMoveState: WrapperMoveStateProps = {
+ isDrag: false,
+ startX: 0,
+ startY: 0,
+ needX: 0,
+ needY: 0,
+};
+
+export const wrapperRefState: WrapperMoveRef = {
+ ref: null,
+};
+
+export const wrapperEvent = (ref: RefObject, config: UserConfig) => {
+ const scale = config.getScaleState().value;
+ const store = config.getStore();
+ return {
+ onMouseDown: (e: React.MouseEvent) => {
+ // e.preventDefault();// 不能使用preventDefault 否则弹窗输入框焦点无法触发
+ contextMenuState.unmountContextMenu();
+ if (e.target !== ref.current) {
+ } else {
+ wrapperMoveState.isDrag = true;
+ wrapperMoveState.startX = e.clientX;
+ wrapperMoveState.startY = e.clientY;
+ if (ref.current) {
+ ref.current.style.cursor = 'grab';
+ wrapperRefState.ref = ref;
+ }
+ }
+ },
+ onMouseMove: (e: React.MouseEvent) => {
+ e.preventDefault();
+ if (wrapperMoveState.isDrag) {
+ const diffX = e.clientX - wrapperMoveState.startX;
+ const diffY = e.clientY - wrapperMoveState.startY;
+ wrapperMoveState.needX = wrapperMoveState.needX + diffX / scale;
+ wrapperMoveState.needY = wrapperMoveState.needY + diffY / scale;
+ wrapperMoveState.startX = e.clientX;
+ wrapperMoveState.startY = e.clientY;
+
+ store.forceUpdate();
+ }
+ containerResizer.onMouseMove(e, config);
+ },
+ };
+};
+export const wrapperMoveMouseUp = (config: UserConfig) => {
+ if (wrapperRefState.ref && wrapperRefState.ref.current) {
+ wrapperRefState.ref.current.style.cursor = 'default';
+ }
+ containerResizer.onMouseUp(config);
+ wrapperMoveState.isDrag = false;
+};
diff --git a/packages/dooringx-lib/src/components/IframeWrapperMove/index.tsx b/packages/dooringx-lib/src/components/IframeWrapperMove/index.tsx
new file mode 100644
index 0000000..03c187b
--- /dev/null
+++ b/packages/dooringx-lib/src/components/IframeWrapperMove/index.tsx
@@ -0,0 +1,86 @@
+/*
+ * @Author: yehuozhili
+ * @Date: 2021-03-14 04:29:09
+ * @LastEditors: yehuozhili
+ * @LastEditTime: 2021-07-17 22:13:37
+ * @FilePath: \dooringx\packages\dooringx-lib\src\components\IframeWrapperMove\index.tsx
+ */
+import { AllHTMLAttributes, CSSProperties, PropsWithChildren, ReactNode, useRef } from 'react';
+import { wrapperEvent } from './event';
+import { onWheelEvent } from '../../core/scale';
+import React from 'react';
+import Ticker from './ticker';
+import UserConfig from '../../config';
+import { containerResizer } from '../../core/resizeHandler/containerResizer';
+
+export interface ContainerWrapperProps extends AllHTMLAttributes {
+ config: UserConfig;
+ classNames?: string;
+ style?: CSSProperties;
+ extra?: ReactNode;
+}
+
+function ContainerWrapper(props: PropsWithChildren) {
+ const { children, style, classNames, config, extra, ...rest } = props;
+ const ref = useRef(null);
+ const ticker = props.config.ticker;
+ const wrapperMoveState = config.getWrapperMove().iframe;
+ const scaleState = config.getScaleState();
+ const state = props.config.getStore().getData();
+
+ return (
+
+
+ {children}
+
+
+
containerResizer.onMousedown(e, props.config)}
+ >
+ {props.config.getConfig().containerIcon}
+
+
+
+ {extra && extra}
+ {ticker &&
}
+
+ );
+}
+export default ContainerWrapper;
diff --git a/packages/dooringx-lib/src/components/IframeWrapperMove/ticker.tsx b/packages/dooringx-lib/src/components/IframeWrapperMove/ticker.tsx
new file mode 100644
index 0000000..a38eadf
--- /dev/null
+++ b/packages/dooringx-lib/src/components/IframeWrapperMove/ticker.tsx
@@ -0,0 +1,156 @@
+/*
+ * @Author: yehuozhili
+ * @Date: 2021-07-12 15:54:35
+ * @LastEditors: yehuozhili
+ * @LastEditTime: 2021-07-13 21:07:22
+ * @FilePath: \dooringx\packages\dooringx-lib\src\components\wrapperMove\ticker.tsx
+ */
+import React, { useEffect, useRef, useState } from 'react';
+import UserConfig from '../../config';
+
+const width = '20px';
+const indent = 50;
+
+function Ticker(props: { config: UserConfig }) {
+ const topRef = useRef(null);
+ const leftRef = useRef(null);
+ const [topRender, setTopRender] = useState(0);
+ const [leftRender, setLeftRender] = useState(0);
+
+ const scale = props.config.getScaleState().value;
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ if (topRef.current) {
+ const width = topRef.current.getBoundingClientRect().width;
+ const renderWidth = Math.ceil(width / 10 / scale);
+ setTopRender(renderWidth);
+ }
+ // left可以不用放,但为了更新统一
+ if (leftRef.current) {
+ const height = leftRef.current.getBoundingClientRect().height;
+ const renderHeight = Math.ceil(height / 10 / scale);
+ setLeftRender(renderHeight);
+ }
+ }, 300);
+
+ return () => {
+ clearTimeout(timer);
+ };
+ }, [props.config, props.config.collapsed, scale]);
+
+ return (
+ <>
+
+ {Array(topRender)
+ .fill(1)
+ .map((_, i) => {
+ if (i % 10 === 0) {
+ return (
+
+ );
+ } else {
+ return (
+
+ );
+ }
+ })}
+
+
+ {Array(leftRender)
+ .fill(1)
+ .map((_, i) => {
+ if (i % 10 === 0) {
+ return (
+
+ );
+ } else {
+ return (
+
+ );
+ }
+ })}
+
+ >
+ );
+}
+
+export default Ticker;
diff --git a/packages/dooringx-lib/src/components/container.tsx b/packages/dooringx-lib/src/components/container.tsx
index 8e9c3f8..7392690 100644
--- a/packages/dooringx-lib/src/components/container.tsx
+++ b/packages/dooringx-lib/src/components/container.tsx
@@ -37,6 +37,7 @@ function Container(props: PropsWithChildren) {
return props.state.globalState.containerColor;
}
};
+
return (
<>
{props.context === 'edit' && (
diff --git a/packages/dooringx-lib/src/components/iframeContainer.tsx b/packages/dooringx-lib/src/components/iframeContainer.tsx
new file mode 100644
index 0000000..a7a4d2d
--- /dev/null
+++ b/packages/dooringx-lib/src/components/iframeContainer.tsx
@@ -0,0 +1,184 @@
+/*
+ * @Author: yehuozhili
+ * @Date: 2021-07-17 10:08:08
+ * @LastEditors: yehuozhili
+ * @LastEditTime: 2021-07-17 22:13:51
+ * @FilePath: \dooringx\packages\dooringx-lib\src\components\iframeContainer.tsx
+ */
+import { containerDragResolve } from '../core/crossDrag';
+import { containerFocusRemove } from '../core/focusHandler';
+import { innerContainerDrag } from '../core/innerDrag';
+import { NormalMarkLineRender } from '../core/markline';
+import { IStoreData } from '../core/store/storetype';
+import { wrapperMoveState } from './IframeWrapperMove/event';
+import { CSSProperties, PropsWithChildren, useEffect, useMemo, useState } from 'react';
+import Blocks from './blocks';
+import React from 'react';
+import UserConfig, { defaultStore } from '../config';
+import styles from '../index.less';
+import { getRealHeight } from '../core/transfer';
+import { WrapperMoveStateProps } from './IframeWrapperMove/event';
+import { onWheelEventIframe } from '../core/scale';
+import { selectRangeMouseUp } from '../core/selectRange';
+interface ContainerProps {
+ context: 'edit' | 'preview';
+ config: UserConfig;
+ editContainerStyle?: CSSProperties;
+ previewContainerStyle?: CSSProperties;
+}
+interface IframeInnerState {
+ store: IStoreData;
+ scaleState: {
+ value: number;
+ maxValue: number;
+ minValue: number;
+ };
+ isEdit: boolean;
+ origin: null | IStoreData[];
+ wrapperState: {
+ data: any;
+ iframe: WrapperMoveStateProps;
+ };
+}
+
+function Container(props: PropsWithChildren) {
+ const { editContainerStyle, previewContainerStyle } = props;
+
+ const [message, setMessage] = useState({
+ store: defaultStore,
+ scaleState: {
+ value: 0,
+ maxValue: 0,
+ minValue: 0,
+ },
+ isEdit: false,
+ wrapperState: props.config.getWrapperMove(),
+ origin: null,
+ });
+
+ const state = message.store;
+ const scaleState = message.scaleState;
+ const isEdit = message.isEdit;
+
+ const bgColor = () => {
+ if (isEdit) {
+ return 'rgba(255,255,255,1)';
+ } else {
+ return state.globalState.containerColor;
+ }
+ };
+
+ const transform = useMemo(() => {
+ if (props.context === 'edit') {
+ return `scale(${scaleState.value}) translate(${wrapperMoveState.needX}px, ${wrapperMoveState.needY}px)`;
+ } else {
+ return undefined;
+ }
+ }, [props.context, scaleState.value]);
+
+ useEffect(() => {
+ const fn = (e: any) => {
+ console.log(e, 'ccccccccccccccc');
+ if (typeof e.data !== 'object') {
+ return;
+ }
+ if (!e.data.store) {
+ if (e.data.type === 'event') {
+ if (e.data.column === 'select') {
+ }
+ }
+
+ return;
+ }
+
+ const data: IframeInnerState = e.data;
+ console.log(data, 'kkkkkkkkkk', !e.data.store, e.data.store);
+
+ setMessage(data);
+ props.config.resetData([data.store]);
+ props.config.scaleState = data.scaleState;
+ };
+ window.addEventListener('message', fn);
+ window.parent.postMessage('ready', '*');
+ return () => {
+ window.removeEventListener('message', fn);
+ };
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ return (
+ <>
+ {props.context === 'edit' && (
+ <>
+ {
+ selectRangeMouseUp(e, props.config);
+ // props.config.sendParent({
+ // type: 'event',
+ // column: 'select',
+ // data: null,
+ // });
+ }}
+ onMouseLeave={(e) => {
+ selectRangeMouseUp(e, props.config);
+ }}
+ {...onWheelEventIframe(props.config, scaleState)}
+ >
+
+ {props.context === 'edit' && (
+
+ )}
+ {state.block.map((v) => {
+ return (
+
+ );
+ })}
+
+
+ >
+ )}
+ {props.context === 'preview' && (
+
+ {state.block.map((v) => {
+ return (
+
+ );
+ })}
+
+ )}
+ >
+ );
+}
+export default Container;
diff --git a/packages/dooringx-lib/src/config/index.tsx b/packages/dooringx-lib/src/config/index.tsx
index 318b8f2..206a1ed 100644
--- a/packages/dooringx-lib/src/config/index.tsx
+++ b/packages/dooringx-lib/src/config/index.tsx
@@ -2,7 +2,7 @@
* @Author: yehuozhili
* @Date: 2021-02-25 21:16:58
* @LastEditors: yehuozhili
- * @LastEditTime: 2021-07-16 20:22:47
+ * @LastEditTime: 2021-07-17 20:57:16
* @FilePath: \dooringx\packages\dooringx-lib\src\config\index.tsx
*/
import React from 'react';
@@ -31,7 +31,8 @@ import ComponentRegister from '../core/components';
import { StoreChanger } from '../core/storeChanger';
import Store from '../core/store';
import { VerticalAlignMiddleOutlined } from '@ant-design/icons';
-
+import { wrapperMoveState } from '../components/wrapperMove/event';
+import { wrapperMoveState as iframeWrapperMoveState } from '../components/IframeWrapperMove/event';
// 组件部分
/**
@@ -344,6 +345,14 @@ export class UserConfig {
public focusState = focusState;
public collapsed = false;
public ticker = true;
+ public wrapperMoveState = wrapperMoveState;
+ public iframeWrapperMoveState = iframeWrapperMoveState;
+ public refreshIframe = () => {};
+ public sendParent = (message: any) => {
+ window.parent.postMessage(message, '*');
+ };
+ public iframeOrigin = '';
+ public iframeId = 'yh-container-iframe';
constructor(initConfig?: Partial) {
const mergeConfig = userConfigMerge(defaultConfig, initConfig);
this.initConfig = mergeConfig;
@@ -410,6 +419,13 @@ export class UserConfig {
this.toRegist();
}
+ getWrapperMove() {
+ return {
+ data: this.wrapperMoveState,
+ iframe: this.iframeWrapperMoveState,
+ };
+ }
+
getFocusState() {
return this.focusState;
}
diff --git a/packages/dooringx-lib/src/core/innerDrag/index.ts b/packages/dooringx-lib/src/core/innerDrag/index.ts
index 2632d2c..230d4af 100644
--- a/packages/dooringx-lib/src/core/innerDrag/index.ts
+++ b/packages/dooringx-lib/src/core/innerDrag/index.ts
@@ -6,6 +6,7 @@ import { selectRangeMouseMove, selectData, selectRangeMouseUp } from '../selectR
import { IBlockType } from '../store/storetype';
import { deepCopy, isMac } from '../utils';
import { wrapperMoveMouseUp } from '../../components/wrapperMove/event';
+import { wrapperMoveMouseUp as iframeWrapperMove } from '../../components/IframeWrapperMove/event';
import { contextMenuState } from '../contextMenu';
import { innerDragState } from './state';
import UserConfig from '../../config';
@@ -102,12 +103,15 @@ export const innerContainerDrag = function (config: UserConfig) {
onMouseMove,
};
};
-export const innerContainerDragUp = function (config: UserConfig) {
+export const innerContainerDragUp = function (config: UserConfig, mode = 'normal') {
const store = config.getStore();
const onMouseUp = (e: React.MouseEvent) => {
e.preventDefault();
+ iframeWrapperMove(config);
wrapperMoveMouseUp(config);
selectRangeMouseUp(e, config);
+ if (mode !== 'normal') {
+ }
if (innerDragState.ref && innerDragState.ref.current) {
innerDragState.ref.current.style.cursor = 'default';
innerDragState.ref.current.style.willChange = 'auto';
diff --git a/packages/dooringx-lib/src/core/scale/index.ts b/packages/dooringx-lib/src/core/scale/index.ts
index fa2cdbb..85dd3a0 100644
--- a/packages/dooringx-lib/src/core/scale/index.ts
+++ b/packages/dooringx-lib/src/core/scale/index.ts
@@ -2,7 +2,7 @@
* @Author: yehuozhili
* @Date: 2021-03-14 04:29:09
* @LastEditors: yehuozhili
- * @LastEditTime: 2021-07-12 20:04:17
+ * @LastEditTime: 2021-07-17 17:05:13
* @FilePath: \dooringx\packages\dooringx-lib\src\core\scale\index.ts
*/
import UserConfig from '../../config';
@@ -23,6 +23,7 @@ export const onWheelEvent = (config: UserConfig) => {
if (scale.value < scale.maxValue) {
scale.value = scale.value + 0.1;
store.forceUpdate();
+ config.refreshIframe();
}
} else {
scaleCancelFn();
@@ -30,6 +31,7 @@ export const onWheelEvent = (config: UserConfig) => {
if (scale.value > scale.minValue) {
scale.value = scale.value - 0.1;
store.forceUpdate();
+ config.refreshIframe();
}
}
},
@@ -44,6 +46,7 @@ export const scaleFn = {
scaleCancelFn();
scaleState.value = scaleState.value + number;
store.forceUpdate();
+ config.refreshIframe();
}
return scaleState.value;
},
@@ -54,7 +57,49 @@ export const scaleFn = {
if (scaleState.value > scaleState.minValue) {
scaleState.value = scaleState.value - number;
store.forceUpdate();
+ config.refreshIframe();
}
return scaleState.value;
},
};
+
+export const onWheelEventIframe = (
+ config: UserConfig,
+ scale: {
+ value: number;
+ maxValue: number;
+ minValue: number;
+ }
+) => {
+ return {
+ onWheel: (e: React.WheelEvent) => {
+ const dom = document.querySelector('.ant-modal-mask');
+ if (dom) {
+ //出现弹窗禁止滚动
+ return;
+ }
+ if (e.deltaY > 0) {
+ scaleCancelFn();
+ if (scale.value < scale.maxValue) {
+ scale.value = scale.value + 0.1;
+ config.sendParent({
+ type: 'update',
+ column: 'scale',
+ data: scale,
+ });
+ }
+ } else {
+ scaleCancelFn();
+ //往上滚缩小
+ if (scale.value > scale.minValue) {
+ scale.value = scale.value - 0.1;
+ config.sendParent({
+ type: 'update',
+ column: 'scale',
+ data: scale,
+ });
+ }
+ }
+ },
+ };
+};
diff --git a/packages/dooringx-lib/src/core/selectRange/index.ts b/packages/dooringx-lib/src/core/selectRange/index.ts
index 24b0466..c3bfcbd 100644
--- a/packages/dooringx-lib/src/core/selectRange/index.ts
+++ b/packages/dooringx-lib/src/core/selectRange/index.ts
@@ -1,5 +1,5 @@
import { IStoreData } from '../store/storetype';
-import { deepCopy } from '../utils';
+import { deepCopy, postMessage } from '../utils';
import style from '../../index.less';
import UserConfig from '../../config';
export interface SelectDataProps {
@@ -99,3 +99,32 @@ export function selectRangeMouseUp(e: React.MouseEvent | MouseEvent, config: Use
selectData.selectDiv = null;
}
}
+
+export function iframeSelectRangeMouseUp(config: UserConfig) {
+ postMessage(
+ {
+ type: 'event',
+ column: 'select',
+ data: null,
+ },
+ config.iframeOrigin,
+ config.iframeId
+ );
+}
+
+export function forceRangeMouseLeave(config: UserConfig) {
+ if (selectData.selectDiv) {
+ let left = 0;
+ let top = 0;
+ const scaleState = config.getScaleState();
+ const { width, height } = selectData.selectDiv.getBoundingClientRect();
+ const scale = scaleState.value;
+ const wwidth = width / scale;
+ const wheight = height / scale;
+ left = selectData.startX;
+ top = selectData.startY;
+ selectFocus(left, top, wwidth, wheight, config);
+ selectData.selectDiv.parentNode!.removeChild(selectData.selectDiv);
+ selectData.selectDiv = null;
+ }
+}
diff --git a/packages/dooringx-lib/src/core/utils/index.ts b/packages/dooringx-lib/src/core/utils/index.ts
index 13f5229..d01e37b 100644
--- a/packages/dooringx-lib/src/core/utils/index.ts
+++ b/packages/dooringx-lib/src/core/utils/index.ts
@@ -279,3 +279,12 @@ export const changeUserValueRecord = (
return {};
}
};
+
+export function postMessage(value: any, src: string, target = 'yh-container-iframe') {
+ const iframe = document.querySelector(`#${target}`) as HTMLIFrameElement;
+ if (iframe) {
+ iframe.contentWindow?.postMessage(value, src);
+ } else {
+ console.warn('can not find iframe');
+ }
+}
diff --git a/packages/dooringx-lib/src/hooks/index.ts b/packages/dooringx-lib/src/hooks/index.ts
index 0296c2e..57bd02c 100644
--- a/packages/dooringx-lib/src/hooks/index.ts
+++ b/packages/dooringx-lib/src/hooks/index.ts
@@ -2,13 +2,14 @@
* @Author: yehuozhili
* @Date: 2021-03-14 05:35:15
* @LastEditors: yehuozhili
- * @LastEditTime: 2021-07-12 15:52:06
+ * @LastEditTime: 2021-07-17 20:59:26
* @FilePath: \dooringx\packages\dooringx-lib\src\hooks\index.ts
*/
import { useEffect, useMemo, useState } from 'react';
import UserConfig from '../config';
import { ComponentRenderConfigProps } from '../core/components/componentItem';
import { registCommandFn, unRegistCommandFn } from '../core/command/runtime';
+import { postMessage } from '../core/utils';
export function useStoreState(
config: UserConfig,
@@ -97,3 +98,55 @@ export function useDynamicAddEventCenter(
}, [displayName, eventCenter, eventName, props.data.eventMap, props.data.id, props.store]);
return;
}
+
+/**
+ *
+ *
+ * @export
+ * @param {string} origin iframe地址
+ * @param {UserConfig} config
+ * @param {boolean} sign iframe onload
+ * @param {string} [target] iframeid 默认是yh-container-iframe
+ * @return {*}
+ */
+export function useIframePostMessage(
+ origin: string,
+ config: UserConfig,
+ sign: boolean,
+ target?: string
+) {
+ const store = config.getStore();
+
+ const fn = useMemo(() => {
+ config.iframeId = target || config.iframeId;
+ config.iframeOrigin = origin;
+ return () => {
+ const data = {
+ store: store.getData(),
+ scaleState: config.getScaleState(),
+ origin: config.getStoreChanger().getOrigin(),
+ isEdit: config.getStoreChanger().isEdit(),
+ wrapperState: config.getWrapperMove().iframe,
+ };
+
+ postMessage(data, origin, target);
+ };
+ }, [config, origin, store, target]);
+
+ useEffect(() => {
+ let unRegister = () => {};
+ if (sign) {
+ config.refreshIframe = fn;
+ unRegister = store.subscribe(() => {
+ // dom等无法传递
+ // config由context带去,传递store和必要state
+ fn();
+ });
+ }
+ return () => {
+ unRegister();
+ };
+ }, [config.refreshIframe, fn, sign, store]);
+
+ return [fn];
+}
diff --git a/packages/dooringx-lib/src/index.tsx b/packages/dooringx-lib/src/index.tsx
index a825332..dc4cc59 100644
--- a/packages/dooringx-lib/src/index.tsx
+++ b/packages/dooringx-lib/src/index.tsx
@@ -2,7 +2,7 @@
* @Author: yehuozhili
* @Date: 2021-03-14 04:22:18
* @LastEditors: yehuozhili
- * @LastEditTime: 2021-07-13 14:57:13
+ * @LastEditTime: 2021-07-17 16:38:22
* @FilePath: \dooringx\packages\dooringx-lib\src\index.tsx
*/
@@ -52,5 +52,9 @@ export { defaultStore } from './config';
//state
export { focusState } from './core/focusHandler/state';
//utils
-export { deepCopy, rgba2Obj, swap, createUid, arrayMove } from './core/utils';
+export { deepCopy, rgba2Obj, swap, createUid, arrayMove, postMessage } from './core/utils';
export { specialCoList } from './core/utils/special';
+// iframe
+export { default as IframeContainer } from './components/iframeContainer';
+export { default as IframeContainerWrapper } from './components/IframeWrapperMove';
+export { useIframePostMessage } from './hooks';