@amaui/ui-react
Version:
UI for React
155 lines (152 loc) • 7.8 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
const _excluded = ["throwError", "onOpen", "onClose", "className", "children"],
_excluded2 = ["name", "description", "buttons", "throwError", "ButtonNegativeProps", "ButtonPositiveProps", "modal"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
import React from 'react';
import { is, setObjectValue } from '@amaui/utils';
import { classNames, style as styleMethod, useAmauiTheme } from '@amaui/style-react';
import ButtonElement from '../Button';
import ConfirmContext from './Context';
import ModalHeaderElement from '../ModalHeader';
import ModalFooterElement from '../ModalFooter';
import ModalTitleElement from '../ModalTitle';
import ModalMainElement from '../ModalMain';
import ModalTextElement from '../ModalText';
import ModalElement from '../Modal';
import { staticClassName } from '../utils';
const useStyle = styleMethod(theme => ({
root: {
'& .amaui-ModalMain-root': {
padding: `6px 0 10px`
},
'& .amaui-ModalFooter-root': {
padding: `12px 0 12px`
},
'& .amaui-Modal-background:not(.amaui-Modal-background-invisible)': {
background: theme.methods.palette.color.colorToRgb(theme.methods.palette.color.value('default', 10), theme.palette.light ? 20 : 40)
}
},
surface: {
'&.amaui-Surface-root': {
background: theme.palette.color.primary[theme.palette.light ? 99 : 5],
paddingBottom: '8px'
}
}
}), {
name: 'amaui-Confirm'
});
const Confirm = /*#__PURE__*/React.forwardRef((props_, ref) => {
const theme = useAmauiTheme();
const props = React.useMemo(() => _objectSpread(_objectSpread(_objectSpread({}, theme?.ui?.elements?.all?.props?.default), theme?.ui?.elements?.amauiConfirm?.props?.default), props_), [props_]);
const ModalHeader = React.useMemo(() => theme?.elements?.ModalHeader || ModalHeaderElement, [theme]);
const ModalFooter = React.useMemo(() => theme?.elements?.ModalFooter || ModalFooterElement, [theme]);
const ModalTitle = React.useMemo(() => theme?.elements?.ModalTitle || ModalTitleElement, [theme]);
const ModalMain = React.useMemo(() => theme?.elements?.ModalMain || ModalMainElement, [theme]);
const ModalText = React.useMemo(() => theme?.elements?.ModalText || ModalTextElement, [theme]);
const Modal = React.useMemo(() => theme?.elements?.Modal || ModalElement, [theme]);
const Button = React.useMemo(() => theme?.elements?.Button || ButtonElement, [theme]);
const {
throwError,
onOpen,
onClose,
className,
children
} = props,
other = _objectWithoutProperties(props, _excluded);
const {
classes
} = useStyle();
const [openModal, setOpenModal] = React.useState(false);
const refs = {
value: React.useRef({}),
modal: React.useRef(),
props: React.useRef(undefined),
promise: {
resolve: React.useRef(undefined),
reject: React.useRef(undefined)
}
};
refs.props.current = props;
const open = React.useCallback(value => {
if (!openModal) {
refs.modal.current = _objectSpread({}, value);
// Defaults
refs.modal.current.name = value?.name !== undefined ? value?.name : 'Confirmation';
refs.modal.current.description = value?.description !== undefined ? value?.description : 'Are you sure you want to proceed?';
if (refs.modal.current.buttons?.negative?.text === undefined) setObjectValue(refs.modal.current, 'buttons.negative.text', '');
if (refs.modal.current.buttons?.positive?.text === undefined) setObjectValue(refs.modal.current, 'buttons.positive.text', '');
refs.modal.current.buttons.negative.text = value?.buttons?.negative?.text !== undefined ? value?.buttons?.negative?.text : 'Cancel';
refs.modal.current.buttons.positive.text = value?.buttons?.positive?.text !== undefined ? value?.buttons?.positive?.text : 'Confirm';
refs.modal.current.throwError = value?.throwError !== undefined ? value.throwError : refs.props.current.throwError;
const promise = new Promise((resolve, reject) => {
refs.promise.resolve.current = resolve;
refs.promise.reject.current = reject;
});
setOpenModal(true);
if (is('function', onOpen)) onOpen();
return promise;
}
}, [openModal, onOpen]);
const close = React.useCallback(function () {
let confirm = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (openModal) {
setOpenModal(false);
if (is('function', onClose)) onClose();
// Resolve or reject
if (confirm) refs.promise.resolve.current?.(confirm);else !refs.modal.current.throwError ? refs.promise.resolve.current?.(false) : refs.promise.reject.current?.();
refs.promise.resolve.current = undefined;
refs.promise.reject.current = undefined;
}
}, [openModal, onClose]);
const _ref = refs.modal.current || {},
{
name,
description,
buttons,
throwError: throwError_,
ButtonNegativeProps,
ButtonPositiveProps,
modal
} = _ref,
otherModal = _objectWithoutProperties(_ref, _excluded2);
// Add to the value
refs.value.current.open = open;
refs.value.current.close = close;
return /*#__PURE__*/React.createElement(ConfirmContext.Provider, {
value: refs.value.current
}, children, /*#__PURE__*/React.createElement(Modal, _extends({
ref: ref,
open: openModal,
onClose: close,
SurfaceProps: {
tonal: true,
color: 'primary',
className: classNames([classes.surface])
},
className: classNames([staticClassName('Confirm', theme) && [`amaui-Confirm-root`], className, classes.root])
}, other, otherModal), is('function', modal) ? modal({
resolve: refs.promise.resolve.current,
reject: refs.promise.reject.current
}) : /*#__PURE__*/React.createElement(React.Fragment, null, name !== false && /*#__PURE__*/React.createElement(ModalHeader, null, /*#__PURE__*/React.createElement(ModalTitle, {
version: "t1",
weight: 500
}, name || 'Confirmation')), /*#__PURE__*/React.createElement(ModalMain, null, /*#__PURE__*/React.createElement(ModalText, {
version: "b1",
weight: 200
}, description !== undefined ? description : 'Are you sure you want to proceed?')), /*#__PURE__*/React.createElement(ModalFooter, null, /*#__PURE__*/React.createElement(Button, _extends({
version: "text",
color: "inherit",
tonal: true,
onClick: () => close(false)
}, ButtonNegativeProps), buttons?.negative?.text !== undefined ? buttons?.negative?.text : 'Cancel'), /*#__PURE__*/React.createElement(Button, _extends({
version: "text",
color: "inherit",
tonal: true,
onClick: () => close(true)
}, ButtonPositiveProps), buttons?.positive?.text !== undefined ? buttons?.positive?.text : 'Confirm')))));
});
Confirm.displayName = 'amaui-Confirm';
export default Confirm;