Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
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

Lines changed: 39 additions & 0 deletions
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

Lines changed: 15 additions & 1 deletion
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)

AltStyle によって変換されたページ (->オリジナル) /