2
0

refactor(editor): ♻️ Undo / Redo buttons + structure refacto

Yet another huge refacto... While implementing undo and redo features I understood that I updated the stored typebot too many times (i.e. on each key input) so I had to rethink it entirely. I also moved around some files.
This commit is contained in:
Baptiste Arnaud
2022-02-02 08:05:02 +01:00
parent fc1d654772
commit 8a350eee6c
153 changed files with 1512 additions and 1352 deletions

View File

@@ -50,8 +50,8 @@ const executeGoogleSheetIntegration = async (
variables: Table<Variable>,
updateVariableValue: (variableId: string, value: string) => void
) => {
if (!step.options) return step.edgeId
switch (step.options?.action) {
if (!('action' in step.options)) return step.edgeId
switch (step.options.action) {
case GoogleSheetsAction.INSERT_ROW:
await insertRowInGoogleSheets(step.options, variables)
break

View File

@@ -9,7 +9,7 @@ import {
SetVariableStep,
RedirectStep,
} from 'models'
import { isDefined } from 'utils'
import { isDefined, isNotDefined } from 'utils'
import { sanitizeUrl } from './utils'
import { isMathFormula, evaluateExpression, parseVariables } from './variable'
@@ -66,7 +66,7 @@ const executeComparison =
if (!comparison?.variableId) return false
const inputValue = variables.byId[comparison.variableId].value ?? ''
const { value } = comparison
if (!isDefined(value)) return false
if (isNotDefined(value)) return false
switch (comparison.comparisonOperator) {
case ComparisonOperators.CONTAINS: {
return inputValue.includes(value)

View File

@@ -47,11 +47,12 @@ export enum GoogleSheetsAction {
}
export type GoogleSheetsOptions =
| GoogleSheetsOptionsBase
| GoogleSheetsGetOptions
| GoogleSheetsInsertRowOptions
| GoogleSheetsUpdateRowOptions
type GoogleSheetsOptionsBase = {
export type GoogleSheetsOptionsBase = {
credentialsId?: string
spreadsheetId?: string
sheetId?: string
@@ -60,29 +61,31 @@ type GoogleSheetsOptionsBase = {
export type Cell = { column?: string; value?: string }
export type ExtractingCell = { column?: string; variableId?: string }
export type GoogleSheetsGetOptions = GoogleSheetsOptionsBase & {
action?: GoogleSheetsAction.GET
export type GoogleSheetsGetOptions = NonNullable<GoogleSheetsOptionsBase> & {
action: GoogleSheetsAction.GET
referenceCell?: Cell
cellsToExtract?: Table<ExtractingCell>
cellsToExtract: Table<ExtractingCell>
}
export type GoogleSheetsInsertRowOptions = GoogleSheetsOptionsBase & {
action?: GoogleSheetsAction.INSERT_ROW
cellsToInsert?: Table<Cell>
}
export type GoogleSheetsInsertRowOptions =
NonNullable<GoogleSheetsOptionsBase> & {
action: GoogleSheetsAction.INSERT_ROW
cellsToInsert: Table<Cell>
}
export type GoogleSheetsUpdateRowOptions = GoogleSheetsOptionsBase & {
action?: GoogleSheetsAction.UPDATE_ROW
referenceCell?: Cell
cellsToUpsert?: Table<Cell>
}
export type GoogleSheetsUpdateRowOptions =
NonNullable<GoogleSheetsOptionsBase> & {
action: GoogleSheetsAction.UPDATE_ROW
referenceCell?: Cell
cellsToUpsert: Table<Cell>
}
export type ResponseVariableMapping = { bodyPath?: string; variableId?: string }
export type WebhookOptions = {
webhookId?: string
variablesForTest?: Table<VariableForTest>
responseVariableMapping?: Table<ResponseVariableMapping>
webhookId: string
variablesForTest: Table<VariableForTest>
responseVariableMapping: Table<ResponseVariableMapping>
}
export enum HttpMethod {
@@ -103,9 +106,9 @@ export type VariableForTest = { variableId?: string; value?: string }
export type Webhook = {
id: string
url?: string
method?: HttpMethod
queryParams?: Table<KeyValue>
headers?: Table<KeyValue>
method: HttpMethod
queryParams: Table<KeyValue>
headers: Table<KeyValue>
body?: string
}
@@ -118,4 +121,13 @@ export const defaultGoogleSheetsOptions: GoogleSheetsOptions = {}
export const defaultGoogleAnalyticsOptions: GoogleAnalyticsOptions = {}
export const defaultWebhookOptions: WebhookOptions = {}
export const defaultWebhookOptions: Omit<WebhookOptions, 'webhookId'> = {
responseVariableMapping: { byId: {}, allIds: [] },
variablesForTest: { byId: {}, allIds: [] },
}
export const defaultWebhookAttributes: Omit<Webhook, 'id'> = {
method: HttpMethod.GET,
headers: { byId: {}, allIds: [] },
queryParams: { byId: {}, allIds: [] },
}

View File

@@ -40,7 +40,7 @@ export type Block = {
export type Source = {
blockId: string
stepId: string
nodeId?: string
buttonId?: string
conditionType?: 'true' | 'false'
}
export type Target = { blockId: string; stepId?: string }

View File

@@ -1 +1,3 @@
export type Table<T> = { byId: { [key: string]: T }; allIds: string[] }
export const defaultTable = { byId: {}, allIds: [] }

View File

@@ -46,6 +46,10 @@ export const isDefined = <T>(
value: T | undefined | null
): value is NonNullable<T> => value !== undefined && value !== null
export const isNotDefined = <T>(
value: T | undefined | null
): value is undefined | null => value === undefined || value === null
export const filterTable = <T>(ids: string[], table: Table<T>): Table<T> => ({
byId: ids.reduce((acc, id) => ({ ...acc, [id]: table.byId[id] }), {}),
allIds: ids,