GithubHelp home page GithubHelp logo

cudr / react-modal-promise Goto Github PK

View Code? Open in Web Editor NEW
61.0 61.0 17.0 2.09 MB

Ease way to use React modal components as Promise

Home Page: https://github.com/cudr/react-modal-promise

License: MIT License

JavaScript 8.86% TypeScript 90.56% Shell 0.58%
async modal modal-dialogs modals promise react typescript

react-modal-promise's Introduction

Install

npm install react-modal-promise

or

yarn add react-modal-promise

How to use:

  1. Place ModalContainer in any place of your App, it will emit new modal instances:
import { Container as ModalContainer } from 'react-modal-promise'

class MyApp extends React.Component {
  render () {
    return (
      <ModalContainer />
    )
  }
}
  1. Create you own modal component:

(You should pass isOpen: boolean flag to you Modal component)

You can resolve or reject Promise with onResolve() or onReject() callback from props:

import { create } from 'react-modal-promise'
import { Modal } from 'react-bootstrap'

const MyModal = ({ isOpen, onResolve, onReject }) => (
  <Modal open={isOpen} onHide={() => onReject()}>
    My Super Promised modal
    <button onClick={() => onResolve(/*pass any value*/)}>Confirm modal</button>
    <button onClick={() => onReject(/*throw any error*/)}>Reject modal</button>
  </Modal>
)

And wrap it:

export const myPromiseModal = create(MyModal)
  1. Use the modal as a Promise everywhere:
myPromiseModal({ /*pass any props there*/ })
  .then(value => {
    // get value that you passed to 'onResolve' function
  }).catch(error => {
    // get error that you passed to 'onReject' function
  })

ModalContainer props

import { Container as ModalContainer } from 'react-modal-promise';

function App() {
  function onOpen(modalId) {
    // do something when modal open
  }
  function onRemove(modalId) {
    // do something when modal closes
  }
  function onResolve() {
    // do something if modal resolved
  }
  function onReject() {
    // do something if modal rejected
  }

  return (
    <>
      <ModalContainer
        onOpen={onOpen}
        onRemove={onRemove}
        onResolve={onResolve}
        onReject={onReject}
        isAppendIntances
      />
      {/* other application */}
    </>
  );
}

Examples

Simple:

Edit react-modal-promise-example

With hook and route control:

Edit react-modal-promise-router-example

Use multiple scopes:

Edit react-modal-promise-multiple-scopes-example

Features

You can use react-modal-promise with any theming (Bootstrap or material-ui, styled-components, or other), all instances work great!

react-modal-promise's People

Contributors

adam1658 avatar cubanducko avatar cudr avatar demetri0 avatar dependabot-preview[bot] avatar khanind avatar oallouch avatar typeofweb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

react-modal-promise's Issues

What license is it?

Under what license is this library published?

Without license there is no way for users to use it (missing license file means that all right reserved for an author and nobody can use it)

Trying to pass props from a Typescript component fails.

This is the TSX component that calls the modal:
image

TitleModal({ isOpen, currentTitle: 'hi' })
  .then(() => {})
  .catch(() => {});

Error message:

(property) currentTitle: string
Argument of type '{ isOpen: boolean; currentTitle: string; }' is not assignable to parameter of type 'Omit<InstanceProps<any, any>, keyof InstanceProps<Resolve, Reject>> & Partial<InstanceProps<any, any>>'.
Object literal may only specify known properties, and 'currentTitle' does not exist in type 'Omit<InstanceProps<any, any>, keyof InstanceProps<Resolve, Reject>> & Partial<InstanceProps<any, any>>'.ts(2345)

Using:

"react": "^17.0.2", "react-modal-promise": "^1.0.2", "typescript": "^4.5.3"

Can I rejectAll()?

Hi. I've got a request to add some functionality. I have a case where there's two buttons on a modal, the first one resolves with true, the second one with false. That way I can check what user clicked.
I simply do if (await myModal())
But sometimes I need to close the modals from outside. That can be achieved with method resolveAll(). The problem is, the modal is resolved as undefined, which is, of course, interpreted as false.
I could do something like
a = await myModal()
if (a === undefined)
But it feels wrong.
I guess it would be much better if i could rejectAll() the promises and try to catch errors, instead of checking what promises return.
Unfortunately, there's no such a method. So my question is could you add this method?

Different types for onResolve and onReject?

I've got a typescript promise component that should either resolve with a certain value, or reject with an Error object. But the types for this library say that onResolve and onReject both take the same type T.

The typescript types for Promise.prototype.then and Promise.prototype.catch show that the rejected callbacks take a different type to the resolved callback: https://github.com/microsoft/TypeScript/blob/cec2fda9a53620dc545a2c4d7b0156446ab145b4/lib/lib.es5.d.ts#L1446-L1461

Would you consider allowing different types for the argument to onResolve and onReject here?

export interface InstanceProps<Result> extends InstanceOptions {
isOpen: boolean
instanceId: Hex
onReject: (reason?: Result) => void
onResolve: (result?: Result) => void
/** @deprecated **/
open: boolean
/** @deprecated **/
close: (result?: Result) => void
}

Maybe something like this:

export interface InstanceProps<Result, RejectReason = Result> extends InstanceOptions { 
   //                                ^^^^^^^^^^^^^^^^^^^^^^^
   isOpen: boolean 
   instanceId: Hex 
   onReject: (reason?: RejectReason) => void 
   //                  ^^^^^^^^^^^^
   onResolve: (result?: Result) => void 
  
   /** @deprecated **/ 
   open: boolean 
   /** @deprecated **/ 
   close: (result?: Result) => void 
 } 

With hook and route control - Re render

Hi, I have a problem when I use the modal with the hook and route control. It basically causes the whole page to rerender, and I think is because of the Context, because I wrap the whole application in it.

If I modify the ModalProvider component to use constate (does the same thing as Redux, but is much easier to implement) instead of react Context do you think it will prevent rerendering the whole application?

Sorry if it's a stupid question, I'm pretty new at React.

React 17 support

Does this work with React 17? this package specifically lists react 16 as a strict dependency and does not allow 17 be installed.

Can you update the peer dependency to allow react 17?

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.