Skip to content

Commit

Permalink
major operations
Browse files Browse the repository at this point in the history
  • Loading branch information
pghalliday committed May 2, 2017
1 parent c786820 commit 7aae474
Show file tree
Hide file tree
Showing 17 changed files with 1,220 additions and 142 deletions.
31 changes: 0 additions & 31 deletions app/src/ducklings/app.js

This file was deleted.

30 changes: 30 additions & 0 deletions app/src/ducklings/app/change-secret.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import factory from '../../lib/factory';
import asyncBehavior from '../../lib/ducklings/async-behavior';

export default factory(
'ducklings/app/change-secret',
(service) => [asyncBehavior, ({
selector,
app: {start, complete},
}) => {
return {
initialState: {
complete: false,
},
handlers: {
[complete]: {
next: () => ({
complete: true,
}),
},
},
app: {
isComplete: selector((state) => state.complete),
submit: (secret, settings) => (dispatch) => {
dispatch(start());
return dispatch(complete(service.changeSecret(secret, settings)));
},
},
};
}],
);
30 changes: 30 additions & 0 deletions app/src/ducklings/app/clear.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import factory from '../../lib/factory';
import asyncBehavior from '../../lib/ducklings/async-behavior';

export default factory(
'ducklings/app/clear',
(service) => [asyncBehavior, ({
selector,
app: {start, complete},
}) => {
return {
initialState: {
complete: false,
},
handlers: {
[complete]: {
next: () => ({
complete: true,
}),
},
},
app: {
isComplete: selector((state) => state.complete),
submit: () => (dispatch) => {
dispatch(start());
return dispatch(complete(service.clear()));
},
},
};
}],
);
38 changes: 38 additions & 0 deletions app/src/ducklings/app/create.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import factory from '../../lib/factory';
import asyncBehavior from '../../lib/ducklings/async-behavior';

export default factory(
'ducklings/app/create',
(service) => [asyncBehavior, ({
selector,
app: {start, complete},
}) => {
return {
initialState: {
count: 0,
settings: undefined,
complete: false,
},
handlers: {
[start]: (_, {payload: settings}) => ({
settings,
}),
[complete]: {
next: (_, {payload: count}) => ({
count,
complete: true,
}),
},
},
app: {
getCount: selector((state) => state.count),
getSettings: selector((state) => state.settings),
isComplete: selector((state) => state.complete),
submit: (secret, settings) => (dispatch) => {
dispatch(start(settings));
return dispatch(complete(service.create(secret, settings)));
},
},
};
}],
);
33 changes: 33 additions & 0 deletions app/src/ducklings/app/delete.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import factory from '../../lib/factory';
import asyncBehavior from '../../lib/ducklings/async-behavior';

export default factory(
'ducklings/app/delete',
(service) => [asyncBehavior, ({
selector,
app: {start, complete},
}) => {
return {
initialState: {
count: 0,
complete: false,
},
handlers: {
[complete]: {
next: (_, {payload: count}) => ({
count,
complete: true,
}),
},
},
app: {
getCount: selector((state) => state.count),
isComplete: selector((state) => state.complete),
submit: () => (dispatch) => {
dispatch(start());
return dispatch(complete(service.delete()));
},
},
};
}],
);
95 changes: 95 additions & 0 deletions app/src/ducklings/app/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import factory from '../../lib/factory';
import unlockFactory from './unlock';
import createFactory from './create';
import deleteFactory from './delete';
import clearFactory from './clear';
import changeSecretFactory from './change-secret';
import asyncBehavior from '../../lib/ducklings/async-behavior';
import {
createSelector,
} from 'reselect';

export default factory(
'ducklings/app',
(service) => [asyncBehavior, {
unlock: unlockFactory(service),
create: createFactory(service),
delete: deleteFactory(service),
clear: clearFactory(service),
changeSecret: changeSecretFactory(service),
}, ({
action,
selector,
reduce,
app: {start, complete},
}) => {
const count = selector((state) => state.count);
const getSettings = selector((state) => state.settings);
const completeUnlock = action('COMPLETE_UNLOCK');
const completeCreate = action('COMPLETE_CREATE');
const completeDelete = action('COMPLETE_DELETE');
const completeClear = action('COMPLETE_CLEAR');
return {
initialState: {
count: 0,
settings: undefined,
},
handlers: {
[start]: () => ({
count: 0,
}),
[complete]: {
next: (_, {payload: count}) => ({
count,
}),
},
[completeUnlock]: (state, {payload: settings}) => ({
...reduce(state, {
unlock: [['reset']],
}),
settings,
}),
[completeCreate]: (state, {payload: {settings, count}}) => ({
...reduce(state, {
create: [['reset']],
}),
settings,
count,
}),
[completeDelete]: (state, {payload: count}) => ({
...reduce(state, {
delete: [['reset']],
}),
settings: undefined,
count,
}),
[completeClear]: (state) => ({
...reduce(state, {
clear: [['reset']],
}),
settings: undefined,
count: 0,
}),
},
app: {
hasSettings: createSelector(
count,
(count) => count > 0,
),
isUnlocked: createSelector(
getSettings,
(settings) => typeof settings !== 'undefined',
),
getSettings,
initialize: () => (dispatch) => {
dispatch(start());
return dispatch(complete(service.initialize()));
},
completeUnlock,
completeCreate,
completeDelete,
completeClear,
},
};
}],
);
45 changes: 45 additions & 0 deletions app/src/ducklings/app/unlock.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import factory from '../../lib/factory';
import errorBehavior from '../../lib/ducklings/error-behavior';
import {
createSelector,
} from 'reselect';

export default factory(
'ducklings/app/unlock',
(service) => [errorBehavior, ({
action,
selector,
}) => {
const getSettings = selector((state) => state.settings);
const submit = action('SUBMIT', (secret) => {
try {
return service.unlock(secret);
} catch (error) {
return error;
}
});
return {
initialState: {
settings: undefined,
},
handlers: {
[submit]: {
next: (_, {payload: settings}) => ({
settings,
}),
throw: (_, {payload: error}) => ({
error,
}),
},
},
app: {
getSettings,
isComplete: createSelector(
getSettings,
(settings) => typeof settings !== 'undefined',
),
submit,
},
};
}],
);
4 changes: 2 additions & 2 deletions app/test/helpers/service.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default class ServiceHelper {
}

_stub(isAsync, method) {
sinon.stub(this.service, method, () => {
sinon.stub(this.service, method).callsFake(() => {
if (isAsync) {
return new Promise((resolve, reject) => {
process.nextTick(() => {
Expand All @@ -33,7 +33,7 @@ export default class ServiceHelper {
}

_reset(_, method) {
this.service[method].reset();
this.service[method].resetHistory();
}

_restore(_, method) {
Expand Down
Loading

0 comments on commit 7aae474

Please sign in to comment.