diff --git a/src/driver/connect.js b/src/driver/connect.js index 76d633a..c526482 100644 --- a/src/driver/connect.js +++ b/src/driver/connect.js @@ -1,16 +1,43 @@ import React from 'react' -export default function connect(core) { +function isObject(target) { + return typeof target === 'object' && target !== null +} + +function link(instance, sources) { + const wrappedMethods = {/* sources[key] -> wrappedMethods.method */} + const map = new Map(/* sources.creator -> wrappedMethods.method */) + + function dispatch(...args) { + if (Object.values(sources).includes(args[0])) { + map.get(args[0])(...args.slice(1)) + } else { + setTimeout( + instance.setState.bind(instance, ...args), + ) + } + } + + Object.entries(sources).forEach(([key, createMethod]) => { + const method = createMethod(dispatch) + wrappedMethods[key] = method + map.set(createMethod, method) + }) + + return wrappedMethods +} + +export default function connect(mapping) { return function linkComponent(ComponentClass) { return class AwesomeApp extends React.PureComponent { static displayName = `Driven${ComponentClass.name}` state = {} - boundCore = core(this) + boundCore = link(this, mapping) render() { return ( - + ) } } diff --git a/src/driver/core.js b/src/driver/core.js index eae8012..ea80664 100644 --- a/src/driver/core.js +++ b/src/driver/core.js @@ -1,5 +1,3 @@ -import link from './link' - import DOMHelper, { REPO_TYPE_PRIVATE } from '../utils/DOMHelper' import GitHubHelper, { NOT_FOUND, BAD_CREDENTIALS } from '../utils/GitHubHelper' import storageHelper from '../utils/storageHelper' diff --git a/src/driver/link.js b/src/driver/link.js deleted file mode 100644 index 2e1a5e7..0000000 --- a/src/driver/link.js +++ /dev/null @@ -1,20 +0,0 @@ -export default function link(setState, sources) { - const wrappedMethods = {/* sources[key] -> wrappedMethods.method */} - const map = new Map(/* sources.creator -> wrappedMethods.method */) - - function dispatch(...args) { - if (Object.values(sources).includes(args[0])) { - map.get(args[0])(...args.slice(1)) - } else { - setState(...args) - } - } - - Object.entries(sources).forEach(([key, createMethod]) => { - const method = createMethod(dispatch) - wrappedMethods[key] = method - map.set(createMethod, method) - }) - - return wrappedMethods -}