♻️ Remove @typebot.io/schemas from @typebot.io/lib
This commit is contained in:
88
packages/results/convertResultsToTableData.ts
Normal file
88
packages/results/convertResultsToTableData.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
import {
|
||||
ResultWithAnswers,
|
||||
ResultHeaderCell,
|
||||
VariableWithValue,
|
||||
Answer,
|
||||
TableData,
|
||||
} from '@typebot.io/schemas'
|
||||
import { InputBlockType } from '@typebot.io/schemas/features/blocks/inputs/constants'
|
||||
import { isDefined } from '../lib/utils'
|
||||
|
||||
type CellParser = (
|
||||
content: VariableWithValue['value'],
|
||||
blockType?: InputBlockType
|
||||
) => { element?: React.JSX.Element; plainText: string }
|
||||
|
||||
const defaultCellParser: CellParser = (content, blockType) => {
|
||||
if (!content) return { plainText: '' }
|
||||
if (Array.isArray(content))
|
||||
return {
|
||||
plainText: content.join(', '),
|
||||
}
|
||||
return blockType === InputBlockType.FILE
|
||||
? { plainText: content }
|
||||
: { plainText: content.toString() }
|
||||
}
|
||||
|
||||
export const convertResultsToTableData = (
|
||||
results: ResultWithAnswers[] | undefined,
|
||||
headerCells: ResultHeaderCell[],
|
||||
cellParser: CellParser = defaultCellParser
|
||||
): TableData[] =>
|
||||
(results ?? []).map((result) => ({
|
||||
id: { plainText: result.id },
|
||||
date: {
|
||||
plainText: convertDateToReadable(result.createdAt),
|
||||
},
|
||||
...[...result.answers, ...result.variables].reduce<{
|
||||
[key: string]: { element?: JSX.Element; plainText: string }
|
||||
}>((tableData, answerOrVariable) => {
|
||||
if ('groupId' in answerOrVariable) {
|
||||
const answer = answerOrVariable satisfies Answer
|
||||
const header = answer.variableId
|
||||
? headerCells.find((headerCell) =>
|
||||
headerCell.variableIds?.includes(answer.variableId as string)
|
||||
)
|
||||
: headerCells.find((headerCell) =>
|
||||
headerCell.blocks?.some((block) => block.id === answer.blockId)
|
||||
)
|
||||
if (!header || !header.blocks || !header.blockType) return tableData
|
||||
const variableValue = result.variables.find(
|
||||
(variable) => variable.id === answer.variableId
|
||||
)?.value
|
||||
const content = variableValue ?? answer.content
|
||||
return {
|
||||
...tableData,
|
||||
[header.id]: cellParser(content, header.blockType),
|
||||
}
|
||||
}
|
||||
const variable = answerOrVariable satisfies VariableWithValue
|
||||
if (variable.value === null) return tableData
|
||||
const headerId = headerCells.find((headerCell) =>
|
||||
headerCell.variableIds?.includes(variable.id)
|
||||
)?.id
|
||||
if (!headerId) return tableData
|
||||
if (isDefined(tableData[headerId])) return tableData
|
||||
return {
|
||||
...tableData,
|
||||
[headerId]: cellParser(variable.value),
|
||||
}
|
||||
}, {}),
|
||||
}))
|
||||
|
||||
const convertDateToReadable = (date: Date): string => {
|
||||
const isThisYear = new Date().getFullYear() === date.getFullYear()
|
||||
|
||||
const dateString = date.toLocaleDateString('default', {
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
year: isThisYear ? undefined : 'numeric', // Only show the year if it's not the current year
|
||||
})
|
||||
|
||||
const timeString = date.toLocaleTimeString('default', {
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
})
|
||||
|
||||
return `${dateString}, ${timeString}`
|
||||
}
|
||||
Reference in New Issue
Block a user