Files
bot/apps/builder/src/features/graph/providers/GraphProvider.tsx

128 lines
3.1 KiB
TypeScript
Raw Normal View History

import { Group, Edge, IdMap, Source, Block, Target } from '@typebot.io/schemas'
2021-12-16 10:43:49 +01:00
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,
},
}
2022-01-12 09:10:59 +01:00
2021-12-16 10:43:49 +01:00
export type Coordinates = { x: number; y: number }
type Position = Coordinates & { scale: number }
export type Anchor = {
coordinates: Coordinates
}
2022-06-11 07:27:38 +02:00
export type Node = Omit<Group, 'blocks'> & {
blocks: (Block & {
2021-12-16 10:43:49 +01:00
sourceAnchorsPosition: { left: Coordinates; right: Coordinates }
})[]
}
export const graphPositionDefaultValue = (
firstGroupCoordinates: Coordinates
) => ({
x: 400 - firstGroupCoordinates.x,
y: 100 - firstGroupCoordinates.y,
scale: 1,
})
2021-12-16 10:43:49 +01:00
2022-01-12 09:10:59 +01:00
export type ConnectingIds = {
source: Source
2022-01-06 09:40:56 +01:00
target?: Target
2022-01-12 09:10:59 +01:00
}
2022-06-11 07:27:38 +02:00
export type GroupsCoordinates = IdMap<Coordinates>
type PreviewingBlock = {
id: string
groupId: string
}
const graphContext = createContext<{
2021-12-16 10:43:49 +01:00
graphPosition: Position
setGraphPosition: Dispatch<SetStateAction<Position>>
2022-01-12 09:10:59 +01:00
connectingIds: ConnectingIds | null
setConnectingIds: Dispatch<SetStateAction<ConnectingIds | null>>
previewingBlock?: PreviewingBlock
setPreviewingBlock: Dispatch<SetStateAction<PreviewingBlock | undefined>>
previewingEdge?: Edge
setPreviewingEdge: Dispatch<SetStateAction<Edge | undefined>>
2022-06-11 07:27:38 +02:00
openedBlockId?: string
setOpenedBlockId: Dispatch<SetStateAction<string | undefined>>
openedItemId?: string
setOpenedItemId: Dispatch<SetStateAction<string | undefined>>
isReadOnly: boolean
2022-06-11 07:27:38 +02:00
focusedGroupId?: string
setFocusedGroupId: Dispatch<SetStateAction<string | undefined>>
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
//@ts-ignore
2021-12-16 10:43:49 +01:00
}>({
graphPosition: graphPositionDefaultValue({ x: 0, y: 0 }),
2021-12-16 10:43:49 +01:00
connectingIds: null,
})
export const GraphProvider = ({
children,
isReadOnly = false,
}: {
children: ReactNode
isReadOnly?: boolean
}) => {
const [graphPosition, setGraphPosition] = useState(
graphPositionDefaultValue({ x: 0, y: 0 })
)
2022-01-12 09:10:59 +01:00
const [connectingIds, setConnectingIds] = useState<ConnectingIds | null>(null)
const [previewingEdge, setPreviewingEdge] = useState<Edge>()
const [previewingBlock, setPreviewingBlock] = useState<PreviewingBlock>()
2022-06-11 07:27:38 +02:00
const [openedBlockId, setOpenedBlockId] = useState<string>()
const [openedItemId, setOpenedItemId] = useState<string>()
2022-06-11 07:27:38 +02:00
const [focusedGroupId, setFocusedGroupId] = useState<string>()
2021-12-16 10:43:49 +01:00
return (
<graphContext.Provider
value={{
graphPosition,
setGraphPosition,
connectingIds,
setConnectingIds,
previewingEdge,
setPreviewingEdge,
2022-06-11 07:27:38 +02:00
openedBlockId,
setOpenedBlockId,
openedItemId,
setOpenedItemId,
isReadOnly,
2022-06-11 07:27:38 +02:00
focusedGroupId,
setFocusedGroupId,
setPreviewingBlock,
previewingBlock,
2021-12-16 10:43:49 +01:00
}}
>
{children}
</graphContext.Provider>
)
}
export const useGraph = () => useContext(graphContext)