UNPKG

@selfcommunity/react-ui

Version:

React UI Components to integrate a Community created with SelfCommunity Platform.

151 lines (143 loc) • 8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = require("react"); const styles_1 = require("@mui/material/styles"); const react_intl_1 = require("react-intl"); const material_1 = require("@mui/material"); const classnames_1 = tslib_1.__importDefault(require("classnames")); const system_1 = require("@mui/system"); const nodes_1 = tslib_1.__importDefault(require("./nodes")); const LexicalComposer_1 = require("@lexical/react/LexicalComposer"); const LexicalContentEditable_1 = require("@lexical/react/LexicalContentEditable"); const ToolbarPlugin_1 = tslib_1.__importDefault(require("./plugins/ToolbarPlugin")); const constants_1 = require("./constants"); const HorizontalRulePlugin_1 = require("./plugins/HorizontalRulePlugin"); const LexicalRichTextPlugin_1 = require("./plugins/LexicalRichTextPlugin"); const LexicalErrorBoundary_1 = require("@lexical/react/LexicalErrorBoundary"); const plugins_1 = require("./plugins"); const OnBlurPlugin_1 = tslib_1.__importDefault(require("./plugins/OnBlurPlugin")); const OnFocusPlugin_1 = tslib_1.__importDefault(require("./plugins/OnFocusPlugin")); const LexicalLinkPlugin_1 = require("@lexical/react/LexicalLinkPlugin"); const FloatingLinkPlugin_1 = tslib_1.__importDefault(require("./plugins/FloatingLinkPlugin")); const ApiPlugin_1 = tslib_1.__importDefault(require("./plugins/ApiPlugin")); const LexicalHistoryPlugin_1 = require("@lexical/react/LexicalHistoryPlugin"); const LexicalListPlugin_1 = require("@lexical/react/LexicalListPlugin"); const classes = { root: `${constants_1.PREFIX}-root`, focused: `${constants_1.PREFIX}-focused`, toolbar: `${constants_1.PREFIX}-toolbar`, content: `${constants_1.PREFIX}-content`, placeholder: `${constants_1.PREFIX}-placeholder`, actions: `${constants_1.PREFIX}-actions` }; const Root = (0, styles_1.styled)(material_1.Box, { name: constants_1.PREFIX, slot: 'Root', overridesResolver: (props, styles) => { return [styles.root, props.className.includes(classes.toolbar) && styles.toolbar]; } })(({ theme }) => ({})); const editorTheme = { heading: { h1: `${constants_1.PREFIX}-h1`, h2: `${constants_1.PREFIX}-h2`, h3: `${constants_1.PREFIX}-h3`, h4: `${constants_1.PREFIX}-h4`, h5: `${constants_1.PREFIX}-h5`, h6: `${constants_1.PREFIX}-h6` }, link: `${constants_1.PREFIX}-link`, list: { listitem: `${constants_1.PREFIX}-listItem`, nested: { listitem: `${constants_1.PREFIX}-nestedListItem` }, olDepth: [`${constants_1.PREFIX}-ol1`, `${constants_1.PREFIX}-ol2`, `${constants_1.PREFIX}-ol3`, `${constants_1.PREFIX}-ol4`, `${constants_1.PREFIX}-ol5`], ul: `${constants_1.PREFIX}-ul` }, ltr: `${constants_1.PREFIX}-ltr`, paragraph: `${constants_1.PREFIX}-paragraph`, image: `${constants_1.PREFIX}-image`, quote: `${constants_1.PREFIX}-quote`, rtl: `${constants_1.PREFIX}-rtl`, text: { bold: `${constants_1.PREFIX}-textBold`, italic: `${constants_1.PREFIX}-textItalic`, strikethrough: `${constants_1.PREFIX}-textStrikethrough`, subscript: `${constants_1.PREFIX}-textSubscript`, superscript: `${constants_1.PREFIX}-textSuperscript`, underline: `${constants_1.PREFIX}-textUnderline`, underlineStrikethrough: `${constants_1.PREFIX}-textUnderlineStrikethrough` } }; /** * > API documentation for the Community-JS Editor component. Learn about the available props and the CSS API. * * * This component renders a text editor. * Take a look at our <strong>demo</strong> component [here](/docs/sdk/community-js/react-ui/Components/Editor) #### Import ```jsx import {Editor} from '@selfcommunity/react-ui'; ``` #### Component Name The name `SCEditor` can be used when providing style overrides in the theme. #### CSS |Rule Name|Global class|Description| |---|---|---| |root|.SCEditor-root|Styles applied to the root element.| |toolbar|.SCEditor-toolbar|Styles applied to the toolbar element.| |content|.SCEditor-content|Styles applied to the content element.| |placeholder|.SCEditor-placeholder|Styles applied to the placeholder element.| |actions|.SCEditor-actions|Styles applied to the actions section.| * @param inProps */ const Editor = (inProps, ref) => { // PROPS const props = (0, system_1.useThemeProps)({ props: inProps, name: constants_1.PREFIX }); const { id = 'editor', className = null, defaultValue = '', toolbar = false, uploadImage = false, editable = true, onChange = null, onFocus = null, onBlur = null } = props; const apiRef = (0, react_1.useRef)(); // STATE const [focused, setFocused] = (0, react_1.useState)(false); // HANDLERS const handleChange = (value) => { onChange && onChange(value); }; const handleError = (error, editor) => { console.log(error); }; const handleFocus = () => { apiRef.current.focus(); }; const handleHasFocus = (0, react_1.useCallback)((event) => { setFocused(true); onFocus && onFocus(event); }, [onFocus]); const handleHasBlur = (0, react_1.useCallback)((event) => { setFocused(false); onBlur && onBlur(event); }, [onBlur]); // EXPOSED METHODS (0, react_1.useImperativeHandle)(ref, () => ({ focus: () => { apiRef.current.focus(); } })); // RENDER // eslint-disable-next-line @typescript-eslint/ban-ts-ignore // @ts-ignore const initialConfig = (0, react_1.useMemo)(() => ({ namespace: 'LexicalEditor', editable: editable, onError: handleError, nodes: [...nodes_1.default], theme: editorTheme }), [editable]); return ((0, jsx_runtime_1.jsx)(Root, Object.assign({ id: id, className: (0, classnames_1.default)(classes.root, className, { [classes.toolbar]: toolbar, [classes.focused]: focused }) }, { children: (0, jsx_runtime_1.jsxs)(LexicalComposer_1.LexicalComposer, Object.assign({ initialConfig: initialConfig }, { children: [toolbar ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(ToolbarPlugin_1.default, { uploadImage: uploadImage }), (0, jsx_runtime_1.jsx)(LexicalListPlugin_1.ListPlugin, {}), (0, jsx_runtime_1.jsx)(HorizontalRulePlugin_1.HorizontalRulePlugin, {})] })) : ((0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ className: classes.actions, direction: "row" }, { children: [uploadImage && (0, jsx_runtime_1.jsx)(plugins_1.ImagePlugin, {}), (0, jsx_runtime_1.jsx)(plugins_1.EmojiPlugin, {})] }))), (0, jsx_runtime_1.jsx)(LexicalRichTextPlugin_1.RichTextPlugin, { contentEditable: (0, jsx_runtime_1.jsx)(LexicalContentEditable_1.ContentEditable, { className: classes.content }), placeholder: (0, jsx_runtime_1.jsx)(material_1.Box, Object.assign({ className: classes.placeholder, onClick: handleFocus }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.editor.placeholder", defaultMessage: "ui.editor.placeholder" }) })), ErrorBoundary: LexicalErrorBoundary_1.LexicalErrorBoundary }), (0, jsx_runtime_1.jsx)(plugins_1.DefaultHtmlValuePlugin, { defaultValue: defaultValue }), (0, jsx_runtime_1.jsx)(LexicalHistoryPlugin_1.HistoryPlugin, {}), (0, jsx_runtime_1.jsx)(plugins_1.OnChangePlugin, { onChange: handleChange }), (0, jsx_runtime_1.jsx)(OnBlurPlugin_1.default, { onBlur: handleHasBlur }), (0, jsx_runtime_1.jsx)(OnFocusPlugin_1.default, { onFocus: handleHasFocus }), (0, jsx_runtime_1.jsx)(plugins_1.AutoLinkPlugin, {}), (0, jsx_runtime_1.jsx)(plugins_1.MentionsPlugin, {}), (0, jsx_runtime_1.jsx)(LexicalLinkPlugin_1.LinkPlugin, {}), (0, jsx_runtime_1.jsx)(FloatingLinkPlugin_1.default, {}), (0, jsx_runtime_1.jsx)(ApiPlugin_1.default, { ref: apiRef })] })) }))); }; exports.default = (0, react_1.forwardRef)(Editor);