diff --git a/src/frontend/components/_templates/app-layout.tsx b/src/frontend/components/_templates/app-layout.tsx index 26907b375..de26c82c0 100644 --- a/src/frontend/components/_templates/app-layout.tsx +++ b/src/frontend/components/_templates/app-layout.tsx @@ -43,14 +43,23 @@ const AppLayout = ({ children, ...rest }: AppLayoutProps): ReactNode => { // System initialization useEffect(() => { const initSystem = async () => { - const sysInfo = await system.getSystemInfo() - setSystemConfigs({ - OS: sysInfo.OS, - arch: sysInfo.architecture, - isWindowMaximized: sysInfo.isWindowMaximized, - }) - const recent = await projectPort.getRecentProjects() - setRecent(recent) + try { + const sysInfo = await system.getSystemInfo() + setSystemConfigs({ + OS: sysInfo.OS, + arch: sysInfo.architecture, + isWindowMaximized: sysInfo.isWindowMaximized, + }) + } catch (error) { + console.error('Failed to read system info during app layout initialization:', error) + } + + try { + const recent = await projectPort.getRecentProjects() + setRecent(recent) + } catch (error) { + console.error('Failed to read recent projects during app layout initialization:', error) + } } void initSystem() }, [system, projectPort, setSystemConfigs, setRecent]) diff --git a/src/main/modules/ipc/main.ts b/src/main/modules/ipc/main.ts index 7b131778a..16af7a6a9 100644 --- a/src/main/modules/ipc/main.ts +++ b/src/main/modules/ipc/main.ts @@ -863,11 +863,13 @@ class MainProcessBridge implements MainIpcModule { nativeTheme.themeSource = savedTheme } + const isWindowMaximized = this.mainWindow && !this.mainWindow.isDestroyed() ? this.mainWindow.isMaximized() : false + return { OS: platform, architecture: 'x64', prefersDarkMode: nativeTheme.shouldUseDarkColors, - isWindowMaximized: this.mainWindow?.isMaximized(), + isWindowMaximized, } } handleStoreRetrieveRecent = async () => { diff --git a/src/renderer/components/_templates/app-layout.tsx b/src/renderer/components/_templates/app-layout.tsx new file mode 100644 index 000000000..802e80a16 --- /dev/null +++ b/src/renderer/components/_templates/app-layout.tsx @@ -0,0 +1,97 @@ +import { + ConfirmDeleteModalProps, + SaveChangeModalProps, + SaveChangesFileModalData, +} from '@root/renderer/components/_organisms/modals' +import { TitleBar } from '@root/renderer/components/_organisms/title-bar' +import { useOpenPLCStore } from '@root/renderer/store' +import { cn } from '@root/utils' +import { ComponentPropsWithoutRef, ReactNode, useEffect, useState } from 'react' + +import Toaster from '../_features/[app]/toast/toaster' +import { ProjectModal } from '../_features/[start]/new-project/project-modal' +import { + ConfirmDeleteElementModal, + QuitApplicationModal, + SaveChangesFileModal, + SaveChangesModal, +} from '../_organisms/modals' +import { AcceleratorHandler } from './accelerator-handler' + +type AppLayoutProps = ComponentPropsWithoutRef<'main'> +const AppLayout = ({ children, ...rest }: AppLayoutProps): ReactNode => { + const [isLinux, setIsLinux] = useState(true) + const { + modals, + workspaceActions: { setSystemConfigs, setRecent }, + } = useOpenPLCStore() + + useEffect(() => { + const getUserSystemProps = async () => { + try { + const { OS, architecture, prefersDarkMode, isWindowMaximized } = await window.bridge.getSystemInfo() + setSystemConfigs({ + OS, + arch: architecture, + shouldUseDarkMode: prefersDarkMode, + isWindowMaximized, + }) + if (OS === 'darwin' || OS === 'win32') { + setIsLinux(false) + } + } catch (error) { + console.error('Failed to read system info during app layout initialization:', error) + } + + try { + const recent = await window.bridge.retrieveRecent() + setRecent(recent) + } catch (error) { + console.error('Failed to read recent projects during app layout initialization:', error) + } + } + void getUserSystemProps() + }, [setRecent, setSystemConfigs]) + + return ( + <> + {!isLinux && } +
+ {children} + + {modals?.['create-project']?.open === true && } + {modals?.['save-changes-project']?.open === true && ( + + )} + {modals?.['save-changes-file']?.open === true && ( + + )} + {modals?.['quit-application']?.open === true && ( + + )} + {modals?.['confirm-delete-element']?.open === true && ( + + )} + +
+ + ) +} + +export { AppLayout }