diff --git a/src/components/FileUpload.tsx b/src/components/FileUpload.tsx
index 201166a..16754f7 100644
--- a/src/components/FileUpload.tsx
+++ b/src/components/FileUpload.tsx
@@ -1,6 +1,6 @@
import { useState, useCallback } from 'react';
import { useShallow } from 'zustand/react/shallow';
-import { useMachineStore } from '../stores/useMachineStore';
+import { useMachineStore, usePatternUploaded } from '../stores/useMachineStore';
import { usePatternStore } from '../stores/usePatternStore';
import { useUIStore } from '../stores/useUIStore';
import { convertPesToPen, type PesPatternData } from '../formats/import/pesImporter';
@@ -40,18 +40,19 @@ export function FileUpload() {
pesData: pesDataProp,
currentFileName,
patternOffset,
- patternUploaded,
setPattern,
} = usePatternStore(
useShallow((state) => ({
pesData: state.pesData,
currentFileName: state.currentFileName,
patternOffset: state.patternOffset,
- patternUploaded: state.patternUploaded,
setPattern: state.setPattern,
}))
);
+ // Derived state: pattern is uploaded if machine has pattern info
+ const patternUploaded = usePatternUploaded();
+
// UI store
const {
pyodideReady,
diff --git a/src/components/LeftSidebar.tsx b/src/components/LeftSidebar.tsx
index 15f93ac..29b4ae9 100644
--- a/src/components/LeftSidebar.tsx
+++ b/src/components/LeftSidebar.tsx
@@ -1,5 +1,5 @@
import { useShallow } from 'zustand/react/shallow';
-import { useMachineStore } from '../stores/useMachineStore';
+import { useMachineStore, usePatternUploaded } from '../stores/useMachineStore';
import { usePatternStore } from '../stores/usePatternStore';
import { ConnectionPrompt } from './ConnectionPrompt';
import { FileUpload } from './FileUpload';
@@ -13,13 +13,15 @@ export function LeftSidebar() {
}))
);
- const { pesData, patternUploaded } = usePatternStore(
+ const { pesData } = usePatternStore(
useShallow((state) => ({
pesData: state.pesData,
- patternUploaded: state.patternUploaded,
}))
);
+ // Derived state: pattern is uploaded if machine has pattern info
+ const patternUploaded = usePatternUploaded();
+
return (
{/* Connect Button or Browser Hint - Show when disconnected */}
diff --git a/src/components/PatternCanvas.tsx b/src/components/PatternCanvas.tsx
index 208a6fd..9869f2a 100644
--- a/src/components/PatternCanvas.tsx
+++ b/src/components/PatternCanvas.tsx
@@ -1,6 +1,6 @@
import { useEffect, useRef, useState, useCallback } from 'react';
import { useShallow } from 'zustand/react/shallow';
-import { useMachineStore } from '../stores/useMachineStore';
+import { useMachineStore, usePatternUploaded } from '../stores/useMachineStore';
import { usePatternStore } from '../stores/usePatternStore';
import { Stage, Layer, Group } from 'react-konva';
import Konva from 'konva';
@@ -27,16 +27,17 @@ export function PatternCanvas() {
const {
pesData,
patternOffset: initialPatternOffset,
- patternUploaded,
setPatternOffset,
} = usePatternStore(
useShallow((state) => ({
pesData: state.pesData,
patternOffset: state.patternOffset,
- patternUploaded: state.patternUploaded,
setPatternOffset: state.setPatternOffset,
}))
);
+
+ // Derived state: pattern is uploaded if machine has pattern info
+ const patternUploaded = usePatternUploaded();
const containerRef = useRef(null);
const stageRef = useRef(null);
diff --git a/src/components/WorkflowStepper.tsx b/src/components/WorkflowStepper.tsx
index b171d4e..43d213b 100644
--- a/src/components/WorkflowStepper.tsx
+++ b/src/components/WorkflowStepper.tsx
@@ -1,6 +1,6 @@
import { useState, useRef, useEffect } from 'react';
import { useShallow } from 'zustand/react/shallow';
-import { useMachineStore } from '../stores/useMachineStore';
+import { useMachineStore, usePatternUploaded } from '../stores/useMachineStore';
import { usePatternStore } from '../stores/usePatternStore';
import { CheckCircleIcon, InformationCircleIcon, ExclamationTriangleIcon } from '@heroicons/react/24/solid';
import { MachineStatus } from '../types/machine';
@@ -268,14 +268,14 @@ export function WorkflowStepper() {
// Pattern store
const {
pesData,
- patternUploaded,
} = usePatternStore(
useShallow((state) => ({
pesData: state.pesData,
- patternUploaded: state.patternUploaded,
}))
);
+ // Derived state: pattern is uploaded if machine has pattern info
+ const patternUploaded = usePatternUploaded();
const hasPattern = pesData !== null;
const hasErrorFlag = hasError(machineError);
const currentStep = getCurrentStep(machineStatus, isConnected, hasPattern, patternUploaded);
diff --git a/src/stores/useMachineStore.ts b/src/stores/useMachineStore.ts
index 85ffd83..5cd80c0 100644
--- a/src/stores/useMachineStore.ts
+++ b/src/stores/useMachineStore.ts
@@ -552,3 +552,5 @@ export const useMachineStatus = () => useMachineStore((state) => state.machineSt
export const useMachineError = () => useMachineStore((state) => state.machineError);
export const usePatternInfo = () => useMachineStore((state) => state.patternInfo);
export const useSewingProgress = () => useMachineStore((state) => state.sewingProgress);
+// Derived state: pattern is uploaded if machine has pattern info
+export const usePatternUploaded = () => useMachineStore((state) => state.patternInfo !== null);