import { useState } from 'octane'; import type { DragDropManager } from '@dnd-kit/abstract'; import type { CleanupFunction } from '@dnd-kit/state'; import { subSlot } from '../../internal'; import { useIsomorphicLayoutEffect } from '../../hooks/useIsomorphicLayoutEffect'; import { useDragDropManager } from './useDragDropManager'; export interface Instance = DragDropManager> { manager: T | undefined; register(): CleanupFunction | void; } export function useInstance( initializer: (manager: DragDropManager | undefined) => T, slot?: symbol, ): T { const manager = useDragDropManager() ?? undefined; const [instance] = useState(() => initializer(manager), subSlot(slot, 'instance')); if (instance.manager !== manager) instance.manager = manager; useIsomorphicLayoutEffect(instance.register, [manager, instance], subSlot(slot, 'register')); return instance; }