12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- import React from "react";
- import PropTypes from "prop-types";
- import invariant from "tiny-invariant";
- import Lifecycle from "./Lifecycle.js";
- import RouterContext from "./RouterContext.js";
- /**
- * The public API for prompting the user before navigating away from a screen.
- */
- function Prompt({ message, when = true }) {
- return (
- <RouterContext.Consumer>
- {context => {
- invariant(context, "You should not use <Prompt> outside a <Router>");
- if (!when || context.staticContext) return null;
- const method = context.history.block;
- return (
- <Lifecycle
- onMount={self => {
- self.release = method(message);
- }}
- onUpdate={(self, prevProps) => {
- if (prevProps.message !== message) {
- self.release();
- self.release = method(message);
- }
- }}
- onUnmount={self => {
- self.release();
- }}
- message={message}
- />
- );
- }}
- </RouterContext.Consumer>
- );
- }
- if (__DEV__) {
- const messageType = PropTypes.oneOfType([PropTypes.func, PropTypes.string]);
- Prompt.propTypes = {
- when: PropTypes.bool,
- message: messageType.isRequired
- };
- }
- export default Prompt;
|