This commit is contained in:
Dave Richer
2023-12-06 17:35:27 -05:00
parent a043f7be24
commit 5c164f807d
68 changed files with 279 additions and 294 deletions

View File

@@ -4,7 +4,7 @@ import LogRocket from "logrocket";
import React, { lazy, Suspense, useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Route, Switch } from "react-router-dom";
import { Route } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import DocumentEditorContainer from "../components/document-editor/document-editor.container";
import ErrorBoundary from "../components/error-boundary/error-boundary.component";

View File

@@ -3,7 +3,7 @@ import queryString from "query-string";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { insertAuditTrail } from "../../redux/application/application.actions";
import { setModalContext } from "../../redux/modals/modals.actions";
@@ -33,7 +33,7 @@ export function BillDetailEditReturn({
disabled,
}) {
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const { t } = useTranslation();
const [form] = Form.useForm();
const [visible, setVisible] = useState(false);

View File

@@ -1,12 +1,12 @@
import { Drawer, Grid } from "antd";
import queryString from "query-string";
import React from "react";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import BillDetailEditComponent from "./bill-detail-edit-component";
export default function BillDetailEditcontainer() {
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const selectedBreakpoint = Object.entries(Grid.useBreakpoint())
.filter((screen) => !!screen[1])

View File

@@ -2,7 +2,7 @@ import React, { useState } from "react";
import { QUERY_ALL_VENDORS } from "../../graphql/vendors.queries";
import { useQuery } from "@apollo/client";
import queryString from "query-string";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { Table, Input } from "antd";
import { useTranslation } from "react-i18next";
import { alphaSort } from "../../utils/sorters";
@@ -10,7 +10,7 @@ import AlertComponent from "../alert/alert.component";
export default function BillsVendorsList() {
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const { loading, error, data } = useQuery(QUERY_ALL_VENDORS, {
fetchPolicy: "network-only",

View File

@@ -14,7 +14,7 @@ import moment from "moment";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory } from "react-router-dom";
import { useNavigate } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { INSERT_NEW_JOB } from "../../graphql/jobs.queries";
import {
@@ -41,7 +41,7 @@ export function ContractConvertToRo({
const [visible, setVisible] = useState(false);
const [loading, setLoading] = useState(false);
const [insertJob] = useMutation(INSERT_NEW_JOB);
const history = useHistory();
const history = useNavigate();
const handleFinish = async (values) => {
setLoading(true);

View File

@@ -3,7 +3,7 @@ import { Button, Card, Input, Space, Table, Typography } from "antd";
import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { setModalContext } from "../../redux/modals/modals.actions";
import { DateTimeFormatter } from "../../utils/DateFormatter";
import { alphaSort } from "../../utils/sorters";
@@ -39,7 +39,7 @@ export function ContractsList({
sortedInfo: {},
filteredInfo: { text: "" },
});
const history = useHistory();
const history = useNavigate();
const search = queryString.parse(useLocation().search);
const { page } = search;

View File

@@ -2,7 +2,7 @@ import { Card, Table } from "antd";
import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { DateFormatter } from "../../utils/DateFormatter";
import { alphaSort } from "../../utils/sorters";
import {pageLimit} from "../../utils/config";
@@ -13,7 +13,7 @@ export default function CourtesyCarContractListComponent({
}) {
const search = queryString.parse(useLocation().search);
const { page, sortcolumn, sortorder } = search;
const history = useHistory();
const history = useNavigate();
const { t } = useTranslation();

View File

@@ -3,7 +3,7 @@ import { Button, Card, Table } from "antd";
import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { DateFormatter } from "../../utils/DateFormatter";
import { alphaSort } from "../../utils/sorters";
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
@@ -17,7 +17,7 @@ export default function CsiResponseListPaginated({
}) {
const search = queryString.parse(useLocation().search);
const { responseid, page, sortcolumn, sortorder } = search;
const history = useHistory();
const history = useNavigate();
const [state, setState] = useState({
sortedInfo: {},
filteredInfo: { text: "" },

View File

@@ -2,8 +2,9 @@ import React from "react";
import { Form, Space } from "antd";
import { useTranslation } from "react-i18next";
import AlertComponent from "../alert/alert.component";
import { Prompt, useLocation } from "react-router-dom";
import {useLocation } from "react-router-dom";
import "./form-fields-changed.styles.scss";
import Prompt from "../../utils/prompt";
export default function FormsFieldChanged({ form, skipPrompt }) {
const { t } = useTranslation();

View File

@@ -3,7 +3,7 @@ import axios from "axios";
import _ from "lodash";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { Link, useHistory } from "react-router-dom";
import { Link, useNavigate } from "react-router-dom";
import PhoneNumberFormatter from "../../utils/PhoneFormatter";
import OwnerNameDisplay, {
OwnerNameDisplayFunction,
@@ -12,7 +12,7 @@ import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.compon
export default function GlobalSearchOs() {
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const [loading, setLoading] = useState(false);
const [data, setData] = useState(false);

View File

@@ -3,7 +3,7 @@ import { AutoComplete, Divider, Input, Space } from "antd";
import _ from "lodash";
import React from "react";
import { useTranslation } from "react-i18next";
import { Link, useHistory } from "react-router-dom";
import { Link, useNavigate } from "react-router-dom";
import { GLOBAL_SEARCH_QUERY } from "../../graphql/search.queries";
import PhoneNumberFormatter from "../../utils/PhoneFormatter";
import AlertComponent from "../alert/alert.component";
@@ -13,7 +13,7 @@ import OwnerNameDisplay, {
import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component";
export default function GlobalSearch() {
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const [callSearch, { loading, error, data }] =
useLazyQuery(GLOBAL_SEARCH_QUERY);

View File

@@ -4,7 +4,7 @@ import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { setModalContext } from "../../redux/modals/modals.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
@@ -31,7 +31,7 @@ export function JobsList({
}) {
const search = queryString.parse(useLocation().search);
const { page, sortcolumn, sortorder } = search;
const history = useHistory();
const history = useNavigate();
const { t } = useTranslation();
const columns = [

View File

@@ -17,7 +17,7 @@ import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import {
openChatByPhone,
@@ -59,7 +59,7 @@ export function ScheduleEventComponent({
}) {
const { t } = useTranslation();
const [visible, setVisible] = useState(false);
const history = useHistory();
const history = useNavigate();
const searchParams = queryString.parse(useLocation().search);
const [updateAppointment] = useMutation(UPDATE_APPOINTMENT);
const [title, setTitle] = useState(event.title);

View File

@@ -5,7 +5,7 @@ import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation, useParams } from "react-router-dom";
import { useNavigate, useLocation, useParams } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../../../firebase/firebase.utils";
import {
@@ -49,7 +49,7 @@ export function JobChecklistForm({
const [updateOwner] = useMutation(UPDATE_OWNER);
const { jobId } = useParams();
const history = useHistory();
const history = useNavigate();
const search = queryString.parse(useLocation().search);
const [form] = Form.useForm();

View File

@@ -4,7 +4,7 @@ import { Button, notification, Popconfirm } from "antd";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory } from "react-router";
import { useNavigate } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { UPDATE_JOB_LINES_IOU } from "../../graphql/jobs-lines.queries";
import {
@@ -25,7 +25,7 @@ export function JobCreateIOU({ bodyshop, currentUser, job, selectedJobLines }) {
const { t } = useTranslation();
const [loading, setLoading] = useState(false);
const client = useApolloClient();
const history = useHistory();
const history = useNavigate();
const { IOU_Tracking } = useTreatments(
["IOU_Tracking"],

View File

@@ -5,7 +5,7 @@ import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { QUERY_JOB_CARD_DETAILS } from "../../graphql/jobs.queries";
import { setModalContext } from "../../redux/modals/modals.actions";
@@ -56,7 +56,7 @@ export function JobDetailCards({ bodyshop, setPrintCenterContext }) {
const searchParams = queryString.parse(useLocation().search);
const { selected } = searchParams;
const history = useHistory();
const history = useNavigate();
const { loading, error, data, refetch } = useQuery(QUERY_JOB_CARD_DETAILS, {
variables: { id: selected },
skip: !selected,

View File

@@ -2,11 +2,11 @@ import { Button } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import { SyncOutlined } from "@ant-design/icons";
import { useHistory } from "react-router-dom";
import { useNavigate } from "react-router-dom";
export default function JobSyncButton({ job }) {
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const handleClick = () => {
history.push(
`/manage/available?availableJobId=${job.available_jobs[0].id}&clm_no=${job.clm_no}`

View File

@@ -14,7 +14,7 @@ import queryString from "query-string";
import React, { useCallback, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../firebase/firebase.utils";
import {
@@ -65,7 +65,7 @@ export function JobsAvailableContainer({
nextFetchPolicy: "network-only",
});
const { clm_no, availableJobId } = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const { t } = useTranslation();
const [ownerModalVisible, setOwnerModalVisible] = useState(false);

View File

@@ -4,7 +4,7 @@ import axios from "axios";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory } from "react-router-dom";
import { useNavigate } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { auth, logImEXEvent } from "../../firebase/firebase.utils";
import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries";
@@ -41,7 +41,7 @@ export function JobsCloseExportButton({
setSelectedJobs,
refetch,
}) {
const history = useHistory();
const history = useNavigate();
const { t } = useTranslation();
const [updateJob] = useMutation(UPDATE_JOB);
const [insertExportLog] = useMutation(INSERT_EXPORT_LOG);

View File

@@ -13,7 +13,7 @@ import {
import React, { useMemo } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory } from "react-router-dom";
import { Link, useNavigate } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../firebase/firebase.utils";
import { CANCEL_APPOINTMENTS_BY_JOB_ID } from "../../graphql/appointments.queries";
@@ -72,7 +72,7 @@ export function JobsDetailHeaderActions({
}) {
const { t } = useTranslation();
const client = useApolloClient();
const history = useHistory();
const history = useNavigate();
const [deleteJob] = useMutation(DELETE_JOB);
const [updateJob] = useMutation(UPDATE_JOB);
const [voidJob] = useMutation(VOID_JOB);

View File

@@ -1,7 +1,7 @@
import { useQuery } from "@apollo/client";
import queryString from "query-string";
import React from "react";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { QUERY_BILLS_BY_JOBID } from "../../graphql/bills.queries";
import JobsDetailPliComponent from "./jobs-detail-pli.component";
@@ -13,7 +13,7 @@ export default function JobsDetailPliContainer({ job }) {
});
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const handleBillOnRowClick = (record) => {
if (record) {

View File

@@ -6,7 +6,7 @@ import queryString from "query-string";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
@@ -26,7 +26,7 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
const [openSearchResults, setOpenSearchResults] = useState([]);
const [searchLoading, setSearchLoading] = useState(false);
const { page, sortcolumn, sortorder } = search;
const history = useHistory();
const history = useNavigate();
const { t } = useTranslation();
const columns = [

View File

@@ -10,7 +10,7 @@ import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries";
import { selectBodyshop } from "../../redux/user/user.selectors";
@@ -45,7 +45,7 @@ export function JobsList({ bodyshop }) {
});
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const [searchText, setSearchText] = useState("");
if (error) return <AlertComponent message={error.message} type="error" />;

View File

@@ -10,7 +10,7 @@ import queryString from "query-string";
import React, { useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries";
import { selectBodyshop } from "../../redux/user/user.selectors";
@@ -59,7 +59,7 @@ export function JobsReadyList({ bodyshop }) {
});
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const [searchText, setSearchText] = useState("");
if (error) return <AlertComponent message={error.message} type="error" />;

View File

@@ -1,6 +1,6 @@
import { Button, Form, notification, PageHeader, Popconfirm } from "antd";
import React, { useState } from "react";
import { useHistory } from "react-router-dom";
import { useNavigate } from "react-router-dom";
import { useMutation } from "@apollo/client";
import { useTranslation } from "react-i18next";
import { DELETE_OWNER, UPDATE_OWNER } from "../../graphql/owners.queries";
@@ -9,7 +9,7 @@ import OwnerDetailFormComponent from "./owner-detail-form.component";
function OwnerDetailFormContainer({ owner, refetch }) {
const { t } = useTranslation();
const [form] = Form.useForm();
const history = useHistory();
const history = useNavigate();
const [loading, setLoading] = useState(false);
const [updateOwner] = useMutation(UPDATE_OWNER);
const [deleteOwner] = useMutation(DELETE_OWNER);

View File

@@ -3,7 +3,7 @@ import { Button, Card, Input, Space, Table, Typography } from "antd";
import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import PhoneFormatter from "../../utils/PhoneFormatter";
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
import {pageLimit} from "../../utils/config";
@@ -19,7 +19,7 @@ export default function OwnersListComponent({
page,
// sortcolumn, sortorder
} = search;
const history = useHistory();
const history = useNavigate();
const [state, setState] = useState({
sortedInfo: {},

View File

@@ -6,7 +6,7 @@ import queryString from "query-string";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { QUERY_PAYMENT_BY_ID } from "../../graphql/payments.queries";
import { setModalContext } from "../../redux/modals/modals.actions";
@@ -47,7 +47,7 @@ export function PaymentsListPaginated({
const [searchLoading, setSearchLoading] = useState(false);
const { page, sortcolumn, sortorder } = search;
const client = useApolloClient();
const history = useHistory();
const history = useNavigate();
const [state, setState] = useState({
sortedInfo: {},
filteredInfo: { text: "" },

View File

@@ -4,7 +4,7 @@ import queryString from "query-string";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import {
DELETE_PHONEBOOK,
@@ -22,7 +22,7 @@ const mapStateToProps = createStructuredSelector({
});
function PhonebookFormContainer({ refetch, bodyshop }) {
const history = useHistory();
const history = useNavigate();
const search = queryString.parse(useLocation().search);
const { phonebookentry } = search;
const [formLoading, setFormLoading] = useState(false);

View File

@@ -5,7 +5,7 @@ import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { QUERY_JOB_CARD_DETAILS } from "../../graphql/jobs.queries";
import { setModalContext } from "../../redux/modals/modals.actions";
@@ -45,7 +45,7 @@ export function ProductionListDetail({
technician,
}) {
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const { selected } = search;
const { t } = useTranslation();

View File

@@ -5,14 +5,14 @@ import { useTranslation } from "react-i18next";
import { logImEXEvent } from "../../firebase/firebase.utils";
import { UPDATE_JOB } from "../../graphql/jobs.queries";
import queryString from "query-string";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
export default function ProductionRemoveButton({ jobId }) {
const [removeJobFromProduction] = useMutation(UPDATE_JOB);
const { t } = useTranslation();
const [loading, setLoading] = useState(false);
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const handleRemoveFromProd = async () => {
logImEXEvent("production_remove_job");

View File

@@ -3,12 +3,12 @@ import Axios from "axios";
import queryString from "query-string";
import React, { useEffect } from "react";
import { useCookies } from "react-cookie";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import QboSignIn from "../../assets/qbo/C2QB_green_btn_med_default.svg";
export default function QboAuthorizeComponent() {
const location = useLocation();
const history = useHistory();
const history = useNavigate();
const [, setCookie] = useCookies(["access_token", "refresh_token"]);
const handleQbSignIn = async () => {

View File

@@ -3,7 +3,7 @@ import queryString from "query-string";
import React from "react";
import { Calendar, momentLocalizer } from "react-big-calendar";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
import Event from "../job-at-change/schedule-event.container";
@@ -31,7 +31,7 @@ export function ScheduleCalendarWrapperComponent({
...otherProps
}) {
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const { t } = useTranslation();
const handleEventPropStyles = (event, start, end, isSelected) => {
return {

View File

@@ -17,7 +17,7 @@ import querystring from "query-string";
import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../firebase/firebase.utils";
import {
@@ -47,7 +47,7 @@ const mapDispatchToProps = (dispatch) => ({
export function ShopEmployeesFormComponent({ bodyshop }) {
const { t } = useTranslation();
const [form] = useForm();
const history = useHistory();
const history = useNavigate();
const search = querystring.parse(useLocation().search);
const [deleteVacation] = useMutation(DELETE_VACATION);
const { error, data } = useQuery(QUERY_EMPLOYEE_BY_ID, {

View File

@@ -2,11 +2,11 @@ import { Button, Table } from "antd";
import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
export default function ShopEmployeesListComponent({ loading, employees }) {
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const search = queryString.parse(useLocation().search);
const handleOnRowClick = (record) => {

View File

@@ -15,7 +15,7 @@ import ShopInfoResponsibilityCenterComponent from "./shop-info.responsibilitycen
import ShopInfoROStatusComponent from "./shop-info.rostatus.component";
import ShopInfoSchedulingComponent from "./shop-info.scheduling.component";
import ShopInfoSpeedPrint from "./shop-info.speedprint.component";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import queryString from "query-string";
const mapStateToProps = createStructuredSelector({
@@ -33,7 +33,7 @@ export function ShopInfoComponent({ bodyshop, form, saveLoading }) {
bodyshop.imexshopid
);
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const location = useLocation();
const search = queryString.parse(location.search);

View File

@@ -5,7 +5,7 @@ import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../firebase/firebase.utils";
import {
@@ -30,7 +30,7 @@ export function ShopTemplateAddComponent({
}) {
const { t } = useTranslation();
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const [insertTemplate] = useMutation(INSERT_TEMPLATE);
const shopTemplateKeys = shopTemplateList.map((template) => template.name);

View File

@@ -3,14 +3,14 @@ import { Button, notification, Popconfirm } from "antd";
import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { DELETE_TEMPLATE } from "../../graphql/templates.queries";
import { logImEXEvent } from "../../firebase/firebase.utils";
export default function ShopTemplateDeleteComponent({ templateId, refetch }) {
const { t } = useTranslation();
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const [deleteTemplate] = useMutation(DELETE_TEMPLATE);
const handleDelete = async () => {

View File

@@ -5,7 +5,7 @@ import { QUERY_CUSTOM_TEMPLATES } from "../../graphql/templates.queries";
import AlertComponent from "../alert/alert.component";
import Skeleton from "../loading-skeleton/loading-skeleton.component";
import { useTranslation } from "react-i18next";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import queryString from "query-string";
import { TemplateList } from "../../utils/TemplateConstants";
import ShopTemplateAdd from "../shop-template-add/shop-template-add.component";
@@ -19,7 +19,7 @@ export default function ShopTemplatesListContainer({ visibleState }) {
});
const { t } = useTranslation();
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
if (error) return <AlertComponent message={error.message} type="error" />;
const handleEdit = (record) => {

View File

@@ -4,7 +4,7 @@ import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, Redirect, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import ImEXOnlineLogo from "../../assets/logo192.png";
import {
@@ -39,7 +39,7 @@ export function SignInComponent({
loginLoading,
}) {
const { redirect } = queryString.parse(useLocation().search);
const navigate = useNavigate();
const { t } = useTranslation();
const handleFinish = (values) => {
const { email, password } = values;
@@ -48,7 +48,7 @@ export function SignInComponent({
const [form] = Form.useForm();
if (currentUser.authorized === true)
return <Redirect to={redirect || "/manage"} />;
return navigate("/manage");
return (
<div className="login-container">

View File

@@ -11,7 +11,7 @@ import {
} from "../../redux/tech/tech.selectors";
import AlertComponent from "../alert/alert.component";
import "./tech-login.styles.scss";
import { Redirect } from "react-router-dom";
import { useNavigate } from "react-router-dom";
const mapStateToProps = createStructuredSelector({
technician: selectTechnician,
@@ -30,14 +30,16 @@ export function TechLogin({
techLoginStart,
}) {
const { t } = useTranslation();
const navigate = useNavigate();
const handleFinish = (values) => {
techLoginStart(values);
};
if (technician) return navigate("/tech/joblookup");
return (
<div className="tech-login-container">
{technician ? <Redirect to={`/tech/joblookup`} /> : null}
<Form
layout="vertical"
onFinish={handleFinish}

View File

@@ -5,7 +5,7 @@ import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { GET_JOB_BY_PK } from "../../graphql/jobs.queries";
import { setModalContext } from "../../redux/modals/modals.actions";
@@ -53,7 +53,7 @@ export function TechLookupJobsDrawer({ bodyshop, setPrintCenterContext }) {
const searchParams = queryString.parse(useLocation().search);
const { selected } = searchParams;
const history = useHistory();
const history = useNavigate();
const { loading, error, data, refetch } = useQuery(GET_JOB_BY_PK, {
variables: { id: selected },
skip: !selected,

View File

@@ -5,7 +5,7 @@ import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries";
import { selectBodyshop } from "../../redux/user/user.selectors";
@@ -37,7 +37,7 @@ export function TechLookupJobsList({ bodyshop }) {
});
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const [searchText, setSearchText] = useState("");
if (error) return <AlertComponent message={error.message} type="error" />;

View File

@@ -3,12 +3,12 @@ import { DatePicker } from "antd";
import moment from "moment";
import queryString from "query-string";
import React from "react";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
export default function TimeTicketsDatesSelector() {
const searchParams = queryString.parse(useLocation().search);
const { start, end } = searchParams;
const history = useHistory();
const history = useNavigate();
const handleChange = (dates) => {
if (dates) {

View File

@@ -5,7 +5,7 @@ import VehicleDetailFormComponent from "./vehicle-detail-form.component";
import { useTranslation } from "react-i18next";
import moment from "moment";
import { DELETE_VEHICLE, UPDATE_VEHICLE } from "../../graphql/vehicles.queries";
import { useHistory } from "react-router-dom";
import { useNavigate } from "react-router-dom";
function VehicleDetailFormContainer({ vehicle, refetch }) {
const { t } = useTranslation();
@@ -13,7 +13,7 @@ function VehicleDetailFormContainer({ vehicle, refetch }) {
const [deleteVehicle] = useMutation(DELETE_VEHICLE);
const [form] = Form.useForm();
const [loading, setLoading] = useState(false);
const history = useHistory();
const history = useNavigate();
const handleDelete = async () => {
setLoading(true);

View File

@@ -3,7 +3,7 @@ import { Button, Card, Input, Space, Table, Typography } from "antd";
import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component";
import {pageLimit} from "../../utils/config";
export default function VehiclesListComponent({
@@ -17,7 +17,7 @@ export default function VehiclesListComponent({
page,
//sortcolumn, sortorder,
} = search;
const history = useHistory();
const history = useNavigate();
const [state, setState] = useState({
sortedInfo: {},

View File

@@ -4,7 +4,7 @@ import queryString from "query-string";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import {
DELETE_VENDOR,
@@ -22,7 +22,7 @@ const mapStateToProps = createStructuredSelector({
});
function VendorsFormContainer({ refetch, bodyshop }) {
const history = useHistory();
const history = useNavigate();
const search = queryString.parse(useLocation().search);
const { selectedvendor } = search;
const [formLoading, setFormLoading] = useState(false);

View File

@@ -1,7 +1,7 @@
import { useQuery } from "@apollo/client";
import queryString from "query-string";
import React from "react";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import AlertComponent from "../../components/alert/alert.component";
import { QUERY_ALL_VENDORS } from "../../graphql/vendors.queries";
import VendorsListComponent from "./vendors-list.component";
@@ -12,7 +12,7 @@ export default function VendorsListContainer() {
nextFetchPolicy: "network-only",
});
const search = queryString.parse(useLocation().search);
const history = useHistory();
const history = useNavigate();
const handleNewVendor = () => {
search.selectedvendor = "new";

View File

@@ -5,7 +5,7 @@ import queryString from "query-string";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import BillDeleteButton from "../../components/bill-delete-button/bill-delete-button.component";
import PartsOrderModalContainer from "../../components/parts-order-modal/parts-order-modal.container";
import PrintWrapperComponent from "../../components/print-wrapper/print-wrapper.component";
@@ -35,7 +35,7 @@ export function BillsListPage({
const [openSearchResults, setOpenSearchResults] = useState([]);
const [searchLoading, setSearchLoading] = useState(false);
const { page } = search;
const history = useHistory();
const history = useNavigate();
const [state, setState] = useState({
sortedInfo: {},
filteredInfo: { text: "" },

View File

@@ -3,7 +3,7 @@ import { Form, notification } from "antd";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { INSERT_NEW_CONTRACT } from "../../graphql/cccontracts.queries";
@@ -30,7 +30,7 @@ export function ContractCreatePageContainer({
}) {
const [form] = Form.useForm();
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const location = useLocation();
const [loading, setLoading] = useState(false);
const selectedCarState = useState(null);

View File

@@ -3,7 +3,7 @@ import { Form, notification } from "antd";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory } from "react-router-dom";
import { useNavigate } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import CourtesyCarFormComponent from "../../components/courtesy-car-form/courtesy-car-form.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
@@ -30,7 +30,7 @@ export function CourtesyCarCreateContainer({
const [loading, setLoading] = useState(false);
const [insertCourtesyCar] = useMutation(INSERT_NEW_COURTESY_CAR);
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const handleFinish = async (values) => {
setLoading(true);

View File

@@ -2,7 +2,7 @@ import { Button, Card, Col, notification, Row, Select, Space } from "antd";
import React, { useEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import SocketIO from "socket.io-client";
import DmsAllocationsSummaryApComponent from "../../components/dms-allocations-summary-ap/dms-allocations-summary-ap.component";
@@ -42,7 +42,7 @@ export const socket = SocketIO(
export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) {
const { t } = useTranslation();
const [logLevel, setLogLevel] = useState("DEBUG");
const history = useHistory();
const history = useNavigate();
const [logs, setLogs] = useState([]);
const { state } = useLocation();

View File

@@ -13,7 +13,7 @@ import queryString from "query-string";
import React, { useEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import SocketIO from "socket.io-client";
import AlertComponent from "../../components/alert/alert.component";
@@ -60,7 +60,7 @@ export const socket = SocketIO(
export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) {
const { t } = useTranslation();
const [logLevel, setLogLevel] = useState("DEBUG");
const history = useHistory();
const history = useNavigate();
const [logs, setLogs] = useState([]);
const search = queryString.parse(useLocation().search);
const { jobId } = search;

View File

@@ -6,7 +6,7 @@ import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import AlertComponent from "../../components/alert/alert.component";
import { QUERY_EXPORT_LOG_PAGINATED } from "../../graphql/accounting.queries";
@@ -21,7 +21,7 @@ const mapStateToProps = createStructuredSelector({
export function ExportLogsPageComponent({ bodyshop }) {
const searchParams = queryString.parse(useLocation().search);
const { page, sortcolumn, sortorder, search } = searchParams;
const history = useHistory();
const history = useNavigate();
const { loading, error, data, refetch } = useQuery(
QUERY_EXPORT_LOG_PAGINATED,

View File

@@ -24,7 +24,7 @@ import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { FaHardHat, FaRegStickyNote, FaShieldAlt } from "react-icons/fa";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import {useNavigate, useLocation} from "react-router-dom";
import { createStructuredSelector } from "reselect";
import FormFieldsChanged from "../../components/form-fields-changed-alert/form-fields-changed-alert.component";
import JobAuditTrail from "../../components/job-audit-trail/job-audit-trail.component";
@@ -77,7 +77,7 @@ export function JobsDetailPage({
}) {
const { t } = useTranslation();
const [form] = Form.useForm();
const history = useHistory();
const history = useNavigate();
const [loading, setLoading] = useState(false);
const search = queryString.parse(useLocation().search);

View File

@@ -1,6 +1,6 @@
import React from "react";
import { connect } from "react-redux";
import { Redirect } from "react-router-dom";
import { useNavigate } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { selectCurrentUser } from "../../redux/user/user.selectors";
import LandingPageStatic from "../../landing/index";
@@ -12,7 +12,8 @@ const mapStateToProps = createStructuredSelector({
export default connect(mapStateToProps, null)(LandingPage);
export function LandingPage({ currentUser }) {
if (currentUser.authorized) return <Redirect to={"/manage"} />;
const navigate = useNavigate();
if (currentUser.authorized) return navigate("/manage");
return <LandingPageStatic />;
//return <Redirect to={"/signin"} />;

View File

@@ -1,10 +1,10 @@
import React from "react";
//import DashboardGridComponent from "../../components/dashboard-grid/dashboard-grid.component";
import { Redirect } from "react-router-dom";
import { useNavigate } from "react-router-dom";
export default function ManageRootPageComponent() {
//const client = useApolloClient();
return <Redirect to={`/manage/jobs`} />;
const navigate = useNavigate();
return navigate("/manage/jobs");
// return (
// <div>

View File

@@ -3,7 +3,7 @@ import preval from "preval.macro";
import React, { lazy, Suspense, useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, Route, Switch } from "react-router-dom";
import { Link, Route, Routes } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import BreadCrumbs from "../../components/breadcrumbs/breadcrumbs.component";
import ChatAffixContainer from "../../components/chat-affix/chat-affix.container";
@@ -212,7 +212,7 @@ export function Manage({ match, conflict, bodyshop }) {
<Route exact path={`${match.path}/_test`} component={TestComponent} />
<Route exact path={`${match.path}`} component={ManageRootPage} />
<Route exact path={`${match.path}/jobs`} component={JobsPage} />
<Switch>
<Routes>
<Route
exact
path={`${match.path}/jobs/:jobId/intake`}
@@ -246,7 +246,7 @@ export function Manage({ match, conflict, bodyshop }) {
component={JobsCreateContainerPage}
/>
<Route path={`${match.path}/jobs/:jobId`} component={JobsDetailPage} />
</Switch>
</Routes>
<Route exact path={`${match.path}/temporarydocs/`} component={TempDocs} />
<Route
exact
@@ -258,7 +258,7 @@ export function Manage({ match, conflict, bodyshop }) {
path={`${match.path}/courtesycars/`}
component={CourtesyCarsPage}
/>
<Switch>
<Routes>
<Route
exact
path={`${match.path}/courtesycars/new`}
@@ -287,7 +287,7 @@ export function Manage({ match, conflict, bodyshop }) {
path={`${match.path}/courtesycars/:ccId`}
component={CourtesyCarDetailContainer}
/>
</Switch>
</Routes>
<Route exact path={`${match.path}/profile`} component={ProfilePage} />
<Route
exact

View File

@@ -6,7 +6,7 @@ import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
import { Link, useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import AlertComponent from "../../components/alert/alert.component";
import JobPartsQueueCount from "../../components/job-parts-queue-count/job-parts-queue-count.component";
@@ -32,7 +32,7 @@ export function PartsQueuePageComponent({ bodyshop }) {
sortorder,
statusFilters,
} = searchParams;
const history = useHistory();
const history = useNavigate();
const [filter, setFilter] = useLocalStorage("filter_parts_queue", null);
const { loading, error, data, refetch } = useQuery(QUERY_PARTS_QUEUE, {

View File

@@ -6,7 +6,7 @@ import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import AlertComponent from "../../components/alert/alert.component";
import { QUERY_PHONEBOOK_PAGINATED } from "../../graphql/phonebook.queries";
@@ -27,7 +27,7 @@ const mapStateToProps = createStructuredSelector({
export function PhonebookPageComponent({ bodyshop, authLevel }) {
const searchParams = queryString.parse(useLocation().search);
const { page, sortcolumn, sortorder, search, phonebookentry } = searchParams;
const history = useHistory();
const history = useNavigate();
const { loading, error, data, refetch } = useQuery(
QUERY_PHONEBOOK_PAGINATED,

View File

@@ -9,7 +9,7 @@ import {
import PhonebookPage from "./phonebook.page.component";
import { Drawer, Grid } from "antd";
import queryString from "query-string";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import PhonebookFormContainer from "../../components/phonebook-form/phonebook-form.container";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -31,7 +31,7 @@ export function PhonebookContainer({ setBreadcrumbs, setSelectedHeader }) {
}, [setBreadcrumbs, t, setSelectedHeader]);
const search = queryString.parse(useLocation().search);
const { phonebookentry } = search;
const history = useHistory();
const history = useNavigate();
const selectedBreakpoint = Object.entries(Grid.useBreakpoint())
.filter((screen) => !!screen[1])

View File

@@ -5,7 +5,7 @@ import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { FaShieldAlt } from "react-icons/fa";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
@@ -31,7 +31,7 @@ export function ScoreboardContainer({ setBreadcrumbs, setSelectedHeader }) {
const { t } = useTranslation();
const searchParams = queryString.parse(useLocation().search);
const { tab } = searchParams;
const history = useHistory();
const history = useNavigate();
useEffect(() => {
document.title = t("titles.scoreboard");
setSelectedHeader("scoreboard");

View File

@@ -1,14 +1,14 @@
import { Drawer, Grid } from "antd";
import queryString from "query-string";
import React from "react";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import VendorsFormContainer from "../../components/vendors-form/vendors-form.container";
import VendorsListContainer from "../../components/vendors-list/vendors-list.container";
export default function ShopVendorPageComponent() {
const search = queryString.parse(useLocation().search);
const { selectedvendor } = search;
const history = useHistory();
const history = useNavigate();
const selectedBreakpoint = Object.entries(Grid.useBreakpoint())
.filter((screen) => !!screen[1])

View File

@@ -1,6 +1,6 @@
import { Tabs } from "antd";
import React, { useEffect } from "react";
import { useHistory, useLocation } from "react-router-dom";
import { useNavigate, useLocation } from "react-router-dom";
import queryString from "query-string";
import { useTranslation } from "react-i18next";
import ShopEmployeesContainer from "../../components/shop-employees/shop-employees.container";
@@ -26,7 +26,7 @@ const mapDispatchToProps = (dispatch) => ({
export function ShopPage({ bodyshop, setSelectedHeader, setBreadcrumbs }) {
const { t } = useTranslation();
const history = useHistory();
const history = useNavigate();
const search = queryString.parse(useLocation().search);
useEffect(() => {

View File

@@ -2,7 +2,7 @@ import { BackTop, Layout } from "antd";
import React, { Suspense, lazy, useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Redirect, Route, Switch } from "react-router-dom";
import { useNavigate, Route, Routes } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import ErrorBoundary from "../../components/error-boundary/error-boundary.component";
@@ -50,16 +50,18 @@ const mapDispatchToProps = (dispatch) => ({
export function TechPage({ technician, match }) {
const { t } = useTranslation();
const navigate = useNavigate();
useEffect(() => {
document.title = t("titles.app");
}, [t]);
if (!technician) return navigate(`${match.path}/login`
);
return (
<Layout className="tech-layout-container">
<TechSider />
<Layout>
{technician ? null : <Redirect to={`${match.path}/login`} />}
<UpdateAlert />
<TechHeader />
@@ -74,7 +76,7 @@ export function TechPage({ technician, match }) {
<TimeTicketModalContainer />
<EmailOverlayContainer />
<PrintCenterModalContainer />
<Switch>
<Routes>
<Route
exact
path={`${match.path}/login`}
@@ -105,7 +107,7 @@ export function TechPage({ technician, match }) {
path={`${match.path}/board`}
component={ProductionBoardPage}
/>
</Switch>
</Routes>
</FeatureWrapper>
</Suspense>
</ErrorBoundary>

View File

@@ -1,18 +1,17 @@
import React from "react";
import { Redirect, Route, useLocation } from "react-router-dom";
import { useNavigate, Route, useLocation } from "react-router-dom";
function PrivateRoute({ component: Component, isAuthorized, ...rest }) {
const location = useLocation();
const navigate = useNavigate();
if (!isAuthorized) {
navigate(`/signin?redirect=${location.pathname}`);
}
return (
<Route
{...rest}
render={(props) =>
isAuthorized === true ? (
<Component {...props} />
) : (
<Redirect to={`/signin?redirect=${location.pathname}`} />
)
render={(props) => <Component {...props} />
}
/>
);

View File

@@ -0,0 +1,18 @@
import { unstable_usePrompt as useBlocker } from 'react-router-dom'
function Prompt(props) {
const block = props.when
useBlocker(() => {
if (block) {
return ! window.confirm(props.message)
}
return false
})
return (
<div key={block}/>
)
}
export default Prompt