diff --git a/apps/builder/components/dashboard/FolderContent/TypebotButton.tsx b/apps/builder/components/dashboard/FolderContent/TypebotButton.tsx index fe0f1b527a..7d533edaef 100644 --- a/apps/builder/components/dashboard/FolderContent/TypebotButton.tsx +++ b/apps/builder/components/dashboard/FolderContent/TypebotButton.tsx @@ -159,7 +159,7 @@ export const TypebotButton = ({ > {} - {typebot.name} + {typebot.name} {!isReadOnly && ( ([]) @@ -113,6 +114,7 @@ export const ChatBlock = ({ onNewLog, createEdge, setCurrentTypebotId, + pushEdgeIdInLinkedTypebotQueue, }) nextEdgeId ? onBlockEnd(nextEdgeId, linkedTypebot) : displayNextStep() } diff --git a/packages/bot-engine/src/components/ConversationContainer.tsx b/packages/bot-engine/src/components/ConversationContainer.tsx index 843215189a..b7ceb222e0 100644 --- a/packages/bot-engine/src/components/ConversationContainer.tsx +++ b/packages/bot-engine/src/components/ConversationContainer.tsx @@ -21,7 +21,12 @@ export const ConversationContainer = ({ onNewBlockVisible, onCompleted, }: Props) => { - const { typebot, updateVariableValue } = useTypebot() + const { + typebot, + updateVariableValue, + linkedBotEdgeIdsQueue, + popEdgeIdFromLinkedTypebotQueue, + } = useTypebot() const { document: frameDocument } = useFrame() const [displayedBlocks, setDisplayedBlocks] = useState< { block: Block; startStepIndex: number }[] @@ -36,7 +41,14 @@ export const ConversationContainer = ({ ) => { const currentTypebot = updatedTypebot ?? typebot const nextEdge = currentTypebot.edges.find(byId(edgeId)) - if (!nextEdge) return onCompleted() + if (!nextEdge) { + if (linkedBotEdgeIdsQueue.length > 0) { + const nextEdgeId = linkedBotEdgeIdsQueue[0] + popEdgeIdFromLinkedTypebotQueue() + displayNextBlock(nextEdgeId) + } + return onCompleted() + } const nextBlock = currentTypebot.blocks.find(byId(nextEdge.to.blockId)) if (!nextBlock) return onCompleted() const startStepIndex = nextEdge.to.stepId diff --git a/packages/bot-engine/src/contexts/TypebotContext.tsx b/packages/bot-engine/src/contexts/TypebotContext.tsx index e5dd8c1457..d82ef39c18 100644 --- a/packages/bot-engine/src/contexts/TypebotContext.tsx +++ b/packages/bot-engine/src/contexts/TypebotContext.tsx @@ -18,10 +18,13 @@ const typebotContext = createContext<{ linkedTypebots: LinkedTypebot[] apiHost: string isPreview: boolean + linkedBotEdgeIdsQueue: string[] setCurrentTypebotId: (id: string) => void updateVariableValue: (variableId: string, value: string) => void createEdge: (edge: Edge) => void injectLinkedTypebot: (typebot: Typebot | PublicTypebot) => LinkedTypebot + popEdgeIdFromLinkedTypebotQueue: () => void + pushEdgeIdInLinkedTypebotQueue: (edgeId: string) => void onNewLog: (log: Omit) => void // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore @@ -43,6 +46,9 @@ export const TypebotContext = ({ const [localTypebot, setLocalTypebot] = useState(typebot) const [linkedTypebots, setLinkedTypebots] = useState([]) const [currentTypebotId, setCurrentTypebotId] = useState(typebot.typebotId) + const [linkedBotEdgeIdsQueue, setLinkedBotEdgeIdsQueue] = useState( + [] + ) useEffect(() => { setLocalTypebot((localTypebot) => ({ @@ -87,6 +93,12 @@ export const TypebotContext = ({ return typebotToInject } + const pushEdgeIdInLinkedTypebotQueue = (edgeId: string) => + setLinkedBotEdgeIdsQueue((queue) => [...queue, edgeId]) + + const popEdgeIdFromLinkedTypebotQueue = () => + setLinkedBotEdgeIdsQueue((queue) => queue.slice(1)) + return ( void setCurrentTypebotId: (id: string) => void updateVariableValue: (variableId: string, value: string) => void updateVariables: (variables: VariableWithValue[]) => void @@ -149,8 +150,14 @@ const executeTypebotLink = async ( nextEdgeId?: EdgeId linkedTypebot?: PublicTypebot | LinkedTypebot }> => { - const { typebot, linkedTypebots, onNewLog, createEdge, setCurrentTypebotId } = - context + const { + typebot, + linkedTypebots, + onNewLog, + createEdge, + setCurrentTypebotId, + pushEdgeIdInLinkedTypebotQueue, + } = context const linkedTypebot = ( step.options.typebotId === 'current' ? typebot @@ -165,6 +172,7 @@ const executeTypebotLink = async ( }) return { nextEdgeId: step.outgoingEdgeId } } + if (step.outgoingEdgeId) pushEdgeIdInLinkedTypebotQueue(step.outgoingEdgeId) setCurrentTypebotId( 'typebotId' in linkedTypebot ? linkedTypebot.typebotId : linkedTypebot.id )