DEV Community

Max Frolov
Max Frolov

Posted on

React Modal Manager Context

In case your modal open/close/update logic sucks - grab & use this modal manager context.

import * as React from 'react'

export const ModalManagerContext = React.createContext({
  handleOpenModal: () => {},
  handleCloseModal: () => {},
  handleChangeModalData: () => {},
  handleUpdateModalData: () => {},
  isOpen: false,
  modalData: {}
})

const ModalManagerContextProvider = ({ children }) => {
  const [modalState, handleChangeState] = React.useState({
    isOpen: false,
    data: {}
  })

  const handleOpenModal = (data = {}) => {
    handleChangeState(prevState => ({
      isOpen: true,
      data: {
        ...prevState.data,
        ...data
      }
    }))
  }

  const handleCloseModal = () => {
    handleChangeState({ isOpen: false, data: {} })
  }

  const handleChangeModalData = (data = {}) => {
    handleChangeState(prevState => ({ ...prevState, data }))
  }

  const handleUpdateModalData = (data = {}) => {
    handleChangeState(prevState => ({ ...prevState, data: { ...prevState.data, ...data } }))
  }

  return (
    <ModalManagerContext.Provider
      value={{
        handleOpenModal,
        handleCloseModal,
        handleChangeModalData,
        handleUpdateModalData,
        isOpen: modalState.isOpen,
        modalData: modalState.data
      }}
    >
      {children}
    </ModalManagerContext.Provider>
  )
}

export default ModalManagerContextProvider

Check this 🍬 as well: React click outside hook.

More tips and best practices on my twitter.

Feedback is appreciated. Cheers!

Top comments (0)