Skip to content

Commit

Permalink
refactor: change synchoronized method between canvas and host
Browse files Browse the repository at this point in the history
  • Loading branch information
chilingling committed Nov 9, 2024
1 parent 06da4de commit 5ab6050
Show file tree
Hide file tree
Showing 21 changed files with 158 additions and 209 deletions.
2 changes: 0 additions & 2 deletions packages/canvas/DesignCanvas/src/api/useCanvas.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,6 @@ const resetCanvasState = async (state = {}) => {
generateNodesMap(pageState.pageSchema.children, pageState.pageSchema)
}

await canvasApi.value?.setSchema(pageState.pageSchema)

const diffPatch = jsondiffpatchInstance.diff(previousSchema, pageState.pageSchema)

publish({ topic: 'schemaImport', data: { current: pageState.pageSchema, previous: previousSchema, diffPatch } })
Expand Down
13 changes: 9 additions & 4 deletions packages/canvas/container/src/CanvasContainer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@
</template>

<script>
import { onMounted, ref, computed, onUnmounted } from 'vue'
import { onMounted, ref, computed, onUnmounted, watch, watchEffect } from 'vue'
import { iframeMonitoring } from '@opentiny/tiny-engine-common/js/monitor'
import { useTranslate, useCanvas, useMaterial, useMessage } from '@opentiny/tiny-engine-meta-register'
import { useTranslate, useCanvas, useMaterial, useMessage, useResource } from '@opentiny/tiny-engine-meta-register'
import { NODE_UID, NODE_LOOP } from '../../common'
import { registerHostkeyEvent, removeHostkeyEvent } from './keyboard'
import CanvasMenu, { closeMenu, openMenu } from './components/CanvasMenu.vue'
Expand Down Expand Up @@ -116,13 +116,18 @@ export default {
win.thirdPartyDeps = useMaterial().materialState.thirdPartyDeps
const { subscribe, unsubscribe } = useMessage()
const { getSchemaDiff, patchLatestSchema } = useCanvas()
const { getSchemaDiff, patchLatestSchema, getSchema } = useCanvas()
const { appSchemaState } = useResource()
iframe.value.contentWindow.host = {
unsubscribe,
subscribe,
getSchemaDiff,
patchLatestSchema
patchLatestSchema,
watch,
watchEffect,
getSchema,
appSchema: appSchemaState
}
}
}
Expand Down
54 changes: 2 additions & 52 deletions packages/canvas/container/src/container.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import {
NODE_TAG,
NODE_LOOP
} from '../../common'
import { useCanvas, useLayout, useResource, useTranslate, useMaterial } from '@opentiny/tiny-engine-meta-register'
import { useCanvas, useLayout, useTranslate, useMaterial } from '@opentiny/tiny-engine-meta-register'
import { utils } from '@opentiny/tiny-engine-utils'
import { isVsCodeEnv } from '@opentiny/tiny-engine-common/js/environments'
import Builtin from '../../render/src/builtin/builtin.json' //TODO 画布内外应该分开
Expand Down Expand Up @@ -69,8 +69,6 @@ export const getCurrent = () => {
}
}

export const getGlobalState = () => getRenderer().getGlobalState()

export const getSchema = () => useCanvas().getPageSchema()

// 记录拖拽状态
Expand Down Expand Up @@ -766,31 +764,6 @@ export const setLocales = (messages, merge) => {
})
}

export const setUtils = (utils, clear, isForceRefresh) => {
getRenderer().setUtils(utils, clear, isForceRefresh)
}

export const updateUtils = (utils) => {
getRenderer().updateUtils(utils)
}

export const deleteUtils = (utils) => {
getRenderer().deleteUtils(utils)
}

export const setGlobalState = (state) => {
useResource().resState.globalState = state
getRenderer().setGlobalState(state)
}

export const setSchema = async (schema) => {
clearHover()
clearSelect()
canvasState.schema = await getRenderer()?.setSchema(schema)

return canvasState.schema
}

export const setConfigure = (configure) => {
getRenderer().setConfigure(configure)
}
Expand Down Expand Up @@ -836,33 +809,15 @@ export const canvasApi = {
addScript,
addStyle,
getCurrent,
setSchema,
setUtils,
updateUtils,
deleteUtils,
setI18n,
getCanvasType,
setCanvasType,
setGlobalState,
getGlobalState,
getDocument,
canvasDispatch,
Builtin,
setDataSourceMap: (...args) => {
return canvasState.renderer.setDataSourceMap(...args)
},
getDataSourceMap: (...args) => {
return canvasState.renderer.getDataSourceMap(...args)
}
Builtin
}

