Skip to content

Commit ea4f27a

Browse files
committed
initial work to move target event data
1 parent a8dd9b9 commit ea4f27a

File tree

3 files changed

+63
-21
lines changed

3 files changed

+63
-21
lines changed

Diff for: src/client/packages/idom-client-react/src/event-to-object.js

+38-20
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,40 @@ export function serializeEvent(event) {
55
Object.assign(data, eventTransforms[event.type](event));
66
}
77

8-
const target = event.target;
9-
if (target.tagName in targetTransforms) {
10-
targetTransforms[target.tagName].forEach((trans) =>
11-
Object.assign(data, trans(target))
12-
);
13-
}
8+
data.target = serializeDomElement(event.target);
9+
data.currentTarget =
10+
event.target === event.currentTarget
11+
? data.target
12+
: serializeDomElement(event.currentTarget);
13+
data.relatedTarget = serializeDomElement(event.relatedTarget);
1414

1515
return data;
1616
}
1717

18-
const targetTransformCategories = {
19-
hasValue: (target) => ({
20-
value: target.value,
18+
function serializeDomElement(element) {
19+
let elementData = null;
20+
if (element) {
21+
elementData = defaultElementTransform(element);
22+
if (element.tagName in elementTransforms) {
23+
elementTransforms[element.tagName].forEach((trans) =>
24+
Object.assign(elementData, trans(element))
25+
);
26+
}
27+
}
28+
return elementData;
29+
}
30+
31+
const elementTransformCategories = {
32+
hasValue: (element) => ({
33+
value: element.value,
2134
}),
22-
hasCurrentTime: (target) => ({
23-
currentTime: target.currentTime,
35+
hasCurrentTime: (element) => ({
36+
currentTime: element.currentTime,
2437
}),
25-
hasFiles: (target) => {
26-
if (target?.type === "file") {
38+
hasFiles: (element) => {
39+
if (element?.type === "file") {
2740
return {
28-
files: Array.from(target.files).map((file) => ({
41+
files: Array.from(element.files).map((file) => ({
2942
lastModified: file.lastModified,
3043
name: file.name,
3144
size: file.size,
@@ -38,7 +51,11 @@ const targetTransformCategories = {
3851
},
3952
};
4053

41-
const targetTagCategories = {
54+
function defaultElementTransform(element) {
55+
return { boundingClientRect: element.getBoundingClientRect() };
56+
}
57+
58+
const elementTagCategories = {
4259
hasValue: [
4360
"BUTTON",
4461
"INPUT",
@@ -54,12 +71,13 @@ const targetTagCategories = {
5471
hasFiles: ["INPUT"],
5572
};
5673

57-
const targetTransforms = {};
74+
const elementTransforms = {};
5875

59-
Object.keys(targetTagCategories).forEach((category) => {
60-
targetTagCategories[category].forEach((type) => {
61-
const transforms = targetTransforms[type] || (targetTransforms[type] = []);
62-
transforms.push(targetTransformCategories[category]);
76+
Object.keys(elementTagCategories).forEach((category) => {
77+
elementTagCategories[category].forEach((type) => {
78+
const transforms =
79+
elementTransforms[type] || (elementTransforms[type] = []);
80+
transforms.push(elementTransformCategories[category]);
6381
});
6482
});
6583

Diff for: src/idom/core/_event_proxy.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from typing import Any, Sequence
2+
from warnings import warn
3+
4+
5+
def _wrap_in_warning_event_proxies(values: Sequence[Any]) -> Sequence[Any]:
6+
return [_EventProxy(x) if isinstance(x, dict) else x for x in values]
7+
8+
9+
class _EventProxy(dict[Any, Any]):
10+
def __getitem__(self, key: Any) -> Any:
11+
try:
12+
return super().__getitem__(key)
13+
except KeyError:
14+
target = self.get("target")
15+
if isinstance(target, dict) and key in target:
16+
warn(
17+
f"The event key event[{key!r}] has been moved event['target'][{key!r}",
18+
DeprecationWarning,
19+
stacklevel=1,
20+
)
21+
return target[key]
22+
else:
23+
raise

Diff for: src/idom/core/layout.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
)
3030
from idom.utils import Ref
3131

32+
from ._event_proxy import _wrap_in_warning_event_proxies
3233
from .hooks import LifeCycleHook
3334
from .proto import ComponentType, EventHandlerDict, VdomJson
3435
from .vdom import validate_vdom_json
@@ -119,7 +120,7 @@ async def deliver(self, event: LayoutEvent) -> None:
119120

120121
if handler is not None:
121122
try:
122-
await handler.function(event.data)
123+
await handler.function(_wrap_in_warning_event_proxies(event.data))
123124
except Exception:
124125
logger.exception(f"Failed to execute event handler {handler}")
125126
else:

0 commit comments

Comments
 (0)