@@ -8,6 +8,7 @@ import { spawn, exec } from 'child_process';
88import { getAllCoverImageUrls , getGameMetaData } from './src/js/backends.js' ;
99
1010import { PLATFORMS , getPlatformInfo } from './src/js/platforms.js' ;
11+ import { pickFolderPersist } from "./src/js/portal-picker.js" ;
1112
1213import axios from 'axios' ;
1314import os from 'os' ;
@@ -356,6 +357,7 @@ const downloadAndSaveImage = async (imgSrc, platform, gameName, gamesDir) => {
356357 }
357358} ;
358359
360+
359361// delete cover from covers directory (with existence check)
360362ipcMain . handle ( 'delete-image' , async ( _event , imagePath ) => {
361363 return new Promise ( resolve => {
@@ -488,16 +490,6 @@ ipcMain.handle('get-user-data', () => {
488490 } ;
489491} ) ;
490492
491- ipcMain . handle ( 'select-file-or-directory' , async ( event , property ) => {
492-
493- const result = await dialog . showOpenDialog ( { properties : [ property ] } ) ;
494-
495- if ( ! result . canceled && result . filePaths . length > 0 ) {
496- return result . filePaths [ 0 ] ;
497- }
498- return null ;
499- } ) ;
500-
501493ipcMain . handle ( 'go-to-url' , async ( event , link ) => {
502494 console . log ( "url: " , link ) ;
503495 shell . openExternal ( link ) ;
@@ -1116,3 +1108,46 @@ ipcMain.handle('get-flatpak-download-size', async (event, appId) => {
11161108 } ) ;
11171109 } ) ;
11181110} ) ;
1111+
1112+
1113+ ipcMain . handle ( 'ping' , ( ) => {
1114+ console . log ( "π Ping handler called - IPC is working!" ) ;
1115+ return 'pong' ;
1116+ } ) ;
1117+
1118+ ipcMain . handle ( "select-file-or-directory" , async ( event , property ) => {
1119+ console . log ( "π IPC handler CALLED for:" , property ) ;
1120+ const isFlatpak = ! ! process . env . FLATPAK_ID ;
1121+ console . log ( "π Running in Flatpak?" , isFlatpak ) ;
1122+
1123+ try {
1124+ if ( property === "openDirectory" && isFlatpak ) {
1125+ console . log ( "π Using portal picker for directory (Flatpak)..." ) ;
1126+ try {
1127+ const result = await pickFolderPersist ( ) ;
1128+ console . log ( "π Portal picker result:" , result ) ;
1129+ return result ?. path || null ;
1130+ } catch ( portalError ) {
1131+ console . error ( "π Portal picker failed:" , portalError ) ;
1132+ console . log ( "β Portal error - falling back to native dialog" ) ;
1133+ }
1134+ }
1135+
1136+ // Fallback to Electron native dialogs (always for file picker, and fallback for directories)
1137+ console . log ( "π Using Electron native dialog for" , property ) ;
1138+ const result = await dialog . showOpenDialog ( {
1139+ title : property === 'openDirectory' ? 'Choose a folder' : 'Choose a file' ,
1140+ properties : [ property ] ,
1141+ modal : true
1142+ } ) ;
1143+ console . log ( "π Dialog result:" , result ) ;
1144+ if ( result . canceled || result . filePaths . length === 0 ) {
1145+ return null ;
1146+ }
1147+ return result . filePaths [ 0 ] ;
1148+
1149+ } catch ( e ) {
1150+ console . error ( "IPC handler error:" , e ) ;
1151+ return null ;
1152+ }
1153+ } ) ;
0 commit comments