فهرست منبع

Add navigation persistence for embedded camera viewers

Embedded camera viewers now stay open when navigating away from the
Printers page and back. Previously, users had to reopen each camera
view manually after navigation.
maziggy 4 ماه پیش
والد
کامیت
c6ad12e4af
4فایلهای تغییر یافته به همراه33 افزوده شده و 2 حذف شده
  1. 1 0
      CHANGELOG.md
  2. 31 1
      frontend/src/pages/PrintersPage.tsx
  3. 0 0
      static/assets/index-DFo1_Rau.js
  4. 1 1
      static/index.html

+ 1 - 0
CHANGELOG.md

@@ -9,6 +9,7 @@ All notable changes to Bambuddy will be documented in this file.
   - Each viewer has its own remembered position and size
   - New viewers are automatically offset to prevent stacking
   - Printer-specific persistence in localStorage
+  - **Navigation persistence** - Open cameras stay open when navigating away and back to Printers page
 - **Application Log Viewer** - View and filter application logs in real-time from System Information page:
   - Start/Stop live streaming with 2-second auto-refresh
   - Filter by log level (DEBUG, INFO, WARNING, ERROR)

+ 31 - 1
frontend/src/pages/PrintersPage.tsx

@@ -3803,7 +3803,30 @@ export function PrintersPage() {
   const viewMode: ViewMode = cardSize === 1 ? 'compact' : 'expanded';
   const queryClient = useQueryClient();
   // Embedded camera viewer state - supports multiple simultaneous viewers
-  const [embeddedCameraPrinters, setEmbeddedCameraPrinters] = useState<Map<number, { id: number; name: string }>>(new Map());
+  // Persisted to localStorage so cameras reopen after navigation
+  const [embeddedCameraPrinters, setEmbeddedCameraPrinters] = useState<Map<number, { id: number; name: string }>>(() => {
+    // Initialize from localStorage if camera_view_mode is embedded
+    const saved = localStorage.getItem('openEmbeddedCameras');
+    if (saved) {
+      try {
+        const cameras = JSON.parse(saved) as Array<{ id: number; name: string }>;
+        return new Map(cameras.map(c => [c.id, c]));
+      } catch {
+        return new Map();
+      }
+    }
+    return new Map();
+  });
+
+  // Persist open cameras to localStorage when they change
+  useEffect(() => {
+    const cameras = Array.from(embeddedCameraPrinters.values());
+    if (cameras.length > 0) {
+      localStorage.setItem('openEmbeddedCameras', JSON.stringify(cameras));
+    } else {
+      localStorage.removeItem('openEmbeddedCameras');
+    }
+  }, [embeddedCameraPrinters]);
 
   const { data: printers, isLoading } = useQuery({
     queryKey: ['printers'],
@@ -3816,6 +3839,13 @@ export function PrintersPage() {
     queryFn: api.getSettings,
   });
 
+  // Close embedded cameras if mode changes to 'window'
+  useEffect(() => {
+    if (settings?.camera_view_mode === 'window' && embeddedCameraPrinters.size > 0) {
+      setEmbeddedCameraPrinters(new Map());
+    }
+  }, [settings?.camera_view_mode, embeddedCameraPrinters.size]);
+
   // Fetch all smart plugs to know which printers have them
   const { data: smartPlugs } = useQuery({
     queryKey: ['smart-plugs'],

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/index-DFo1_Rau.js


+ 1 - 1
static/index.html

@@ -23,7 +23,7 @@
 
     <!-- Splash screens for iOS -->
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
-    <script type="module" crossorigin src="/assets/index-CLLKOagz.js"></script>
+    <script type="module" crossorigin src="/assets/index-DFo1_Rau.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-BmODu1qm.css">
   </head>
   <body>

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است