Skip to content
This repository was archived by the owner on Apr 8, 2020. It is now read-only.

Commit 30684c9

Browse files
committed
Add Timeout Action to reducer
1 parent 4d1023c commit 30684c9

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

src/reducer.spec.ts

+39
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,45 @@ describe("actions", () => {
490490
});
491491
});
492492
});
493+
describe("Timeout", () => {
494+
const actionID = ActionID.Timeout;
495+
const validOrigin = [
496+
StateID.AppearTriggered, StateID.AppearStarted,
497+
StateID.EnterTriggered, StateID.EnterStarted,
498+
StateID.LeaveTriggered, StateID.LeaveStarted,
499+
];
500+
501+
it("should fail on invalid state transitions", () => {
502+
StateIDList
503+
.filter((id) => validOrigin.indexOf(id) < 0)
504+
.forEach((id) => assert.throw(() => reducer(id, { kind: actionID, props: {} })));
505+
});
506+
it("should transit to active state", () => {
507+
const origin = [
508+
StateID.AppearTriggered, StateID.AppearStarted,
509+
StateID.EnterTriggered, StateID.EnterStarted,
510+
];
511+
origin.forEach((id) => {
512+
const {state, pending} = reducer(id, { kind: actionID, props: {} });
513+
assert.isUndefined(pending);
514+
assert.strictEqual(state.id, StateID.Active);
515+
});
516+
});
517+
it("should transit to default state", () => {
518+
[StateID.LeaveTriggered, StateID.LeaveStarted].forEach((id) => {
519+
const {state, pending} = reducer(id, { kind: actionID, props: {} });
520+
assert.isUndefined(pending);
521+
assert.strictEqual(state.id, StateID.Default);
522+
});
523+
});
524+
it("should complete", () => {
525+
validOrigin.forEach((id) => {
526+
const result = reducer(id, { kind: actionID, props: {} });
527+
assert.isTrue(result.completed);
528+
});
529+
});
530+
});
531+
493532
describe("TransitionTrigger", () => {
494533
const actionID = ActionID.TransitionTrigger;
495534
it("should transit to enter init state", () => {

src/reducer.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export enum ActionID {
5050
TransitionTrigger,
5151
TransitionStart,
5252
TransitionComplete,
53+
Timeout,
5354
}
5455

5556
export type ActionPropKeys =
@@ -271,8 +272,8 @@ export const reducer: Reducer = (stateID, action) => {
271272
}
272273
case ActionID.TransitionComplete:
273274
switch (stateID) {
274-
case StateID.AppearStarted:
275275
case StateID.AppearTriggered:
276+
case StateID.AppearStarted:
276277
case StateID.EnterTriggered:
277278
case StateID.EnterStarted:
278279
return { state: activeState(props), completed: true };
@@ -319,6 +320,19 @@ export const reducer: Reducer = (stateID, action) => {
319320
default:
320321
throw new Error(`invalid state transition from ${StateID[stateID as any]}`);
321322
}
323+
case ActionID.Timeout:
324+
switch (stateID) {
325+
case StateID.AppearTriggered:
326+
case StateID.AppearStarted:
327+
case StateID.EnterTriggered:
328+
case StateID.EnterStarted:
329+
return { state: activeState(props), completed: true };
330+
case StateID.LeaveTriggered:
331+
case StateID.LeaveStarted:
332+
return { state: defaultState(props), completed: true };
333+
default:
334+
throw new Error(`invalid state transition from ${StateID[stateID]}`);
335+
}
322336
default:
323337
}
324338
throw new Error("unexpected error");

0 commit comments

Comments
 (0)