Skip to content

Commit 06e2154

Browse files
authored
Fix/dropdown input result callbacks (#1071)
* fix uiDropdown not being updated * fix tests * fix test COVERAGE * remove unnecessary return * wip test
1 parent 0be729e commit 06e2154

File tree

5 files changed

+35
-39
lines changed

5 files changed

+35
-39
lines changed

packages/@dcl/react-ecs/src/reconciler/index.ts

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { Entity, IEngine, InputAction, PointerEventsSystem, PointerEventType } from '@dcl/ecs'
1+
import {
2+
Entity,
3+
IEngine,
4+
InputAction,
5+
PointerEventsSystem,
6+
PointerEventType,
7+
PBUiInputResult,
8+
PBUiDropdownResult
9+
} from '@dcl/ecs'
210
import * as components from '@dcl/ecs/dist/components'
311
import Reconciler, { HostConfig } from 'react-reconciler'
412
import { Callback, isListener, Listeners } from '../components'
@@ -183,6 +191,7 @@ export function createReconciler(
183191

184192
function removeChildEntity(instance: Instance) {
185193
changeEvents.delete(instance.entity)
194+
clickEvents.delete(instance.entity)
186195
engine.removeEntity(instance.entity)
187196
for (const child of instance._child) {
188197
removeChildEntity(child)
@@ -233,13 +242,24 @@ export function createReconciler(
233242
}
234243

235244
function updateOnChange(entity: Entity, componentId: number, state?: OnChangeState) {
245+
const hasEvent = changeEvents.has(entity)
236246
const event = changeEvents.get(entity) || changeEvents.set(entity, new Map()).get(entity)!
237-
const oldState = event.get(componentId)
238247
const onChangeCallback = state?.onChangeCallback
239248
const onSubmitCallback = state?.onSubmitCallback
240-
const value = state?.value ?? oldState?.value
241-
const isSubmit = state?.isSubmit ?? oldState?.isSubmit
242-
event.set(componentId, { onChangeCallback, onSubmitCallback, value, isSubmit })
249+
event.set(componentId, { onChangeCallback, onSubmitCallback })
250+
// Create onChange callback if its the first callback event for this entity
251+
if (!hasEvent) {
252+
const resultComponentId =
253+
componentId === UiDropdown.componentId ? UiDropdownResult.componentId : UiInputResult.componentId
254+
engine.getComponent<PBUiInputResult | PBUiDropdownResult>(resultComponentId).onChange(entity, (value) => {
255+
if ((value as PBUiInputResult)?.isSubmit) {
256+
const onSubmit = changeEvents.get(entity)?.get(componentId)?.onSubmitCallback
257+
onSubmit && onSubmit(value?.value)
258+
}
259+
const onChange = changeEvents.get(entity)?.get(componentId)?.onChangeCallback
260+
onChange && onChange(value?.value)
261+
})
262+
}
243263
}
244264

245265
const hostConfig: HostConfig<
@@ -352,34 +372,8 @@ export function createReconciler(
352372
null
353373
)
354374

355-
// Maybe this could be something similar to Input system, but since we
356-
// are going to use this only here, i prefer to scope it here.
357-
function handleOnChange(componentId: number, resultComponent: typeof UiDropdownResult | typeof UiInputResult) {
358-
for (const [entity, Result] of engine.getEntitiesWith(resultComponent)) {
359-
const entityState = changeEvents.get(entity)?.get(componentId)
360-
const isSubmit = !!(Result as any).isSubmit
361-
if (entityState?.onChangeCallback && Result.value !== entityState.value) {
362-
entityState.onChangeCallback(Result.value)
363-
}
364-
if (entityState?.onSubmitCallback && isSubmit && !entityState.isSubmit) {
365-
entityState.onSubmitCallback(Result.value)
366-
}
367-
368-
updateOnChange(entity, componentId, {
369-
onChangeCallback: entityState?.onChangeCallback,
370-
onSubmitCallback: entityState?.onSubmitCallback,
371-
value: Result.value,
372-
isSubmit
373-
})
374-
}
375-
}
376-
377375
return {
378376
update: function (component: ReactEcs.JSX.ReactNode) {
379-
if (changeEvents.size) {
380-
handleOnChange(UiInput.componentId, UiInputResult)
381-
handleOnChange(UiDropdown.componentId, UiDropdownResult)
382-
}
383377
return reconciler.updateContainer(component as any, root, null)
384378
},
385379
getEntities: () => Array.from(entities)

packages/@dcl/sdk/src/internal/transports/rendererTransport.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export function createRendererTransport(engineApi: EngineApiForTransport): Trans
3939
) {
4040
return false
4141
}
42-
4342
return !!message
4443
},
4544
type: 'renderer'

test/react-ecs/dropdown.spec.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,9 @@ describe('UiDropdown React ECS', () => {
6767
})
6868

6969
it('remove the onchange fn, so if we change the value there is no call to the fn because there is no onChange fn', async () => {
70-
expect(onChange).toBeCalledTimes(0)
70+
onChange.mockClear()
7171
conditional = false
72+
expect(onChange).toBeCalledTimes(0)
7273
await engine.update(1)
7374

7475
UiDropdownResult.getMutable(uiEntity).value = 2
@@ -78,6 +79,7 @@ describe('UiDropdown React ECS', () => {
7879
})
7980

8081
it('put the conditional en true, so we have the onChange fn again', async () => {
82+
onChange.mockClear()
8183
conditional = true
8284
await engine.update(1)
8385
expect(onChange).toBeCalledTimes(0)

test/react-ecs/input.spec.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ describe('Ui Listeners React Ecs', () => {
6868
UiInputResult.getMutable(uiEntity).isSubmit = true
6969
await engine.update(1)
7070
expect(onSubmit).toBeCalledTimes(1)
71+
onChange.mockClear()
7172
removeComponent = true
7273
await engine.update(1)
7374
UiInputResult.create(uiEntity, { value: 'BOEDO' })

test/snapshots/production-bundles/ui.ts.crdt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
SCENE_COMPILED_JS_SIZE_PROD=353.8k bytes
1+
SCENE_COMPILED_JS_SIZE_PROD=353.6k bytes
22
(start empty vm 0.21.0-3680274614.commit-1808aa1)
33
OPCODES ~= 0k
44
MALLOC_COUNT = 1005
@@ -9,7 +9,7 @@ EVAL test/snapshots/production-bundles/ui.js
99
REQUIRE: ~system/EngineApi
1010
REQUIRE: ~system/EngineApi
1111
OPCODES ~= 65k
12-
MALLOC_COUNT = 19507
12+
MALLOC_COUNT = 19502
1313
ALIVE_OBJS_DELTA ~= 3.88k
1414
CALL onStart()
1515
OPCODES ~= 0k
@@ -48,11 +48,11 @@ CALL onUpdate(0)
4848
Scene: PUT_COMPONENT e=0x209 c=1093 t=1 data={"placeholder":"","disabled":false}
4949
Scene: PUT_COMPONENT e=0x201 c=1094 t=1 data={"acceptEmpty":false,"options":["BOEDO","CASLA"],"selectedIndex":0,"disabled":false,"color":{"r":1,"g":0,"b":0,"a":1}}
5050
OPCODES ~= 134k
51-
MALLOC_COUNT = 678
52-
ALIVE_OBJS_DELTA ~= 0.24k
51+
MALLOC_COUNT = 705
52+
ALIVE_OBJS_DELTA ~= 0.25k
5353
CALL onUpdate(0.1)
5454
Scene: PUT_COMPONENT e=0x200 c=1 t=2 data={"position":{"x":8,"y":1,"z":8},"rotation":{"x":0,"y":0.008726535364985466,"z":0,"w":0.9999619126319885},"scale":{"x":1,"y":1,"z":1},"parent":0}
55-
OPCODES ~= 66k
55+
OPCODES ~= 65k
5656
MALLOC_COUNT = 250
5757
ALIVE_OBJS_DELTA ~= 0.12k
5858
CALL onUpdate(0.1)
@@ -65,4 +65,4 @@ CALL onUpdate(0.1)
6565
OPCODES ~= 64k
6666
MALLOC_COUNT = 0
6767
ALIVE_OBJS_DELTA ~= 0.00k
68-
MEMORY_USAGE_COUNT ~= 1695.75k bytes
68+
MEMORY_USAGE_COUNT ~= 1695.42k bytes

0 commit comments

Comments
 (0)