@ioca/react 1.5.18 → 1.5.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -33,6 +33,7 @@ const Editor = (props) => {
33
33
  const [memtionKeyword, setMemtionKeyword] = react.useState("");
34
34
  const [memtionActiveIndex, setMemtionActiveIndex] = react.useState(0);
35
35
  const [activeMemtionIndex, setActiveMemtionIndex] = react.useState(-1);
36
+ const activeMemtionIndexRef = react.useRef(-1);
36
37
  const memtionOptions = react.useMemo(() => {
37
38
  if (activeMemtionIndex < 0 || !memtion$1?.length)
38
39
  return [];
@@ -168,6 +169,7 @@ const Editor = (props) => {
168
169
  memtionTriggerRangeRef.current =
169
170
  selectionRef.current?.cloneRange() ?? null;
170
171
  pendingMemtionRef.current = true;
172
+ activeMemtionIndexRef.current = matchedIndex;
171
173
  setActiveMemtionIndex(matchedIndex);
172
174
  }
173
175
  }
@@ -217,8 +219,8 @@ const Editor = (props) => {
217
219
  setEditorValue(nextValue);
218
220
  }
219
221
  rememberSelection();
220
- if (activeMemtionIndex >= 0 && (pendingMemtionRef.current || memtionVisible)) {
221
- const active = memtion$1?.[activeMemtionIndex];
222
+ if (activeMemtionIndexRef.current >= 0 && (pendingMemtionRef.current || memtionVisible)) {
223
+ const active = memtion$1?.[activeMemtionIndexRef.current];
222
224
  if (!active) {
223
225
  hideMemtion();
224
226
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"editor.js","sources":["../../../../packages/components/editor/editor.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport xss from \"xss\";\nimport { IButton } from \"../button/type\";\nimport getControls, { exec, xssOptions } from \"./controls\";\nimport \"./index.css\";\nimport Memtion, {\n filterMemtionOptions,\n getMemtionReplaceRange,\n getMemtionText,\n getSelectionRect,\n insertMemtionOption,\n removeAdjacentMemtionTag,\n sanitizePlaintextOnMemtionHtml,\n} from \"./memtion\";\nimport { IEditor, IEditorMemtionOption } from \"./type\";\n\nconst controlBtnProps: IButton = {\n square: true,\n flat: true,\n size: \"small\",\n};\n\nconst Editor = (props: IEditor) => {\n const {\n ref,\n value = \"\",\n width,\n height = \"10em\",\n placeholder,\n autosize,\n border = true,\n mode = \"rich\",\n hideControl,\n addtionControls,\n memtion,\n className,\n style,\n onChange,\n onEnter,\n onFocus,\n onBlur,\n onPaste,\n onMouseUp,\n onKeyUp,\n onKeyDown,\n ...restProps\n } = props;\n const editorRef = useRef<HTMLDivElement>(null);\n const selectionRef = useRef<Range | null>(null);\n const memtionTriggerRangeRef = useRef<Range | null>(null);\n const pendingMemtionRef = useRef(false);\n const isPlaintextMode = mode === \"plaintext\";\n const isRichMode = mode === \"rich\";\n const isPlaintextOnMemtionMode = mode === \"plaintextOnMemtion\";\n const [memtionVisible, setMemtionVisible] = useState(false);\n const [memtionRect, setMemtionRect] = useState<DOMRect | null>(null);\n const [memtionKeyword, setMemtionKeyword] = useState(\"\");\n const [memtionActiveIndex, setMemtionActiveIndex] = useState(0);\n const [activeMemtionIndex, setActiveMemtionIndex] = useState(-1);\n const memtionOptions = useMemo(\n () => {\n if (activeMemtionIndex < 0 || !memtion?.length) return [];\n const active = memtion?.[activeMemtionIndex];\n return filterMemtionOptions(active?.options ?? [], memtionKeyword);\n },\n [memtion, memtionKeyword, activeMemtionIndex],\n );\n\n const sanitizeValue = (nextValue: string) => {\n if (isPlaintextMode) {\n return nextValue === \"\\n\" ? \"\" : nextValue;\n }\n\n const safeHtml = isPlaintextOnMemtionMode\n ? sanitizePlaintextOnMemtionHtml(xss(nextValue, xssOptions))\n : xss(nextValue, xssOptions);\n\n return safeHtml === \"<br>\" ? \"\" : safeHtml;\n };\n\n const syncHeight = () => {\n if (autosize && editorRef.current) {\n editorRef.current.style.height = `${editorRef.current.scrollHeight}px`;\n }\n };\n\n const rememberSelection = () => {\n if (!editorRef.current) return;\n\n const selection = window.getSelection();\n if (!selection?.rangeCount) return;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const parent =\n container.nodeType === Node.ELEMENT_NODE\n ? (container as Element)\n : container.parentElement;\n\n if (!parent || !editorRef.current.contains(parent)) return;\n\n selectionRef.current = range.cloneRange();\n };\n\n const setEditorValue = (nextValue: string) => {\n if (!editorRef.current) return;\n\n const safeValue = sanitizeValue(nextValue);\n\n if (isPlaintextMode) {\n editorRef.current.textContent = safeValue;\n return;\n }\n\n editorRef.current.innerHTML = safeValue;\n };\n\n const getEditorValue = (sanitize = false) => {\n const nextValue = !editorRef.current\n ? \"\"\n : isPlaintextMode\n ? (editorRef.current.textContent ?? \"\")\n : editorRef.current.innerHTML;\n\n return sanitize ? sanitizeValue(nextValue) : nextValue;\n };\n\n const hideMemtion = () => {\n pendingMemtionRef.current = false;\n memtionTriggerRangeRef.current = null;\n setMemtionVisible(false);\n setMemtionRect(null);\n setMemtionKeyword(\"\");\n setMemtionActiveIndex(0);\n setActiveMemtionIndex(-1);\n };\n\n const syncEditorState = () => {\n selectionRef.current = null;\n hideMemtion();\n };\n\n const insertMemtion = (option: IEditorMemtionOption) => {\n const activeMemtion = memtion?.[activeMemtionIndex];\n const replaceRange = getMemtionReplaceRange(\n memtionTriggerRangeRef.current,\n selectionRef.current,\n );\n\n const range = insertMemtionOption({\n editor: editorRef.current,\n range: replaceRange,\n mode,\n memtion: activeMemtion,\n option,\n sanitizeValue,\n });\n\n if (!range || !editorRef.current) return;\n\n selectionRef.current = range.cloneRange();\n hideMemtion();\n editorRef.current.dispatchEvent(new Event(\"input\", { bubbles: true }));\n };\n\n const handlePaste = (e) => {\n onPaste?.(e);\n\n if (e.defaultPrevented) return;\n\n e.preventDefault();\n\n const html = e.clipboardData.getData(\"text/html\");\n const text = e.clipboardData.getData(\"text/plain\");\n const pasteValue = isPlaintextMode\n ? text\n : html\n ? sanitizeValue(html)\n : text;\n\n exec(isPlaintextMode ? \"insertText\" : \"insertHTML\", false, pasteValue);\n };\n\n const handleKeyDown = (e) => {\n onKeyDown?.(e);\n\n if (e.defaultPrevented) return;\n\n if (\n !isPlaintextMode &&\n (e.key === \"Backspace\" || e.key === \"Delete\") &&\n removeAdjacentMemtionTag(editorRef.current, e.key)\n ) {\n e.preventDefault();\n rememberSelection();\n editorRef.current?.dispatchEvent(\n new Event(\"input\", { bubbles: true }),\n );\n return;\n }\n\n if (memtionVisible && e.key === \" \") {\n hideMemtion();\n }\n\n if (memtionVisible && memtionOptions.length) {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setMemtionActiveIndex((index) =>\n index + 1 >= memtionOptions.length ? 0 : index + 1,\n );\n return;\n case \"ArrowUp\":\n e.preventDefault();\n setMemtionActiveIndex((index) =>\n index - 1 < 0 ? memtionOptions.length - 1 : index - 1,\n );\n return;\n case \"Enter\":\n e.preventDefault();\n insertMemtion(memtionOptions[memtionActiveIndex]);\n return;\n default:\n break;\n }\n }\n\n if (memtion?.length) {\n const matchedIndex = memtion.findIndex((m) => e.key === m.key);\n if (matchedIndex >= 0) {\n rememberSelection();\n memtionTriggerRangeRef.current =\n selectionRef.current?.cloneRange() ?? null;\n pendingMemtionRef.current = true;\n setActiveMemtionIndex(matchedIndex);\n }\n }\n\n switch (e.key) {\n case \"Tab\":\n e.preventDefault();\n exec(\n isRichMode ? \"insertHTML\" : \"insertText\",\n false,\n isRichMode ? \"&#09;\" : \"\\t\",\n );\n break;\n case \"Enter\":\n if (e.shiftKey) {\n break;\n }\n if (!onEnter) break;\n e.preventDefault();\n onEnter(e);\n break;\n default:\n break;\n }\n };\n\n useEffect(() => {\n if (!editorRef.current) return;\n const nextValue = sanitizeValue(value);\n if (getEditorValue(true) === nextValue) return;\n\n setEditorValue(nextValue);\n syncEditorState();\n syncHeight();\n }, [autosize, mode, value]);\n\n useEffect(() => {\n if (!memtionOptions.length) {\n setMemtionActiveIndex(0);\n return;\n }\n\n setMemtionActiveIndex((index) =>\n index >= memtionOptions.length ? 0 : index,\n );\n }, [memtionOptions]);\n\n const handleInput = (e) => {\n const rawValue = getEditorValue();\n let nextValue = sanitizeValue(rawValue);\n\n if (\n isPlaintextOnMemtionMode &&\n rawValue !== nextValue &&\n editorRef.current\n ) {\n setEditorValue(nextValue);\n }\n\n if (!nextValue && rawValue && editorRef.current) {\n nextValue = \"\";\n setEditorValue(nextValue);\n }\n\n rememberSelection();\n\n if (activeMemtionIndex >= 0 && (pendingMemtionRef.current || memtionVisible)) {\n const active = memtion?.[activeMemtionIndex];\n if (!active) { hideMemtion(); return; }\n const memtionKey = active.key ?? \"@\";\n const memtionText = getMemtionText(\n memtionTriggerRangeRef.current,\n selectionRef.current,\n );\n\n if (!memtionText.startsWith(memtionKey) || /\\s/.test(memtionText)) {\n hideMemtion();\n } else {\n const keyword = memtionText.slice(memtionKey.length);\n pendingMemtionRef.current = false;\n setMemtionRect(getSelectionRect(selectionRef.current));\n setMemtionKeyword(keyword);\n setMemtionActiveIndex(0);\n setMemtionVisible(true);\n }\n }\n\n syncHeight();\n\n onChange?.(nextValue, e);\n };\n\n const handleFocus = (e) => {\n rememberSelection();\n onFocus?.(e);\n };\n\n const handleBlur = (e) => {\n hideMemtion();\n onBlur?.(e);\n };\n\n const handleMouseUp = (e) => {\n rememberSelection();\n onMouseUp?.(e);\n };\n\n const handleKeyUp = (e) => {\n rememberSelection();\n onKeyUp?.(e);\n };\n\n const handleRef = (node: HTMLDivElement | null) => {\n editorRef.current = node;\n\n if (typeof ref === \"function\") {\n ref(node);\n return;\n }\n\n if (ref) {\n ref.current = node;\n }\n };\n\n const getSelection = useCallback(\n () => selectionRef.current?.cloneRange() ?? null,\n [],\n );\n\n const controls = useMemo(\n () =>\n getControls({\n controlBtnProps,\n addtionControls,\n getSelection,\n }),\n [addtionControls, getSelection],\n );\n\n return (\n <div\n className={classNames(\"i-editor\", className, {\n \"i-editor-borderless\": !border,\n })}\n style={{\n ...style,\n [autosize ? \"minHeight\" : \"height\"]: height,\n width,\n }}\n >\n {!hideControl && (\n <div className=\"i-editor-controls\">{controls}</div>\n )}\n\n {memtion?.length && (\n <Memtion\n visible={memtionVisible}\n rect={memtionRect}\n options={memtionOptions}\n activeIndex={memtionActiveIndex}\n onActiveChange={setMemtionActiveIndex}\n onSelect={insertMemtion}\n />\n )}\n\n <div\n ref={handleRef}\n className=\"i-editor-content\"\n data-placeholder={placeholder}\n contentEditable={isPlaintextMode ? \"plaintext-only\" : true}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onMouseUp={handleMouseUp}\n onPaste={handlePaste}\n onInput={handleInput}\n onKeyUp={handleKeyUp}\n onKeyDown={handleKeyDown}\n {...restProps}\n />\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["memtion","useRef","useState","useMemo","filterMemtionOptions","sanitizePlaintextOnMemtionHtml","xss","xssOptions","getMemtionReplaceRange","insertMemtionOption","exec","removeAdjacentMemtionTag","useEffect","getMemtionText","getSelectionRect","useCallback","controls","getControls","_jsxs","classNames","_jsx","Memtion"],"mappings":"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"}
1
+ {"version":3,"file":"editor.js","sources":["../../../../packages/components/editor/editor.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport xss from \"xss\";\nimport { IButton } from \"../button/type\";\nimport getControls, { exec, xssOptions } from \"./controls\";\nimport \"./index.css\";\nimport Memtion, {\n filterMemtionOptions,\n getMemtionReplaceRange,\n getMemtionText,\n getSelectionRect,\n insertMemtionOption,\n removeAdjacentMemtionTag,\n sanitizePlaintextOnMemtionHtml,\n} from \"./memtion\";\nimport { IEditor, IEditorMemtionOption } from \"./type\";\n\nconst controlBtnProps: IButton = {\n square: true,\n flat: true,\n size: \"small\",\n};\n\nconst Editor = (props: IEditor) => {\n const {\n ref,\n value = \"\",\n width,\n height = \"10em\",\n placeholder,\n autosize,\n border = true,\n mode = \"rich\",\n hideControl,\n addtionControls,\n memtion,\n className,\n style,\n onChange,\n onEnter,\n onFocus,\n onBlur,\n onPaste,\n onMouseUp,\n onKeyUp,\n onKeyDown,\n ...restProps\n } = props;\n const editorRef = useRef<HTMLDivElement>(null);\n const selectionRef = useRef<Range | null>(null);\n const memtionTriggerRangeRef = useRef<Range | null>(null);\n const pendingMemtionRef = useRef(false);\n const isPlaintextMode = mode === \"plaintext\";\n const isRichMode = mode === \"rich\";\n const isPlaintextOnMemtionMode = mode === \"plaintextOnMemtion\";\n const [memtionVisible, setMemtionVisible] = useState(false);\n const [memtionRect, setMemtionRect] = useState<DOMRect | null>(null);\n const [memtionKeyword, setMemtionKeyword] = useState(\"\");\n const [memtionActiveIndex, setMemtionActiveIndex] = useState(0);\n const [activeMemtionIndex, setActiveMemtionIndex] = useState(-1);\n const activeMemtionIndexRef = useRef(-1);\n const memtionOptions = useMemo(\n () => {\n if (activeMemtionIndex < 0 || !memtion?.length) return [];\n const active = memtion?.[activeMemtionIndex];\n return filterMemtionOptions(active?.options ?? [], memtionKeyword);\n },\n [memtion, memtionKeyword, activeMemtionIndex],\n );\n\n const sanitizeValue = (nextValue: string) => {\n if (isPlaintextMode) {\n return nextValue === \"\\n\" ? \"\" : nextValue;\n }\n\n const safeHtml = isPlaintextOnMemtionMode\n ? sanitizePlaintextOnMemtionHtml(xss(nextValue, xssOptions))\n : xss(nextValue, xssOptions);\n\n return safeHtml === \"<br>\" ? \"\" : safeHtml;\n };\n\n const syncHeight = () => {\n if (autosize && editorRef.current) {\n editorRef.current.style.height = `${editorRef.current.scrollHeight}px`;\n }\n };\n\n const rememberSelection = () => {\n if (!editorRef.current) return;\n\n const selection = window.getSelection();\n if (!selection?.rangeCount) return;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const parent =\n container.nodeType === Node.ELEMENT_NODE\n ? (container as Element)\n : container.parentElement;\n\n if (!parent || !editorRef.current.contains(parent)) return;\n\n selectionRef.current = range.cloneRange();\n };\n\n const setEditorValue = (nextValue: string) => {\n if (!editorRef.current) return;\n\n const safeValue = sanitizeValue(nextValue);\n\n if (isPlaintextMode) {\n editorRef.current.textContent = safeValue;\n return;\n }\n\n editorRef.current.innerHTML = safeValue;\n };\n\n const getEditorValue = (sanitize = false) => {\n const nextValue = !editorRef.current\n ? \"\"\n : isPlaintextMode\n ? (editorRef.current.textContent ?? \"\")\n : editorRef.current.innerHTML;\n\n return sanitize ? sanitizeValue(nextValue) : nextValue;\n };\n\n const hideMemtion = () => {\n pendingMemtionRef.current = false;\n memtionTriggerRangeRef.current = null;\n setMemtionVisible(false);\n setMemtionRect(null);\n setMemtionKeyword(\"\");\n setMemtionActiveIndex(0);\n setActiveMemtionIndex(-1);\n };\n\n const syncEditorState = () => {\n selectionRef.current = null;\n hideMemtion();\n };\n\n const insertMemtion = (option: IEditorMemtionOption) => {\n const activeMemtion = memtion?.[activeMemtionIndex];\n const replaceRange = getMemtionReplaceRange(\n memtionTriggerRangeRef.current,\n selectionRef.current,\n );\n\n const range = insertMemtionOption({\n editor: editorRef.current,\n range: replaceRange,\n mode,\n memtion: activeMemtion,\n option,\n sanitizeValue,\n });\n\n if (!range || !editorRef.current) return;\n\n selectionRef.current = range.cloneRange();\n hideMemtion();\n editorRef.current.dispatchEvent(new Event(\"input\", { bubbles: true }));\n };\n\n const handlePaste = (e) => {\n onPaste?.(e);\n\n if (e.defaultPrevented) return;\n\n e.preventDefault();\n\n const html = e.clipboardData.getData(\"text/html\");\n const text = e.clipboardData.getData(\"text/plain\");\n const pasteValue = isPlaintextMode\n ? text\n : html\n ? sanitizeValue(html)\n : text;\n\n exec(isPlaintextMode ? \"insertText\" : \"insertHTML\", false, pasteValue);\n };\n\n const handleKeyDown = (e) => {\n onKeyDown?.(e);\n\n if (e.defaultPrevented) return;\n\n if (\n !isPlaintextMode &&\n (e.key === \"Backspace\" || e.key === \"Delete\") &&\n removeAdjacentMemtionTag(editorRef.current, e.key)\n ) {\n e.preventDefault();\n rememberSelection();\n editorRef.current?.dispatchEvent(\n new Event(\"input\", { bubbles: true }),\n );\n return;\n }\n\n if (memtionVisible && e.key === \" \") {\n hideMemtion();\n }\n\n if (memtionVisible && memtionOptions.length) {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setMemtionActiveIndex((index) =>\n index + 1 >= memtionOptions.length ? 0 : index + 1,\n );\n return;\n case \"ArrowUp\":\n e.preventDefault();\n setMemtionActiveIndex((index) =>\n index - 1 < 0 ? memtionOptions.length - 1 : index - 1,\n );\n return;\n case \"Enter\":\n e.preventDefault();\n insertMemtion(memtionOptions[memtionActiveIndex]);\n return;\n default:\n break;\n }\n }\n\n if (memtion?.length) {\n const matchedIndex = memtion.findIndex((m) => e.key === m.key);\n if (matchedIndex >= 0) {\n rememberSelection();\n memtionTriggerRangeRef.current =\n selectionRef.current?.cloneRange() ?? null;\n pendingMemtionRef.current = true;\n activeMemtionIndexRef.current = matchedIndex;\n setActiveMemtionIndex(matchedIndex);\n }\n }\n\n switch (e.key) {\n case \"Tab\":\n e.preventDefault();\n exec(\n isRichMode ? \"insertHTML\" : \"insertText\",\n false,\n isRichMode ? \"&#09;\" : \"\\t\",\n );\n break;\n case \"Enter\":\n if (e.shiftKey) {\n break;\n }\n if (!onEnter) break;\n e.preventDefault();\n onEnter(e);\n break;\n default:\n break;\n }\n };\n\n useEffect(() => {\n if (!editorRef.current) return;\n const nextValue = sanitizeValue(value);\n if (getEditorValue(true) === nextValue) return;\n\n setEditorValue(nextValue);\n syncEditorState();\n syncHeight();\n }, [autosize, mode, value]);\n\n useEffect(() => {\n if (!memtionOptions.length) {\n setMemtionActiveIndex(0);\n return;\n }\n\n setMemtionActiveIndex((index) =>\n index >= memtionOptions.length ? 0 : index,\n );\n }, [memtionOptions]);\n\n const handleInput = (e) => {\n const rawValue = getEditorValue();\n let nextValue = sanitizeValue(rawValue);\n\n if (\n isPlaintextOnMemtionMode &&\n rawValue !== nextValue &&\n editorRef.current\n ) {\n setEditorValue(nextValue);\n }\n\n if (!nextValue && rawValue && editorRef.current) {\n nextValue = \"\";\n setEditorValue(nextValue);\n }\n\n rememberSelection();\n\n if (activeMemtionIndexRef.current >= 0 && (pendingMemtionRef.current || memtionVisible)) {\n const active = memtion?.[activeMemtionIndexRef.current];\n if (!active) { hideMemtion(); return; }\n const memtionKey = active.key ?? \"@\";\n const memtionText = getMemtionText(\n memtionTriggerRangeRef.current,\n selectionRef.current,\n );\n\n if (!memtionText.startsWith(memtionKey) || /\\s/.test(memtionText)) {\n hideMemtion();\n } else {\n const keyword = memtionText.slice(memtionKey.length);\n pendingMemtionRef.current = false;\n setMemtionRect(getSelectionRect(selectionRef.current));\n setMemtionKeyword(keyword);\n setMemtionActiveIndex(0);\n setMemtionVisible(true);\n }\n }\n\n syncHeight();\n\n onChange?.(nextValue, e);\n };\n\n const handleFocus = (e) => {\n rememberSelection();\n onFocus?.(e);\n };\n\n const handleBlur = (e) => {\n hideMemtion();\n onBlur?.(e);\n };\n\n const handleMouseUp = (e) => {\n rememberSelection();\n onMouseUp?.(e);\n };\n\n const handleKeyUp = (e) => {\n rememberSelection();\n onKeyUp?.(e);\n };\n\n const handleRef = (node: HTMLDivElement | null) => {\n editorRef.current = node;\n\n if (typeof ref === \"function\") {\n ref(node);\n return;\n }\n\n if (ref) {\n ref.current = node;\n }\n };\n\n const getSelection = useCallback(\n () => selectionRef.current?.cloneRange() ?? null,\n [],\n );\n\n const controls = useMemo(\n () =>\n getControls({\n controlBtnProps,\n addtionControls,\n getSelection,\n }),\n [addtionControls, getSelection],\n );\n\n return (\n <div\n className={classNames(\"i-editor\", className, {\n \"i-editor-borderless\": !border,\n })}\n style={{\n ...style,\n [autosize ? \"minHeight\" : \"height\"]: height,\n width,\n }}\n >\n {!hideControl && (\n <div className=\"i-editor-controls\">{controls}</div>\n )}\n\n {memtion?.length && (\n <Memtion\n visible={memtionVisible}\n rect={memtionRect}\n options={memtionOptions}\n activeIndex={memtionActiveIndex}\n onActiveChange={setMemtionActiveIndex}\n onSelect={insertMemtion}\n />\n )}\n\n <div\n ref={handleRef}\n className=\"i-editor-content\"\n data-placeholder={placeholder}\n contentEditable={isPlaintextMode ? \"plaintext-only\" : true}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onMouseUp={handleMouseUp}\n onPaste={handlePaste}\n onInput={handleInput}\n onKeyUp={handleKeyUp}\n onKeyDown={handleKeyDown}\n {...restProps}\n />\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["memtion","useRef","useState","useMemo","filterMemtionOptions","sanitizePlaintextOnMemtionHtml","xss","xssOptions","getMemtionReplaceRange","insertMemtionOption","exec","removeAdjacentMemtionTag","useEffect","getMemtionText","getSelectionRect","useCallback","controls","getControls","_jsxs","classNames","_jsx","Memtion"],"mappings":"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"}
@@ -54,7 +54,7 @@ const Textarea = (props) => {
54
54
  onKeyDown: handleKeydown,
55
55
  ...restProps,
56
56
  };
57
- return (jsxRuntime.jsx(container.default, { label: label, labelInline: labelInline, className: className, style: { width, ...style }, tip: message ?? tip, status: status, children: jsxRuntime.jsx("div", { className: classNames__default("i-input-item", {
57
+ return (jsxRuntime.jsx(container.default, { label: label, labelInline: labelInline, className: classNames__default("i-textarea-label", className), style: { width, ...style }, tip: message ?? tip, status: status, children: jsxRuntime.jsx("div", { className: classNames__default("i-input-item", {
58
58
  [`i-input-${status}`]: status !== "normal",
59
59
  "i-input-borderless": !border,
60
60
  }), children: jsxRuntime.jsx("textarea", { ...inputProps }) }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"textarea.js","sources":["../../../../packages/components/input/textarea.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport {\n ChangeEvent,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport \"../../css/input.css\";\nimport InputContainer from \"./container\";\nimport type { ITextarea } from \"./type\";\n\nconst Textarea = (props: ITextarea) => {\n const {\n ref,\n label,\n name,\n value = \"\",\n labelInline,\n className,\n status = \"normal\",\n message,\n tip,\n autoSize,\n border,\n width,\n style,\n resize,\n onChange,\n onEnter,\n ...restProps\n } = props;\n\n const [textareaValue, setTextareaValue] = useState(value);\n const refTextarea = useRef<HTMLTextAreaElement>(null);\n\n const syncTextareaHeight = () => {\n const ta = refTextarea.current;\n if (!autoSize || !ta) return;\n\n ta.style.height = \"auto\";\n ta.style.height = `${ta.scrollHeight}px`;\n };\n\n const handleChange = (\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n const v = e.target.value;\n\n setTextareaValue(v);\n\n onChange?.(v, e);\n };\n\n const handleKeydown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.code !== \"Enter\") return;\n\n e.stopPropagation();\n onEnter?.(e);\n };\n\n useEffect(() => {\n setTextareaValue(value);\n }, [value]);\n\n useEffect(() => {\n syncTextareaHeight();\n }, [autoSize, textareaValue]);\n\n useImperativeHandle(ref, () => {\n return {\n input: refTextarea.current,\n };\n });\n\n const inputProps = {\n ref: refTextarea,\n name,\n value: textareaValue,\n className: \"i-input i-textarea\",\n style: resize === false ? { resize: \"none\" as const } : undefined,\n onChange: handleChange,\n onKeyDown: handleKeydown,\n ...restProps,\n };\n\n return (\n <InputContainer\n label={label}\n labelInline={labelInline}\n className={className}\n style={{ width, ...style }}\n tip={message ?? tip}\n status={status}\n >\n <div\n className={classNames(\"i-input-item\", {\n [`i-input-${status}`]: status !== \"normal\",\n \"i-input-borderless\": !border,\n })}\n >\n <textarea {...inputProps} />\n </div>\n </InputContainer>\n );\n};\n\nexport default Textarea;\n"],"names":["useState","useRef","useEffect","useImperativeHandle","_jsx","InputContainer","classNames"],"mappings":";;;;;;;;;;;;;AAaA,MAAM,QAAQ,GAAG,CAAC,KAAgB,KAAI;AAClC,IAAA,MAAM,EACF,GAAG,EACH,KAAK,EACL,IAAI,EACJ,KAAK,GAAG,EAAE,EACV,WAAW,EACX,SAAS,EACT,MAAM,GAAG,QAAQ,EACjB,OAAO,EACP,GAAG,EACH,QAAQ,EACR,MAAM,EACN,KAAK,EACL,KAAK,EACL,MAAM,EACN,QAAQ,EACR,OAAO,EACP,GAAG,SAAS,EACf,GAAG,KAAK;IAET,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;AACzD,IAAA,MAAM,WAAW,GAAGC,YAAM,CAAsB,IAAI,CAAC;IAErD,MAAM,kBAAkB,GAAG,MAAK;AAC5B,QAAA,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO;AAC9B,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE;YAAE;AAEtB,QAAA,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;QACxB,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAA,EAAA,CAAI;AAC5C,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CACjB,CAAsD,KACtD;AACA,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK;QAExB,gBAAgB,CAAC,CAAC,CAAC;AAEnB,QAAA,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;AACpB,IAAA,CAAC;AAED,IAAA,MAAM,aAAa,GAAG,CAAC,CAAqC,KAAI;AAC5D,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE;QAExB,CAAC,CAAC,eAAe,EAAE;AACnB,QAAA,OAAO,GAAG,CAAC,CAAC;AAChB,IAAA,CAAC;IAEDC,eAAS,CAAC,MAAK;QACX,gBAAgB,CAAC,KAAK,CAAC;AAC3B,IAAA,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAEXA,eAAS,CAAC,MAAK;AACX,QAAA,kBAAkB,EAAE;AACxB,IAAA,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAE7B,IAAAC,yBAAmB,CAAC,GAAG,EAAE,MAAK;QAC1B,OAAO;YACH,KAAK,EAAE,WAAW,CAAC,OAAO;SAC7B;AACL,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,UAAU,GAAG;AACf,QAAA,GAAG,EAAE,WAAW;QAChB,IAAI;AACJ,QAAA,KAAK,EAAE,aAAa;AACpB,QAAA,SAAS,EAAE,oBAAoB;AAC/B,QAAA,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,EAAE,MAAM,EAAE,MAAe,EAAE,GAAG,SAAS;AACjE,QAAA,QAAQ,EAAE,YAAY;AACtB,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,GAAG,SAAS;KACf;AAED,IAAA,QACIC,cAAA,CAACC,iBAAc,IACX,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAC1B,GAAG,EAAE,OAAO,IAAI,GAAG,EACnB,MAAM,EAAE,MAAM,YAEdD,cAAA,CAAA,KAAA,EAAA,EACI,SAAS,EAAEE,mBAAU,CAAC,cAAc,EAAE;AAClC,gBAAA,CAAC,WAAW,MAAM,CAAA,CAAE,GAAG,MAAM,KAAK,QAAQ;gBAC1C,oBAAoB,EAAE,CAAC,MAAM;AAChC,aAAA,CAAC,YAEFF,cAAA,CAAA,UAAA,EAAA,EAAA,GAAc,UAAU,GAAI,EAAA,CAC1B,EAAA,CACO;AAEzB;;;;"}
1
+ {"version":3,"file":"textarea.js","sources":["../../../../packages/components/input/textarea.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport {\n ChangeEvent,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport \"../../css/input.css\";\nimport InputContainer from \"./container\";\nimport type { ITextarea } from \"./type\";\n\nconst Textarea = (props: ITextarea) => {\n const {\n ref,\n label,\n name,\n value = \"\",\n labelInline,\n className,\n status = \"normal\",\n message,\n tip,\n autoSize,\n border,\n width,\n style,\n resize,\n onChange,\n onEnter,\n ...restProps\n } = props;\n\n const [textareaValue, setTextareaValue] = useState(value);\n const refTextarea = useRef<HTMLTextAreaElement>(null);\n\n const syncTextareaHeight = () => {\n const ta = refTextarea.current;\n if (!autoSize || !ta) return;\n\n ta.style.height = \"auto\";\n ta.style.height = `${ta.scrollHeight}px`;\n };\n\n const handleChange = (\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n const v = e.target.value;\n\n setTextareaValue(v);\n\n onChange?.(v, e);\n };\n\n const handleKeydown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.code !== \"Enter\") return;\n\n e.stopPropagation();\n onEnter?.(e);\n };\n\n useEffect(() => {\n setTextareaValue(value);\n }, [value]);\n\n useEffect(() => {\n syncTextareaHeight();\n }, [autoSize, textareaValue]);\n\n useImperativeHandle(ref, () => {\n return {\n input: refTextarea.current,\n };\n });\n\n const inputProps = {\n ref: refTextarea,\n name,\n value: textareaValue,\n className: \"i-input i-textarea\",\n style: resize === false ? { resize: \"none\" as const } : undefined,\n onChange: handleChange,\n onKeyDown: handleKeydown,\n ...restProps,\n };\n\n return (\n <InputContainer\n label={label}\n labelInline={labelInline}\n className={classNames(\"i-textarea-label\", className)}\n style={{ width, ...style }}\n tip={message ?? tip}\n status={status}\n >\n <div\n className={classNames(\"i-input-item\", {\n [`i-input-${status}`]: status !== \"normal\",\n \"i-input-borderless\": !border,\n })}\n >\n <textarea {...inputProps} />\n </div>\n </InputContainer>\n );\n};\n\nexport default Textarea;\n"],"names":["useState","useRef","useEffect","useImperativeHandle","_jsx","InputContainer","classNames"],"mappings":";;;;;;;;;;;;;AAaA,MAAM,QAAQ,GAAG,CAAC,KAAgB,KAAI;AAClC,IAAA,MAAM,EACF,GAAG,EACH,KAAK,EACL,IAAI,EACJ,KAAK,GAAG,EAAE,EACV,WAAW,EACX,SAAS,EACT,MAAM,GAAG,QAAQ,EACjB,OAAO,EACP,GAAG,EACH,QAAQ,EACR,MAAM,EACN,KAAK,EACL,KAAK,EACL,MAAM,EACN,QAAQ,EACR,OAAO,EACP,GAAG,SAAS,EACf,GAAG,KAAK;IAET,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;AACzD,IAAA,MAAM,WAAW,GAAGC,YAAM,CAAsB,IAAI,CAAC;IAErD,MAAM,kBAAkB,GAAG,MAAK;AAC5B,QAAA,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO;AAC9B,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE;YAAE;AAEtB,QAAA,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;QACxB,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAA,EAAA,CAAI;AAC5C,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CACjB,CAAsD,KACtD;AACA,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK;QAExB,gBAAgB,CAAC,CAAC,CAAC;AAEnB,QAAA,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;AACpB,IAAA,CAAC;AAED,IAAA,MAAM,aAAa,GAAG,CAAC,CAAqC,KAAI;AAC5D,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE;QAExB,CAAC,CAAC,eAAe,EAAE;AACnB,QAAA,OAAO,GAAG,CAAC,CAAC;AAChB,IAAA,CAAC;IAEDC,eAAS,CAAC,MAAK;QACX,gBAAgB,CAAC,KAAK,CAAC;AAC3B,IAAA,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAEXA,eAAS,CAAC,MAAK;AACX,QAAA,kBAAkB,EAAE;AACxB,IAAA,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAE7B,IAAAC,yBAAmB,CAAC,GAAG,EAAE,MAAK;QAC1B,OAAO;YACH,KAAK,EAAE,WAAW,CAAC,OAAO;SAC7B;AACL,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,UAAU,GAAG;AACf,QAAA,GAAG,EAAE,WAAW;QAChB,IAAI;AACJ,QAAA,KAAK,EAAE,aAAa;AACpB,QAAA,SAAS,EAAE,oBAAoB;AAC/B,QAAA,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,EAAE,MAAM,EAAE,MAAe,EAAE,GAAG,SAAS;AACjE,QAAA,QAAQ,EAAE,YAAY;AACtB,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,GAAG,SAAS;KACf;IAED,QACIC,eAACC,iBAAc,EAAA,EACX,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,EACxB,SAAS,EAAEC,mBAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,EACpD,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAC1B,GAAG,EAAE,OAAO,IAAI,GAAG,EACnB,MAAM,EAAE,MAAM,EAAA,QAAA,EAEdF,cAAA,CAAA,KAAA,EAAA,EACI,SAAS,EAAEE,mBAAU,CAAC,cAAc,EAAE;AAClC,gBAAA,CAAC,WAAW,MAAM,CAAA,CAAE,GAAG,MAAM,KAAK,QAAQ;gBAC1C,oBAAoB,EAAE,CAAC,MAAM;AAChC,aAAA,CAAC,YAEFF,cAAA,CAAA,UAAA,EAAA,EAAA,GAAc,UAAU,GAAI,EAAA,CAC1B,EAAA,CACO;AAEzB;;;;"}
@@ -7,14 +7,21 @@ var react = require('react');
7
7
  var button = require('../button/button.js');
8
8
  var helpericon = require('../utils/helpericon/helpericon.js');
9
9
 
10
- function Content(props) {
10
+ const Content$1 = (props) => {
11
11
  const { title, footer, hideCloseButton, footerLeft, okButtonProps, cancelButtonProps, children, onOk, onClose, } = props;
12
12
  const showHeader = title || !hideCloseButton;
13
+ const [loading, setLoading] = react.useState(false);
13
14
  const handleOk = async () => {
14
- const ret = await onOk?.();
15
- if (ret === false)
16
- return;
17
- onClose?.();
15
+ setLoading(true);
16
+ try {
17
+ const ret = await onOk?.();
18
+ if (ret === false)
19
+ return;
20
+ onClose?.();
21
+ }
22
+ finally {
23
+ setLoading(false);
24
+ }
18
25
  };
19
26
  const renderFooter = react.useMemo(() => {
20
27
  if (footer || footer === null)
@@ -22,16 +29,17 @@ function Content(props) {
22
29
  const propsOk = Object.assign({
23
30
  children: "确定",
24
31
  onClick: handleOk,
25
- }, okButtonProps);
32
+ }, okButtonProps, { loading });
26
33
  const propsCancel = Object.assign({
27
34
  secondary: true,
28
35
  children: "关闭",
29
36
  onClick: onClose,
30
37
  }, cancelButtonProps);
31
38
  return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [footerLeft, jsxRuntime.jsx(button.default, { ...propsOk }), jsxRuntime.jsx(button.default, { ...propsCancel })] }));
32
- }, [footer, okButtonProps, cancelButtonProps]);
39
+ }, [footer, okButtonProps, cancelButtonProps, loading]);
33
40
  return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [showHeader && (jsxRuntime.jsxs("header", { className: 'i-modal-header', children: [title && jsxRuntime.jsx("b", { children: title }), jsxRuntime.jsx(helpericon.default, { active: !hideCloseButton, className: 'i-modal-close', onClick: onClose })] })), jsxRuntime.jsx("div", { className: 'i-modal-content', children: children }), jsxRuntime.jsx("footer", { className: 'i-modal-footer', children: renderFooter })] }));
34
- }
41
+ };
42
+ var Content = react.memo(Content$1);
35
43
 
36
44
  exports.default = Content;
37
45
  //# sourceMappingURL=content.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","sources":["../../../../packages/components/modal/content.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport Button from \"../button\";\nimport Helpericon from \"../utils/helpericon\";\nimport \"./index.css\";\nimport { IModalContent } from \"./type\";\n\nexport default function Content(props: IModalContent) {\n\tconst {\n\t\ttitle,\n\t\tfooter,\n\t\thideCloseButton,\n\t\tfooterLeft,\n\t\tokButtonProps,\n\t\tcancelButtonProps,\n\t\tchildren,\n\t\tonOk,\n\t\tonClose,\n\t} = props;\n\tconst showHeader = title || !hideCloseButton;\n\n\tconst handleOk = async () => {\n\t\tconst ret = await onOk?.();\n\n\t\tif (ret === false) return;\n\n\t\tonClose?.();\n\t};\n\n\tconst renderFooter = useMemo(() => {\n\t\tif (footer || footer === null) return footer;\n\n\t\tconst propsOk = Object.assign(\n\t\t\t{\n\t\t\t\tchildren: \"确定\",\n\t\t\t\tonClick: handleOk,\n\t\t\t},\n\t\t\tokButtonProps\n\t\t);\n\t\tconst propsCancel = Object.assign(\n\t\t\t{\n\t\t\t\tsecondary: true,\n\t\t\t\tchildren: \"关闭\",\n\t\t\t\tonClick: onClose,\n\t\t\t},\n\t\t\tcancelButtonProps\n\t\t);\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{footerLeft}\n\t\t\t\t<Button {...propsOk} />\n\t\t\t\t<Button {...propsCancel} />\n\t\t\t</>\n\t\t);\n\t}, [footer, okButtonProps, cancelButtonProps]);\n\n\treturn (\n\t\t<>\n\t\t\t{showHeader && (\n\t\t\t\t<header className='i-modal-header'>\n\t\t\t\t\t{title && <b>{title}</b>}\n\n\t\t\t\t\t<Helpericon\n\t\t\t\t\t\tactive={!hideCloseButton}\n\t\t\t\t\t\tclassName='i-modal-close'\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t/>\n\t\t\t\t</header>\n\t\t\t)}\n\n\t\t\t<div className='i-modal-content'>{children}</div>\n\n\t\t\t<footer className='i-modal-footer'>{renderFooter}</footer>\n\t\t</>\n\t);\n}\n"],"names":["useMemo","_jsxs","_Fragment","_jsx","Button","Helpericon"],"mappings":";;;;;;;;;AAMc,SAAU,OAAO,CAAC,KAAoB,EAAA;IACnD,MAAM,EACL,KAAK,EACL,MAAM,EACN,eAAe,EACf,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,IAAI,EACJ,OAAO,GACP,GAAG,KAAK;AACT,IAAA,MAAM,UAAU,GAAG,KAAK,IAAI,CAAC,eAAe;AAE5C,IAAA,MAAM,QAAQ,GAAG,YAAW;AAC3B,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI;QAE1B,IAAI,GAAG,KAAK,KAAK;YAAE;QAEnB,OAAO,IAAI;AACZ,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAGA,aAAO,CAAC,MAAK;AACjC,QAAA,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI;AAAE,YAAA,OAAO,MAAM;AAE5C,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC5B;AACC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,OAAO,EAAE,QAAQ;SACjB,EACD,aAAa,CACb;AACD,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAChC;AACC,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,OAAO,EAAE,OAAO;SAChB,EACD,iBAAiB,CACjB;AAED,QAAA,QACCC,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA,CACE,UAAU,EACXC,cAAA,CAACC,cAAM,EAAA,EAAA,GAAK,OAAO,EAAA,CAAI,EACvBD,eAACC,cAAM,EAAA,EAAA,GAAK,WAAW,EAAA,CAAI,CAAA,EAAA,CACzB;IAEL,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAE9C,QACCH,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA,CACE,UAAU,KACVD,4BAAQ,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAChC,KAAK,IAAIE,gCAAI,KAAK,EAAA,CAAK,EAExBA,cAAA,CAACE,kBAAU,EAAA,EACV,MAAM,EAAE,CAAC,eAAe,EACxB,SAAS,EAAC,eAAe,EACzB,OAAO,EAAE,OAAO,EAAA,CACf,CAAA,EAAA,CACM,CACT,EAEDF,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAAE,QAAQ,EAAA,CAAO,EAEjDA,cAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAC,gBAAgB,YAAE,YAAY,EAAA,CAAU,CAAA,EAAA,CACxD;AAEL;;;;"}
1
+ {"version":3,"file":"content.js","sources":["../../../../packages/components/modal/content.tsx"],"sourcesContent":["import { memo, useMemo, useState } from \"react\";\nimport Button from \"../button\";\nimport Helpericon from \"../utils/helpericon\";\nimport \"./index.css\";\nimport { IModalContent } from \"./type\";\n\nconst Content = (props: IModalContent) => {\n\tconst {\n\t\ttitle,\n\t\tfooter,\n\t\thideCloseButton,\n\t\tfooterLeft,\n\t\tokButtonProps,\n\t\tcancelButtonProps,\n\t\tchildren,\n\t\tonOk,\n\t\tonClose,\n\t} = props;\n\tconst showHeader = title || !hideCloseButton;\n\n\tconst [loading, setLoading] = useState(false);\n\n\tconst handleOk = async () => {\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tconst ret = await onOk?.();\n\n\t\t\tif (ret === false) return;\n\n\t\t\tonClose?.();\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t};\n\n\tconst renderFooter = useMemo(() => {\n\t\tif (footer || footer === null) return footer;\n\n\t\tconst propsOk = Object.assign(\n\t\t\t{\n\t\t\t\tchildren: \"确定\",\n\t\t\t\tonClick: handleOk,\n\t\t\t},\n\t\t\tokButtonProps,\n\t\t\t{ loading }\n\t\t);\n\t\tconst propsCancel = Object.assign(\n\t\t\t{\n\t\t\t\tsecondary: true,\n\t\t\t\tchildren: \"关闭\",\n\t\t\t\tonClick: onClose,\n\t\t\t},\n\t\t\tcancelButtonProps\n\t\t);\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{footerLeft}\n\t\t\t\t<Button {...propsOk} />\n\t\t\t\t<Button {...propsCancel} />\n\t\t\t</>\n\t\t);\n\t}, [footer, okButtonProps, cancelButtonProps, loading]);\n\n\treturn (\n\t\t<>\n\t\t\t{showHeader && (\n\t\t\t\t<header className='i-modal-header'>\n\t\t\t\t\t{title && <b>{title}</b>}\n\n\t\t\t\t\t<Helpericon\n\t\t\t\t\t\tactive={!hideCloseButton}\n\t\t\t\t\t\tclassName='i-modal-close'\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t/>\n\t\t\t\t</header>\n\t\t\t)}\n\n\t\t\t<div className='i-modal-content'>{children}</div>\n\n\t\t\t<footer className='i-modal-footer'>{renderFooter}</footer>\n\t\t</>\n\t);\n};\n\nexport default memo(Content);\n"],"names":["Content","useState","useMemo","_jsxs","_Fragment","_jsx","Button","Helpericon","memo"],"mappings":";;;;;;;;;AAMA,MAAMA,SAAO,GAAG,CAAC,KAAoB,KAAI;IACxC,MAAM,EACL,KAAK,EACL,MAAM,EACN,eAAe,EACf,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,IAAI,EACJ,OAAO,GACP,GAAG,KAAK;AACT,IAAA,MAAM,UAAU,GAAG,KAAK,IAAI,CAAC,eAAe;IAE5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGC,cAAQ,CAAC,KAAK,CAAC;AAE7C,IAAA,MAAM,QAAQ,GAAG,YAAW;QAC3B,UAAU,CAAC,IAAI,CAAC;AAChB,QAAA,IAAI;AACH,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI;YAE1B,IAAI,GAAG,KAAK,KAAK;gBAAE;YAEnB,OAAO,IAAI;QACZ;gBAAU;YACT,UAAU,CAAC,KAAK,CAAC;QAClB;AACD,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAGC,aAAO,CAAC,MAAK;AACjC,QAAA,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI;AAAE,YAAA,OAAO,MAAM;AAE5C,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC5B;AACC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,OAAO,EAAE,QAAQ;AACjB,SAAA,EACD,aAAa,EACb,EAAE,OAAO,EAAE,CACX;AACD,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAChC;AACC,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,OAAO,EAAE,OAAO;SAChB,EACD,iBAAiB,CACjB;AAED,QAAA,QACCC,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA,CACE,UAAU,EACXC,cAAA,CAACC,cAAM,EAAA,EAAA,GAAK,OAAO,EAAA,CAAI,EACvBD,eAACC,cAAM,EAAA,EAAA,GAAK,WAAW,EAAA,CAAI,CAAA,EAAA,CACzB;IAEL,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAEvD,QACCH,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA,CACE,UAAU,KACVD,4BAAQ,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAChC,KAAK,IAAIE,gCAAI,KAAK,EAAA,CAAK,EAExBA,cAAA,CAACE,kBAAU,EAAA,EACV,MAAM,EAAE,CAAC,eAAe,EACxB,SAAS,EAAC,eAAe,EACzB,OAAO,EAAE,OAAO,EAAA,CACf,CAAA,EAAA,CACM,CACT,EAEDF,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAAE,QAAQ,EAAA,CAAO,EAEjDA,cAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAC,gBAAgB,YAAE,YAAY,EAAA,CAAU,CAAA,EAAA,CACxD;AAEL,CAAC;AAED,cAAeG,UAAI,CAACR,SAAO,CAAC;;;;"}
@@ -9,32 +9,48 @@ var reactDom = require('react-dom');
9
9
  var hooks = require('../../js/hooks.js');
10
10
  var content = require('./content.js');
11
11
  var context = require('./context.js');
12
+ var modalManager = require('./modalManager.js');
12
13
  var useModal = require('./useModal.js');
13
14
 
14
15
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
15
16
 
16
17
  var classNames__default = /*#__PURE__*/_interopDefaultCompat(classNames);
17
18
 
19
+ let midCounter = 0;
18
20
  function Modal(props) {
19
21
  const { visible, title, footer, okButtonProps, cancelButtonProps, closable = true, hideBackdrop, backdropClosable = true, hideCloseButton, disableEsc, width, height, customized, fixed, hideShadow, children, style, className, keepDOM, footerLeft, onClick, onVisibleChange, onClose, onOk, ...restProps } = props;
22
+ const midRef = react.useRef(`modal-${++midCounter}`);
23
+ const mid = midRef.current;
20
24
  const [show, setShow] = react.useState(visible);
21
25
  const [active, setActive] = react.useState(false);
22
26
  const [bounced, setBounced] = react.useState(false);
23
27
  const [mounted, setMounted] = react.useState(false);
28
+ const [top, setTop] = react.useState(false);
24
29
  const toggable = react.useRef(true);
25
- const handleShow = async () => {
30
+ const layerRef = react.useRef(null);
31
+ const handleShow = react.useCallback(() => {
26
32
  if (!toggable.current)
27
33
  return;
28
- (!keepDOM || !show) && setShow(true);
34
+ if (!keepDOM || !show)
35
+ setShow(true);
29
36
  toggable.current = false;
30
- const timer = setTimeout(() => {
37
+ modalManager.updateVisible(mid, true);
38
+ const raf = requestAnimationFrame(() => {
39
+ if (!layerRef.current) {
40
+ requestAnimationFrame(() => {
41
+ setActive(true);
42
+ onVisibleChange?.(true);
43
+ toggable.current = true;
44
+ });
45
+ return;
46
+ }
31
47
  setActive(true);
32
48
  onVisibleChange?.(true);
33
49
  toggable.current = true;
34
- }, 64);
35
- return () => clearTimeout(timer);
36
- };
37
- const handleHide = () => {
50
+ });
51
+ return () => cancelAnimationFrame(raf);
52
+ }, [keepDOM, show, onVisibleChange]);
53
+ const handleHide = react.useCallback(() => {
38
54
  if (!toggable.current)
39
55
  return;
40
56
  toggable.current = false;
@@ -47,28 +63,53 @@ function Modal(props) {
47
63
  return () => clearTimeout(timer);
48
64
  }
49
65
  setActive(false);
66
+ modalManager.updateVisible(mid, false);
50
67
  const timer = setTimeout(() => {
51
- !keepDOM && setShow(false);
68
+ if (!keepDOM)
69
+ setShow(false);
52
70
  toggable.current = true;
53
71
  onVisibleChange?.(false);
54
72
  onClose?.();
55
73
  }, 240);
56
74
  return () => clearTimeout(timer);
57
- };
75
+ }, [closable, keepDOM, onClose, onVisibleChange]);
58
76
  const handleBackdropClick = () => {
59
77
  backdropClosable && handleHide();
60
78
  };
61
- hooks.useKeydown((e) => {
62
- if (e.code !== "Escape" || !visible)
63
- return;
64
- handleHide();
65
- }, { disabled: disableEsc });
79
+ react.useEffect(() => {
80
+ const unsub = modalManager.subscribe(() => {
81
+ setTop(modalManager.isTop(mid));
82
+ });
83
+ return unsub;
84
+ }, []);
85
+ react.useEffect(() => {
86
+ const unregister = modalManager.register({
87
+ mid,
88
+ visible: !!visible,
89
+ hideBackdrop: !!hideBackdrop,
90
+ closable: !!closable,
91
+ });
92
+ return unregister;
93
+ }, []);
66
94
  react.useEffect(() => {
67
95
  visible ? handleShow() : handleHide();
68
96
  }, [visible]);
97
+ react.useEffect(() => {
98
+ if (!show)
99
+ return;
100
+ const raf = requestAnimationFrame(() => {
101
+ setActive(top);
102
+ });
103
+ return () => cancelAnimationFrame(raf);
104
+ }, [top]);
69
105
  react.useEffect(() => {
70
106
  setMounted(true);
71
107
  }, []);
108
+ hooks.useKeydown((e) => {
109
+ if (e.code !== "Escape" || !visible || !top)
110
+ return;
111
+ handleHide();
112
+ }, { disabled: disableEsc });
72
113
  const handleClick = () => {
73
114
  if (typeof document === "undefined")
74
115
  return;
@@ -76,12 +117,12 @@ function Modal(props) {
76
117
  };
77
118
  if (!show || !mounted)
78
119
  return null;
79
- return reactDom.createPortal(jsxRuntime.jsx("div", { className: classNames__default("i-modal-container", {
80
- "i-modal-backdrop": !hideBackdrop,
81
- "i-modal-customized": customized,
120
+ return reactDom.createPortal(jsxRuntime.jsx("div", { ref: layerRef, className: classNames__default("i-modal-layer", {
82
121
  "i-modal-active": active,
122
+ "i-modal-customized": customized,
123
+ "i-modal-hide-backdrop": hideBackdrop,
83
124
  fixed,
84
- }, className), style: style, onClick: handleBackdropClick, "aria-modal": 'true', inert: !active, children: jsxRuntime.jsx("div", { className: classNames__default("i-modal", {
125
+ }, className), style: style, onClick: handleBackdropClick, children: jsxRuntime.jsx("div", { className: classNames__default("i-modal", {
85
126
  bounced,
86
127
  shadow: !hideShadow,
87
128
  }), style: {
@@ -91,7 +132,7 @@ function Modal(props) {
91
132
  e.stopPropagation();
92
133
  handleClick();
93
134
  onClick?.(e);
94
- }, role: 'dialog', "aria-labelledby": title ? "modal-title" : undefined, ...restProps, children: jsxRuntime.jsxs(context.default.Provider, { value: true, children: [customized && children, !customized && (jsxRuntime.jsx(content.default, { title: title, hideCloseButton: hideCloseButton, footer: footer, okButtonProps: okButtonProps, cancelButtonProps: cancelButtonProps, children: children, footerLeft: footerLeft, onOk: onOk, onClose: handleHide }))] }) }) }), document?.body ?? null);
135
+ }, role: "dialog", "aria-modal": top, "data-mid": mid, ...restProps, children: jsxRuntime.jsxs(context.default.Provider, { value: true, children: [customized && children, !customized && (jsxRuntime.jsx(content.default, { title: title, hideCloseButton: hideCloseButton, footer: footer, okButtonProps: okButtonProps, cancelButtonProps: cancelButtonProps, children: children, footerLeft: footerLeft, onOk: onOk, onClose: handleHide }))] }) }) }), modalManager.getContainer());
95
136
  }
96
137
  Modal.useModal = useModal.default;
97
138
 
@@ -1 +1 @@
1
- {"version":3,"file":"modal.js","sources":["../../../../packages/components/modal/modal.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useKeydown } from \"../../js/hooks\";\nimport Content from \"./content\";\nimport ModalContext from \"./context\";\nimport \"./index.css\";\nimport { CompositionModal, IModal } from \"./type\";\nimport useModal from \"./useModal\";\n\nfunction Modal(props: IModal) {\n\tconst {\n\t\tvisible,\n\t\ttitle,\n\t\tfooter,\n\t\tokButtonProps,\n\t\tcancelButtonProps,\n\t\tclosable = true,\n\t\thideBackdrop,\n\t\tbackdropClosable = true,\n\t\thideCloseButton,\n\t\tdisableEsc,\n\t\twidth,\n\t\theight,\n\t\tcustomized,\n\t\tfixed,\n\t\thideShadow,\n\t\tchildren,\n\t\tstyle,\n\t\tclassName,\n\t\tkeepDOM,\n\t\tfooterLeft,\n\t\tonClick,\n\t\tonVisibleChange,\n\t\tonClose,\n\t\tonOk,\n\t\t...restProps\n\t} = props;\n\n\tconst [show, setShow] = useState(visible);\n\tconst [active, setActive] = useState(false);\n\tconst [bounced, setBounced] = useState(false);\n\tconst [mounted, setMounted] = useState(false);\n\tconst toggable = useRef(true);\n\n\tconst handleShow = async () => {\n\t\tif (!toggable.current) return;\n\n\t\t(!keepDOM || !show) && setShow(true);\n\t\ttoggable.current = false;\n\n\t\tconst timer = setTimeout(() => {\n\t\t\tsetActive(true);\n\t\t\tonVisibleChange?.(true);\n\t\t\ttoggable.current = true;\n\t\t}, 64);\n\n\t\treturn () => clearTimeout(timer);\n\t};\n\n\tconst handleHide = () => {\n\t\tif (!toggable.current) return;\n\t\ttoggable.current = false;\n\n\t\tif (!closable) {\n\t\t\tsetBounced(true);\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tsetBounced(false);\n\t\t\t\ttoggable.current = true;\n\t\t\t}, 400);\n\t\t\treturn () => clearTimeout(timer);\n\t\t}\n\n\t\tsetActive(false);\n\t\tconst timer = setTimeout(() => {\n\t\t\t!keepDOM && setShow(false);\n\t\t\ttoggable.current = true;\n\t\t\tonVisibleChange?.(false);\n\t\t\tonClose?.();\n\t\t}, 240);\n\n\t\treturn () => clearTimeout(timer);\n\t};\n\n\tconst handleBackdropClick = () => {\n\t\tbackdropClosable && handleHide();\n\t};\n\n\tuseKeydown(\n\t\t(e) => {\n\t\t\tif (e.code !== \"Escape\" || !visible) return;\n\t\t\thandleHide();\n\t\t},\n\t\t{ disabled: disableEsc }\n\t);\n\n\tuseEffect(() => {\n\t\tvisible ? handleShow() : handleHide();\n\t}, [visible]);\n\n\tuseEffect(() => {\n\t\tsetMounted(true);\n\t}, []);\n\n\tconst handleClick = () => {\n\t\tif (typeof document === \"undefined\") return;\n\t\tdocument.documentElement.click();\n\t};\n\n\tif (!show || !mounted) return null;\n\n\treturn createPortal(\n\t\t<div\n\t\t\tclassName={classNames(\n\t\t\t\t\"i-modal-container\",\n\t\t\t\t{\n\t\t\t\t\t\"i-modal-backdrop\": !hideBackdrop,\n\t\t\t\t\t\"i-modal-customized\": customized,\n\t\t\t\t\t\"i-modal-active\": active,\n\t\t\t\t\tfixed,\n\t\t\t\t},\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tstyle={style}\n\t\t\tonClick={handleBackdropClick}\n\t\t\taria-modal='true'\n\t\t\tinert={!active}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={classNames(\"i-modal\", {\n\t\t\t\t\tbounced,\n\t\t\t\t\tshadow: !hideShadow,\n\t\t\t\t})}\n\t\t\t\tstyle={{\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t}}\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\thandleClick();\n\t\t\t\t\tonClick?.(e);\n\t\t\t\t}}\n\t\t\t\trole='dialog'\n\t\t\t\taria-labelledby={title ? \"modal-title\" : undefined}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t<ModalContext.Provider value={true}>\n\t\t\t\t\t{customized && children}\n\n\t\t\t\t\t{!customized && (\n\t\t\t\t\t\t<Content\n\t\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\t\thideCloseButton={hideCloseButton}\n\t\t\t\t\t\t\tfooter={footer}\n\t\t\t\t\t\t\tokButtonProps={okButtonProps}\n\t\t\t\t\t\t\tcancelButtonProps={cancelButtonProps}\n\t\t\t\t\t\t\tchildren={children}\n\t\t\t\t\t\t\tfooterLeft={footerLeft}\n\t\t\t\t\t\t\tonOk={onOk}\n\t\t\t\t\t\t\tonClose={handleHide}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</ModalContext.Provider>\n\t\t\t</div>\n\t\t</div>,\n\t\tdocument?.body ?? null\n\t);\n}\n\nModal.useModal = useModal;\n\nexport default Modal as CompositionModal;\n"],"names":["useState","useRef","useKeydown","useEffect","createPortal","_jsx","classNames","_jsxs","ModalContext","Content","useModal"],"mappings":"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"}
1
+ {"version":3,"file":"modal.js","sources":["../../../../packages/components/modal/modal.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useKeydown } from \"../../js/hooks\";\nimport Content from \"./content\";\nimport ModalContext from \"./context\";\nimport \"./index.css\";\nimport {\n getContainer,\n isTop,\n register,\n subscribe,\n updateVisible,\n} from \"./modalManager\";\nimport { CompositionModal, IModal } from \"./type\";\nimport useModal from \"./useModal\";\n\nlet midCounter = 0;\n\nfunction Modal(props: IModal) {\n const {\n visible,\n title,\n footer,\n okButtonProps,\n cancelButtonProps,\n closable = true,\n hideBackdrop,\n backdropClosable = true,\n hideCloseButton,\n disableEsc,\n width,\n height,\n customized,\n fixed,\n hideShadow,\n children,\n style,\n className,\n keepDOM,\n footerLeft,\n onClick,\n onVisibleChange,\n onClose,\n onOk,\n ...restProps\n } = props;\n\n const midRef = useRef(`modal-${++midCounter}`);\n const mid = midRef.current;\n\n const [show, setShow] = useState(visible);\n const [active, setActive] = useState(false);\n const [bounced, setBounced] = useState(false);\n const [mounted, setMounted] = useState(false);\n const [top, setTop] = useState(false);\n const toggable = useRef(true);\n const layerRef = useRef(null);\n\n const handleShow = useCallback(() => {\n if (!toggable.current) return;\n\n if (!keepDOM || !show) setShow(true);\n toggable.current = false;\n\n updateVisible(mid, true);\n\n const raf = requestAnimationFrame(() => {\n if (!layerRef.current) {\n requestAnimationFrame(() => {\n setActive(true);\n onVisibleChange?.(true);\n toggable.current = true;\n });\n return;\n }\n setActive(true);\n onVisibleChange?.(true);\n toggable.current = true;\n });\n\n return () => cancelAnimationFrame(raf);\n }, [keepDOM, show, onVisibleChange]);\n\n const handleHide = useCallback(() => {\n if (!toggable.current) return;\n toggable.current = false;\n\n if (!closable) {\n setBounced(true);\n const timer = setTimeout(() => {\n setBounced(false);\n toggable.current = true;\n }, 400);\n return () => clearTimeout(timer);\n }\n\n setActive(false);\n updateVisible(mid, false);\n const timer = setTimeout(() => {\n if (!keepDOM) setShow(false);\n toggable.current = true;\n onVisibleChange?.(false);\n onClose?.();\n }, 240);\n\n return () => clearTimeout(timer);\n }, [closable, keepDOM, onClose, onVisibleChange]);\n\n const handleBackdropClick = () => {\n backdropClosable && handleHide();\n };\n\n useEffect(() => {\n const unsub = subscribe(() => {\n setTop(isTop(mid));\n });\n return unsub;\n }, []);\n\n useEffect(() => {\n const unregister = register({\n mid,\n visible: !!visible,\n hideBackdrop: !!hideBackdrop,\n closable: !!closable,\n });\n return unregister;\n }, []);\n\n useEffect(() => {\n visible ? handleShow() : handleHide();\n }, [visible]);\n\n useEffect(() => {\n if (!show) return;\n const raf = requestAnimationFrame(() => {\n setActive(top);\n });\n return () => cancelAnimationFrame(raf);\n }, [top]);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useKeydown(\n (e) => {\n if (e.code !== \"Escape\" || !visible || !top) return;\n handleHide();\n },\n { disabled: disableEsc },\n );\n\n const handleClick = () => {\n if (typeof document === \"undefined\") return;\n document.documentElement.click();\n };\n\n if (!show || !mounted) return null;\n\n return createPortal(\n <div\n ref={layerRef}\n className={classNames(\n \"i-modal-layer\",\n {\n \"i-modal-active\": active,\n \"i-modal-customized\": customized,\n \"i-modal-hide-backdrop\": hideBackdrop,\n fixed,\n },\n className,\n )}\n style={style}\n onClick={handleBackdropClick}\n >\n <div\n className={classNames(\"i-modal\", {\n bounced,\n shadow: !hideShadow,\n })}\n style={{\n width,\n height,\n }}\n onClick={(e) => {\n e.stopPropagation();\n handleClick();\n onClick?.(e);\n }}\n role=\"dialog\"\n aria-modal={top}\n data-mid={mid}\n {...restProps}\n >\n <ModalContext.Provider value={true}>\n {customized && children}\n\n {!customized && (\n <Content\n title={title}\n hideCloseButton={hideCloseButton}\n footer={footer}\n okButtonProps={okButtonProps}\n cancelButtonProps={cancelButtonProps}\n children={children}\n footerLeft={footerLeft}\n onOk={onOk}\n onClose={handleHide}\n />\n )}\n </ModalContext.Provider>\n </div>\n </div>,\n getContainer(),\n );\n}\n\nModal.useModal = useModal;\n\nexport default Modal as CompositionModal;\n"],"names":["useRef","useState","useCallback","updateVisible","useEffect","subscribe","isTop","register","useKeydown","createPortal","_jsx","classNames","_jsxs","ModalContext","Content","getContainer","useModal"],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ const CONTAINER_ID = "i-modal-container";
4
+ const BACKDROP_ID = "i-modal-backdrop";
5
+ let containerEl = null;
6
+ let backdropEl = null;
7
+ const stack = [];
8
+ const listeners = new Set();
9
+ function ensureContainer() {
10
+ if (containerEl)
11
+ return containerEl;
12
+ containerEl = document.createElement("div");
13
+ containerEl.id = CONTAINER_ID;
14
+ containerEl.className = "i-modal-container";
15
+ document.body.append(containerEl);
16
+ backdropEl = document.createElement("div");
17
+ backdropEl.id = BACKDROP_ID;
18
+ backdropEl.className = "i-modal-backdrop";
19
+ containerEl.prepend(backdropEl);
20
+ return containerEl;
21
+ }
22
+ function syncBackdrop() {
23
+ if (!backdropEl)
24
+ return;
25
+ const show = stack.some((e) => e.visible && !e.hideBackdrop);
26
+ backdropEl.classList.toggle("i-modal-backdrop-active", show);
27
+ }
28
+ function notify() {
29
+ listeners.forEach((fn) => fn());
30
+ }
31
+ function register(entry) {
32
+ ensureContainer();
33
+ stack.push(entry);
34
+ syncBackdrop();
35
+ notify();
36
+ return () => {
37
+ const idx = stack.findIndex((e) => e.mid === entry.mid);
38
+ if (idx !== -1)
39
+ stack.splice(idx, 1);
40
+ syncBackdrop();
41
+ notify();
42
+ if (stack.length === 0) {
43
+ backdropEl?.remove();
44
+ backdropEl = null;
45
+ containerEl?.remove();
46
+ containerEl = null;
47
+ }
48
+ };
49
+ }
50
+ function updateVisible(mid, visible) {
51
+ const entry = stack.find((e) => e.mid === mid);
52
+ if (entry) {
53
+ entry.visible = visible;
54
+ syncBackdrop();
55
+ notify();
56
+ }
57
+ }
58
+ function isTop(mid) {
59
+ const top = getTopVisible();
60
+ return top?.mid === mid;
61
+ }
62
+ function getTopVisible() {
63
+ for (let i = stack.length - 1; i >= 0; i--) {
64
+ if (stack[i].visible)
65
+ return stack[i];
66
+ }
67
+ return undefined;
68
+ }
69
+ function getContainer() {
70
+ return ensureContainer();
71
+ }
72
+ function subscribe(fn) {
73
+ listeners.add(fn);
74
+ return () => listeners.delete(fn);
75
+ }
76
+
77
+ exports.getContainer = getContainer;
78
+ exports.getTopVisible = getTopVisible;
79
+ exports.isTop = isTop;
80
+ exports.register = register;
81
+ exports.subscribe = subscribe;
82
+ exports.updateVisible = updateVisible;
83
+ //# sourceMappingURL=modalManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modalManager.js","sources":["../../../../packages/components/modal/modalManager.ts"],"sourcesContent":["export type StackEntry = {\n\tmid: string;\n\tvisible: boolean;\n\thideBackdrop: boolean;\n\tclosable: boolean;\n};\n\ntype Listener = () => void;\n\nconst CONTAINER_ID = \"i-modal-container\";\nconst BACKDROP_ID = \"i-modal-backdrop\";\nlet containerEl: HTMLDivElement | null = null;\nlet backdropEl: HTMLDivElement | null = null;\nconst stack: StackEntry[] = [];\nconst listeners = new Set<Listener>();\n\nfunction ensureContainer(): HTMLDivElement {\n\tif (containerEl) return containerEl;\n\n\tcontainerEl = document.createElement(\"div\");\n\tcontainerEl.id = CONTAINER_ID;\n\tcontainerEl.className = \"i-modal-container\";\n\tdocument.body.append(containerEl);\n\n\tbackdropEl = document.createElement(\"div\");\n\tbackdropEl.id = BACKDROP_ID;\n\tbackdropEl.className = \"i-modal-backdrop\";\n\tcontainerEl.prepend(backdropEl);\n\n\treturn containerEl;\n}\n\nfunction syncBackdrop() {\n\tif (!backdropEl) return;\n\tconst show = stack.some((e) => e.visible && !e.hideBackdrop);\n\tbackdropEl.classList.toggle(\"i-modal-backdrop-active\", show);\n}\n\nfunction notify() {\n\tlisteners.forEach((fn) => fn());\n}\n\nexport function register(entry: StackEntry): () => void {\n\tensureContainer();\n\tstack.push(entry);\n\tsyncBackdrop();\n\tnotify();\n\n\treturn () => {\n\t\tconst idx = stack.findIndex((e) => e.mid === entry.mid);\n\t\tif (idx !== -1) stack.splice(idx, 1);\n\t\tsyncBackdrop();\n\t\tnotify();\n\n\t\tif (stack.length === 0) {\n\t\t\tbackdropEl?.remove();\n\t\t\tbackdropEl = null;\n\t\t\tcontainerEl?.remove();\n\t\t\tcontainerEl = null;\n\t\t}\n\t};\n}\n\nexport function updateVisible(mid: string, visible: boolean) {\n\tconst entry = stack.find((e) => e.mid === mid);\n\tif (entry) {\n\t\tentry.visible = visible;\n\t\tsyncBackdrop();\n\t\tnotify();\n\t}\n}\n\nexport function isTop(mid: string): boolean {\n\tconst top = getTopVisible();\n\treturn top?.mid === mid;\n}\n\nexport function getTopVisible(): StackEntry | undefined {\n\tfor (let i = stack.length - 1; i >= 0; i--) {\n\t\tif (stack[i].visible) return stack[i];\n\t}\n\treturn undefined;\n}\n\nexport function getContainer(): HTMLDivElement {\n\treturn ensureContainer();\n}\n\nexport function subscribe(fn: Listener): () => void {\n\tlisteners.add(fn);\n\treturn () => listeners.delete(fn);\n}\n\nexport function shouldShowBackdrop(): boolean {\n\treturn stack.some((e) => e.visible && !e.hideBackdrop);\n}\n"],"names":[],"mappings":"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"}
@@ -64,12 +64,15 @@ function useMouseUp(listener, options) {
64
64
  }
65
65
  function useKeydown(listener, options) {
66
66
  initEventsOnce();
67
+ const listenerRef = react.useRef(listener);
68
+ listenerRef.current = listener;
67
69
  react.useEffect(() => {
68
70
  if (options?.disabled)
69
71
  return;
70
- KeydownEvents.add(listener);
72
+ const handler = (e) => listenerRef.current(e);
73
+ KeydownEvents.add(handler);
71
74
  return () => {
72
- KeydownEvents.delete(listener);
75
+ KeydownEvents.delete(handler);
73
76
  };
74
77
  }, []);
75
78
  }