Security News
GitHub Removes Malicious Pull Requests Targeting Open Source Repositories
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
react-modal-global
Advanced tools
React modal dialogs which is similar to react-modal
but it may be called from useEffect
, that's why it is global ^_^
Needs feedback, please contribute to GitHub Issues or leave your message to my discord server.
useEffect
hook without creating a new component for each one by passing props
to open
method.useEffect
hook).props
to open
method.[Type][Name]
=> DrawerLayout
).ModalController
class and creating your own layouts.open
method can be accessed in the component using useModalContext
hookweak: true
it will not happen)open
method is PromiseLike
(thenable
) - you can use await
or then
to wait for modal closingModalContainer
is a container for modal components (it usually appears in the root of your app) and modal components will appear there as you open them.
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"))
All it needs for creating modal component is a react component factory with a valid JSX.Element
:
// Arrow function
const ModalComponent = () => <>:3</>
// Plain function
function ModalComponent() {
return <>:3</>
}
modal context
function ModalComponent() {
const modal = useModalContext() // Getting modal context of currently active component
return (
<>
<h2>Title</h2>
<p>Content text</p>
<button type="button" onClick={modal.close}>close</button>
</>
)
}
Note that PopupLogin
should have its own styles to look like a popup, it is advised to use custom PopupLayout
(Learn below).
import "react-modal-global/styles/modal.scss" // import default styles if want
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>
</>
)
}
There is a multicontainers feature - you can put containers at different depths of your app to vary templates.
Only one container will be used.
The last mounted container will be used.
To use various modal types (Dialog, Popup, Drawer), you create your own layout
for each one, advised naming is [Type][Name] => DrawerLayout
.
To create your first Popup
modal try this
import { FormEvent } from "react"
import { useModalContext } from "react-modal-global"
import PopupLayout from "../modal/layouts/PopupLayout/PopupLayout"
function PopupMyFirst() {
const modal = useModalContext()
function onSubmit(event: FormEvent<HTMLFormElement>) {
event.preventDefault()
const target = event.currentTarget
const ageInput = target.elements.namedItem("age")
alert(ageInput) // Show age
modal.close() // Then close `this modal`
}
return (
<PopupLayout>
<form onSubmit={onSubmit}>
<h2>My first popup modal</h2>
<input name="age" placeholder="Enter your `first popup modal` age" />
<button type="submit">See my age</button>
</form>
</PopupLayout>
)
}
export default PopupMyFirst
Instead of wrapping your modal components manually you can pass template
attribute to ModalContainer
, for example, PopupLayout
<ModalContainer template={PopupLayout} />
Layout is a component that wraps modal component and allows to customize modal look and controls (close button, header, footer, etc.).
Layouts are used to create various modal types (Dialog, Popup, Drawer) and to customize modal controls.
For example, you can create your own PopupLayout
to use it in your Popup
modals.
Layouts should not have aria-modal
attribute and role="dialog"
because they are already set in ModalContainer
component.
You should manually add aria-labelledby
and aria-describedby
attributes to your layout.
Open
Modal.open
is a method that opens a modal. See usage for example. See options for more details.
Modal.open(ModalComponent, { /* options */ })
Close
There is no Modal.close
method because it's hard to know what exactly window to close, instead you can close a modal from inside of a modal component using useModalContext
hook.
To close from outside you can use returned close
method from Modal.open
or Modal.closeBy
methods
CloseByComponent
Modal.closeByComponent
is a method that closes a modal by its component. It will close all modals that use this component.
Modal.closeByComponent(ModalComponent)
CloseById
Modal.closeById
is a method that closes a modal by its id. It will close all modals that have this id.
Modal.closeById("insane-id")
You can use options when opening a modal with Modal.open()
.
Available options
Option | Description |
---|---|
id | Specifies id of a modal. In react it's used as a key . May be used to find and close specific modal or else. |
closable | Specifies if a modal closing is controllable internally. If false , it's supposed to mean that user should do a specific action to close. |
weak | By default, a last closed modal will not be removed if the same modal will be requested to open. It will restore previous modal but with weak: true it will not happen. |
FAQs
Uncontrollable Global React Modal
The npm package react-modal-global receives a total of 0 weekly downloads. As such, react-modal-global popularity was classified as not popular.
We found that react-modal-global demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
Security News
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
Security News
Node.js will be enforcing stricter semver-major PR policies a month before major releases to enhance stability and ensure reliable release candidates.