UNPKG

@vimeo/iris

Version:
139 lines (132 loc) 7.04 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var tslib_es6 = require('../../tslib.es6-3ec409b7.js'); var React = require('react'); var typography_Text_Text_style = require('./Text.style.js'); var utils_HOCs_withIris = require('../../utils/HOCs/withIris.js'); var utils_hooks_useLayoutStyles = require('../../utils/hooks/useLayoutStyles.js'); var utils_DOM_geometry = require('../../utils/DOM/geometry.js'); var utils_css = require('../../utils/css.js'); require('styled-components'); require('polished'); require('../typography.js'); require('../../tokens/core.js'); require('../../tokens/color/index.js'); require('../../tokens/color/background/background.js'); require('../../tokens/util/readToken.js'); require('../../color/colors.js'); require('../../tokens/util/clamp.js'); require('../../tokens/color/format/format.js'); require('../../tokens/color/format/primary.js'); require('../../tokens/color/format/secondary.js'); require('../../tokens/color/format/tertiary.js'); require('../../tokens/color/rainbow/rainbow.js'); require('../../tokens/color/rainbow/conic/index.js'); require('../../tokens/color/rainbow/conic/sm.js'); require('../../tokens/color/rainbow/conic/xl.js'); require('../../tokens/color/rainbow/linear/index.js'); require('../../tokens/color/rainbow/linear/sm.js'); require('../../tokens/color/rainbow/linear/xl.js'); require('../../tokens/color/livestream/livestream.js'); require('../../tokens/color/status/status.js'); require('../../tokens/color/status/caution.js'); require('../../tokens/color/status/negative.js'); require('../../tokens/color/status/positive.js'); require('../../tokens/color/stroke/stroke.js'); require('../../tokens/color/surface/surface.js'); require('../../tokens/color/text/text.js'); require('../../tokens/util/round.js'); require('../../tokens/color/upsell/upsell.js'); require('../../tokens/color/upsell/sm.js'); require('../../tokens/color/upsell/xl.js'); require('../../tokens/color/upsell/new.js'); require('../../tokens/edge/edge.js'); require('../../tokens/space/space.js'); require('../../tokens/typography/index.js'); require('../../tokens/typography/size/size.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var EditableText = utils_HOCs_withIris.withIris(EditableTextComponent); function EditableTextComponent(_a) { var children = _a.children, className = _a.className, _b = _a.element, element = _b === void 0 ? 'span' : _b, _c = _a.format, format = _c === void 0 ? 'soft' : _c, forwardRef = _a.forwardRef, onBlur = _a.onBlur, onChange = _a.onChange, onFocus = _a.onFocus, onKeyUp = _a.onKeyUp, placeholder = _a.placeholder, size = _a.size, style = _a.style, props = tslib_es6.__rest(_a, ["children", "className", "element", "format", "forwardRef", "onBlur", "onChange", "onFocus", "onKeyUp", "placeholder", "size", "style"]); var _d = tslib_es6.__read(React.useReducer(reducer, { text: children, width: 0, focus: false, }), 2), state = _d[0], dispatch = _d[1]; var text = state.text, width = state.width, focus = state.focus; var textRef = React.useRef(null); var inputRef = React.useRef(null); var _e = tslib_es6.__read(utils_hooks_useLayoutStyles.useLayoutStyles(style), 2), layoutStyles = _e[0], displayStyles = _e[1]; React.useEffect(function () { var payload = utils_DOM_geometry.geometry(textRef.current).width; if (width !== payload) dispatch(['widthSet', payload]); }, [text, width]); function doFocus(event) { var _a; onFocus && onFocus(event); dispatch(['focusSet', true]); (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus(); } function doBlur(event) { var _a; onBlur && onBlur(event); dispatch(['focusSet', false]); (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.blur(); } function doChange(event) { onChange && onChange(event); dispatch(['textSet', event.target.value]); } function doKeyUp(event) { var _a; onKeyUp && onKeyUp(event); if (event.key === 'Enter') (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.blur(); } return (React__default["default"].createElement("div", { style: tslib_es6.__assign({ position: 'relative', display: 'inline-block' }, layoutStyles), className: className }, React__default["default"].createElement(typography_Text_Text_style.Text, tslib_es6.__assign({ as: element, children: text.length > 0 ? text : placeholder, className: className, format: format, onClick: doFocus, ref: textRef, size: size }, props, { style: tslib_es6.__assign(tslib_es6.__assign({}, displayStyles), { opacity: focus ? 0 : 1, margin: 0 }) })), React__default["default"].createElement(typography_Text_Text_style.Input, tslib_es6.__assign({ className: className, defaultValue: text, format: format, onBlur: doBlur, onChange: doChange, onFocus: doFocus, onKeyUp: doKeyUp, ref: assignRefs(forwardRef, inputRef), size: size, type: "text" }, props, { style: tslib_es6.__assign(tslib_es6.__assign({}, displayStyles), { width: width, opacity: focus ? 1 : 0, margin: 0 }) })), React__default["default"].createElement(utils_css.Focus, { parent: typography_Text_Text_style.Input }))); } function reducer(state, _a) { var _b = tslib_es6.__read(_a, 2), type = _b[0], payload = _b[1]; switch (type) { case 'textSet': return tslib_es6.__assign(tslib_es6.__assign({}, state), { text: withSpaces(payload) }); case 'widthSet': return tslib_es6.__assign(tslib_es6.__assign({}, state), { width: payload }); case 'focusSet': return tslib_es6.__assign(tslib_es6.__assign({}, state), { focus: payload }); } } var withSpaces = function (string) { return string.replace(/ /g, '\u00a0'); }; function assignRefs() { var refs = []; for (var _i = 0; _i < arguments.length; _i++) { refs[_i] = arguments[_i]; } return function (node) { var e_1, _a; try { for (var refs_1 = tslib_es6.__values(refs), refs_1_1 = refs_1.next(); !refs_1_1.done; refs_1_1 = refs_1.next()) { var ref = refs_1_1.value; if (typeof ref === 'function') { ref(node); } else if (ref) { ref.current = node; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (refs_1_1 && !refs_1_1.done && (_a = refs_1.return)) _a.call(refs_1); } finally { if (e_1) throw e_1.error; } } }; } exports.EditableText = EditableText;