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 }