import { FloatButton, Layout, Spin } from "antd"; import { Route, Routes } from "react-router-dom"; // import preval from "preval.macro"; import { Suspense, useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import BreadCrumbs from "../../components/breadcrumbs/breadcrumbs.component"; import ChatAffixContainer from "../../components/chat-affix/chat-affix.container"; import ConflictComponent from "../../components/conflict/conflict.component"; import ErrorBoundary from "../../components/error-boundary/error-boundary.component"; //import FooterComponent from "../../components/footer/footer.component"; //Component Imports import * as Sentry from "@sentry/react"; import TestComponent from "../../components/_test/test.page"; import GlobalFooter from "../../components/global-footer/global-footer.component.jsx"; import HeaderContainer from "../../components/header/header.container"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import PartnerPingComponent from "../../components/partner-ping/partner-ping.component"; import ShopSubStatusComponent from "../../components/shop-sub-status/shop-sub-status.component"; import UpdateAlert from "../../components/update-alert/update-alert.component"; import { selectBodyshop, selectCurrentUser, selectInstanceConflict, selectPartsManagementOnly } from "../../redux/user/user.selectors"; import InstanceRenderManager from "../../utils/instanceRenderMgr.js"; import useAlertsNotifications from "../../hooks/useAlertsNotifications.jsx"; import { selectDarkMode } from "../../redux/application/application.selectors.js"; import { lazyDev } from "../../utils/lazyWithPreload.jsx"; import EsignatureModalContainer from "../../components/esignature-modal/esignature-modal.container.jsx"; import { hasDocumensoApiKey } from "../../utils/esignature.js"; const PrintCenterModalContainer = lazyDev( () => import("../../components/print-center-modal/print-center-modal.container") ); const NoteUpsertModal = lazyDev(() => import("../../components/note-upsert-modal/note-upsert-modal.container.jsx")); const JobsPage = lazyDev(() => import("../jobs/jobs.page")); const CardPaymentModalContainer = lazyDev( () => import("../../components/card-payment-modal/card-payment-modal.container.jsx") ); const JobsDetailPage = lazyDev(() => import("../jobs-detail/jobs-detail.page.container")); const InventoryListPage = lazyDev(() => import("../inventory/inventory.page")); const ProfilePage = lazyDev(() => import("../profile/profile.container.page")); const JobsAvailablePage = lazyDev(() => import("../jobs-available/jobs-available.page.container")); const ScheduleContainer = lazyDev(() => import("../schedule/schedule.page.container")); const VehiclesContainer = lazyDev(() => import("../vehicles/vehicles.page.container")); const VehiclesDetailContainer = lazyDev(() => import("../vehicles-detail/vehicles-detail.page.container")); const OwnersContainer = lazyDev(() => import("../owners/owners.page.container")); const OwnersDetailContainer = lazyDev(() => import("../owners-detail/owners-detail.page.container")); const ShopPage = lazyDev(() => import("../shop/shop.page.component")); const ShopVendorPageContainer = lazyDev(() => import("../shop-vendor/shop-vendor.page.container")); const EmailOverlayContainer = lazyDev(() => import("../../components/email-overlay/email-overlay.container.jsx")); const JobsCreateContainerPage = lazyDev(() => import("../jobs-create/jobs-create.container")); const CourtesyCarCreateContainer = lazyDev(() => import("../courtesy-car-create/courtesy-car-create.page.container")); const CourtesyCarDetailContainer = lazyDev(() => import("../courtesy-car-detail/courtesy-car-detail.page.container")); const CourtesyCarsPage = lazyDev(() => import("../courtesy-cars/courtesy-cars.page.container")); const ContractCreatePage = lazyDev(() => import("../contract-create/contract-create.page.container")); const ContractDetailPage = lazyDev(() => import("../contract-detail/contract-detail.page.container")); const ContractsList = lazyDev(() => import("../contracts/contracts.page.container")); const BillsListPage = lazyDev(() => import("../bills/bills.page.container")); const FeatureRequestPage = lazyDev(() => import("../feature-request/feature-request.page.jsx")); const JobCostingModal = lazyDev(() => import("../../components/job-costing-modal/job-costing-modal.container")); const ReportCenterModal = lazyDev(() => import("../../components/report-center-modal/report-center-modal.container")); const BillEnterModalContainer = lazyDev(() => import("../../components/bill-enter-modal/bill-enter-modal.container")); const TimeTicketModalContainer = lazyDev( () => import("../../components/time-ticket-modal/time-ticket-modal.container") ); const TimeTicketModalTask = lazyDev( () => import("../../components/time-ticket-task-modal/time-ticket-task-modal.container") ); const PaymentModalContainer = lazyDev(() => import("../../components/payment-modal/payment-modal.container")); const ProductionListPage = lazyDev(() => import("../production-list/production-list.container")); const ProductionBoardPage = lazyDev(() => import("../production-board/production-board.container")); // const ShopTemplates = lazyDev(() => // import("../shop-templates/shop-templates.container") // ); const JobIntake = lazyDev(() => import("../jobs-intake/jobs-intake.page.container")); const JobChecklistView = lazyDev(() => import("../jobs-checklist-view/jobs-checklist-view.page")); const JobDeliver = lazyDev(() => import("../jobs-deliver/jobs-delivery.page.container")); const AccountingQboCallback = lazyDev(() => import("../accounting-qbo/accounting-qbo.page")); const AccountingReceivables = lazyDev(() => import("../accounting-receivables/accounting-receivables.container")); const AccountingPayables = lazyDev(() => import("../accounting-payables/accounting-payables.container")); const AccountingPayments = lazyDev(() => import("../accounting-payments/accounting-payments.container")); const AllJobs = lazyDev(() => import("../jobs-all/jobs-all.container")); const ReadyJobs = lazyDev(() => import("../jobs-ready/jobs-ready.page")); const JobsClose = lazyDev(() => import("../jobs-close/jobs-close.container")); const JobsAdmin = lazyDev(() => import("../jobs-admin/jobs-admin.page")); const TempDocs = lazyDev(() => import("../temporary-docs/temporary-docs.container")); const ShopCsiPageContainer = lazyDev(() => import("../shop-csi/shop-csi.container.page")); const PaymentsAll = lazyDev(() => import("../payments-all/payments-all.container.page")); const ShiftClock = lazyDev(() => import("../shift-clock/shift-clock.page")); const Scoreboard = lazyDev(() => import("../scoreboard/scoreboard.page.container")); const TimeTicketsAll = lazyDev(() => import("../time-tickets/time-tickets.container")); const Help = lazyDev(() => import("../help/help.page")); const PartsQueue = lazyDev(() => import("../parts-queue/parts-queue.page.container")); const ExportLogs = lazyDev(() => import("../export-logs/export-logs.page.container")); const Phonebook = lazyDev(() => import("../phonebook/phonebook.page.container")); const EmailTest = lazyDev(() => import("../../components/email-test/email-test-component")); const Dashboard = lazyDev(() => import("../dashboard/dashboard.container")); const Dms = lazyDev(() => import("../dms/dms.container")); const DmsPayables = lazyDev(() => import("../dms-payables/dms-payables.container")); const ManageRootPage = lazyDev(() => import("../manage-root/manage-root.page.container")); const TtApprovals = lazyDev(() => import("../tt-approvals/tt-approvals.page.container")); const MyTasksPage = lazyDev(() => import("../tasks/myTasksPageContainer.jsx")); const AllTasksPage = lazyDev(() => import("../tasks/allTasksPageContainer.jsx")); const TaskUpsertModalContainer = lazyDev( () => import("../../components/task-upsert-modal/task-upsert-modal.container") ); const { Content } = Layout; const mapStateToProps = createStructuredSelector({ conflict: selectInstanceConflict, bodyshop: selectBodyshop, partsManagementOnly: selectPartsManagementOnly, isDarkMode: selectDarkMode, currentUser: selectCurrentUser }); export function Manage({ conflict, bodyshop, partsManagementOnly, isDarkMode, currentUser }) { const { t } = useTranslation(); const esignatureEnabled = hasDocumensoApiKey(bodyshop); const [chatVisible] = useState(false); const didMount = useRef(false); // Centralized alerts handling (fetch + dedupe + notifications) useAlertsNotifications(); useEffect(() => { if (didMount.current) return; // prevents dev StrictMode double-run didMount.current = true; window.Canny("initChangelog", { appID: "680bd2c7ee501290377f6686", position: "top", align: "left", theme: !isDarkMode ? "light" : "dark" }); }, []); useEffect(() => { document.title = InstanceRenderManager({ imex: t("titles.imexonline"), rome: t("titles.romeonline") }); }, [t]); // This is a required safety check to prevent parts management only users from accessing /manage based routes useEffect(() => { if (partsManagementOnly && !import.meta.env.DEV) { // This NEEDS to be done this way, DO NOT use the react router, it will cause a ton of side effects window.location = "/parts"; } }, [partsManagementOnly]); // Prevent rendering if redirecting if (partsManagementOnly && !import.meta.env.DEV) { return null; } const AppRouteTable = ( } > {esignatureEnabled && } } /> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> { // } // /> } } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> }> } /> } /> }> } /> }> } /> }> } /> ); let PageContent; if (conflict) PageContent = ; else if (bodyshop && bodyshop.sub_status !== "active") PageContent = ; else PageContent = AppRouteTable; return ( <> } showDialog> {PageContent} ); } export default connect(mapStateToProps)(Manage);