diff --git a/frontend/dist-electron/main.js b/frontend/dist-electron/main.js index 939ee20..d62915f 100644 --- a/frontend/dist-electron/main.js +++ b/frontend/dist-electron/main.js @@ -518,6 +518,14 @@ electron_1.ipcMain.handle('get-community-accounts', async () => { initBackend(); electron_1.ipcMain.handle('get-server-users', async () => { initBackend(); return backend ? await backend.getServerUsers() : []; }); electron_1.ipcMain.handle('switch-account', async (event, loginName) => await handleSwitchAccount(loginName)); electron_1.ipcMain.handle('open-external', (event, url) => electron_1.shell.openExternal(url)); +electron_1.ipcMain.handle('open-steam-app-login', async () => { + console.log('[SteamClient] Triggering desktop login window...'); + // Force Steam to show login window. + // steam://open/login is the protocol for this. + const command = process.platform === 'win32' ? 'start steam://open/login' : 'xdg-open steam://open/login'; + (0, child_process_1.exec)(command); + return true; +}); electron_1.ipcMain.handle('open-steam-login', async (event, expectedSteamId) => { const loginSession = electron_1.session.fromPartition('persist:steam-login'); // Removed: automatic clearStorageData to allow cookie persistence diff --git a/frontend/dist-electron/preload.js b/frontend/dist-electron/preload.js index 56a17c2..f6e21ce 100644 --- a/frontend/dist-electron/preload.js +++ b/frontend/dist-electron/preload.js @@ -11,6 +11,7 @@ electron_1.contextBridge.exposeInMainWorld('electronAPI', { revokeAccountAccess: (steamId, targetSteamId) => electron_1.ipcRenderer.invoke('revoke-account-access', steamId, targetSteamId), revokeAllAccountAccess: (steamId) => electron_1.ipcRenderer.invoke('revoke-all-account-access', steamId), openExternal: (url) => electron_1.ipcRenderer.invoke('open-external', url), + openSteamAppLogin: () => electron_1.ipcRenderer.invoke('open-steam-app-login'), openSteamLogin: (steamId) => electron_1.ipcRenderer.invoke('open-steam-login', steamId), // Server Config & Auth getServerConfig: () => electron_1.ipcRenderer.invoke('get-server-config'), diff --git a/frontend/electron/main.ts b/frontend/electron/main.ts index 481850d..215e173 100644 --- a/frontend/electron/main.ts +++ b/frontend/electron/main.ts @@ -505,6 +505,15 @@ ipcMain.handle('get-server-users', async () => { initBackend(); return backend ? ipcMain.handle('switch-account', async (event, loginName: string) => await handleSwitchAccount(loginName)); ipcMain.handle('open-external', (event, url: string) => shell.openExternal(url)); +ipcMain.handle('open-steam-app-login', async () => { + console.log('[SteamClient] Triggering desktop login window...'); + // Force Steam to show login window. + // steam://open/login is the protocol for this. + const command = process.platform === 'win32' ? 'start steam://open/login' : 'xdg-open steam://open/login'; + exec(command); + return true; +}); + ipcMain.handle('open-steam-login', async (event, expectedSteamId: string) => { const loginSession = session.fromPartition('persist:steam-login'); // Removed: automatic clearStorageData to allow cookie persistence diff --git a/frontend/electron/preload.ts b/frontend/electron/preload.ts index 510657b..bb959b0 100644 --- a/frontend/electron/preload.ts +++ b/frontend/electron/preload.ts @@ -10,6 +10,7 @@ contextBridge.exposeInMainWorld('electronAPI', { revokeAccountAccess: (steamId: string, targetSteamId: string) => ipcRenderer.invoke('revoke-account-access', steamId, targetSteamId), revokeAllAccountAccess: (steamId: string) => ipcRenderer.invoke('revoke-all-account-access', steamId), openExternal: (url: string) => ipcRenderer.invoke('open-external', url), + openSteamAppLogin: () => ipcRenderer.invoke('open-steam-app-login'), openSteamLogin: (steamId: string) => ipcRenderer.invoke('open-steam-login', steamId), // Server Config & Auth diff --git a/frontend/src/hooks/useAccounts.tsx b/frontend/src/hooks/useAccounts.tsx index bf27a08..c5ca1c7 100644 --- a/frontend/src/hooks/useAccounts.tsx +++ b/frontend/src/hooks/useAccounts.tsx @@ -38,6 +38,7 @@ interface AccountsContextType { updateAccount: (id: string, data: Partial) => Promise; deleteAccount: (id: string) => Promise; switchAccount: (loginName: string) => Promise; + openSteamAppLogin: () => Promise; openSteamLogin: (steamId: string) => Promise; shareAccountWithUser: (steamId: string, targetSteamId: string) => Promise; revokeAccountAccess: (steamId: string, targetSteamId: string) => Promise; @@ -127,6 +128,10 @@ export const AccountsProvider: React.FC<{ children: React.ReactNode }> = ({ chil await (window as any).electronAPI.switchAccount(loginName); }; + const openSteamAppLogin = async () => { + await (window as any).electronAPI.openSteamAppLogin(); + }; + const openSteamLogin = async (steamId: string) => { await (window as any).electronAPI.openSteamLogin(steamId); await syncNow(); @@ -172,7 +177,7 @@ export const AccountsProvider: React.FC<{ children: React.ReactNode }> = ({ chil return ( {children} diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index 65726a9..673cf3c 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -34,7 +34,7 @@ const Dashboard: React.FC = () => { const { currentTheme, setTheme } = useAppTheme(); const { accounts, isLoading, isSyncing, serverConfig, deleteAccount, - switchAccount, openSteamLogin, updateServerConfig, loginToServer, syncNow + switchAccount, openSteamAppLogin, openSteamLogin, updateServerConfig, loginToServer, syncNow } = useAccounts(); const [searchTerm, setSearchTerm] = useState(''); @@ -104,7 +104,7 @@ const Dashboard: React.FC = () => { variant="contained" color="primary" startIcon={} - onClick={() => openSteamLogin('')} + onClick={() => openSteamAppLogin()} sx={{ height: 32 }} > Add