diff --git a/src/App.jsx b/src/App.jsx index f25235c..cbc32b3 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -6,6 +6,7 @@ import { Navigate } from 'react-router-dom' import { App, ConfigProvider } from 'antd' +import { lazy } from 'react' import Dashboard from './components/Dashboard/Dashboard.jsx' import PrivateRoute from './components/PrivateRoute' @@ -33,6 +34,10 @@ import AuthCallback from './components/App/AuthCallback.jsx' import EmailNotificationTemplate from './components/Email/EmailNotificationTemplate.jsx' import MarketplaceAuthCallback from './components/Dashboard/Sales/Marketplaces/MarketplaceAuthCallback.jsx' import AuthLaunch from './components/App/AppLaunch.jsx' +const SlicerIntegration = lazy( + () => + import('./components/Dashboard/Production/Printers/SlicerIntegration.jsx') +) import { ProductionRoutes, @@ -121,6 +126,10 @@ const AppContent = () => { path='/email/notification' element={} /> + } + /> { + const location = useLocation() + const printerId = new URLSearchParams(location.search).get('printerId') + const { updateObject } = useContext(ApiServerContext) + + const [pendingSlicerUploads, setPendingSlicerUploads] = useState([]) + const [currentPendingSlicerUpload, setCurrentPendingSlicerUpload] = + useState(null) + + const { setPrimaryColorOverride } = useThemeContext() + + useEffect(() => { + setPrimaryColorOverride('#00baa8') + }, []) + + const [objectFormState, setEditFormState] = useState({ + isEditing: false, + editLoading: false, + formValid: false, + locked: false, + loading: false, + objectData: { + pendingSlicerUploads: [] + } + }) + const [showSlicerUploadFlow, setShowSlicerUploadFlow] = useState(false) + + useEffect(() => { + setPendingSlicerUploads( + objectFormState.objectData?.pendingSlicerUploads || [] + ) + }, [objectFormState.objectData?.pendingSlicerUploads]) + + useEffect(() => { + const nextUpload = pendingSlicerUploads.find( + (upload) => upload.new === true + ) + + if (nextUpload) { + setCurrentPendingSlicerUpload(nextUpload) + setShowSlicerUploadFlow(true) + } else { + setCurrentPendingSlicerUpload(null) + setShowSlicerUploadFlow(false) + } + }, [pendingSlicerUploads]) + + const showPendingSlicerUpload = () => { + const upload = + pendingSlicerUploads.find( + (pendingUpload) => pendingUpload.new === true + ) || pendingSlicerUploads[0] + + if (upload) { + setCurrentPendingSlicerUpload(upload) + setShowSlicerUploadFlow(true) + } + } + + const handleGCodeFileCreated = async (gcodeFile) => { + const updatedUploads = pendingSlicerUploads.map((upload) => + upload._id === currentPendingSlicerUpload?._id + ? { ...upload, gcodeFile: gcodeFile } + : upload + ) + + setPendingSlicerUploads(updatedUploads) + setCurrentPendingSlicerUpload((previous) => ({ + ...previous, + gcodeFile + })) + await updateObject(printerId, 'printer', { + ...objectFormState.objectData, + pendingSlicerUploads: updatedUploads + }) + } + + const handleJobCreated = async (job) => { + const updatedUploads = pendingSlicerUploads.map((upload) => + upload._id === currentPendingSlicerUpload?._id + ? { ...upload, job } + : upload + ) + + setPendingSlicerUploads(updatedUploads) + setCurrentPendingSlicerUpload((previous) => ({ + ...previous, + job + })) + await updateObject(printerId, 'printer', { + ...objectFormState.objectData, + pendingSlicerUploads: updatedUploads + }) + } + + const handleSlicerUploadComplete = async () => { + const updatedUploads = pendingSlicerUploads.filter( + (upload) => upload._id !== currentPendingSlicerUpload?._id + ) + + setPendingSlicerUploads(updatedUploads) + await updateObject(printerId, 'printer', { + ...objectFormState.objectData, + pendingSlicerUploads: updatedUploads + }) + } + + const handleSlicerUploadFlowClosed = async () => { + const updatedUploads = pendingSlicerUploads.map((upload) => + upload._id === currentPendingSlicerUpload?._id + ? { ...upload, new: false } + : upload + ) + + setPendingSlicerUploads(updatedUploads) + await updateObject(printerId, 'printer', { + ...objectFormState.objectData, + pendingSlicerUploads: updatedUploads + }) + } + + const slicerUploadsButton = () => { + if (pendingSlicerUploads.length > 0) { + return ( + +