Browse Source

refactor AttachmentsDropup

Yuki Takei 2 years ago
parent
commit
0251b34aad

+ 5 - 1
packages/editor/src/components/CodeMirrorEditor/CodeMirrorEditor.tsx

@@ -237,7 +237,11 @@ export const CodeMirrorEditor = (props: Props): JSX.Element => {
         <input {...getInputProps()} />
         <input {...getInputProps()} />
         <FileDropzoneOverlay isEnabled={isDragActive} />
         <FileDropzoneOverlay isEnabled={isDragActive} />
         <CodeMirrorEditorContainer ref={containerRef} />
         <CodeMirrorEditorContainer ref={containerRef} />
-        <Toolbar editorKey={editorKey} onFileOpen={open} acceptedUploadFileType={acceptedUploadFileType} />
+        <Toolbar
+          editorKey={editorKey}
+          acceptedUploadFileType={acceptedUploadFileType}
+          onAttachmentMenuItemClicked={open}
+        />
       </div>
       </div>
     </div>
     </div>
   );
   );

+ 4 - 4
packages/editor/src/components/CodeMirrorEditor/Toolbar/AttachmentsButton.tsx

@@ -4,18 +4,18 @@ import {
 } from 'reactstrap';
 } from 'reactstrap';
 
 
 type Props = {
 type Props = {
-  onFileOpen: () => void,
+  onItemClicked: () => void,
   acceptedUploadFileType: AcceptedUploadFileType,
   acceptedUploadFileType: AcceptedUploadFileType,
 }
 }
 
 
 export const AttachmentsButton = (props: Props): JSX.Element => {
 export const AttachmentsButton = (props: Props): JSX.Element => {
 
 
-  const { onFileOpen, acceptedUploadFileType } = props;
+  const { onItemClicked, acceptedUploadFileType } = props;
 
 
   if (acceptedUploadFileType === AcceptedUploadFileType.ALL) {
   if (acceptedUploadFileType === AcceptedUploadFileType.ALL) {
     return (
     return (
       <>
       <>
-        <DropdownItem className="d-flex gap-2 align-items-center" onClick={onFileOpen}>
+        <DropdownItem className="d-flex gap-2 align-items-center" onClick={onItemClicked}>
           <span className="material-symbols-outlined fs-5">attach_file</span>
           <span className="material-symbols-outlined fs-5">attach_file</span>
           Files
           Files
         </DropdownItem>
         </DropdownItem>
@@ -25,7 +25,7 @@ export const AttachmentsButton = (props: Props): JSX.Element => {
   if (acceptedUploadFileType === AcceptedUploadFileType.IMAGE) {
   if (acceptedUploadFileType === AcceptedUploadFileType.IMAGE) {
     return (
     return (
       <>
       <>
-        <DropdownItem className="d-flex gap-2 align-items-center" onClick={onFileOpen}>
+        <DropdownItem className="d-flex gap-2 align-items-center" onClick={onItemClicked}>
           <span className="material-symbols-outlined fs-5">image</span>
           <span className="material-symbols-outlined fs-5">image</span>
           Images
           Images
         </DropdownItem>
         </DropdownItem>

+ 17 - 6
packages/editor/src/components/CodeMirrorEditor/Toolbar/AttachmentsDropup.tsx

@@ -1,9 +1,11 @@
+import { useCallback, useState } from 'react';
+
 import { AcceptedUploadFileType } from '@growi/core';
 import { AcceptedUploadFileType } from '@growi/core';
 import {
 import {
-  UncontrolledDropdown,
   DropdownToggle,
   DropdownToggle,
   DropdownMenu,
   DropdownMenu,
   DropdownItem,
   DropdownItem,
+  Dropdown,
 } from 'reactstrap';
 } from 'reactstrap';
 
 
 import type { GlobalCodeMirrorEditorKey } from '../../../consts';
 import type { GlobalCodeMirrorEditorKey } from '../../../consts';
@@ -13,16 +15,25 @@ import { LinkEditButton } from './LinkEditButton';
 
 
 type Props = {
 type Props = {
   editorKey: string | GlobalCodeMirrorEditorKey,
   editorKey: string | GlobalCodeMirrorEditorKey,
-  onFileOpen: () => void,
   acceptedUploadFileType: AcceptedUploadFileType,
   acceptedUploadFileType: AcceptedUploadFileType,
+  onMenuItemClicked: () => void,
 }
 }
 
 
 export const AttachmentsDropup = (props: Props): JSX.Element => {
 export const AttachmentsDropup = (props: Props): JSX.Element => {
-  const { onFileOpen, acceptedUploadFileType, editorKey } = props;
+  const { onMenuItemClicked, acceptedUploadFileType, editorKey } = props;
+
+  const [isOpen, setOpen] = useState(false);
+
+  const itemClickedHandler = useCallback(() => {
+    onMenuItemClicked();
+
+    // Force close against react-dropzone's { noClick: true } option
+    setOpen(false);
+  }, [onMenuItemClicked]);
 
 
   return (
   return (
     <>
     <>
-      <UncontrolledDropdown direction="up" className="lh-1">
+      <Dropdown isOpen={isOpen} toggle={() => setOpen(!isOpen)} direction="up" className="lh-1">
         <DropdownToggle className="btn-toolbar-button rounded-circle">
         <DropdownToggle className="btn-toolbar-button rounded-circle">
           <span className="material-symbols-outlined fs-6">add</span>
           <span className="material-symbols-outlined fs-6">add</span>
         </DropdownToggle>
         </DropdownToggle>
@@ -31,10 +42,10 @@ export const AttachmentsDropup = (props: Props): JSX.Element => {
             Attachments
             Attachments
           </DropdownItem>
           </DropdownItem>
           <DropdownItem divider />
           <DropdownItem divider />
-          <AttachmentsButton onFileOpen={onFileOpen} acceptedUploadFileType={acceptedUploadFileType} />
+          <AttachmentsButton onItemClicked={itemClickedHandler} acceptedUploadFileType={acceptedUploadFileType} />
           <LinkEditButton editorKey={editorKey} />
           <LinkEditButton editorKey={editorKey} />
         </DropdownMenu>
         </DropdownMenu>
-      </UncontrolledDropdown>
+      </Dropdown>
     </>
     </>
   );
   );
 };
 };

+ 3 - 3
packages/editor/src/components/CodeMirrorEditor/Toolbar/Toolbar.tsx

@@ -15,16 +15,16 @@ import styles from './Toolbar.module.scss';
 
 
 type Props = {
 type Props = {
   editorKey: string | GlobalCodeMirrorEditorKey,
   editorKey: string | GlobalCodeMirrorEditorKey,
-  onFileOpen: () => void,
   acceptedUploadFileType: AcceptedUploadFileType,
   acceptedUploadFileType: AcceptedUploadFileType,
+  onAttachmentMenuItemClicked: () => void,
 }
 }
 
 
 export const Toolbar = memo((props: Props): JSX.Element => {
 export const Toolbar = memo((props: Props): JSX.Element => {
 
 
-  const { editorKey, onFileOpen, acceptedUploadFileType } = props;
+  const { editorKey, onAttachmentMenuItemClicked, acceptedUploadFileType } = props;
   return (
   return (
     <div className={`d-flex gap-2 p-2 codemirror-editor-toolbar ${styles['codemirror-editor-toolbar']}`}>
     <div className={`d-flex gap-2 p-2 codemirror-editor-toolbar ${styles['codemirror-editor-toolbar']}`}>
-      <AttachmentsDropup editorKey={editorKey} onFileOpen={onFileOpen} acceptedUploadFileType={acceptedUploadFileType} />
+      <AttachmentsDropup editorKey={editorKey} onMenuItemClicked={onAttachmentMenuItemClicked} acceptedUploadFileType={acceptedUploadFileType} />
       <TextFormatTools editorKey={editorKey} />
       <TextFormatTools editorKey={editorKey} />
       <EmojiButton
       <EmojiButton
         editorKey={editorKey}
         editorKey={editorKey}