@chayns-components/date
Version:
A set of beautiful React components for developing your own applications with chayns.
152 lines (151 loc) • 5.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("motion/react");
var _react2 = _interopRequireWildcard(require("react"));
var _uuid = require("uuid");
var _openingTimes = require("../../../types/openingTimes");
var _OpeningInput = _interopRequireDefault(require("./opening-input/OpeningInput"));
var _OpeningInputs = require("./OpeningInputs.styles");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
const OpeningInputs = ({
times,
isDisabled,
onRemove,
onAdd,
onInvalid,
id,
onChange,
currentDayId,
editMode = false,
closedText = ''
}) => {
const [newTimes, setNewTimes] = (0, _react2.useState)();
const [invalidTimes, setInvalidTimes] = (0, _react2.useState)([]);
(0, _react2.useEffect)(() => {
setNewTimes(times);
}, [times]);
const handleAdd = (0, _react2.useCallback)(() => {
const defaultTime = {
start: '08:00',
end: '18:00',
id: (0, _uuid.v4)()
};
setNewTimes(prevState => prevState ? [...prevState, defaultTime] : [defaultTime]);
if (typeof onAdd === 'function') {
onAdd(defaultTime, id);
}
}, [id, onAdd]);
const handleRemove = (0, _react2.useCallback)(timeId => {
setNewTimes(prevState => (prevState ?? []).filter(time => time.id !== timeId));
if (typeof onRemove === 'function') {
onRemove(timeId);
}
}, [onRemove]);
(0, _react2.useEffect)(() => {
const result = [];
for (let i = 0; i < times.length; i++) {
const currentTime = times[i];
const prevTime = times[i - 1];
if (currentTime) {
const currStart = new Date(`2000-01-01T${currentTime.start}`);
const currEnd = new Date(`2000-01-01T${currentTime.end}`);
if (currStart >= currEnd) {
result.push(currentTime);
}
if (prevTime) {
const prevEnd = new Date(`2000-01-01T${prevTime.end}`);
if (prevEnd > currStart) {
result.push(prevTime, currentTime);
}
}
}
}
const invalidTimeIds = result.map(({
id: invalidId
}) => invalidId);
setInvalidTimes(invalidTimeIds);
if (typeof onInvalid === 'function') {
onInvalid(id, invalidTimeIds);
}
}, [id, onInvalid, times]);
const handleChange = (0, _react2.useCallback)(newTime => {
setNewTimes(prevState => {
const updatedTimes = (prevState ?? []).map(time => {
if (time.id === newTime.id) {
return newTime;
}
return time;
});
if (typeof onChange === 'function') {
onChange(newTime);
}
return updatedTimes;
});
}, [onChange]);
const content = (0, _react2.useMemo)(() => {
const items = [];
if (!newTimes) {
return items;
}
newTimes.forEach(({
end,
start,
id: timeId
}, index) => {
if (!editMode) {
const text = isDisabled ? closedText : `${start} - ${end}`;
items.push(/*#__PURE__*/_react2.default.createElement(_OpeningInputs.StyledOpeningInputPreview, {
key: `opening-times-preview__${id}.${timeId}`
}, `${text}${currentDayId && newTimes.length > 1 && index === 0 ? ', ' : ''}`));
return;
}
if (index > 1) {
return;
}
let buttonType = _openingTimes.OpeningTimesButtonType.NONE;
if (index === 0 && times.length === 1 && !isDisabled) {
buttonType = _openingTimes.OpeningTimesButtonType.ADD;
} else if (index === 1 && !isDisabled) {
buttonType = _openingTimes.OpeningTimesButtonType.REMOVE;
}
items.push(/*#__PURE__*/_react2.default.createElement(_OpeningInput.default, {
key: `opening-times-input__${id}.${timeId}`,
start: start,
id: timeId,
end: end,
isDisabled: isDisabled,
isInvalid: invalidTimes.includes(timeId),
buttonType: buttonType,
onAdd: handleAdd,
onChange: time => handleChange(time),
onRemove: () => handleRemove(timeId)
}));
});
return items;
}, [closedText, currentDayId, editMode, handleAdd, handleChange, handleRemove, id, invalidTimes, isDisabled, newTimes, times.length]);
const gap = (0, _react2.useMemo)(() => {
if (newTimes && newTimes.length > 1 && editMode || !editMode && currentDayId) {
return '8px';
}
return 0;
}, [currentDayId, editMode, newTimes]);
return (0, _react2.useMemo)(() => /*#__PURE__*/_react2.default.createElement(_OpeningInputs.StyledOpeningInputs, {
$editMode: !currentDayId,
key: `opening-inputs__${id}`,
animate: {
gap
},
initial: {
gap: 0
}
}, /*#__PURE__*/_react2.default.createElement(_react.AnimatePresence, {
initial: false
}, content)), [content, currentDayId, gap, id]);
};
OpeningInputs.displayName = 'OpeningInputs';
var _default = exports.default = OpeningInputs;
//# sourceMappingURL=OpeningInputs.js.map