From 19e7a51b612bbca4a2a644e0a1b2574959609362 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sun, 22 Mar 2026 00:18:19 +0800 Subject: [PATCH] Revert "fix: prevent multiple initialization and state race condition in PopoutPage" This reverts commit 69bd91797d797daa0e57119a7a8d7c1459ba72dd. --- src/pages/PopoutPage.tsx | 89 +++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 47 deletions(-) diff --git a/src/pages/PopoutPage.tsx b/src/pages/PopoutPage.tsx index 3facf76..503a017 100644 --- a/src/pages/PopoutPage.tsx +++ b/src/pages/PopoutPage.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState, useRef } from 'react' +import { useEffect, useState } from 'react' import { useSearchParams } from 'react-router-dom' import type { FileItemDTO } from '@shared/types/file' import { matchModule } from '@/lib/module-registry' @@ -11,14 +11,15 @@ import { useTabStore } from '@/stores' export const PopoutPage = () => { const [searchParams] = useSearchParams() const [file, setFile] = useState(null) + const [content, setContent] = useState('') + const [unsavedContent, setUnsavedContent] = useState('') + const [isEditing, setIsEditing] = useState(false) const [isMaximized, setIsMaximized] = useState(false) const [ready, setReady] = useState(false) - const initializedRef = useRef(false) + + const { selectFile } = useTabStore() useEffect(() => { - if (initializedRef.current) return - initializedRef.current = true - const path = searchParams.get('path') const name = searchParams.get('name') const contentParam = searchParams.get('content') @@ -35,61 +36,55 @@ export const PopoutPage = () => { const decodedUnsaved = unsavedParam ? decodeURIComponent(unsavedParam) : decodedContent const decodedEditing = editingParam === 'true' - const fileObj: FileItemDTO = { + setFile({ name: decodedName, path: decodedPath, type: 'file', size: 0, modified: new Date().toISOString(), - } + }) + setContent(decodedContent) + setUnsavedContent(decodedUnsaved) + setIsEditing(decodedEditing) - setFile(fileObj) + useTabStore.setState((state) => { + const newTabs = new Map(state.tabs) + newTabs.set(decodedPath, { + file: { + name: decodedName, + path: decodedPath, + type: 'file' as const, + size: 0, + modified: new Date().toISOString(), + }, + content: decodedContent, + unsavedContent: decodedUnsaved, + isEditing: decodedEditing, + loading: false, + loaded: true, + }) + return { + tabs: newTabs, + activeTabId: decodedPath, + } + }) - const existingTab = useTabStore.getState().tabs.get(decodedPath) - if (!existingTab) { - useTabStore.setState((state) => { - const newTabs = new Map(state.tabs) - newTabs.set(decodedPath, { - file: fileObj, - content: decodedContent, - unsavedContent: decodedUnsaved, - isEditing: decodedEditing, - loading: false, - loaded: true, - }) - return { - tabs: newTabs, - activeTabId: decodedPath, - } - }) - } else { - useTabStore.setState((state) => { - const newTabs = new Map(state.tabs) - const existing = newTabs.get(decodedPath) - if (existing) { - newTabs.set(decodedPath, { - ...existing, - content: decodedContent, - unsavedContent: decodedUnsaved, - isEditing: decodedEditing, - loaded: true, - }) - } - return { - tabs: newTabs, - activeTabId: decodedPath, - } - }) - } + selectFile({ + name: decodedName, + path: decodedPath, + type: 'file', + size: 0, + modified: new Date().toISOString(), + }) + + setReady(true) window.electronAPI?.windowIsMaximized().then((result) => { if (result.success) { setIsMaximized(result.isMaximized) } }) - - setReady(true) - }, [searchParams]) + }, [searchParams, selectFile]) const handleMinimize = () => { window.electronAPI?.windowMinimize()