Coder Social home page Coder Social logo

kiraind / react-hooks-async-modal Goto Github PK

View Code? Open in Web Editor NEW
8.0 2.0 0.0 4.03 MB

Library for creating async modal-calling functions in React

Home Page: https://www.npmjs.com/package/react-hooks-async-modal

License: MIT License

HTML 17.34% CSS 5.49% TypeScript 77.17%

react-hooks-async-modal's Introduction

react-hooks-async-modal

Library for creating async modal-calling functions in React

NPM JavaScript Style Guide Strict TypeScript Checked

Install

npm install --save react-hooks-async-modal

Usage

First, import ModalProvider and wrap your App with it:

import { ModalProvider } from 'react-hooks-async-modal'

ReactDOM.render(
  (
    <ModalProvider>
      <App />
    </ModalProvider>
  ),
  document.getElementById('root')
)

Then create component for modal, it must have onResolve and onReject callback props. May have custom props like message. Here is an example async implementation of browser's prompt:

import { ModalComponentProps } from 'react-hooks-async-modal'

export interface PromptModalProps {
  message: string
}

const PromptModal: React.FC<PromptModalProps & ModalComponentProps<string>> = ({
  message,

  onResolve,
  onReject
}) => {
  const inputRef = useRef<HTMLInputElement>(null)
  const backRef = useRef(null)

  return (
    <div
      className='ModalWrap'
      ref={backRef}

      onClick={e =>
        // prevent triggering if clicked on a child
        (e.target === backRef.current) &&
          onReject!('Clicked outside modal')}
    >
      <div className='ModalBody'>
        <p>{message}</p>
        <input
          ref={inputRef}
        />
        <button
          onClick={() => onReject!('Input cancelled')}
        >Cancel
        </button>
        <button
          onClick={() => onResolve(inputRef.current!.value)}
        >Ok
        </button>
      </div>
    </div>
  )
}

To use it as an async function, import useModal like here:

import { useModal } from 'react-hooks-async-modal'

const App = () => {
  const [promptedText, setPromptedText] = useState('none')
  const [thrownText, setThrownText] = useState('none')

  const callPromptModal = useModal<PromptModalProps, string>(PromptModal)

  const onPrompt = async () => {
    try {
      const text = await callPromptModal({ message: 'Enter some text' })
      setPromptedText(text)
    } catch (error) {
      setThrownText(error.toString())
    }
  }

  return (
    <main>
      <p>
        Prompted text: {promptedText}
        <br />
        Thrown: {thrownText}
      </p>
      <button
        onClick={onPrompt}
      >
        Prompt!
      </button>
    </main>
  )
}

If you're connecting your modal to Redux or using some other HOC that returns type incompatible with useModal argument you can use proxyModal:

import { proxyModal } from 'react-hooks-async-modal'

export default proxyModal<string>(
  connect(mapStateToProps, mapDispatchToProps)(PromptModalInner)
)

License

MIT

react-hooks-async-modal's People

Contributors

kiraind avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.