Skip to content

Commit b925d85

Browse files
authored
Merge pull request #93 from vankeisb/feature/fix-canceled-subs
DocSub async dispatch
2 parents 5978854 + f4b4b5b commit b925d85

8 files changed

Lines changed: 89 additions & 61 deletions

File tree

core/src/TeaCup/Animation.ts

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,12 @@ let subs: Array<RafSub<any>> = [];
3030
let ticking = false;
3131

3232
function tick() {
33-
// console.log("tick()");
3433
if (!ticking) {
3534
ticking = true;
36-
const subsNow = [...subs];
37-
// console.log("tick() subsNow=" + subsNow);
38-
if (subsNow.length > 0) {
39-
requestAnimationFrame((t: number) => {
40-
// console.log("tick() trigger subsNow=" + subsNow);
41-
subsNow.forEach((s) => s.trigger(t));
42-
ticking = false;
43-
// console.log("tick() recursing");
44-
tick();
45-
});
46-
} else {
35+
requestAnimationFrame((t: number) => {
36+
subs.forEach((s) => s.trigger(t));
4737
ticking = false;
48-
}
38+
});
4939
}
5040
}
5141

@@ -66,9 +56,6 @@ class RafSub<M> extends Sub<M> {
6656
protected onRelease() {
6757
super.onRelease();
6858
subs = subs.filter((s) => s !== this);
69-
if (subs.length === 0) {
70-
ticking = false;
71-
}
7259
}
7360

7461
trigger(t: number) {

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

samples/src/Samples/Raf.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ export function update(msg: Msg, model: Model): [Model, Cmd<Msg>] {
104104
return noCmd({ ...model, started: !model.started });
105105
case 'raf':
106106
const delta = msg.t - model.t;
107-
const fps = 1000 / delta;
107+
const fps = delta === 0
108+
? model.fps
109+
: 1000 / delta;
108110
return noCmd({
109111
...model,
110112
t: msg.t,

samples/src/Samples/SelectSample.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ export function init(): [Model, Cmd<Msg>] {
4747

4848
export function view(dispatch: Dispatcher<Msg>, model: Model) {
4949
const value = model.selected.withDefault("select me");
50-
console.log("rendering value", value)
5150
return (
5251
<div className="select">
5352
<p><em>(Use me with Firefox, too.)</em></p>

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.test.tsx

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ describe('DocumentEvents Test', () => {
7777
expect(removeSpy.mock.calls.length).toBe(2);
7878
});
7979

80-
it('sub receives event from listener', () => {
80+
it('sub receives event from listener', (done) => {
8181
const msgs: string[] = [];
8282
const collectMsgs = (msg: string): void => {
8383
msgs.push(msg);
@@ -90,10 +90,13 @@ describe('DocumentEvents Test', () => {
9090
const listener = addSpy.mock.calls[0][1];
9191

9292
listener({ event: 'event' });
93-
expect(msgs).toEqual(['clicked1']);
93+
setTimeout(() => {
94+
expect(msgs).toEqual(['clicked1']);
95+
done();
96+
}, 10);
9497
});
9598

96-
it('each sub receive events its listener', () => {
99+
it('each sub receive events its listener', (done) => {
97100
const msgs: string[] = [];
98101
const collectMsgs = (msg: string): void => {
99102
msgs.push(msg);
@@ -114,12 +117,17 @@ describe('DocumentEvents Test', () => {
114117
const listener2 = addSpy.mock.calls[1][1];
115118

116119
listener({ event: 'event' });
117-
expect(msgs).toEqual(['clicked']);
118-
listener2({ event: 'event' });
119-
expect(msgs2).toEqual(['clicked2']);
120+
setTimeout(() => {
121+
expect(msgs).toEqual(['clicked']);
122+
listener2({ event: 'event' });
123+
setTimeout(() => {
124+
expect(msgs2).toEqual(['clicked2']);
125+
done();
126+
}, 10)
127+
}, 10)
120128
});
121129

122-
it('sub stops receiving events from listener', () => {
130+
it('sub stops receiving events from listener', (done) => {
123131
const sub = documentEvents.on('click', (e) => 'clicked1');
124132

125133
const msgs: string[] = [];
@@ -132,11 +140,16 @@ describe('DocumentEvents Test', () => {
132140

133141
listener({ event: 'event' });
134142
listener({ event: 'event' });
135-
expect(msgs).toEqual(['clicked1', 'clicked1']);
136-
137-
sub.release();
138-
listener({ event: 'event' });
139-
expect(msgs).toEqual(['clicked1', 'clicked1']);
143+
setTimeout(() => {
144+
expect(msgs).toEqual(['clicked1', 'clicked1']);
145+
146+
sub.release();
147+
listener({ event: 'event' });
148+
setTimeout(() => {
149+
expect(msgs).toEqual(['clicked1', 'clicked1']);
150+
done();
151+
});
152+
}, 10)
140153
});
141154

142155
});

tea-cup/src/TeaCup/DocumentEvents.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@ class DocSub<K extends keyof Map, Map, Msg> extends Sub<Msg> {
5151
super.onRelease();
5252
this.documentEvents.doRemoveListener(this.key, this.listener, this.options)
5353
}
54-
55-
event(e: Map[K]) {
56-
this.dispatch(this.mapper(e));
57-
}
5854
}
5955

6056
abstract class EventMapEvents<Map, Msg> {

tea-cup/src/TeaCup/Program.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@ export class Program<Model, Msg> extends Component<ProgramProps<Model, Msg>, nev
9191

9292
const d = this.dispatch.bind(this);
9393

94-
newSub.init(d);
95-
prevSub?.release();
94+
setTimeout(() => {
95+
newSub.init(d);
96+
prevSub?.release();
97+
});
9698

9799
// perform commands in a separate timout, to
98100
// make sure that this dispatch is done

0 commit comments

Comments
 (0)