UNPKG

@sanity/form-builder

Version:
111 lines (110 loc) • 7.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _types = require("@sanity/types"); var _changeIndicators = require("@sanity/base/change-indicators"); var PathUtils = _interopRequireWildcard(require("@sanity/util/paths")); var _ui = require("@sanity/ui"); var _autoId = require("@reach/auto-id"); var _components = require("@sanity/base/components"); var _PatchEvent = require("../../PatchEvent"); var _withDocument = _interopRequireDefault(require("../../utils/withDocument")); var _withValuePath = _interopRequireDefault(require("../../utils/withValuePath")); var _slugify = require("./utils/slugify"); var _useAsync3 = require("./utils/useAsync"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function getNewFromSource(source, valuePath, document) { var parentPath = valuePath.slice(0, -1); var parent = PathUtils.get(document, parentPath); return Promise.resolve(typeof source === 'function' ? source(document, { parentPath, parent }) : PathUtils.get(document, source)); } var SlugInput = /*#__PURE__*/_react.default.forwardRef(function SlugInput(props, forwardedRef) { var _type$options; var value = props.value, compareValue = props.compareValue, type = props.type, level = props.level, markers = props.markers, onChange = props.onChange, onFocus = props.onFocus, getValuePath = props.getValuePath, document = props.document, readOnly = props.readOnly, presence = props.presence; var sourceField = (_type$options = type.options) === null || _type$options === void 0 ? void 0 : _type$options.source; var inputId = (0, _autoId.useId)(); var errors = (0, _react.useMemo)(() => markers.filter(_types.isValidationErrorMarker), [markers]); var updateSlug = _react.default.useCallback(nextSlug => { if (!nextSlug) { onChange(_PatchEvent.PatchEvent.from((0, _PatchEvent.unset)([]))); return; } onChange(_PatchEvent.PatchEvent.from((0, _PatchEvent.setIfMissing)({ _type: type.name }), (0, _PatchEvent.set)(nextSlug, ['current']))); }, [onChange, type.name]); var _useAsync = (0, _useAsync3.useAsync)(() => { if (!sourceField) { return Promise.reject(new Error("Source is missing. Check source on type \"".concat(type.name, "\" in schema"))); } return getNewFromSource(sourceField, getValuePath(), document).then(newFromSource => (0, _slugify.slugify)(newFromSource || '', type)).then(newSlug => updateSlug(newSlug)); }, [getValuePath, updateSlug, document, type]), _useAsync2 = _slicedToArray(_useAsync, 2), generateState = _useAsync2[0], handleGenerateSlug = _useAsync2[1]; var isUpdating = (generateState === null || generateState === void 0 ? void 0 : generateState.status) === 'pending'; var handleChange = _react.default.useCallback(event => updateSlug(event.currentTarget.value), [updateSlug]); var handleFocus = _react.default.useCallback(() => onFocus(['current']), [onFocus]); return /*#__PURE__*/_react.default.createElement(_changeIndicators.ChangeIndicatorCompareValueProvider, { value: value === null || value === void 0 ? void 0 : value.current, compareValue: compareValue === null || compareValue === void 0 ? void 0 : compareValue.current }, /*#__PURE__*/_react.default.createElement(_components.FormField, { title: type.title, description: type.description, level: level, __unstable_markers: markers, __unstable_presence: presence, inputId: inputId }, /*#__PURE__*/_react.default.createElement(_ui.Stack, { space: 3 }, /*#__PURE__*/_react.default.createElement(_ui.Flex, null, /*#__PURE__*/_react.default.createElement(_ui.Box, { flex: 1 }, /*#__PURE__*/_react.default.createElement(_ui.TextInput, { id: inputId, ref: forwardedRef, customValidity: errors.length > 0 ? errors[0].item.message : '', disabled: isUpdating, onChange: handleChange, onFocus: handleFocus, value: (value === null || value === void 0 ? void 0 : value.current) || '', readOnly: readOnly }), (generateState === null || generateState === void 0 ? void 0 : generateState.status) === 'error' && /*#__PURE__*/_react.default.createElement(_ui.Card, { padding: 2, tone: "critical" }, generateState.error.message)), sourceField && /*#__PURE__*/_react.default.createElement(_ui.Box, { marginLeft: 1 }, /*#__PURE__*/_react.default.createElement(_ui.Button, { mode: "ghost", type: "button", disabled: readOnly || isUpdating, onClick: handleGenerateSlug, onFocus: handleFocus, text: (generateState === null || generateState === void 0 ? void 0 : generateState.status) === 'pending' ? 'Generating…' : 'Generate' })))))); }); var _default = (0, _withValuePath.default)((0, _withDocument.default)(SlugInput)); exports.default = _default;