11<template >
2- <div v-for =" state in multiSelectedStates " :key =" state.id" >
2+ <div v-for =" state in allMultiSelectedStates " :key =" state.id" >
33 <canvas-action
44 :hoverState =" hoverState"
55 :inactiveHoverState =" inactiveHoverState"
88 :windowGetClickEventTarget =" target"
99 :resize =" canvasState.type === 'absolute'"
1010 :multiStateLength =" multiStateLength"
11+ :remoteStatesLength =" remoteStatesLength"
1112 :isMultiDragging =" isMultiDragging"
1213 @select-slot =" selectSlot"
1314 @setting =" settingModel"
@@ -91,8 +92,12 @@ import {
9192 clearLineState ,
9293 querySelectById ,
9394 getCurrent ,
94- canvasApi
95+ canvasApi ,
96+ getRect
9597} from ' ./container'
98+ import { initHook , HOOK_NAME } from ' @opentiny/tiny-engine-meta-register'
99+ import useCollabSchema from ' @opentiny/tiny-engine-multi-person-collaboration'
100+ import { useRealtimeCollab } from ' @opentiny/tiny-engine-meta-register'
96101
97102export default {
98103 components: {
@@ -138,7 +143,53 @@ export default {
138143
139144 const { multiSelectedStates , isMouseDown } = useMultiSelect ()
140145
146+ // Awareness 是否完成初始化,initHook之后才能得到 remoteStates数据
147+ const isReady = ref (false )
148+
149+ // Awareness 远端数据
150+ const remoteStates = ref ({})
151+
152+ // 滚动保持节点位置同步
153+ const syncRemoteStatesSelections = ref ([])
154+
155+ // 全部 Selection States 信息
156+ const allMultiSelectedStates = computed (() => {
157+ return [... multiSelectedStates .value , ... syncRemoteStatesSelections .value ]
158+ })
159+
160+ // 将 state 映射成带位置信息的 selection
161+ const mapStateToSelection = (state ) => {
162+ const element = querySelectById (state .selection .id )
163+ if (! element) return null
164+ const { top , left , width , height } = getRect (element)
165+ return {
166+ ... state,
167+ isRemote: true ,
168+ user: state .user ,
169+ top,
170+ left,
171+ width,
172+ height
173+ }
174+ }
175+
176+ // 远端 selections,自动过滤不存在的元素
177+ const remoteStatesSelections = computed (() => {
178+ if (! remoteStates .value ) return []
179+
180+ return Object .values (remoteStates .value )
181+ .filter ((state ) => state .selection )
182+ .map (mapStateToSelection)
183+ .filter (Boolean )
184+ })
185+
186+ // 手动刷新远端节点位置
187+ const syncRemoteNode = () => {
188+ syncRemoteStatesSelections .value = syncRemoteStatesSelections .value .map (mapStateToSelection).filter (Boolean )
189+ }
190+
141191 const multiStateLength = computed (() => multiSelectedStates .value .length )
192+ const remoteStatesLength = computed (() => syncRemoteStatesSelections .value .length )
142193 const {
143194 startMultiDrag ,
144195 moveMultiDrag ,
@@ -397,6 +448,26 @@ export default {
397448 registerHotkeyEvent (doc)
398449
399450 win .addEventListener (' scroll' , syncNodeScroll, true )
451+ win .addEventListener (' scroll' , syncRemoteNode, true )
452+
453+ const { insertSharedNode , deleteSharedNode , updateUserSelection , remoteStates } = useCollabSchema ({
454+ roomId: ' schema-yjs' ,
455+ currentUser: {
456+ id: 2 ,
457+ name: ' Bob' ,
458+ color: ' #4ECDC4' ,
459+ avatarUrl: ' https://i.pravatar.cc/150?img=2'
460+ }
461+ })
462+
463+ initHook (HOOK_NAME .useRealtimeCollab , {
464+ insertSharedNode,
465+ deleteSharedNode,
466+ updateUserSelection,
467+ remoteStates
468+ })
469+
470+ isReady .value = true
400471 }
401472 }
402473 // 设置弹窗
@@ -452,6 +523,30 @@ export default {
452523 document .addEventListener (' beforeCanvasReady' , beforeCanvasReady)
453524 document .addEventListener (' canvasReady' , canvasReady)
454525
526+ watch (isReady, (newVal ) => {
527+ if (newVal) {
528+ const newStates = useRealtimeCollab ().remoteStates
529+ remoteStates .value = newStates
530+ }
531+ })
532+
533+ watch (
534+ remoteStatesSelections,
535+ (newVal ) => {
536+ syncRemoteStatesSelections .value = newVal
537+ },
538+ { immediate: true }
539+ )
540+
541+ watch (
542+ remoteStates,
543+ (newVal ) => {
544+ // eslint-disable-next-line no-console
545+ console .log (' remoteStates变动' , newVal)
546+ },
547+ { deep: true }
548+ )
549+
455550 return {
456551 isMouseDown,
457552 iframe,
@@ -477,7 +572,12 @@ export default {
477572 srcAttrName,
478573 isMultiDragging,
479574 multiDragState,
480- getMultiDragPositionText
575+ getMultiDragPositionText,
576+ remoteStates,
577+ allMultiSelectedStates,
578+ remoteStatesSelections,
579+ remoteStatesLength,
580+ syncRemoteStatesSelections
481581 }
482582 }
483583}
0 commit comments