export const initCanvas = ({ renderer, iframe, emit, controller }) => {
const { getSchema, getPageSchema } = useCanvas()
const currentSchema = getSchema()

// 在点击刷新按钮的情况下继续保留最新的schema.json
const schema = currentSchema ? currentSchema : getPageSchema()

canvasState.iframe = iframe
canvasState.emit = emit
// 存放画布外层传进来的插件api
Expand All @@ -877,11 +832,6 @@ export const initCanvas = ({ renderer, iframe, emit, controller }) => {
senterMessage({ type: 'i18nReady', value: true }, '*')
}

setGlobalState(useResource().resState.globalState)
renderer.setDataSourceMap(useResource().resState.dataSource)
// 设置画布全局的utils工具类上下文环境
setUtils(useResource().resState.utils)
setSchema(schema)
setConfigure(useMaterial().getConfigureMap())
canvasDispatch('updateDependencies', { detail: useMaterial().materialState.thirdPartyDeps })
canvasState.loading = false
Expand Down
118 changes: 58 additions & 60 deletions packages/canvas/render/src/RenderMain.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,25 @@ watchEffect(() => {
})
})

const getDeletedKeys = (objA, objB) => {
const keyA = Object.keys(objA)
const keyB = new Set(Object.keys(objB))

return keyA.filter((item) => !keyB.has(item))
}

const getUtils = () => utils

