import { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react' import PropTypes from 'prop-types' const DashboardObjectToolsContext = createContext() export const DashboardObjectToolsProvider = ({ children }) => { const [currentObjectTools, setCurrentObjectToolsState] = useState(null) const ownerRef = useRef(null) const setCurrentObjectTools = useCallback((tools, ownerId) => { ownerRef.current = ownerId setCurrentObjectToolsState(tools) }, []) const clearCurrentObjectTools = useCallback((ownerId) => { if (ownerRef.current !== ownerId) { return } ownerRef.current = null setCurrentObjectToolsState(null) }, []) return ( {children} ) } DashboardObjectToolsProvider.propTypes = { children: PropTypes.node.isRequired } // eslint-disable-next-line react-refresh/only-export-components export const useDashboardObjectToolsContext = () => { const context = useContext(DashboardObjectToolsContext) if (!context) { throw new Error( 'useDashboardObjectToolsContext must be used within a DashboardObjectToolsProvider' ) } return context } // eslint-disable-next-line react-refresh/only-export-components export const useDashboardObjectTools = (tools) => { const { setCurrentObjectTools, clearCurrentObjectTools } = useDashboardObjectToolsContext() const ownerIdRef = useRef(null) if (ownerIdRef.current == null) { ownerIdRef.current = Symbol('dashboardObjectTools') } useEffect(() => { setCurrentObjectTools(tools, ownerIdRef.current) }, [tools, setCurrentObjectTools]) useEffect(() => { const ownerId = ownerIdRef.current return () => clearCurrentObjectTools(ownerId) }, [clearCurrentObjectTools]) } export { DashboardObjectToolsContext }