Skip to content

React use browser previous page, button click, refresh page or close window, trigger confirm message

Notifications You must be signed in to change notification settings

jason90929/react-unsaved

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

react-unsaved

React use browser previous page, button click, refresh page or close window, trigger confirm message

If your react-router is version 5, just use master branch directly; If it's v6, you can checkout branch into feature/v6

import { ModalUnsaved } from 'react-unsaved';

<ModalUnsaved
  modalShow={() => modalRef.current.show()} // How to open your modal
  modalClose={() => modalRef.current.close()} // How to close your modal
  message="Are you sure you want to leave page without saving?"
>
  {(message, onClose, onConfirm) => (
    // your modal with my methods
    <ModalConfirm
      ref={modalRef}
      onClose={onClose}
      onConfirm={onConfirm}
    >
      <h5>{message}</h5>
    </ModalConfirm>
  )}
</ModalUnsaved>

And this is my example of component ModalConfirm.jsx

import React from 'react';
import PropTypes from 'prop-types';
import { Modal } from 'antd';

class ModalUnsavedConfirm extends React.Component {
  state = { visible: false };

  showModal = () => {
    this.setState({
      visible: true,
    });
  };

  hideModal = () => {
    this.setState({
      visible: false,
    });
  };

  onClose = (event) => {
    this.hideModal();
    this.props.onClose(event);
  };

  render() {
    return (
      <Modal
        title="Confirm leave?"
        visible={this.state.visible}
        onOk={this.props.onConfirm}
        onCancel={this.onClose}
        okText="Confirm"
        cancelText="Close"
        zIndex="1005" // Should higher than all other modals
      >
        {this.props.children}
      </Modal>
    );
  }
}

ModalUnsavedConfirm.defaultProps = {
  children: null,
};

ModalUnsavedConfirm.propTypes = {
  children: PropTypes.node,
}

export default ModalUnsavedConfirm;

How to activate confirm leave event:

import { unsavedInstance } from 'react-unsaved';

// After you modified your form data or state, you can enable event after setState
unsavedInstance.enable();

// If you call API that saving your form, you can disable event after success callback
unsavedInstance.disable();

If your button doesn't change route, like close modal, you can set your button onClick event like this:

import { unsavedInstance } from 'react-unsaved';

const closeModal = () => {
  if (unsavedInstance.getUnsavedStatus()) {
    unsavedInstance.showModal();
    unsavedInstance.setAfterConfirmEvent(() => {
      toggleVisible(false);
    });
  } else {
    toggleVisible(false);
  }
};

So after that setting your event would bind on confirm leave modal's button event.

About

React use browser previous page, button click, refresh page or close window, trigger confirm message

Resources

Stars

Watchers

Forks

Packages

No packages published