UNPKG

react-powerplug

Version:
771 lines (679 loc) 20.8 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var _objectSpread = _interopDefault(require('@babel/runtime/helpers/builtin/objectSpread')); var _inheritsLoose = _interopDefault(require('@babel/runtime/helpers/builtin/inheritsLoose')); var _assertThisInitialized = _interopDefault(require('@babel/runtime/helpers/builtin/assertThisInitialized')); var _defineProperty = _interopDefault(require('@babel/runtime/helpers/builtin/defineProperty')); var React = require('react'); var _objectWithoutProperties = _interopDefault(require('@babel/runtime/helpers/builtin/objectWithoutProperties')); /* eslint-disable no-console */ var warn = function warn(condition, message, trace) { if (trace === void 0) { trace = true; } if (condition) { console.warn("[react-powerplug]: " + message); console.trace && trace && console.trace('Trace'); } }; var isFn = function isFn(prop) { return typeof prop === 'function'; }; /** * renderProps * is a render/children props interop. * will pick up the prop that was used, * or children if both are used */ var renderProps = function renderProps(_ref) { var children = _ref.children, render = _ref.render; if (process.env.NODE_ENV !== 'production') { warn(isFn(children) && isFn(render), 'You are using the children and render props together.\n' + 'This is impossible, therefore, only the children will be used.'); } var fn = isFn(children) ? children : render; for (var _len = arguments.length, props = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { props[_key - 1] = arguments[_key]; } return fn ? fn.apply(void 0, props) : null; }; var noop = function noop() {}; var State = /*#__PURE__*/ function (_Component) { _inheritsLoose(State, _Component); function State() { var _temp, _this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return (_temp = _this = _Component.call.apply(_Component, [this].concat(args)) || this, _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "state", _objectSpread({}, _this.props.initial)), _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "_setState", function (updater, cb) { if (cb === void 0) { cb = noop; } var _this$props$onChange = _this.props.onChange, onChange = _this$props$onChange === void 0 ? noop : _this$props$onChange; _this.setState(updater, function () { onChange(_this.state); cb(); }); }), _temp) || _assertThisInitialized(_this); } var _proto = State.prototype; _proto.render = function render() { return renderProps(this.props, { state: this.state, setState: this._setState }); }; return State; }(React.Component); var onChangeProp = function onChangeProp(originalOnChange, propName) { if (originalOnChange === void 0) { originalOnChange = noop; } return function (state) { originalOnChange(state[propName]); }; }; var Active = function Active(_ref) { var onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["onChange"]); return React.createElement(State, { initial: { active: false }, onChange: onChangeProp(onChange, 'active') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { active: state.active, bind: { onMouseDown: function onMouseDown() { return setState({ active: true }); }, onMouseUp: function onMouseUp() { return setState({ active: false }); } } }); }); }; var isElement = function isElement(element) { return typeof element.type === 'function'; }; var compose = function compose() { for (var _len = arguments.length, elements = new Array(_len), _key = 0; _key < _len; _key++) { elements[_key] = arguments[_key]; } var reversedElements = elements.reverse(); return function (composedProps) { // Stack children arguments recursively and pass // it down until the last component that render children // with these stacked arguments function stackProps(i, elements, propsList) { if (propsList === void 0) { propsList = []; } var element = elements[i]; var isTheLast = i === 0; // Check if is latest component. // If is latest then render children, // Otherwise continue stacking arguments var renderFn = function renderFn(props) { return isTheLast ? renderProps.apply(void 0, [composedProps].concat(propsList.concat(props))) : stackProps(i - 1, elements, propsList.concat(props)); }; // Clone a element if it's passed created as <Element initial={} /> // Or create it if passed as just Element var elementFn = isElement(element) ? React.cloneElement : React.createElement; return elementFn(element, {}, renderFn); } return stackProps(elements.length - 1, reversedElements); }; }; var Compose = function Compose(_ref) { var components = _ref.components, props = _objectWithoutProperties(_ref, ["components"]); return compose.apply(void 0, components)(props); }; var set = function set(updater, arg) { return typeof updater === 'function' ? updater(arg) : updater; }; var add = function add(value) { return function (state) { return { count: state.count + value }; }; }; var Counter = function Counter(_ref) { var _ref$initial = _ref.initial, initial = _ref$initial === void 0 ? 0 : _ref$initial, onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["initial", "onChange"]); return React.createElement(State, { initial: { count: initial }, onChange: onChangeProp(onChange, 'count') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { count: state.count, inc: function inc() { return setState(add(1)); }, dec: function dec() { return setState(add(-1)); }, incBy: function incBy(value) { return setState(add(value)); }, decBy: function decBy(value) { return setState(add(-value)); }, set: function set$$1(value) { return setState(function (s) { return { count: set(value, s.count) }; }); } }); }); }; var Focus = function Focus(_ref) { var onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["onChange"]); return React.createElement(State, { initial: { focused: false }, onChange: onChangeProp(onChange, 'focused') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { focused: state.focused, bind: { onFocus: function onFocus() { return setState({ focused: true }); }, onBlur: function onBlur() { return setState({ focused: false }); } } }); }); }; var FocusManager = function FocusManager(_ref) { var onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["onChange"]); var canBlur = true; return React.createElement(State, { initial: { focused: false }, onChange: onChangeProp(onChange, 'focused') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { focused: state.focused, blur: function blur() { if (state.focused) { document.activeElement.blur(); } }, bind: { tabIndex: -1, onBlur: function onBlur() { if (canBlur) { setState({ focused: false }); } }, onFocus: function onFocus() { setState({ focused: true }); }, onMouseDown: function onMouseDown() { canBlur = false; }, onMouseUp: function onMouseUp() { canBlur = true; } } }); }); }; var Form = function Form(_ref) { var _ref$initial = _ref.initial, initial = _ref$initial === void 0 ? {} : _ref$initial, onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["initial", "onChange"]); return React.createElement(State, { initial: _objectSpread({}, initial), onChange: onChange }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { values: _objectSpread({}, state), input: function input(id) { var value = state[id] || ''; var setValue = function setValue(value) { var _setState; return setState((_setState = {}, _setState[id] = value, _setState)); }; return { bind: { onChange: function onChange(event) { return setValue(event.target.value); }, value: value }, set: function set$$1(value) { return setState(function (s) { var _ref3; return _ref3 = {}, _ref3[id] = set(value, s.value), _ref3; }); }, value: value }; } }); }); }; var Hover = function Hover(_ref) { var onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["onChange"]); return React.createElement(State, { initial: { hovered: false }, onChange: onChangeProp(onChange, 'hovered') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { hovered: state.hovered, bind: { onMouseEnter: function onMouseEnter() { return setState({ hovered: true }); }, onMouseLeave: function onMouseLeave() { return setState({ hovered: false }); } } }); }); }; var Input = function Input(_ref) { var _ref$initial = _ref.initial, initial = _ref$initial === void 0 ? '' : _ref$initial, onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["initial", "onChange"]); return React.createElement(State, { initial: { value: initial }, onChange: onChangeProp(onChange, 'value') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { bind: { onChange: function onChange(event) { return setState({ value: event.target.value }); }, value: state.value }, set: function set$$1(value) { return setState(function (s) { return { value: set(value, s.value) }; }); }, value: state.value }); }); }; var Interval = /*#__PURE__*/ function (_Component) { _inheritsLoose(Interval, _Component); function Interval() { var _temp, _this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return (_temp = _this = _Component.call.apply(_Component, [this].concat(args)) || this, _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "state", { times: 0 }), _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "intervalId", undefined), _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "_clearIntervalIfNecessary", function () { if (_this.intervalId) { _this.intervalId = clearInterval(_this.intervalId); } }), _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "_setIntervalIfNecessary", function (delay) { if (Number.isFinite(delay)) { _this.intervalId = setInterval(function () { return _this.setState(function (s) { return { times: s.times + 1 }; }); }, delay); } }), _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "stop", function () { _this._clearIntervalIfNecessary(); }), _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "start", function (delay) { var _delay = typeof delay === 'number' ? delay : _this.props.delay != null ? _this.props.delay : 1000; _this._setIntervalIfNecessary(_delay); }), _defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "toggle", function () { _this.intervalId ? _this.stop() : _this.start(); }), _temp) || _assertThisInitialized(_this); } var _proto = Interval.prototype; _proto.componentDidMount = function componentDidMount() { this.start(); }; _proto.componentDidUpdate = function componentDidUpdate(prevProps) { if (prevProps.delay !== this.props.delay) { this.stop(); this.start(); } }; _proto.componentWillUnmount = function componentWillUnmount() { this.stop(); }; _proto.render = function render() { return renderProps(this.props, { start: this.start, stop: this.stop, toggle: this.toggle }); }; return Interval; }(React.Component); var complement = function complement(fn) { return function () { return !fn.apply(void 0, arguments); }; }; var List = function List(_ref) { var _ref$initial = _ref.initial, initial = _ref$initial === void 0 ? [] : _ref$initial, onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["initial", "onChange"]); return React.createElement(State, { initial: { list: initial }, onChange: onChangeProp(onChange, 'list') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { list: state.list, first: function first() { return state.list[0]; }, last: function last() { return state.list[Math.max(0, state.list.length - 1)]; }, set: function set$$1(list) { return setState(function (s) { return { list: set(list, s.list) }; }); }, push: function push() { for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) { values[_key] = arguments[_key]; } return setState(function (s) { return { list: s.list.concat(values) }; }); }, pull: function pull(predicate) { return setState(function (s) { return { list: s.list.filter(complement(predicate)) }; }); }, sort: function sort(compareFn) { return setState(function (s) { return { list: s.list.concat().sort(compareFn) }; }); } }); }); }; var Map = function Map(_ref) { var _ref$initial = _ref.initial, initial = _ref$initial === void 0 ? {} : _ref$initial, onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["initial", "onChange"]); return React.createElement(State, { initial: _objectSpread({}, initial), onChange: onChange }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { values: state, set: function set(key, value) { var _setState; return setState((_setState = {}, _setState[key] = value, _setState)); }, over: function over(key, fn) { return setState(function (s) { var _ref3; return _ref3 = {}, _ref3[key] = fn(s[key]), _ref3; }); }, get: function get(key) { return state[key]; } }); }); }; var unique = function unique(arr) { return arr.filter(function (d, i) { return arr.indexOf(d) === i; }); }; var hasItem = function hasItem(arr, item) { return arr.indexOf(item) !== -1; }; var removeItem = function removeItem(arr, item) { return hasItem(arr, item) ? arr.filter(function (d) { return d !== item; }) : arr; }; var addUnique = function addUnique(arr, item) { return hasItem(arr, item) ? arr : arr.concat([item]); }; var Set = function Set(_ref) { var _ref$initial = _ref.initial, initial = _ref$initial === void 0 ? [] : _ref$initial, onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["initial", "onChange"]); return React.createElement(State, { initial: { values: unique(initial) }, onChange: onChangeProp(onChange, 'values') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { values: state.values, add: function add(key) { return setState({ values: addUnique(state.values, key) }); }, clear: function clear() { return setState({ values: [] }); }, remove: function remove(key) { return setState({ values: removeItem(state.values, key) }); }, has: function has(key) { return hasItem(state.values, key); } }); }); }; var Toggle = function Toggle(_ref) { var _ref$initial = _ref.initial, initial = _ref$initial === void 0 ? false : _ref$initial, onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["initial", "onChange"]); return React.createElement(State, { initial: { on: initial }, onChange: onChangeProp(onChange, 'on') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { on: state.on, toggle: function toggle() { return setState(function (s) { return { on: !s.on }; }); }, set: function set$$1(value) { return setState(function (s) { return { on: set(value, s.on) }; }); } }); }); }; var Touch = function Touch(_ref) { var onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["onChange"]); return React.createElement(State, { initial: { touched: false }, onChange: onChangeProp(onChange, 'touched') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { touched: state.touched, bind: { onTouchStart: function onTouchStart() { return setState({ touched: true }); }, onTouchEnd: function onTouchEnd() { return setState({ touched: false }); } } }); }); }; var Value = function Value(_ref) { var initial = _ref.initial, onChange = _ref.onChange, props = _objectWithoutProperties(_ref, ["initial", "onChange"]); return React.createElement(State, { initial: { value: initial }, onChange: onChangeProp(onChange, 'value') }, function (_ref2) { var state = _ref2.state, setState = _ref2.setState; return renderProps(props, { value: state.value, set: function set$$1(value) { return setState(function (s) { return { value: set(value, s.value) }; }); } }); }); }; var composeEvents = function composeEvents() { for (var _len = arguments.length, objEvents = new Array(_len), _key = 0; _key < _len; _key++) { objEvents[_key] = arguments[_key]; } return objEvents.reverse().reduce(function (allEvents, events) { var append = {}; var _loop = function _loop(key) { append[key] = allEvents[key] ? // Already have this event: let's merge function () { events[key].apply(events, arguments); allEvents[key].apply(allEvents, arguments); } : // Don't have this event yet: just assign the event events[key]; }; for (var key in events) { _loop(key); } return _objectSpread({}, allEvents, append); }); }; exports.Active = Active; exports.Compose = Compose; exports.Counter = Counter; exports.Focus = Focus; exports.FocusManager = FocusManager; exports.Form = Form; exports.Hover = Hover; exports.Input = Input; exports.Interval = Interval; exports.List = List; exports.Map = Map; exports.Set = Set; exports.State = State; exports.Toggle = Toggle; exports.Touch = Touch; exports.Value = Value; exports.compose = compose; exports.composeEvents = composeEvents; exports.renderProps = renderProps;