Skip to content

Commit 7234f59

Browse files
committed
DocSub dispatches with setTimeout to avoid canceling other batched subs
1 parent 5978854 commit 7234f59

3 files changed

Lines changed: 63 additions & 29 deletions

File tree

samples/src/Samples/EventsSample.tsx

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ export type Model = {
3131
clicked: Maybe<MousePosition>
3232
moved: Maybe<MousePosition>
3333
scrolled: Maybe<Position>
34+
nbResizeLeft: number
35+
nbResizeRight: number
3436
};
3537

3638
type MousePosition = {
@@ -47,6 +49,9 @@ export type Msg = {
4749
} | {
4850
type: 'moved',
4951
position: MousePosition
52+
} | {
53+
type: 'resized',
54+
left: boolean
5055
} | {
5156
type: 'scrolled',
5257
scroll: Position
@@ -56,7 +61,9 @@ export function init(): [Model, Cmd<Msg>] {
5661
return noCmd({
5762
clicked: nothing,
5863
moved: nothing,
59-
scrolled: nothing
64+
scrolled: nothing,
65+
nbResizeLeft: 0,
66+
nbResizeRight: 0,
6067
});
6168
}
6269

@@ -75,6 +82,8 @@ export function view(dispatch: Dispatcher<Msg>, model: Model) {
7582
.map(viewPosition('Scrolled'))
7683
.withDefault(<div>Waiting for move ...</div>)
7784
}
85+
<div>resized left : {model.nbResizeLeft}</div>
86+
<div>resized right : {model.nbResizeRight}</div>
7887
</div>
7988
);
8089
}
@@ -102,6 +111,13 @@ export function update(msg: Msg, model: Model): [Model, Cmd<Msg>] {
102111
};
103112
return [model1, Cmd.none()];
104113
}
114+
case 'resized': {
115+
return noCmd({
116+
...model,
117+
nbResizeRight: msg.left ? model.nbResizeRight : model.nbResizeRight + 1,
118+
nbResizeLeft: msg.left ? model.nbResizeLeft + 1 : model.nbResizeLeft,
119+
});
120+
}
105121
}
106122
}
107123

@@ -110,30 +126,42 @@ const windowEvents = new WindowEvents<Msg>();
110126

111127
export function subscriptions(model: Model): Sub<Msg> {
112128
return Sub.batch([
113-
// documentEvents.on('click', (e: MouseEvent) => (
114-
// {
115-
// type: 'clicked',
116-
// position: {
117-
// pos: [e.x, e.y],
118-
// page: [e.pageX, e.pageY],
119-
// offset: [e.offsetX, e.offsetY]
120-
// }
121-
// } as Msg
122-
// )),
123-
// documentEvents.on('mousemove', (e: MouseEvent) => ({
124-
// type: 'moved',
125-
// position: {
126-
// pos: [e.x, e.y],
127-
// page: [e.pageX, e.pageY],
128-
// offset: [e.offsetX, e.offsetY]
129-
// }
130-
// } as Msg)),
131-
// windowEvents.on('scroll', (e: Event) => {
132-
// return {
133-
// type: 'scrolled',
134-
// scroll: [window.scrollX, window.scrollY]
135-
// } as Msg;
136-
// })
129+
documentEvents.on('click', (e: MouseEvent) => (
130+
{
131+
type: 'clicked',
132+
position: {
133+
pos: [e.x, e.y],
134+
page: [e.pageX, e.pageY],
135+
offset: [e.offsetX, e.offsetY]
136+
}
137+
} as Msg
138+
)),
139+
documentEvents.on('mousemove', (e: MouseEvent) => ({
140+
type: 'moved',
141+
position: {
142+
pos: [e.x, e.y],
143+
page: [e.pageX, e.pageY],
144+
offset: [e.offsetX, e.offsetY]
145+
}
146+
} as Msg)),
147+
windowEvents.on('scroll', (e: Event) => {
148+
return {
149+
type: 'scrolled',
150+
scroll: [window.scrollX, window.scrollY]
151+
} as Msg;
152+
}),
153+
windowEvents.on('resize', () => {
154+
return {
155+
type: 'resized',
156+
left: true
157+
} as Msg;
158+
}),
159+
windowEvents.on('resize', () => {
160+
return {
161+
type: 'resized',
162+
left: false
163+
} as Msg;
164+
}),
137165
]);
138166
}
139167

tea-cup/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"test-watch": "jest --watch",
1717
"prettify": "prettier --write .",
1818
"tsc": "tsc",
19+
"compile:ts": "tsc",
1920
"compile": "rimraf dist && tsc",
2021
"samples": "tsc --outFile ./dist/Samples/index.js && cp ./src/Samples/index.html ./dist/Samples"
2122
},

tea-cup/src/TeaCup/DocumentEvents.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,15 @@ class DocSub<K extends keyof Map, Map, Msg> extends Sub<Msg> {
4242
this.listener = (e) => this.dispatch(this.mapper(e));
4343
}
4444

45+
protected dispatch(m: Msg) {
46+
const d = this.dispatcher;
47+
if (d !== undefined) {
48+
setTimeout(() => {
49+
d(m);
50+
});
51+
}
52+
}
53+
4554
protected onInit() {
4655
super.onInit();
4756
this.documentEvents.doAddListener(this.key, this.listener, this.options)
@@ -51,10 +60,6 @@ class DocSub<K extends keyof Map, Map, Msg> extends Sub<Msg> {
5160
super.onRelease();
5261
this.documentEvents.doRemoveListener(this.key, this.listener, this.options)
5362
}
54-
55-
event(e: Map[K]) {
56-
this.dispatch(this.mapper(e));
57-
}
5863
}
5964

6065
abstract class EventMapEvents<Map, Msg> {

0 commit comments

Comments
 (0)