import { Group, Edge, IdMap, Source, Block, Target } from 'models' import { createContext, Dispatch, ReactNode, SetStateAction, useContext, useState, } from 'react' export const stubLength = 20 export const blockWidth = 300 export const blockAnchorsOffset = { left: { x: 0, y: 20, }, top: { x: blockWidth / 2, y: 0, }, right: { x: blockWidth, y: 20, }, } export type Coordinates = { x: number; y: number } type Position = Coordinates & { scale: number } export type Anchor = { coordinates: Coordinates } export type Node = Omit & { blocks: (Block & { sourceAnchorsPosition: { left: Coordinates; right: Coordinates } })[] } export const graphPositionDefaultValue = ( firstGroupCoordinates: Coordinates ) => ({ x: 400 - firstGroupCoordinates.x, y: 100 - firstGroupCoordinates.y, scale: 1, }) export type ConnectingIds = { source: Source target?: Target } export type GroupsCoordinates = IdMap type PreviewingBlock = { id: string groupId: string } const graphContext = createContext<{ graphPosition: Position setGraphPosition: Dispatch> connectingIds: ConnectingIds | null setConnectingIds: Dispatch> previewingBlock?: PreviewingBlock setPreviewingBlock: Dispatch> previewingEdge?: Edge setPreviewingEdge: Dispatch> openedBlockId?: string setOpenedBlockId: Dispatch> openedItemId?: string setOpenedItemId: Dispatch> isReadOnly: boolean focusedGroupId?: string setFocusedGroupId: Dispatch> // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore }>({ graphPosition: graphPositionDefaultValue({ x: 0, y: 0 }), connectingIds: null, }) export const GraphProvider = ({ children, isReadOnly = false, }: { children: ReactNode isReadOnly?: boolean }) => { const [graphPosition, setGraphPosition] = useState( graphPositionDefaultValue({ x: 0, y: 0 }) ) const [connectingIds, setConnectingIds] = useState(null) const [previewingEdge, setPreviewingEdge] = useState() const [previewingBlock, setPreviewingBlock] = useState() const [openedBlockId, setOpenedBlockId] = useState() const [openedItemId, setOpenedItemId] = useState() const [focusedGroupId, setFocusedGroupId] = useState() return ( {children} ) } export const useGraph = () => useContext(graphContext)