const setUtils = (data, clear, isForceRefresh) => {
if (clear) {
reset(utils)
const setUtils = (data) => {
// 筛选出来已经被删除的 key
const newKeys = new Set(data.map(({ name }) => name))
const currentKeys = Object.keys(utils)
const deletedUtilsKeys = currentKeys.filter((item) => !newKeys.has(item))

for (const key of deletedUtilsKeys) {
delete utils[key]
}

const utilsCollection = {}
// 目前画布还不具备远程加载utils工具类的功能,目前只能加载TinyVue组件库中的组件工具
data?.forEach((item) => {
Expand All @@ -83,33 +96,9 @@ const setUtils = (data, clear, isForceRefresh) => {
Object.assign(utils, utilsCollection)

// 因为工具类并不具有响应式行为,所以需要通过修改key来强制刷新画布
if (isForceRefresh) {
refreshKey.value++
}
}

const updateUtils = (data) => {
setUtils(data, false, true)
refreshKey.value++
}

const deleteUtils = (data) => {
data?.forEach((item) => {
if (utils[item.name]) {
delete utils[item.name]
}
})
setUtils([], false, true)
}

const setBridge = (data, clear) => {
clear && reset(bridge)
Object.assign(bridge, data)
}

const getBridge = () => bridge

// const getMethods = () => methods

const setMethods = (data = {}, clear) => {
clear && reset(methods)
// 这里有些方法在画布还是有执行的必要的,比如说表格的renderer和formatText方法,包括一些自定义渲染函数
Expand All @@ -124,10 +113,6 @@ const setMethods = (data = {}, clear) => {
setContext(methods)
}

// const deleteState = (variable) => {
// delete state[variable]
// }

const generateAccessor = (type, accessor, property) => {
const accessorFn = generateFunction(accessor[type].value, context)

Expand Down Expand Up @@ -164,13 +149,6 @@ const generateStateAccessors = (type, accessor, key) => {
)
}

const getDeletedKeys = (objA, objB) => {
const keyA = Object.keys(objA)
const keyB = new Set(Object.keys(objB))

return keyA.filter((item) => !keyB.has(item))
}

const setState = (data) => {
const deletedKeys = getDeletedKeys(state, data)

Expand Down Expand Up @@ -221,10 +199,6 @@ const setDataSourceMap = (list) => {
}, {})
}

const getGlobalState = () => {
return globalState.value
}

const setGlobalState = (data = []) => {
globalState.value = data
}
Expand Down Expand Up @@ -390,14 +364,21 @@ export default {

const { locale } = inject(I18nInjectionKey).global
const { data } = useBroadcastChannel({ name: BROADCAST_CHANNEL.CanvasLang })
const { post } = useBroadcastChannel({ name: BROADCAST_CHANNEL.SchemaLength })

window.host.subscribe({
topic: 'schemaChange',
subscriber: 'canvasRenderer',
callback: throttleUpdateSchema
})

window.host.subscribe({
topic: 'schemaImport',
subscriber: 'canvasRenderer',
callback: () => {
setSchema(window.host.getSchema())
}
})

onUnmounted(() => {
window.host.unsubscribe({
topic: 'schemaChange',
Expand All @@ -409,13 +390,6 @@ export default {
locale.value = data.value
})

watch(
() => schema?.children?.length,
(length) => {
post(length)
}
)

// 这里监听schema.methods,为了保证methods上下文环境始终为最新
watch(
() => schema.methods,
Expand Down Expand Up @@ -443,7 +417,38 @@ export default {
deep: true
}
)

window.host.watch(
() => window.host.appSchema?.utils,
(data) => {
setUtils(data)
},
{
immediate: true
}
)

window.host.watch(
() => window.host.appSchema?.dataSource,
(data) => {
setDataSourceMap(data)
},
{
immediate: true
}
)

window.host.watch(
() => window.host.appSchema?.globalState,
(data) => {
setGlobalState(data)
},
{
immediate: true
}
)
},

render() {
return getRenderer().call(this)
}
Expand All @@ -452,23 +457,16 @@ export default {
export const api = {
// 用于 lowcode.js 获取 utils 工具类
getUtils,
setUtils,
updateUtils,
deleteUtils,
getBridge,
setBridge,
getDataSourceMap,
setDataSourceMap,
getGlobalState,
setGlobalState,

// setState 需要把 collection 的引用解开
setState,

// 用于调用区块获取、注册、以及 CanvasCollection 的相关逻辑调用
setController,
// 设置物料
setConfigure,
setSchema,

// 用于大纲树临时性隐藏
setCondition,
getRenderer,
Expand Down
4 changes: 2 additions & 2 deletions packages/common/component/MetaListItems.vue
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ export default {
},
setup(props, { emit }) {
const listItemOption = computed(() => props)
const { resState } = useResource()
const { appSchemaState } = useResource()
const changeItem = (params) => {
const optionsList = [...props.optionsList]
Expand Down Expand Up @@ -159,7 +159,7 @@ export default {
if (item[props.textField]) {
if (item[props.textField].i18nKey) {
let i18nKey = item[props.textField].i18nKey
text = resState.langs[i18nKey][resState.currentLang]
text = appSchemaState.langs[i18nKey][appSchemaState.currentLang]
} else {
text = item[props.textField]
}
Expand Down
2 changes: 1 addition & 1 deletion packages/common/js/canvas.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { useResource, getMetaApi, META_SERVICE } from '@opentiny/tiny-engine-met
export const getCanvasStatus = (data) => {
const globalState = getMetaApi(META_SERVICE.GlobalService).getState()
// 写死ID 待删除
let isDemo = useResource().resState.isDemo
let isDemo = useResource().appSchemaState.isDemo
const { resetPasswordToken } = globalState.userInfo

if (isDemo && [PAGE_STATUS.Developer, PAGE_STATUS.SuperAdmin].includes(resetPasswordToken)) {
Expand Down
2 changes: 1 addition & 1 deletion packages/common/js/completion.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ const getSnippetsSuggestions = (monaco, range, wordContent) =>
.filter(({ insertText }) => insertText.indexOf(wordContent) === 0)

const getUserWords = () => {
const { bridge = [], dataSource = [], utils = [], globalState = [] } = useResource().resState
const { bridge = [], dataSource = [], utils = [], globalState = [] } = useResource().appSchemaState

return {
state: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,7 @@ export default {
} else if (item.id === 'bridge' || item.id === 'utils') {
state.bindPrefix = `${CONSTANTS.THIS}${item.id}.`
const bridge = {}
useResource().resState[item.id]?.forEach((res) => {
useResource().appSchemaState[item.id]?.forEach((res) => {
bridge[res.name] = `${item.id}.${res.content.exportName}`
})
Expand Down Expand Up @@ -502,7 +502,7 @@ export default {
state.bindPrefix = CONSTANTS.STORE
state.variables = {}
const stores = canvasApi.value.getGlobalState()
const stores = useResource().appSchemaState.globalState
stores.forEach(({ id, state: storeState = {}, getters = {} }) => {
const loadProp = (prop) => {
const propBinding = `${id}.${prop}`
Expand Down
Loading

0 comments on commit 5ab6050

Please sign in to comment.