1
1
// TODO: 整理所有 ICON 封装成组件
2
- import CloseIcon from './Close.svg?raw'
3
- import SizeIcon from './Size.svg?raw'
2
+ import CloseIcon from './assets/Close.svg?raw'
3
+ import MoveIcon from './assets/Move.svg?raw'
4
+ import SizeIcon from './assets/Size.svg?raw'
5
+ import { useMoveable } from '../../Common/useMoveable'
6
+ import { useResizable } from '../../Common/useReizeable'
4
7
5
8
import styles from './index.module.less'
6
9
7
10
export const Header = ( ) => {
8
- const storeRef = React . useRef < any > ( {
11
+ const storeRef = React . useRef ( {
9
12
resizeTrigger : null ,
10
13
resizeContainer : null ,
14
+ dragContainer : null ,
15
+ dragTrigger : null ,
11
16
isResizing : false ,
12
17
x : 0 ,
13
18
y : 0 ,
@@ -16,47 +21,23 @@ export const Header = () => {
16
21
} )
17
22
18
23
React . useEffect ( ( ) => {
19
- const { resizeTrigger } = storeRef . current
20
- if ( ! resizeTrigger ) {
21
- return
22
- }
24
+ const aiRoot = document . querySelector ( '#aiChatRoot' )
23
25
24
- storeRef . current . resizeContainer = document . querySelector ( '#aiChatRoot .ChatWrapper' )
25
-
26
- storeRef . current . resizeTrigger . addEventListener ( 'mousedown' , ( e ) => {
27
- const { resizeContainer } = storeRef . current
28
- storeRef . current = {
29
- ...storeRef . current ,
30
- isResizing : true ,
31
- x : e . clientX ,
32
- y : e . clientY ,
33
- width : resizeContainer . offsetWidth ,
34
- height : resizeContainer . offsetHeight ,
35
- }
36
- document . addEventListener ( 'mousemove' , resize )
37
- document . addEventListener ( 'mouseup' , stopResize )
38
- } )
39
-
40
- const resize = ( e ) => {
41
- const { isResizing, resizeContainer, x, y, width, height } = storeRef . current
42
- if ( isResizing ) {
43
- const newWidth = width + ( e . clientX - x )
44
- const newHeight = height - ( e . clientY - y )
45
- resizeContainer . style . width = `${ newWidth } px`
46
- resizeContainer . style . height = `${ newHeight } px`
47
- }
48
- }
26
+ storeRef . current . resizeContainer = aiRoot . querySelector ( '.ChatWrapper' )
27
+ storeRef . current . dragContainer = aiRoot . querySelector ( '.AiChatEntry' )
28
+ } , [ ] )
49
29
50
- const stopResize = ( ) => {
51
- storeRef . current . isResizing = false
52
- document . removeEventListener ( 'mousemove' , resize )
53
- document . removeEventListener ( 'mouseup' , stopResize )
54
- }
30
+ useMoveable ( {
31
+ reactIns : React ,
32
+ container : storeRef . current . dragContainer ,
33
+ trigger : storeRef . current . dragTrigger ,
34
+ } )
55
35
56
- return ( ) => {
57
- storeRef . current . resizeTrigger . removeEventListener ( 'mousedown' )
58
- }
59
- } , [ ] )
36
+ useResizable ( {
37
+ reactIns : React ,
38
+ container : storeRef . current . resizeContainer ,
39
+ trigger : storeRef . current . resizeTrigger ,
40
+ } )
60
41
61
42
const handleClose = ( ) => {
62
43
window . postMessage ( {
@@ -69,6 +50,12 @@ export const Header = () => {
69
50
< i > </ i >
70
51
< span > Amis Bot</ span >
71
52
< div className = { styles . right } >
53
+ < button
54
+ title = '移动位置'
55
+ className = { styles . move }
56
+ ref = { ( ref ) => ( storeRef . current . dragTrigger = ref ) }
57
+ dangerouslySetInnerHTML = { { __html : MoveIcon } }
58
+ />
72
59
< button
73
60
title = '调整大小'
74
61
className = { styles . resize }
0 commit comments