2
0

Improve new bot engine client side actions

We make sure to save client side actions in an array that will be executed sequentially
This commit is contained in:
Baptiste Arnaud
2023-01-26 15:26:42 +01:00
parent 0fc82cf73b
commit 9aab6ddb2c
15 changed files with 133 additions and 106 deletions

View File

@ -56,21 +56,23 @@ export const executeChatwootBlock = (
const chatwootCode = parseChatwootOpenCode(block.options)
return {
outgoingEdgeId: block.outgoingEdgeId,
integrations: {
chatwoot: {
codeToExecute: {
content: parseVariables(variables, { fieldToParse: 'id' })(
chatwootCode
),
args: extractVariablesFromText(variables)(chatwootCode).map(
(variable) => ({
id: variable.id,
value: parseCorrectValueType(variable.value),
})
),
clientSideActions: [
{
chatwoot: {
codeToExecute: {
content: parseVariables(variables, { fieldToParse: 'id' })(
chatwootCode
),
args: extractVariablesFromText(variables)(chatwootCode).map(
(variable) => ({
id: variable.id,
value: parseCorrectValueType(variable.value),
})
),
},
},
},
},
],
logs: isPreview
? [
{

View File

@ -7,7 +7,9 @@ export const executeGoogleAnalyticsBlock = (
block: GoogleAnalyticsBlock
): ExecuteIntegrationResponse => ({
outgoingEdgeId: block.outgoingEdgeId,
integrations: {
googleAnalytics: deepParseVariable(variables)(block.options),
},
clientSideActions: [
{
googleAnalytics: deepParseVariable(variables)(block.options),
},
],
})

View File

@ -10,7 +10,6 @@ export const insertRow = async (
options,
}: { outgoingEdgeId?: string; options: GoogleSheetsInsertRowOptions }
): Promise<ExecuteIntegrationResponse> => {
console.log('insertRow', options)
if (!options.cellsToInsert || !options.sheetId) return { outgoingEdgeId }
let log: ReplyLog | undefined

View File

@ -24,11 +24,13 @@ export const executeCode = (
return {
outgoingEdgeId: block.outgoingEdgeId,
logic: {
codeToExecute: {
content,
args,
clientSideActions: [
{
codeToExecute: {
content,
args,
},
},
},
],
}
}

View File

@ -10,9 +10,11 @@ export const executeRedirect = (
if (!block.options?.url) return { outgoingEdgeId: block.outgoingEdgeId }
const formattedUrl = sanitizeUrl(parseVariables(variables)(block.options.url))
return {
logic: {
redirect: { url: formattedUrl, isNewTab: block.options.isNewTab },
},
clientSideActions: [
{
redirect: { url: formattedUrl, isNewTab: block.options.isNewTab },
},
],
outgoingEdgeId: block.outgoingEdgeId,
}
}

View File

@ -48,6 +48,7 @@ export const sendMessageProcedure = publicProcedure
resultId,
dynamicTheme,
logs,
clientSideActions,
} = await startSession(startParams)
return {
sessionId,
@ -63,9 +64,10 @@ export const sendMessageProcedure = publicProcedure
resultId,
dynamicTheme,
logs,
clientSideActions,
}
} else {
const { messages, input, logic, newSessionState, integrations, logs } =
const { messages, input, clientSideActions, newSessionState, logs } =
await continueBotFlow(session.state)(message)
await prisma.chatSession.updateMany({
@ -78,8 +80,7 @@ export const sendMessageProcedure = publicProcedure
return {
messages,
input,
logic,
integrations,
clientSideActions,
dynamicTheme: parseDynamicThemeReply(newSessionState),
logs,
}
@ -133,7 +134,7 @@ const startSession = async (startParams?: StartParams) => {
const {
messages,
input,
logic,
clientSideActions,
newSessionState: newInitialState,
logs,
} = await startBotFlow(initialState, startParams.startGroupId)
@ -141,7 +142,7 @@ const startSession = async (startParams?: StartParams) => {
if (!input)
return {
messages,
logic,
clientSideActions,
typebot: {
id: typebot.id,
settings: deepParseVariable(newInitialState.typebot.variables)(
@ -183,7 +184,7 @@ const startSession = async (startParams?: StartParams) => {
},
messages,
input,
logic,
clientSideActions,
dynamicTheme: parseDynamicThemeReply(newInitialState),
logs,
} satisfies ChatReply

View File

@ -25,8 +25,8 @@ export const executeGroup =
group: Group
): Promise<ChatReply & { newSessionState: SessionState }> => {
const messages: ChatReply['messages'] = currentReply?.messages ?? []
let logic: ChatReply['logic'] = currentReply?.logic
let integrations: ChatReply['integrations'] = currentReply?.integrations
let clientSideActions: ChatReply['clientSideActions'] =
currentReply?.clientSideActions
let logs: ChatReply['logs'] = currentReply?.logs
let nextEdgeId = null
@ -59,8 +59,7 @@ export const executeGroup =
blockId: block.id,
},
},
logic,
integrations,
clientSideActions,
logs,
}
const executionResponse = isLogicBlock(block)
@ -70,10 +69,14 @@ export const executeGroup =
: null
if (!executionResponse) continue
if ('logic' in executionResponse && executionResponse.logic)
logic = { ...logic, ...executionResponse.logic }
if ('integrations' in executionResponse && executionResponse.integrations)
integrations = { ...integrations, ...executionResponse.integrations }
if (
'clientSideActions' in executionResponse &&
executionResponse.clientSideActions
)
clientSideActions = [
...(clientSideActions ?? []),
...executionResponse.clientSideActions,
]
if (executionResponse.logs)
logs = [...(logs ?? []), ...executionResponse.logs]
if (executionResponse.newSessionState)
@ -85,20 +88,19 @@ export const executeGroup =
}
if (!nextEdgeId)
return { messages, newSessionState, logic, integrations, logs }
return { messages, newSessionState, clientSideActions, logs }
const nextGroup = getNextGroup(newSessionState)(nextEdgeId)
if (nextGroup?.updatedContext) newSessionState = nextGroup.updatedContext
if (!nextGroup) {
return { messages, newSessionState, logic, integrations, logs }
return { messages, newSessionState, clientSideActions, logs }
}
return executeGroup(newSessionState, {
messages,
logic,
integrations,
clientSideActions,
logs,
})(nextGroup.group)
}

View File

@ -5,9 +5,9 @@ export type EdgeId = string
export type ExecuteLogicResponse = {
outgoingEdgeId: EdgeId | undefined
newSessionState?: SessionState
} & Pick<ChatReply, 'logic' | 'logs'>
} & Pick<ChatReply, 'clientSideActions' | 'logs'>
export type ExecuteIntegrationResponse = {
outgoingEdgeId: EdgeId | undefined
newSessionState?: SessionState
} & Pick<ChatReply, 'integrations' | 'logs'>
} & Pick<ChatReply, 'clientSideActions' | 'logs'>