JSPM

  • Created
  • Published
  • Downloads 359
  • Score
    100M100P100Q89404F
  • License MIT

React Modal but Global

Package Exports

  • react-modal-global
  • react-modal-global/dist/index.ts

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (react-modal-global) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

React Modal Global

Introduction

This is a package that provides modal dialogs which does similar to react-modal except that it is accessed from anywhere.

Motivation

It is often to happen that in the function context, for example fetchMyLovelyData, after some, probably async, actions, you need to open a Modal. In react-modal you add Modal component to your components tree and this approach requires doing so each time you want a modal to exist, it may cause some unwanted overlaping, is a bit of boilerplate code and inflicts a holder of this Modal to control the isOpen state and other parameters.

Likely to create a package that would solve these problems while still covering most of use cases.

How it works

  • The package uses only react as a dependency.
  • Relies on react context to transfer information between ModalContainer and modal components.

The main idea

There is a ModalContainer which is a container for modal components (it usually appears in #root element) and modal components will appear there as you open them.

Show `ModalContainer` usage example
import React from "react"
import ReactDOM from "react-dom"
import { ModalContainer } from "react-modal-global"

function App() {
  return (
    <>
      {/* ... Other components ... */}
      <ModalContainer />
    </>
  )
}

ReactDOM.render(<App />, document.getElementById("root"))
There are other features upon this idea.

Usage

Create new Modal component

All it needs for creating such is a valid JSX.Element:

Plain component

// Arrow function
const ModalComponent = () => <>:3</>
// Plain function
function ModalComponent() {
  return <>:3</>
}

Using modal context

function ModalComponent() {
  const modal = useModalContext() // Getting modal context of current component

  return (
    <>
      <h2>Title</h2>
      <p>Content text</p>
      
      <button type="button" onClick={() => modal.close()}>My custom button to close modal</button>
    </>
  )
}
import { Modal } from "react-modal-global"

import PopupLogin from "./PopupLogin"

function HomeView() {
  function showLoginPopup() {
    // Recommended naming is [Popup, Dialog or Modal] then [Name of a modal] i.e. DialogMyName
    Modal.open(PopupLogin, { /* Probably your options? */ })
  }
  return (
    <>
      <h2>Title</h2>
      <p>Content text</p>

      <button type="button" onClick={showLoginPopup}>Show login popup</button>
    </>
  )
}

You can use options when opening a modal. Available options

  • fork - creates a new layer for a single modal
  • asd