Updates, bug fix, prompt refactor
Signed-off-by: Dave Richer <dave@imexsystems.ca>
This commit is contained in:
8
client/package-lock.json
generated
8
client/package-lock.json
generated
@@ -28,7 +28,7 @@
|
|||||||
"exifr": "^7.1.3",
|
"exifr": "^7.1.3",
|
||||||
"firebase": "^10.7.1",
|
"firebase": "^10.7.1",
|
||||||
"graphql": "^16.6.0",
|
"graphql": "^16.6.0",
|
||||||
"i18next": "^23.7.8",
|
"i18next": "^23.7.9",
|
||||||
"i18next-browser-languagedetector": "^7.0.1",
|
"i18next-browser-languagedetector": "^7.0.1",
|
||||||
"jsoneditor": "^9.9.0",
|
"jsoneditor": "^9.9.0",
|
||||||
"jsreport-browser-client-dist": "^1.3.0",
|
"jsreport-browser-client-dist": "^1.3.0",
|
||||||
@@ -11594,9 +11594,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/i18next": {
|
"node_modules/i18next": {
|
||||||
"version": "23.7.8",
|
"version": "23.7.9",
|
||||||
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.7.8.tgz",
|
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.7.9.tgz",
|
||||||
"integrity": "sha512-yCe9964O+1abdIG01AOzk6P9mQi0HVJV1B57whYJQu6TjmrB9JHHDYonDI8amGt6M6b9bP3x3R0Zh7ROmvX7JQ==",
|
"integrity": "sha512-wturtxTfJLJdLzHhyfxXo2l9Cbu2Iz4wF4065oWThPvdFJMUUG3fhXD3BLCHgrv4VxfScORq0i9sfCdjVPbgiw==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "individual",
|
"type": "individual",
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
"exifr": "^7.1.3",
|
"exifr": "^7.1.3",
|
||||||
"firebase": "^10.7.1",
|
"firebase": "^10.7.1",
|
||||||
"graphql": "^16.6.0",
|
"graphql": "^16.6.0",
|
||||||
"i18next": "^23.7.8",
|
"i18next": "^23.7.9",
|
||||||
"i18next-browser-languagedetector": "^7.0.1",
|
"i18next-browser-languagedetector": "^7.0.1",
|
||||||
"jsoneditor": "^9.9.0",
|
"jsoneditor": "^9.9.0",
|
||||||
"jsreport-browser-client-dist": "^1.3.0",
|
"jsreport-browser-client-dist": "^1.3.0",
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ function PrivateRoute({component: Component, isAuthorized, ...rest}) {
|
|||||||
if (!isAuthorized) {
|
if (!isAuthorized) {
|
||||||
navigate(`/signin?redirect=${location.pathname}`);
|
navigate(`/signin?redirect=${location.pathname}`);
|
||||||
}
|
}
|
||||||
}, [isAuthorized, navigate]);
|
}, [isAuthorized, navigate,location]);
|
||||||
|
|
||||||
return <Outlet/>;
|
return <Outlet/>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ export default function FormsFieldChanged({ form, skipPrompt }) {
|
|||||||
<Space direction="vertical" style={{ width: "100%" }}>
|
<Space direction="vertical" style={{ width: "100%" }}>
|
||||||
<Prompt
|
<Prompt
|
||||||
when={!skipPrompt}
|
when={!skipPrompt}
|
||||||
|
beforeUnload={true}
|
||||||
message={(location) => {
|
message={(location) => {
|
||||||
if (loc.pathname === location.pathname) return false;
|
if (loc.pathname === location.pathname) return false;
|
||||||
return t("general.messages.unsavedchangespopup");
|
return t("general.messages.unsavedchangespopup");
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import Dinero from "dinero.js";
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import ReactDOM from "react-dom/client";
|
import ReactDOM from "react-dom/client";
|
||||||
import { Provider } from "react-redux";
|
import { Provider } from "react-redux";
|
||||||
import { BrowserRouter as Router } from "react-router-dom";
|
import {createBrowserRouter, createRoutesFromElements, Route, RouterProvider} from "react-router-dom";
|
||||||
import { PersistGate } from "redux-persist/integration/react";
|
import { PersistGate } from "redux-persist/integration/react";
|
||||||
import AppContainer from "./App/App.container";
|
import AppContainer from "./App/App.container";
|
||||||
import LoadingSpinner from "./components/loading-spinner/loading-spinner.component";
|
import LoadingSpinner from "./components/loading-spinner/loading-spinner.component";
|
||||||
@@ -47,22 +47,42 @@ if (process.env.NODE_ENV !== "development") {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const root = ReactDOM.createRoot(document.getElementById("root"));
|
// const root = ReactDOM.createRoot(document.getElementById("root"));
|
||||||
root.render(
|
|
||||||
<React.StrictMode>
|
const router = createBrowserRouter(
|
||||||
<Provider store={store}>
|
createRoutesFromElements(
|
||||||
<Router>
|
<Route path="*" element={<AppContainer />}>
|
||||||
<PersistGate
|
</Route>
|
||||||
loading={<LoadingSpinner message="Restoring your settings..." />}
|
)
|
||||||
persistor={persistor}
|
|
||||||
>
|
|
||||||
<AppContainer />
|
|
||||||
</PersistGate>
|
|
||||||
</Router>
|
|
||||||
</Provider>
|
|
||||||
</React.StrictMode>
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export default function App() {
|
||||||
|
return (
|
||||||
|
<Provider store={store}>
|
||||||
|
<RouterProvider router={router} />
|
||||||
|
</Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ReactDOM.createRoot(document.getElementById('root')).render(
|
||||||
|
<PersistGate loading={<LoadingSpinner message="Restoring your settings..." />} persistor={persistor}>
|
||||||
|
<App />
|
||||||
|
</PersistGate>);
|
||||||
|
|
||||||
|
// root.render(
|
||||||
|
// <React.StrictMode>
|
||||||
|
// <Provider store={store}>
|
||||||
|
// <BrowserRouter>
|
||||||
|
// <PersistGate
|
||||||
|
// loading={<LoadingSpinner message="Restoring your settings..." />}
|
||||||
|
// persistor={persistor}
|
||||||
|
// >
|
||||||
|
// <AppContainer />
|
||||||
|
// </PersistGate>
|
||||||
|
// </BrowserRouter>
|
||||||
|
// </Provider>
|
||||||
|
// </React.StrictMode>
|
||||||
|
// );
|
||||||
|
|
||||||
// const onServiceWorkerUpdate = (registration) => {
|
// const onServiceWorkerUpdate = (registration) => {
|
||||||
// console.log("onServiceWorkerUpdate", registration);
|
// console.log("onServiceWorkerUpdate", registration);
|
||||||
|
|
||||||
|
|||||||
@@ -1,36 +1,40 @@
|
|||||||
import { unstable_usePrompt as useBlocker } from 'react-router-dom'
|
import * as React from "react";
|
||||||
|
import { useBeforeUnload, useBlocker } from "react-router-dom";
|
||||||
|
|
||||||
function Prompt(props) {
|
function usePrompt(message, { beforeUnload } = {}) {
|
||||||
const block = props.when
|
|
||||||
|
|
||||||
useBlocker(() => {
|
let blocker = useBlocker(
|
||||||
if (block) {
|
React.useCallback(
|
||||||
return ! window.confirm(props.message)
|
() => (typeof message === "string" ? !window.confirm(message) : false),
|
||||||
}
|
[message]
|
||||||
return false
|
|
||||||
})
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div key={block}/>
|
|
||||||
)
|
)
|
||||||
|
);
|
||||||
|
let prevState = React.useRef(blocker.state);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (blocker.state === "blocked") {
|
||||||
|
blocker.reset();
|
||||||
|
}
|
||||||
|
prevState.current = blocker.state;
|
||||||
|
}, [blocker]);
|
||||||
|
|
||||||
|
useBeforeUnload(
|
||||||
|
React.useCallback(
|
||||||
|
(event) => {
|
||||||
|
if (beforeUnload && typeof message === "string") {
|
||||||
|
event.preventDefault();
|
||||||
|
event.returnValue = message;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[message, beforeUnload]
|
||||||
|
),
|
||||||
|
{ capture: true }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Prompt({ when, message, ...props }) {
|
||||||
|
usePrompt(when ? message : false, props);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Prompt;
|
export default Prompt;
|
||||||
|
|
||||||
|
|
||||||
// Potential new solution:
|
|
||||||
// import { useBlocker } from 'react-router-dom';
|
|
||||||
//
|
|
||||||
// function Prompt({ when, message }) {
|
|
||||||
// useBlocker((transition) => {
|
|
||||||
// if (when) {
|
|
||||||
// transition.retry();
|
|
||||||
// return !window.confirm(message);
|
|
||||||
// }
|
|
||||||
// return false;
|
|
||||||
// }, when);
|
|
||||||
//
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// export default Prompt;
|
|
||||||
Reference in New Issue
Block a user