From 330c1ca7724ba47408e83fa5a6fecb5635e81ce5 Mon Sep 17 00:00:00 2001 From: Stefan Moraru Date: Thu, 31 Oct 2024 16:40:26 +0200 Subject: [PATCH] refactor(CustomExpressionDrawer): use utils file / improve error handling --- .../CustomExpressionDrawer.tsx | 101 ++++++++++-------- 1 file changed, 58 insertions(+), 43 deletions(-) diff --git a/src/components/billableMetrics/CustomExpressionDrawer.tsx b/src/components/billableMetrics/CustomExpressionDrawer.tsx index 1fb2068a0..5c4b1981d 100644 --- a/src/components/billableMetrics/CustomExpressionDrawer.tsx +++ b/src/components/billableMetrics/CustomExpressionDrawer.tsx @@ -1,8 +1,14 @@ import { Typography } from '@mui/material' import { useFormik } from 'formik' import { forwardRef, useImperativeHandle, useRef, useState } from 'react' - -import { Button, Drawer, DrawerRef } from '~/components/designSystem' +import { mixed, object, string } from 'yup' + +import { + isValidJSON, + wrappedEvaluateExpression, + wrappedParseExpression, +} from '~/components/billableMetrics/utils' +import { Button, Drawer, DrawerRef, Icon } from '~/components/designSystem' import { JsonEditorField } from '~/components/form/JsonEditor' import { useInternationalization } from '~/hooks/core/useInternationalization' import { Divider } from '~/styles/mainObjectsForm' @@ -22,9 +28,26 @@ type CustomExpressionDrawerProps = { onSave: (expression: string) => void } +export type EventPayload = { + events: { + transaction_id: string + external_subscription_id: string + code: string + timestamp: number + properties: { + [key: string]: string + } + } +} + type CustomExpressionInput = { expression: string - eventPayload: object + eventPayload: EventPayload +} + +export type ValidationResult = { + result?: string | null + error?: string | null } const CUSTOM_EXPRESSION_EXAMPLES = [ @@ -33,33 +56,6 @@ const CUSTOM_EXPRESSION_EXAMPLES = [ '(event.properties.ended_at - event.timestamp) / 3600', ] -type ValidationResult = { - result?: string | null - error?: string | null -} - -const parseExpression = async (expression: string) => { - if (expression === 'break-parse') { - throw new Error('Invalid') - } - - return -} - -const validateExpression = async (expression: string): Promise => { - if (expression === 'break-validate') { - return { - result: null, - error: 'The expression you have provided is not valid', - } - } - - return { - result: '5.12345', - error: null, - } -} - const TIMESTAMP = new Date().getTime() export const CustomExpressionDrawer = forwardRef< @@ -93,6 +89,10 @@ export const CustomExpressionDrawer = forwardRef< }, }, }, + validationSchema: object().shape({ + expression: string().test((value) => wrappedParseExpression(value)), + eventPayload: mixed().test((value) => isValidJSON(value)), + }), validateOnMount: true, enableReinitialize: true, onSubmit: (values) => { @@ -105,7 +105,10 @@ export const CustomExpressionDrawer = forwardRef< }) const onValidateExpression = async () => { - const result = await validateExpression(formikProps.values.expression) + const result = wrappedEvaluateExpression( + formikProps.values.expression, + formikProps.values.eventPayload, + ) setValidationResult(result) } @@ -118,6 +121,8 @@ export const CustomExpressionDrawer = forwardRef< closeDrawer: () => drawerRef.current?.closeDrawer(), })) + const hasErrors = !!(formikProps.errors.expression || formikProps.errors.eventPayload) + return ( {translate('text_1729773655417m826qhyr465')} @@ -174,25 +179,26 @@ export const CustomExpressionDrawer = forwardRef< disabled={!localData?.isEditable} label={translate('text_17297736554164pkbpqi0ke8')} editorMode="text" - validate={parseExpression} customInvalidError="text_1729864793151rrlucly2t6d" showHelperOnError={true} formikProps={formikProps} placeholder={translate('text_1729771640162kaf49b93e20') + '\n'} helperText={ -
+
{translate('text_1729773655417n5w5fu02lbm')} - {CUSTOM_EXPRESSION_EXAMPLES.map((example) => ( - - {example} - - ))} +
+ {CUSTOM_EXPRESSION_EXAMPLES.map((example) => ( + + {example} + + ))} +
} /> @@ -215,6 +221,7 @@ export const CustomExpressionDrawer = forwardRef< height="300px" label={translate('text_1729773655417k0y7nxt5c5j')} formikProps={formikProps} + customInvalidError="text_6638a3538de76801ac2f451b" placeholder={translate('text_17297753616921jc1iyf6mke')} /> @@ -223,7 +230,15 @@ export const CustomExpressionDrawer = forwardRef< {translate('text_1729773655417b4y4j7oatnq')} - {validationResult?.error &&
Error
} + {validationResult?.error && ( +
+ + + + {validationResult?.error} + +
+ )} {!validationResult?.result && !validationResult?.error && (