| import { useCallback } from 'react'; |
| import { uniq } from 'lodash'; |
| import { useCanvasStore } from '@/lib/store'; |
| import { useKeyboardStore } from '@/lib/store/keyboard'; |
| import type { PPTElement } from '@/lib/types/slides'; |
|
|
| |
| |
| |
| |
| export function useSelectElement( |
| elementListRef: React.RefObject<PPTElement[]>, |
| moveElement: (e: React.MouseEvent | React.TouchEvent, element: PPTElement) => void, |
| ) { |
| const activeElementIdList = useCanvasStore.use.activeElementIdList(); |
| const activeGroupElementId = useCanvasStore.use.activeGroupElementId(); |
| const handleElementId = useCanvasStore.use.handleElementId(); |
| const editorAreaFocus = useCanvasStore.use.editorAreaFocus(); |
| const setActiveElementIdList = useCanvasStore.use.setActiveElementIdList(); |
| const setHandleElementId = useCanvasStore.use.setHandleElementId(); |
| const setActiveGroupElementId = useCanvasStore.use.setActiveGroupElementId(); |
| const setEditorAreaFocus = useCanvasStore.use.setEditorAreaFocus(); |
|
|
| const ctrlOrShiftKeyActive = useKeyboardStore((state) => state.ctrlOrShiftKeyActive()); |
|
|
| |
| |
| const selectElement = useCallback( |
| (e: React.MouseEvent | React.TouchEvent, element: PPTElement, startMove = true) => { |
| if (!editorAreaFocus) setEditorAreaFocus(true); |
|
|
| |
| |
| |
| if (!activeElementIdList.includes(element.id)) { |
| let newActiveIdList: string[] = []; |
|
|
| if (ctrlOrShiftKeyActive) { |
| newActiveIdList = [...activeElementIdList, element.id]; |
| } else { |
| newActiveIdList = [element.id]; |
| } |
|
|
| if (element.groupId) { |
| const groupMembersId: string[] = []; |
| elementListRef.current.forEach((el: PPTElement) => { |
| if (el.groupId === element.groupId) groupMembersId.push(el.id); |
| }); |
| newActiveIdList = [...newActiveIdList, ...groupMembersId]; |
| } |
|
|
| setActiveElementIdList(uniq(newActiveIdList)); |
| setHandleElementId(element.id); |
| } |
|
|
| |
| |
| |
| else if (ctrlOrShiftKeyActive) { |
| let newActiveIdList: string[] = []; |
|
|
| if (element.groupId) { |
| const groupMembersId: string[] = []; |
| elementListRef.current.forEach((el: PPTElement) => { |
| if (el.groupId === element.groupId) groupMembersId.push(el.id); |
| }); |
| newActiveIdList = activeElementIdList.filter((id) => !groupMembersId.includes(id)); |
| } else { |
| newActiveIdList = activeElementIdList.filter((id) => id !== element.id); |
| } |
|
|
| if (newActiveIdList.length > 0) { |
| setActiveElementIdList(newActiveIdList); |
| } |
| } |
|
|
| |
| else if (handleElementId !== element.id) { |
| setHandleElementId(element.id); |
| } |
|
|
| |
| else if (activeGroupElementId !== element.id) { |
| const startPageX = |
| e.nativeEvent instanceof MouseEvent |
| ? e.nativeEvent.pageX |
| : 'changedTouches' in e |
| ? e.changedTouches[0].pageX |
| : 0; |
| const startPageY = |
| e.nativeEvent instanceof MouseEvent |
| ? e.nativeEvent.pageY |
| : 'changedTouches' in e |
| ? e.changedTouches[0].pageY |
| : 0; |
|
|
| const target = e.target as HTMLElement; |
| const handleMouseUp = (e: MouseEvent) => { |
| const currentPageX = e.pageX; |
| const currentPageY = e.pageY; |
|
|
| if (startPageX === currentPageX && startPageY === currentPageY) { |
| setActiveGroupElementId(element.id); |
| target.onmouseup = null; |
| } |
| }; |
|
|
| target.onmouseup = handleMouseUp; |
| } |
|
|
| if (startMove) moveElement(e, element); |
| }, |
| |
| [ |
| editorAreaFocus, |
| activeElementIdList, |
| ctrlOrShiftKeyActive, |
| handleElementId, |
| activeGroupElementId, |
| setEditorAreaFocus, |
| setActiveElementIdList, |
| setHandleElementId, |
| setActiveGroupElementId, |
| moveElement, |
| ], |
| ); |
|
|
| return { |
| selectElement, |
| }; |
| } |
|
|