UNPKG

@onesy/ui-react

Version:
343 lines (339 loc) 16.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _utils = require("@onesy/utils"); var _date = require("@onesy/date"); var _styleReact = require("@onesy/style-react"); var _IconMaterialTimerW = _interopRequireDefault(require("@onesy/icons-material-rounded-react/IconMaterialTimerW100")); var _IconMaterialPlayArrowW = _interopRequireDefault(require("@onesy/icons-material-rounded-react/IconMaterialPlayArrowW100")); var _IconMaterialPauseW = _interopRequireDefault(require("@onesy/icons-material-rounded-react/IconMaterialPauseW100")); var _IconMaterialStopW = _interopRequireDefault(require("@onesy/icons-material-rounded-react/IconMaterialStopW100")); var _IconMaterialFlagW = _interopRequireDefault(require("@onesy/icons-material-rounded-react/IconMaterialFlagW100")); var _Fade = _interopRequireDefault(require("../Fade")); var _Expand = _interopRequireDefault(require("../Expand")); var _Type = _interopRequireDefault(require("../Type")); var _Tooltip = _interopRequireDefault(require("../Tooltip")); var _Tree = _interopRequireDefault(require("../Tree")); var _Surface = _interopRequireDefault(require("../Surface")); var _Line = _interopRequireDefault(require("../Line")); var _IconButton = _interopRequireDefault(require("../IconButton")); var _utils2 = require("../utils"); var _jsxRuntime = require("react/jsx-runtime"); const _excluded = ["ref", "tonal", "color", "renderValue", "icon", "onStart", "onFlag", "onPause", "onStop", "onResume", "Icon", "IconStart", "IconPause", "IconFlag", "IconStop", "TreeProps", "TooltipProps", "IconButtonProps", "IconProps", "Component", "className"]; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } const useStyle = (0, _styleReact.style)(theme => ({ root: { minWidth: '300px', padding: `${theme.methods.space.value(3, 'px')} ${theme.methods.space.value(5, 'px')}`, borderRadius: theme.methods.shape.radius.value('rg', 'px') }, value: { marginTop: '8px' }, flags_wrapper: { width: '100%', paddingTop: theme.methods.space.value(1, 'px') }, flags: { width: '100%', maxHeight: '170px', overflowY: 'auto' }, flag: { width: '100%', paddingInlineStart: theme.methods.space.value(0.5, 'px') }, actions: { marginTop: '8px' } }), { name: 'onesy-Timer' }); const Timer = props_ => { var _theme$ui, _theme$ui2, _theme$elements, _theme$elements2, _theme$elements3, _theme$elements4, _theme$elements5, _theme$elements6, _theme$elements7, _theme$elements8; const theme = (0, _styleReact.useOnesyTheme)(); const l = theme.l; const props = _objectSpread(_objectSpread(_objectSpread({}, theme === null || theme === void 0 || (_theme$ui = theme.ui) === null || _theme$ui === void 0 || (_theme$ui = _theme$ui.elements) === null || _theme$ui === void 0 || (_theme$ui = _theme$ui.all) === null || _theme$ui === void 0 || (_theme$ui = _theme$ui.props) === null || _theme$ui === void 0 ? void 0 : _theme$ui.default), theme === null || theme === void 0 || (_theme$ui2 = theme.ui) === null || _theme$ui2 === void 0 || (_theme$ui2 = _theme$ui2.elements) === null || _theme$ui2 === void 0 || (_theme$ui2 = _theme$ui2.onesyTimer) === null || _theme$ui2 === void 0 || (_theme$ui2 = _theme$ui2.props) === null || _theme$ui2 === void 0 ? void 0 : _theme$ui2.default), props_); const Line = (theme === null || theme === void 0 || (_theme$elements = theme.elements) === null || _theme$elements === void 0 ? void 0 : _theme$elements.Line) || _Line.default; const Fade = (theme === null || theme === void 0 || (_theme$elements2 = theme.elements) === null || _theme$elements2 === void 0 ? void 0 : _theme$elements2.Fade) || _Fade.default; const Type = (theme === null || theme === void 0 || (_theme$elements3 = theme.elements) === null || _theme$elements3 === void 0 ? void 0 : _theme$elements3.Type) || _Type.default; const Expand = (theme === null || theme === void 0 || (_theme$elements4 = theme.elements) === null || _theme$elements4 === void 0 ? void 0 : _theme$elements4.Expand) || _Expand.default; const Tooltip = (theme === null || theme === void 0 || (_theme$elements5 = theme.elements) === null || _theme$elements5 === void 0 ? void 0 : _theme$elements5.Tooltip) || _Tooltip.default; const Tree = (theme === null || theme === void 0 || (_theme$elements6 = theme.elements) === null || _theme$elements6 === void 0 ? void 0 : _theme$elements6.Tree) || _Tree.default; const Surface = (theme === null || theme === void 0 || (_theme$elements7 = theme.elements) === null || _theme$elements7 === void 0 ? void 0 : _theme$elements7.Surface) || _Surface.default; const IconButton = (theme === null || theme === void 0 || (_theme$elements8 = theme.elements) === null || _theme$elements8 === void 0 ? void 0 : _theme$elements8.IconButton) || _IconButton.default; const { ref, tonal = true, color = 'primary', renderValue, icon = true, onStart: onStart_, onFlag: onFlag_, onPause: onPause_, onStop: onStop_, onResume: onResume_, Icon: Icon_ = _IconMaterialTimerW.default, IconStart = _IconMaterialPlayArrowW.default, IconPause = _IconMaterialPauseW.default, IconFlag = _IconMaterialFlagW.default, IconStop = _IconMaterialStopW.default, TreeProps: TreeProps_, TooltipProps: TooltipProps_, IconButtonProps: IconButtonProps_, IconProps: IconProps_, Component = 'div', className } = props, other = (0, _objectWithoutProperties2.default)(props, _excluded); const { classes } = useStyle(); const [status, setStatus] = _react.default.useState('initial'); const [flags, setFlags] = _react.default.useState([]); const [expand, setExpand] = _react.default.useState(); const [value, setValue] = _react.default.useState(0); const refs = { root: _react.default.useRef(undefined), start: _react.default.useRef(0), valuePaused: _react.default.useRef(0), value: _react.default.useRef(undefined), animationFrame: _react.default.useRef(undefined) }; refs.value.current = value; const clear = () => { cancelAnimationFrame(refs.animationFrame.current); }; _react.default.useEffect(() => { return () => { // Clean up clear(); }; }, []); const update = () => { setValue(refs.valuePaused.current + (_date.OnesyDate.milliseconds - refs.start.current)); refs.animationFrame.current = requestAnimationFrame(update); }; const onStart = event => { refs.start.current = _date.OnesyDate.milliseconds; // ~60+ fps refs.animationFrame.current = requestAnimationFrame(update); setStatus('running'); if ((0, _utils.is)('function', onStart_)) onStart_(event); }; const onFlag = event_0 => { if (!expand) setExpand(true); setFlags(values => [...values, refs.value.current]); if ((0, _utils.is)('function', onFlag_)) onFlag_(event_0); }; const onPause = event_1 => { clear(); // Remember previous value refs.valuePaused.current = refs.value.current; setStatus('paused'); if ((0, _utils.is)('function', onPause_)) onPause_(event_1); }; const onStop = event_2 => { clear(); setStatus('initial'); setExpand(false); setValue(0); refs.start.current = 0; refs.valuePaused.current = 0; refs.value.current = 0; if ((0, _utils.is)('function', onStop_)) onStop_(event_2); }; const onResume = event_3 => { // ~60+ fps refs.animationFrame.current = requestAnimationFrame(update); // Update start, valuePaused value refs.start.current = _date.OnesyDate.milliseconds; setStatus('running'); if ((0, _utils.is)('function', onResume_)) onResume_(event_3); }; const onExited = () => { setFlags([]); }; const IconProps = _objectSpread({}, IconProps_); const TooltipProps = _objectSpread({ portal: true, interactive: false }, TooltipProps_); const TreeProps = _objectSpread({ tonal, color: 'inherit' }, TreeProps_); const IconButtonProps = _objectSpread({ tonal, color: 'inherit', version: 'text' }, IconButtonProps_); const valueFormat = valueNew_ => { let valueNew = ''; const valueDuration = (0, _date.duration)(valueNew_, undefined, true, undefined, ['hour', 'minute', 'second', 'millisecond']); if (valueDuration.hour > 0) valueNew += `${(0, _utils.getLeadingZerosNumber)(valueDuration.hour)}:`; valueNew += `${(0, _utils.getLeadingZerosNumber)(valueDuration.minute || 0)}:`; valueNew += `${(0, _utils.getLeadingZerosNumber)(valueDuration.second || 0)}.`; valueNew += `${(0, _utils.getLeadingZerosNumber)(Math.floor((valueDuration.millisecond || 0) / 10))}`; return valueNew; }; const value_ = status === 'initial' ? '00:00.00' : valueFormat(value); return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Surface, _objectSpread(_objectSpread({ ref: item => { if (ref) { if ((0, _utils.is)('function', ref)) ref(item);else if (ref !== null && ref !== void 0 && ref.current) ref.current = item; } refs.root.current = item; }, tonal: tonal, color: color, gap: 0, direction: "column", align: "center", Component: Line, AdditionalProps: { Component }, className: (0, _styleReact.classNames)([(0, _utils2.staticClassName)('Timer', theme) && ['onesy-Timer-root'], className, classes.root]) }, other), {}, { children: [icon && /*#__PURE__*/(0, _jsxRuntime.jsx)(Icon_, _objectSpread(_objectSpread({ size: "medium" }, IconProps), {}, { style: _objectSpread({ marginBottom: 4 }, IconProps === null || IconProps === void 0 ? void 0 : IconProps.style) })), (0, _utils.is)('function', renderValue) ? renderValue(value_) : /*#__PURE__*/(0, _jsxRuntime.jsx)(Type, { version: "h1", className: (0, _styleReact.classNames)([(0, _utils2.staticClassName)('Timer', theme) && ['onesy-Timer-value'], classes.value]), children: value_ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Expand, { in: expand, parent: refs.root.current, onExited: onExited, className: (0, _styleReact.classNames)([(0, _utils2.staticClassName)('Timer', theme) && ['onesy-Timer-flags-wrapper'], classes.flags_wrapper]), children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Surface, { tonal: tonal, color: color, children: ({ palette }) => { return /*#__PURE__*/(0, _jsxRuntime.jsx)(Tree, _objectSpread(_objectSpread({ openDefault: true, middle: l('Flags'), indicator: true, indicatorPosition: "end", parent: refs.root.current, TreeProps: { className: (0, _styleReact.classNames)([(0, _utils2.staticClassName)('Timer', theme) && ['onesy-Timer-flags'], classes.flags]) } }, TreeProps), {}, { children: flags.map((item_0, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(Tree, _objectSpread({ icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconFlag, { size: "small", color: palette[40] }), middle: /*#__PURE__*/(0, _jsxRuntime.jsxs)(Line, { direction: "row", align: "center", justify: "space-between", className: (0, _styleReact.classNames)([classes.flag]), children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Type, { version: "b2", children: (0, _utils.getLeadingZerosNumber)(index + 1) }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(Type, { version: "b2", style: { opacity: '0.7' }, children: ["+", valueFormat(item_0 - (flags[index - 1] || 0))] }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Type, { version: "b2", children: valueFormat(item_0) })] }), noPadding: true, indicator: true, indicatorPosition: "end" }, TreeProps), index)) })); } }) }) }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(Line, { gap: 1, direction: "row", align: "center", justify: "center", className: (0, _styleReact.classNames)([(0, _utils2.staticClassName)('Timer', theme) && ['onesy-Timer-actions'], classes.actions]), children: [status === 'initial' && /*#__PURE__*/(0, _jsxRuntime.jsx)(Fade, { in: true, add: true, children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Tooltip, _objectSpread(_objectSpread({ name: l('Start') }, TooltipProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconButton, _objectSpread(_objectSpread({ onClick: onStart }, IconButtonProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconStart, {}) })) })) }) }), status === 'running' && /*#__PURE__*/(0, _jsxRuntime.jsx)(Fade, { in: true, add: true, children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", { children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Tooltip, _objectSpread(_objectSpread({ name: l('Flag') }, TooltipProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconButton, _objectSpread(_objectSpread({ onClick: onFlag }, IconButtonProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconFlag, {}) })) })), /*#__PURE__*/(0, _jsxRuntime.jsx)(Tooltip, _objectSpread(_objectSpread({ name: l('Pause') }, TooltipProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconButton, _objectSpread(_objectSpread({ onClick: onPause }, IconButtonProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconPause, {}) })) }))] }) }), status === 'paused' && /*#__PURE__*/(0, _jsxRuntime.jsx)(Fade, { in: true, add: true, children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", { children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Tooltip, _objectSpread(_objectSpread({ name: l('Stop') }, TooltipProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconButton, _objectSpread(_objectSpread({ onClick: onStop }, IconButtonProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconStop, {}) })) })), /*#__PURE__*/(0, _jsxRuntime.jsx)(Tooltip, _objectSpread(_objectSpread({ name: l('Resume') }, TooltipProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconButton, _objectSpread(_objectSpread({ onClick: onResume }, IconButtonProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconStart, {}) })) }))] }) })] })] })); }; Timer.displayName = 'onesy-Timer'; var _default = exports.default = Timer;