1.1.2 • Published 1 year ago

demodal v1.1.2

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

GitHub Actions Coverage NPM bundle size Twitter Badge

Quick Features

  • Promise based: open your modal with a simple function call and await for the result.
  • Uncontrolled: open/close your modal from anywhere in the code (even inside the modal itself).
  • Decoupled: no need to import a modal component to use it. Modals can be managed by ID.
  • Tiny: zero-dependency to keep your bundle size under control: ~1.5kB.
  • Easy integration: easily integrate with any UI library.
  • Lazy-loading: delay the rendering of your modal component until it's open.

Examples

Try it on CodeSandbox or browse the examples folder.

Demodal Examples

Basic Usage

import Demodal from 'demodal'
import MyModal from './MyModal'

// ...
const result = await Demodal.open(MyModal, { myModalProp: 'value' })
// Do something with result

Use-Case: Confirmation Modal

/**
 * confirm.js
 */
import { Demodal, useModal } from 'demodal'

// Register your Confirm modal wrapping it with `Demodal.create`
const Confirm = Demodal.create(
  ({ title = 'Confirmation', message = 'Do you confirm this action?' }) => {
    // useModal hook to control UI components
    const modal = useModal()

    // Once resolved, automatically close the modal
    const resolve = value => () => {
      modal.resolve(value)
      modal.close()
    }

    // "title" and "message" are props sent with "modal.open()"
    return (
      <Modal open={modal.isOpen} onClose={modal.close} onExited={modal.remove}>
        <div>{title}</div>
        <div>{body}</div>
        <Button onClick={resolve(true)}>Yes</Button>
        <Button onClick={resolve(false)}>No</Button>
      </Modal>
    )
  }
)

// Create a custom confirm function
export const confirm = props => Demodal.open(Confirm, props)

/**
 * page.js
 */
import { confirm } from './confirm'

export const Page = () => {
  const handleClick = async () => {
    const confirmed = await confirm({
      title: 'Are you sure?',
      message: 'This action is irreversible',
    })
    console.log(confirmed)
  }

  return <Button onClick={handleClick}>Action</Button>
}

/**
 * app.js
 */
import { Demodal } from 'demodal'

function App() {
  // Remember to add a Demodal.Container to your app's root
  return (
    <>
      <Page />
      <Demodal.Container />
    </>
  )
}

Contributors ✨

Thanks goes to these wonderful people (emoji key):

This project follows the all-contributors specification. Contributions of any kind welcome!

1.1.2

1 year ago

1.1.1

2 years ago

1.1.0

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago