Initial commit: igny8 project

This commit is contained in:
igny8
2025-11-09 10:27:02 +00:00
commit 60b8188111
27265 changed files with 4360521 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
import type { DropTarget } from 'dnd-core'
import type { DropTargetMonitor } from '../../types/index.js'
import type { DropTargetHookSpec } from '../types.js'
export class DropTargetImpl<O, R, P> implements DropTarget {
public constructor(
public spec: DropTargetHookSpec<O, R, P>,
private monitor: DropTargetMonitor<O, R>,
) {}
public canDrop() {
const spec = this.spec
const monitor = this.monitor
return spec.canDrop ? spec.canDrop(monitor.getItem(), monitor) : true
}
public hover() {
const spec = this.spec
const monitor = this.monitor
if (spec.hover) {
spec.hover(monitor.getItem(), monitor)
}
}
public drop() {
const spec = this.spec
const monitor = this.monitor
if (spec.drop) {
return spec.drop(monitor.getItem(), monitor)
}
return
}
}

View File

@@ -0,0 +1,7 @@
import { useMemo } from 'react'
import type { TargetConnector } from '../../internals/index.js'
export function useConnectDropTarget(connector: TargetConnector) {
return useMemo(() => connector.hooks.dropTarget(), [connector])
}

View File

@@ -0,0 +1 @@
export * from './useDrop.js'

View File

@@ -0,0 +1,20 @@
import { invariant } from '@react-dnd/invariant'
import type { Identifier } from 'dnd-core'
import { useMemo } from 'react'
import type { DropTargetHookSpec } from '../types.js'
/**
* Internal utility hook to get an array-version of spec.accept.
* The main utility here is that we aren't creating a new array on every render if a non-array spec.accept is passed in.
* @param spec
*/
export function useAccept<O, R, P>(
spec: DropTargetHookSpec<O, R, P>,
): Identifier[] {
const { accept } = spec
return useMemo(() => {
invariant(spec.accept != null, 'accept must be defined')
return Array.isArray(accept) ? accept : [accept]
}, [accept])
}

View File

@@ -0,0 +1,34 @@
import type { ConnectDropTarget } from '../../types/index.js'
import type { DropTargetHookSpec, FactoryOrInstance } from '../types.js'
import { useCollectedProps } from '../useCollectedProps.js'
import { useOptionalFactory } from '../useOptionalFactory.js'
import { useConnectDropTarget } from './connectors.js'
import { useDropTargetConnector } from './useDropTargetConnector.js'
import { useDropTargetMonitor } from './useDropTargetMonitor.js'
import { useRegisteredDropTarget } from './useRegisteredDropTarget.js'
/**
* useDropTarget Hook
* @param spec The drop target specification (object or function, function preferred)
* @param deps The memoization deps array to use when evaluating spec changes
*/
export function useDrop<
DragObject = unknown,
DropResult = unknown,
CollectedProps = unknown,
>(
specArg: FactoryOrInstance<
DropTargetHookSpec<DragObject, DropResult, CollectedProps>
>,
deps?: unknown[],
): [CollectedProps, ConnectDropTarget] {
const spec = useOptionalFactory(specArg, deps)
const monitor = useDropTargetMonitor<DragObject, DropResult>()
const connector = useDropTargetConnector(spec.options)
useRegisteredDropTarget(spec, monitor, connector)
return [
useCollectedProps(spec.collect, monitor, connector),
useConnectDropTarget(connector),
]
}

View File

@@ -0,0 +1,16 @@
import { useEffect, useMemo } from 'react'
import type { DropTargetMonitor } from '../../types/index.js'
import type { DropTargetHookSpec } from '../types.js'
import { DropTargetImpl } from './DropTargetImpl.js'
export function useDropTarget<O, R, P>(
spec: DropTargetHookSpec<O, R, P>,
monitor: DropTargetMonitor<O, R>,
) {
const dropTarget = useMemo(() => new DropTargetImpl(spec, monitor), [monitor])
useEffect(() => {
dropTarget.spec = spec
}, [spec])
return dropTarget
}

View File

@@ -0,0 +1,22 @@
import { useMemo } from 'react'
import { TargetConnector } from '../../internals/index.js'
import type { DropTargetOptions } from '../../types/index.js'
import { useDragDropManager } from '../useDragDropManager.js'
import { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect.js'
export function useDropTargetConnector(
options: DropTargetOptions,
): TargetConnector {
const manager = useDragDropManager()
const connector = useMemo(
() => new TargetConnector(manager.getBackend()),
[manager],
)
useIsomorphicLayoutEffect(() => {
connector.dropTargetOptions = options || null
connector.reconnect()
return () => connector.disconnectDropTarget()
}, [options])
return connector
}

View File

@@ -0,0 +1,10 @@
import { useMemo } from 'react'
import { DropTargetMonitorImpl } from '../../internals/index.js'
import type { DropTargetMonitor } from '../../types/index.js'
import { useDragDropManager } from '../useDragDropManager.js'
export function useDropTargetMonitor<O, R>(): DropTargetMonitor<O, R> {
const manager = useDragDropManager()
return useMemo(() => new DropTargetMonitorImpl(manager), [manager])
}

View File

@@ -0,0 +1,38 @@
import type { TargetConnector } from '../../internals/index.js'
import { registerTarget } from '../../internals/index.js'
import type { DropTargetMonitor } from '../../types/index.js'
import type { DropTargetHookSpec } from '../types.js'
import { useDragDropManager } from '../useDragDropManager.js'
import { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect.js'
import { useAccept } from './useAccept.js'
import { useDropTarget } from './useDropTarget.js'
export function useRegisteredDropTarget<O, R, P>(
spec: DropTargetHookSpec<O, R, P>,
monitor: DropTargetMonitor<O, R>,
connector: TargetConnector,
): void {
const manager = useDragDropManager()
const dropTarget = useDropTarget(spec, monitor)
const accept = useAccept(spec)
useIsomorphicLayoutEffect(
function registerDropTarget() {
const [handlerId, unregister] = registerTarget(
accept,
dropTarget,
manager,
)
monitor.receiveHandlerId(handlerId)
connector.receiveHandlerId(handlerId)
return unregister
},
[
manager,
monitor,
dropTarget,
connector,
accept.map((a) => a.toString()).join('|'),
],
)
}