Files
PyUIBuilder/src/components/draggable/draggableContext.js

42 lines
1.6 KiB
JavaScript
Raw Normal View History

2024-09-21 18:37:28 +05:30
import React, { createContext, useContext, useState } from 'react'
import { isSubClassOfWidget } from '../../utils/widget'
// import Widget from '../../canvas/widgets/base'
2024-09-16 12:23:15 +05:30
2024-09-21 18:37:28 +05:30
export const DragContext = createContext()
2024-09-16 12:23:15 +05:30
export const useDragContext = () => useContext(DragContext)
// Provider component to wrap around parts of your app that need drag-and-drop functionality
export const DragProvider = ({ children }) => {
const [draggedElement, setDraggedElement] = useState(null)
const [overElement, setOverElement] = useState(null) // the element the dragged items is over
2024-09-16 12:23:15 +05:30
2025-03-06 14:32:00 +05:30
const [posMetaData, setPosMetaData] = useState({dragStartCursorPos: {x: 0, y: 0},
initialPos: {x: 0, y: 0}})
2025-03-06 14:32:00 +05:30
const [widgetClass, setWidgetClass] = useState(null) // helper to help pass the widget type from sidebar to canvas
const onDragStart = (element, widgetClass=null) => {
2024-09-16 12:23:15 +05:30
setDraggedElement(element)
if (widgetClass && !isSubClassOfWidget(widgetClass))
throw new Error("widgetClass must inherit from the Widget base class")
setWidgetClass(() => widgetClass) // store the class so later it can be passed to the canvas from sidebar
2024-09-16 12:23:15 +05:30
}
const onDragEnd = () => {
setDraggedElement(null)
setWidgetClass(null)
2024-09-16 12:23:15 +05:30
}
return (
<DragContext.Provider value={{ draggedElement, overElement, setOverElement,
2025-03-06 14:32:00 +05:30
widgetClass, onDragStart, onDragEnd, posMetaData,
setPosMetaData }}>
2024-09-16 12:23:15 +05:30
{children}
</DragContext.Provider>
)
}