dnd-core
Version:
Drag and drop sans the GUI
54 lines (50 loc) • 1.12 kB
text/typescript
import {
BEGIN_DRAG,
DROP,
END_DRAG,
HOVER,
INIT_COORDS,
} from '../actions/dragDrop/index.js'
import type { Action, XYCoord } from '../interfaces.js'
import { areCoordsEqual } from '../utils/equality.js'
export interface State {
initialSourceClientOffset: XYCoord | null
initialClientOffset: XYCoord | null
clientOffset: XYCoord | null
}
const initialState: State = {
initialSourceClientOffset: null,
initialClientOffset: null,
clientOffset: null,
}
export function reduce(
state: State = initialState,
action: Action<{
sourceClientOffset: XYCoord
clientOffset: XYCoord
}>,
): State {
const { payload } = action
switch (action.type) {
case INIT_COORDS:
case BEGIN_DRAG:
return {
initialSourceClientOffset: payload.sourceClientOffset,
initialClientOffset: payload.clientOffset,
clientOffset: payload.clientOffset,
}
case HOVER:
if (areCoordsEqual(state.clientOffset, payload.clientOffset)) {
return state
}
return {
...state,
clientOffset: payload.clientOffset,
}
case END_DRAG:
case DROP:
return initialState
default:
return state
}
}