Blame view

天文台pc/tianwentai-ui/node_modules/react-dnd/src/hooks/useDrag/DragSourceImpl.ts 1.51 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  import type { DragDropMonitor, DragSource, Identifier } from 'dnd-core'
  
  import type { Connector } from '../../internals/index.js'
  import type { DragSourceMonitor } from '../../types/index.js'
  import type { DragObjectFactory, DragSourceHookSpec } from '../types.js'
  
  export class DragSourceImpl<O, R, P> implements DragSource {
  	public constructor(
  		public spec: DragSourceHookSpec<O, R, P>,
  		private monitor: DragSourceMonitor<O, R>,
  		private connector: Connector,
  	) {}
  
  	public beginDrag() {
  		const spec = this.spec
  		const monitor = this.monitor
  
  		let result: O | null = null
  		if (typeof spec.item === 'object') {
  			result = spec.item as O
  		} else if (typeof spec.item === 'function') {
  			result = (spec.item as DragObjectFactory<O>)(monitor)
  		} else {
  			result = {} as O
  		}
  		return result ?? null
  	}
  
  	public canDrag() {
  		const spec = this.spec
  		const monitor = this.monitor
  		if (typeof spec.canDrag === 'boolean') {
  			return spec.canDrag
  		} else if (typeof spec.canDrag === 'function') {
  			return spec.canDrag(monitor)
  		} else {
  			return true
  		}
  	}
  
  	public isDragging(globalMonitor: DragDropMonitor, target: Identifier) {
  		const spec = this.spec
  		const monitor = this.monitor
  		const { isDragging } = spec
  		return isDragging
  			? isDragging(monitor)
  			: target === globalMonitor.getSourceId()
  	}
  
  	public endDrag() {
  		const spec = this.spec
  		const monitor = this.monitor
  		const connector = this.connector
  		const { end } = spec
  		if (end) {
  			end(monitor.getItem(), monitor)
  		}
  		connector.reconnect()
  	}
  }