Skip to content

Commit e72b296

Browse files
authored
Add support for passing the event object for eventHandlers, also add support for expressions and dynamic references as newState values (#961)
1 parent 5d432e1 commit e72b296

File tree

3 files changed

+32
-8
lines changed
  • packages
    • teleport-plugin-common/src/node-handlers/node-to-jsx
    • teleport-types/src
    • teleport-uidl-validator/src/decoders

3 files changed

+32
-8
lines changed

packages/teleport-plugin-common/src/node-handlers/node-to-jsx/utils.ts

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,24 @@ export const addEventHandlerToTag = (
5858
})
5959

6060
let expressionContent: types.ArrowFunctionExpression | types.Expression
61+
const functionParams = eventHandlerStatements.some(
62+
(eventHandler) => eventHandler.includeEventObject
63+
)
64+
? [t.identifier('event')]
65+
: []
66+
6167
if (eventHandlerASTStatements.length === 1) {
6268
const expression = eventHandlerASTStatements[0].expression
6369

6470
expressionContent =
6571
expression.type === 'CallExpression' && expression.arguments.length === 0
6672
? (expression.callee as types.ArrowFunctionExpression | types.Expression)
67-
: t.arrowFunctionExpression([], expression)
73+
: t.arrowFunctionExpression(functionParams, expression)
6874
} else {
69-
expressionContent = t.arrowFunctionExpression([], t.blockStatement(eventHandlerASTStatements))
75+
expressionContent = t.arrowFunctionExpression(
76+
functionParams,
77+
t.blockStatement(eventHandlerASTStatements)
78+
)
7079
}
7180

7281
tag.openingElement.attributes.push(
@@ -122,10 +131,21 @@ const createStateChangeStatement = (
122131
? options.dynamicReferencePrefixMap.state + '.'
123132
: ''
124133

125-
const newStateValue =
126-
eventHandlerStatement.newState === '$toggle'
127-
? t.unaryExpression('!', t.identifier(statePrefix + stateKey))
128-
: convertValueToLiteral(eventHandlerStatement.newState, stateDefinition.type)
134+
let newStateValue
135+
136+
if (eventHandlerStatement.newState === '$toggle') {
137+
newStateValue = t.unaryExpression('!', t.identifier(statePrefix + stateKey))
138+
} else if (typeof eventHandlerStatement.newState === 'object') {
139+
if (eventHandlerStatement.newState.type === 'expr') {
140+
newStateValue = getExpressionFromUIDLExpressionNode(eventHandlerStatement.newState)
141+
} else if (eventHandlerStatement.newState.type === 'dynamic') {
142+
newStateValue = createDynamicValueExpression(eventHandlerStatement.newState, options)
143+
} else {
144+
newStateValue = convertValueToLiteral(eventHandlerStatement.newState, stateDefinition.type)
145+
}
146+
} else {
147+
newStateValue = convertValueToLiteral(eventHandlerStatement.newState, stateDefinition.type)
148+
}
129149

130150
switch (options.stateHandling) {
131151
case 'hooks':

packages/teleport-types/src/uidl.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -683,12 +683,14 @@ export interface UIDLPropCallEvent {
683683
type: 'propCall'
684684
calls: string
685685
args?: Array<string | number | boolean>
686+
includeEventObject?: boolean
686687
}
687688

688689
export interface UIDLStateModifierEvent {
689690
type: 'stateChange'
690691
modifies: string
691-
newState: string | number | boolean
692+
newState: string | number | boolean | UIDLDynamicReference | UIDLExpressionValue
693+
includeEventObject?: boolean
692694
}
693695

694696
export type UIDLEventHandlerStatement = UIDLPropCallEvent | UIDLStateModifierEvent

packages/teleport-uidl-validator/src/decoders/utils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,12 +549,14 @@ export const propCallEventDecoder: Decoder<UIDLPropCallEvent> = object({
549549
type: constant('propCall'),
550550
calls: string(),
551551
args: optional(array(union(string(), number(), boolean()))),
552+
includeEventObject: optional(boolean()),
552553
})
553554

554555
export const stateChangeEventDecoder: Decoder<UIDLStateModifierEvent> = object({
555556
type: constant('stateChange'),
556557
modifies: string(),
557-
newState: union(string(), number(), boolean()),
558+
newState: union(string(), number(), boolean(), dynamicValueDecoder, expressionValueDecoder),
559+
includeEventObject: optional(boolean()),
558560
})
559561

560562
export const urlLinkNodeDecoder: Decoder<VUIDLURLLinkNode> = object({

0 commit comments

Comments
 (0)