2023-01-16 12:13:21 +01:00
|
|
|
import { TRPCError } from '@trpc/server'
|
2023-11-08 15:34:16 +01:00
|
|
|
import { ChatReply, SessionState, StartElementId } from '@typebot.io/schemas'
|
2022-11-29 10:02:40 +01:00
|
|
|
import { executeGroup } from './executeGroup'
|
|
|
|
import { getNextGroup } from './getNextGroup'
|
2023-11-08 15:34:16 +01:00
|
|
|
import { VisitedEdge } from '@typebot.io/prisma'
|
2022-11-29 10:02:40 +01:00
|
|
|
|
2023-10-06 10:14:26 +02:00
|
|
|
type Props = {
|
|
|
|
version: 1 | 2
|
|
|
|
state: SessionState
|
2023-11-08 15:34:16 +01:00
|
|
|
} & StartElementId
|
2023-10-06 10:14:26 +02:00
|
|
|
|
|
|
|
export const startBotFlow = async ({
|
|
|
|
version,
|
|
|
|
state,
|
2023-11-08 15:34:16 +01:00
|
|
|
...props
|
|
|
|
}: Props): Promise<
|
|
|
|
ChatReply & { newSessionState: SessionState; visitedEdges: VisitedEdge[] }
|
|
|
|
> => {
|
2023-09-29 11:23:04 +02:00
|
|
|
let newSessionState = state
|
2023-11-08 15:34:16 +01:00
|
|
|
const visitedEdges: VisitedEdge[] = []
|
|
|
|
if ('startGroupId' in props) {
|
2023-08-24 07:48:30 +02:00
|
|
|
const group = state.typebotsQueue[0].typebot.groups.find(
|
2023-11-08 15:34:16 +01:00
|
|
|
(group) => group.id === props.startGroupId
|
2023-01-16 12:13:21 +01:00
|
|
|
)
|
|
|
|
if (!group)
|
|
|
|
throw new TRPCError({
|
|
|
|
code: 'BAD_REQUEST',
|
2023-11-08 15:34:16 +01:00
|
|
|
message: "Start group doesn't exist",
|
2023-01-16 12:13:21 +01:00
|
|
|
})
|
2023-11-08 15:34:16 +01:00
|
|
|
return executeGroup(group, {
|
|
|
|
version,
|
|
|
|
state: newSessionState,
|
|
|
|
visitedEdges,
|
|
|
|
})
|
2023-01-16 12:13:21 +01:00
|
|
|
}
|
2023-11-08 15:34:16 +01:00
|
|
|
const firstEdgeId = getFirstEdgeId({
|
|
|
|
state: newSessionState,
|
|
|
|
startEventId: 'startEventId' in props ? props.startEventId : undefined,
|
|
|
|
})
|
|
|
|
if (!firstEdgeId) return { messages: [], newSessionState, visitedEdges: [] }
|
2023-09-29 11:23:04 +02:00
|
|
|
const nextGroup = await getNextGroup(newSessionState)(firstEdgeId)
|
|
|
|
newSessionState = nextGroup.newSessionState
|
2023-11-08 15:34:16 +01:00
|
|
|
if (nextGroup.visitedEdge) visitedEdges.push(nextGroup.visitedEdge)
|
|
|
|
if (!nextGroup.group) return { messages: [], newSessionState, visitedEdges }
|
|
|
|
return executeGroup(nextGroup.group, {
|
|
|
|
version,
|
|
|
|
state: newSessionState,
|
|
|
|
visitedEdges,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
const getFirstEdgeId = ({
|
|
|
|
state,
|
|
|
|
startEventId,
|
|
|
|
}: {
|
|
|
|
state: SessionState
|
|
|
|
startEventId: string | undefined
|
|
|
|
}) => {
|
|
|
|
const { typebot } = state.typebotsQueue[0]
|
|
|
|
if (startEventId) {
|
|
|
|
const event = typebot.events?.find((e) => e.id === startEventId)
|
|
|
|
if (!event)
|
|
|
|
throw new TRPCError({
|
|
|
|
code: 'BAD_REQUEST',
|
|
|
|
message: "Start event doesn't exist",
|
|
|
|
})
|
|
|
|
return event.outgoingEdgeId
|
|
|
|
}
|
|
|
|
if (typebot.version === '6') return typebot.events[0].outgoingEdgeId
|
|
|
|
return typebot.groups[0].blocks[0].outgoingEdgeId
|
2022-11-29 10:02:40 +01:00
|
|
|
}
|