@vimeo/iris
Version:
Vimeo Design System
139 lines (132 loc) • 7.04 kB
JavaScript
'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;