0.9.6 • Published 8 months ago

@kamo88/react-dialog-hooks v0.9.6

Weekly downloads
-
License
Unlicense
Repository
github
Last release
8 months ago

license npm (scoped) codecov pages-build-deployment

npm i @kamo88/react-dialog-hooks

or

Please choose your @version

<script src="https://unpkg.com/@kamo88/react-dialog-hooks@0.9.5/dist/umd/index.js" crossorigin></script>
<!doctype html>
<html>
  <head>
    <script
      src="https://unpkg.com/react@18/umd/react.development.js"
      crossorigin
    ></script>
    <script
      src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"
      crossorigin
    ></script>
    <script
      src="https://unpkg.com/@kamo88/react-dialog-hooks@0.9.5/dist/umd/index.js"
      crossorigin
    ></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
  </head>
  <body>
    <div id="root"></div>

    <script type="text/babel">
      function Hello() {
        const { ref, isOpen, showDialog, closeDialog } =
          Kamo88Dialog.useDialog();
        return (
          <div>
            <button type="button" onClick={showDialog}>
              showDialog
            </button>
            <Kamo88Dialog.Dialog
              ref={ref}
              isOpen={isOpen}
              onClickAway={closeDialog}
            >
              <div>
                <div>header</div>
                <div>Hello World!</div>
                <div>
                  <button type="button" onClick={closeDialog}>
                    closeDialog main
                  </button>
                  <button type="button" onClick={closeDialog}>
                    closeDialog sub
                  </button>
                </div>
              </div>
            </Kamo88Dialog.Dialog>
          </div>
        );
      }

      const container = document.getElementById('root');
      const root = ReactDOM.createRoot(container);
      root.render(<Hello />);
    </script>
  </body>
</html>

@kamo88/react-dialog-hooks

This React component & hooks are to be displayed using the \<dialog> tag.

storybook

Description

  1. Hooks for using the dialog tag.
  2. Using body-scroll-lock to stop the body scrolling.
  3. Dialog Component loops focus to a focusable element in the content using focus-trap-react.
  4. Dialog Component can be styled using className. ex) tailwindcss , css modules (@emotion/react is also available)

Usage

useDialog

Normal usage.

Of course, you can also create markup using regular dialog tags.

import { useDialog } from '@kamo88/react-dialog-hooks';

const UseDialogExample = () => {
  const { ref, isOpen, showDialog, closeDialog } = useDialog();

  return (
    <div>
      <button type="button" onClick={showDialog}>
        showDialog
      </button>
      <dialog role="presentation" ref={ref} onClick={closeDialog}>
        <div role="presentation" onClick={(e) => e.stopPropagation()}>
          <div>header</div>
          <div>main</div>
          <div>
            footer
            <button type="button" onClick={closeDialog}>
              closeDialog
            </button>
          </div>
        </div>
      </dialog>
    </div>
  );
};

useDialogPromise

The use of showDialog's return is Promise. Wait for user operation in a Promise and handle it with its return ('main', 'sub', 'abort' type string). ※ The same behavior can be implemented in useDialog, even though Promise cannot be used.

import { useCallback } from 'react';
import { useDialogPromise, DialogResponse } from '@kamo88/react-dialog-hooks';

const UseDialogPromiseExample = () => {
  const {
    ref,
    isOpen,
    showDialog,
    closeDialogMain,
    closeDialogSub,
    closeDialogAbort,
  } = useDialogPromise();

  const handleShowDialog = useCallback(async () => {
    const dialogRes = await showDialog();
    if (dialogRes === DialogResponse.main) {
      // main processing ex) primary button`s action
      return;
    }

    if (dialogRes === DialogResponse.sub) {
      // sub processing ex) secondary button`s action
      return;
    }

    if (dialogRes === DialogResponse.abort) {
      // abort processing ex) click away`s action & This Component`s unmount
    }
  }, [showDialog]);

  return (
    <div>
      <button type="button" onClick={handleShowDialog}>
        showDialog
      </button>
      <dialog role="presentation" ref={ref} onClick={closeDialogAbort}>
        <div role="presentation" onClick={(e) => e.stopPropagation()}>
          <div>header</div>
          <div>main</div>
          <div>
            footer
            <button type="button" onClick={closeDialogMain}>
              closeDialogMain
            </button>
            <button type="button" onClick={closeDialogSub}>
              closeDialogSub
            </button>
          </div>
        </div>
      </dialog>
    </div>
  );
};

Dialog

import { Dialog, useDialog } from '@kamo88/react-dialog-hooks';

const DialogComponentExample = () => {
  const { ref, isOpen, showDialog, closeDialog } = useDialog();

  return (
    <div>
      <button type="button" onClick={showDialog}>
        showDialog
      </button>
      <Dialog
        className="backdrop:bg-gray-900 backdrop:opacity-80"
        ref={ref}
        isOpen={isOpen}
        className="dialogClass"
        shouldFocusTrap
        initialFocus={false}
        onClickAway={closeDialog}
      >
        <div>
          <div>header</div>
          <div>main</div>
          <div>
            footer
            <button type="button" onClick={closeDialog}>
              closeDialog main
            </button>
          </div>
        </div>
      </Dialog>
    </div>
  );
};

Dialog Component Props

keytyperequireddefaultdescription
refReact.RefObject\<HTMLDialogElement>dialog ref
childrenReactNodedialog contents.Basically, include elements that can focus.
isOpenbooleandialog open state
shouldFocusTrapbooleantrue
initialFocusundefined or falseundefinedThis is based on the focus-trap-react property.
onClickAway() => voidEvent when backdrop in Dialog is clicked.This is an alternative to the click event in the dialog tag.

& \<dialog> element`s attributes

0.9.6

8 months ago

0.9.5

8 months ago

0.9.4

8 months ago

0.9.3

8 months ago

0.9.2

9 months ago

0.9.1

9 months ago

0.9.0

9 months ago

0.0.3

9 months ago

0.0.2

9 months ago

0.0.1

9 months ago