From 4cebf6d404b3d93cf3ec26e4054d5b658c89e26e Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 12 Jun 2018 09:31:59 +0200 Subject: [PATCH 1/5] feat(effects): provide linkState and toggleState MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The issue with this implementation is that these effects shadow each others, maybe they should simply be exported and explicitly added by users… --- src/factory.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/factory.js b/src/factory.js index ce150ed..4de562a 100644 --- a/src/factory.js +++ b/src/factory.js @@ -32,6 +32,17 @@ const makeSpy = (keys, accessor) => { return [create(null, descriptors), spy] } +const defaultEffects = { + linkState: (_, { target }) => state => ({ + ...state, + [target.name]: target.nodeName.toLowerCase() === 'input' && + target.type.toLowerCase() === 'checkbox' + ? target.checked + : target.value, + }), + toggleState: (_, { target: { name } }) => state => ({ ...state, [name]: !state[name] }), +} + module.exports = ({ Component, createElement, PropTypes }) => { const contextTypes_ = { [TAG]: @@ -143,6 +154,7 @@ module.exports = ({ Component, createElement, PropTypes }) => { let state if (initialState !== undefined) { state = initialState(props) + effects = { ...defaultEffects, ...effects } keys(state).forEach(k => { if (!(k in stateDescriptors)) { From a15d2f208fc4f40cf9dd5a1998e89e54161546c8 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 27 Aug 2018 10:38:16 +0200 Subject: [PATCH 2/5] no longer necessary to merge with state --- src/factory.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/factory.js b/src/factory.js index 4de562a..0d795be 100644 --- a/src/factory.js +++ b/src/factory.js @@ -33,14 +33,13 @@ const makeSpy = (keys, accessor) => { } const defaultEffects = { - linkState: (_, { target }) => state => ({ - ...state, + linkState: (_, { target }) => () => ({ [target.name]: target.nodeName.toLowerCase() === 'input' && target.type.toLowerCase() === 'checkbox' ? target.checked : target.value, }), - toggleState: (_, { target: { name } }) => state => ({ ...state, [name]: !state[name] }), + toggleState: (_, { target: { name } }) => state => ({ [name]: !state[name] }), } module.exports = ({ Component, createElement, PropTypes }) => { From 77dbbb6f6f6c95ebdc338167d5c23a7cdad177c6 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 27 Aug 2018 10:38:31 +0200 Subject: [PATCH 3/5] add linkState.trim() --- src/factory.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/factory.js b/src/factory.js index 0d795be..ef2b75f 100644 --- a/src/factory.js +++ b/src/factory.js @@ -42,6 +42,18 @@ const defaultEffects = { toggleState: (_, { target: { name } }) => state => ({ [name]: !state[name] }), } +defaultEffects.linkState.trim = (_, { target }) => state => { + if (target.nodeName.toLowerCase() === 'input' && + target.type.toLowerCase() === 'checkbox') { + return { + [target.name]: target.checked, + } + } + + const { value } = target + return typeof value === 'string' ? value.trim() : value +} + module.exports = ({ Component, createElement, PropTypes }) => { const contextTypes_ = { [TAG]: From 0930d36657c2565c8a3c5aa4ef6226b0b834714a Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 9 Oct 2018 16:49:02 +0200 Subject: [PATCH 4/5] fixes --- src/factory.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/factory.js b/src/factory.js index ef2b75f..7676a19 100644 --- a/src/factory.js +++ b/src/factory.js @@ -43,15 +43,18 @@ const defaultEffects = { } defaultEffects.linkState.trim = (_, { target }) => state => { + const { name } = target if (target.nodeName.toLowerCase() === 'input' && target.type.toLowerCase() === 'checkbox') { return { - [target.name]: target.checked, + [name]: target.checked, } } const { value } = target - return typeof value === 'string' ? value.trim() : value + return { + [name]: typeof value === 'string' ? value.trim() : value, + } } module.exports = ({ Component, createElement, PropTypes }) => { From 944b4658cc592fef2129953259484d04d9de57d8 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 29 Oct 2018 17:23:12 +0100 Subject: [PATCH 5/5] =?UTF-8?q?fix(toggleState):=20target=20=E2=86=92=20cu?= =?UTF-8?q?rrentTarget?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/factory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/factory.js b/src/factory.js index 7676a19..217b8fb 100644 --- a/src/factory.js +++ b/src/factory.js @@ -39,7 +39,7 @@ const defaultEffects = { ? target.checked : target.value, }), - toggleState: (_, { target: { name } }) => state => ({ [name]: !state[name] }), + toggleState: (_, { currentTarget: { name } }) => state => ({ [name]: !state[name] }), } defaultEffects.linkState.trim = (_, { target }) => state => {