Skip to content

Commit 728f4e6

Browse files
committed
progress
1 parent cc6b8d6 commit 728f4e6

File tree

4 files changed

+3963
-7692
lines changed

4 files changed

+3963
-7692
lines changed

addon/usables/use-machine.ts

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ import { tracked } from '@glimmer/tracking';
2020
import { DEBUG } from '@glimmer/env';
2121
import { later, cancel } from '@ember/runloop';
2222
import { getOwner, setOwner } from '@ember/application';
23-
import { warn } from '@ember/debug';
23+
import { assert, warn } from '@ember/debug';
2424
import { action } from '@ember/object';
2525

2626
import { use, Resource } from 'ember-could-get-used-to-this';
2727

28-
2928
export const ARGS_STATE_CHANGE_WARNING =
3029
'A change to passed `args` or a local state change triggered an update to a `useMachine`-usable. You can send a dedicated event to the machine or restart it so this is handled. This is done via the `.update`-hook of the `useMachine`-usable.';
3130

@@ -58,25 +57,40 @@ export type UsableStatechart<
5857
| MachineConfig<TContext, TStateSchema, TEvent>
5958
| StateMachine<TContext, TStateSchema, TEvent, TTypestate>;
6059

60+
type Args<
61+
TContext,
62+
TStateSchema,
63+
TEvent extends EventObject,
64+
TTypestate extends Typestate<TContext>
65+
> = {
66+
machine: UsableStatechart<TContext, TStateSchema, TEvent, TTypestate>;
67+
interpreterOptions: Partial<InterpreterOptions>;
68+
onTransition?: StateListener<TContext, TEvent, TStateSchema, TTypestate>;
69+
};
70+
6171
export class Statechart<
6272
TContext,
6373
TStateSchema extends StateSchema,
6474
TEvent extends EventObject,
6575
TTypestate extends Typestate<TContext>
66-
> extends Resource {
67-
@tracked service!: Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
68-
@tracked _state!: State<TContext, TEvent, TStateSchema, TTypestate>;
76+
> extends Resource<Args<TContext, TStateSchema, TEvent, TTypestate>> {
77+
@tracked service?: Interpreter<TContext, TStateSchema, TEvent, TTypestate> = undefined;
78+
// current state of the machine,
79+
// set onTransition, which is configured during setup
80+
@tracked _state?: State<TContext, TEvent, TStateSchema, TTypestate> = undefined;
6981

7082
machine: StateMachine<TContext, TStateSchema, TEvent, TTypestate>;
7183
interpreterOptions: Partial<InterpreterOptions>;
72-
_onTransition: StateListener<TContext, TEvent, TStateSchema, TTypestate> | undefined = undefined;
7384

74-
constructor(
75-
machine: UsableStatechart<TContext, TStateSchema, TEvent, TTypestate>,
76-
interpreterOptions: Partial<InterpreterOptions>,
77-
onTransition?: StateListener<TContext, TEvent, TStateSchema, TTypestate>
78-
) {
79-
super(...arguments);
85+
declare _onTransition: StateListener<TContext, TEvent, TStateSchema, TTypestate> | undefined;
86+
declare _config: Partial<MachineOptions<TContext, TEvent>>;
87+
declare _context: TContext;
88+
89+
constructor(owner: unknown, args: Args<TContext, TStateSchema, TEvent, TTypestate>) {
90+
super(owner, args);
91+
92+
let { machine } = args;
93+
const { interpreterOptions, onTransition } = args;
8094

8195
machine = machine instanceof StateNode ? machine : createMachine(machine);
8296

@@ -85,26 +99,28 @@ export class Statechart<
8599
this._onTransition = onTransition;
86100
}
87101

88-
get state(): {
89-
state: State<TContext, TEvent, TStateSchema, TTypestate>;
90-
send: Send<TContext, TStateSchema, TEvent, TTypestate>;
91-
service: Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
92-
} {
102+
get state() {
103+
if (!this.service) {
104+
this.setup();
105+
}
106+
107+
assert(`Machine setup failed`, this.service);
108+
93109
return {
94110
state: this._state,
95111
send: this.service.send,
96112
service: this.service,
97113
};
98114
}
99115

116+
// used when this Resource is used as a helper
100117
get value() {
101-
// TODO: lazily call setup, as we don't know if the call site has .withContext or .withConfig
102-
return "foo";
118+
return this.state;
103119
}
104120

105121
@action
106-
send() {
107-
this.service.send(...arguments);
122+
send(...args: Parameters<Interpreter<TContext, TStateSchema, TEvent, TTypestate>['send']>) {
123+
this.state.service.send(...args);
108124
}
109125

110126
@action
@@ -113,7 +129,6 @@ export class Statechart<
113129
return this;
114130
}
115131

116-
117132
@action
118133
withContext(context: TContext) {
119134
this._context = context;
@@ -128,7 +143,6 @@ export class Statechart<
128143
return this;
129144
}
130145

131-
132146
setup(
133147
setupOptions: {
134148
initialState?: State<TContext, TEvent, TStateSchema, TTypestate> | StateValue;
@@ -159,6 +173,8 @@ export class Statechart<
159173
}
160174

161175
teardown(): void {
176+
if (!this.service) return;
177+
162178
this.service.stop();
163179
}
164180
}

package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,23 @@
2727
"postpublish": "ember ts:clean"
2828
},
2929
"dependencies": {
30-
"@glimmer/tracking": "^1.0.2",
31-
"ember-auto-import": "^1.8.0",
30+
"@glimmer/tracking": "^1.0.3",
31+
"ember-auto-import": "^1.9.0",
3232
"ember-cli-babel": "^7.23.0",
3333
"ember-cli-htmlbars": "^5.3.1",
34-
"ember-cli-typescript": "^3.1.4",
34+
"ember-cli-typescript": "^4.0.0",
3535
"ember-could-get-used-to-this": "^1.0.1",
3636
"xstate": "^4.12.0"
3737
},
3838
"devDependencies": {
3939
"@ember/optional-features": "^2.0.0",
4040
"@ember/render-modifiers": "^1.0.2",
41-
"@glimmer/component": "^1.0.2",
41+
"@glimmer/component": "^1.0.3",
4242
"@release-it/conventional-changelog": "^1.1.4",
43-
"@types/ember": "^3.16.0",
44-
"@types/ember-qunit": "^3.4.9",
45-
"@types/ember__test-helpers": "^1.7.2",
46-
"@types/qunit": "^2.9.1",
43+
"@types/ember": "^3.16.2",
44+
"@types/ember-qunit": "^3.4.13",
45+
"@types/ember__test-helpers": "^1.7.3",
46+
"@types/qunit": "^2.11.1",
4747
"@types/rsvp": "^4.0.3",
4848
"@typescript-eslint/eslint-plugin": "^4.0.1",
4949
"@typescript-eslint/parser": "^4.0.1",
@@ -89,7 +89,7 @@
8989
"prettier": "^2.0.2",
9090
"qunit-dom": "^1.5.0",
9191
"release-it": "^13.6.2",
92-
"typescript": "^4.0.2"
92+
"typescript": "^4.1.3"
9393
},
9494
"engines": {
9595
"node": "10.* || >= 12"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export function use(prototypeOrThis: unknown, keyOrDef: string): void;
2+
3+
export class Resource<T> {
4+
constructor(owner: unknown, args: T);
5+
}

0 commit comments

Comments
 (0)