diff --git a/package-lock.json b/package-lock.json index 756f179f..8805e861 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cyd", - "version": "1.0.22", + "version": "1.0.24-dev", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cyd", - "version": "1.0.22", + "version": "1.0.24-dev", "license": "proprietary", "dependencies": { "@fortawesome/fontawesome-free": "^6.5.2", diff --git a/package.json b/package.json index 1e93d14b..52e9dccd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cyd", "private": true, - "version": "1.0.22", + "version": "1.0.24-dev", "main": ".vite/build/main.js", "description": "Automatically delete your data from tech platforms, except for what you want to keep", "license": "proprietary", diff --git a/src/account_x/x_account_controller.ts b/src/account_x/x_account_controller.ts index 6a35ffa8..d8006e38 100644 --- a/src/account_x/x_account_controller.ts +++ b/src/account_x/x_account_controller.ts @@ -1718,13 +1718,17 @@ export class XAccountController { // Unzip twitter archive to the account data folder using unzipper // Return unzipped path if success, else null. async unzipXArchive(archiveZipPath: string): Promise { - const archiveZip = await unzipper.Open.file(archiveZipPath); if (!this.account) { return null; } - const unzippedPath = path.join(getAccountDataPath("X", this.account.username), path.parse(archiveZipPath).name) + const unzippedPath = path.join(getAccountDataPath("X", this.account.username), "tmp"); + + const archiveZip = await unzipper.Open.file(archiveZipPath); await archiveZip.extract({ path: unzippedPath }); - return unzippedPath + + log.info(`XAccountController.unzipXArchive: unzipped to ${unzippedPath}`); + + return unzippedPath; } // Delete the unzipped X archive once the build is completed diff --git a/src/main.ts b/src/main.ts index b758a087..73a5489b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,7 +14,8 @@ import { nativeImage, autoUpdater, powerSaveBlocker, - powerMonitor + powerMonitor, + FileFilter } from 'electron'; import { updateElectronApp, UpdateSourceType } from 'update-electron-app'; @@ -343,34 +344,22 @@ async function createWindow() { } }); - ipcMain.handle('showSelectZIPFileDialog', async (_): Promise => { + ipcMain.handle('showOpenDialog', async (_, selectFolders: boolean, selectFiles: boolean, fileFilters: FileFilter[] | undefined = undefined): Promise => { const dataPath = database.getConfig('dataPath'); - const options: Electron.OpenDialogSyncOptions = { - filters: [{ name: 'Archive', extensions: ['zip'] }], - properties: ['openFile'], - }; - - if (dataPath) { - options.defaultPath = dataPath; + const properties: ("openFile" | "openDirectory" | "multiSelections" | "showHiddenFiles" | "createDirectory" | "promptToCreate" | "noResolveAliases" | "treatPackageAsDirectory" | "dontAddToRecent")[] = []; + if (selectFolders) { + properties.push('openDirectory'); + properties.push('createDirectory'); + properties.push('promptToCreate'); } - - try { - const result = dialog.showOpenDialogSync(win, options); - if (result && result.length > 0) { - return result[0]; - } - return null; - } catch (error) { - throw new Error(packageExceptionForReport(error as Error)); + if (selectFiles) { + properties.push('openFile'); } - }); - - ipcMain.handle('showSelectFolderDialog', async (_): Promise => { - const dataPath = database.getConfig('dataPath'); const options: Electron.OpenDialogSyncOptions = { - properties: ['openDirectory', 'createDirectory', 'promptToCreate'], + properties: properties, + filters: fileFilters, }; if (dataPath) { options.defaultPath = dataPath; diff --git a/src/preload.ts b/src/preload.ts index 42b69584..b0cdf5f7 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -1,4 +1,4 @@ -import { contextBridge, ipcRenderer } from 'electron' +import { contextBridge, ipcRenderer, FileFilter } from 'electron' import { ErrorReport, Account, @@ -51,11 +51,8 @@ contextBridge.exposeInMainWorld('electron', { showQuestion: (message: string, trueText: string, falseText: string): Promise => { return ipcRenderer.invoke('showQuestion', message, trueText, falseText) }, - showSelectZIPFileDialog: (): Promise => { - return ipcRenderer.invoke('showSelectZIPFileDialog') - }, - showSelectFolderDialog: (): Promise => { - return ipcRenderer.invoke('showSelectFolderDialog') + showOpenDialog: (selectFolders: boolean, selectFiles: boolean, fileFilters: FileFilter[] | undefined = undefined): Promise => { + return ipcRenderer.invoke('showOpenDialog', selectFolders, selectFiles, fileFilters) }, openURL: (url: string) => { ipcRenderer.invoke('openURL', url) diff --git a/src/renderer/src/main.ts b/src/renderer/src/main.ts index dbb42904..e6e57619 100644 --- a/src/renderer/src/main.ts +++ b/src/renderer/src/main.ts @@ -24,6 +24,8 @@ import type { } from "../../shared_types"; import App from "./App.vue"; +import { FileFilter } from "electron"; + declare global { interface Window { electron: { @@ -38,8 +40,7 @@ declare global { showMessage: (message: string) => void; showError: (message: string) => void; showQuestion: (message: string, trueText: string, falseText: string) => Promise; - showSelectZIPFileDialog: () => Promise; - showSelectFolderDialog: () => Promise; + showOpenDialog: (selectFolders: boolean, selectFiles: boolean, fileFilters: FileFilter[] | undefined) => Promise; openURL: (url: string) => void; loadFileInWebview: (webContentsId: number, filename: string) => void; getAccountDataPath: (accountID: number, filename: string) => Promise, diff --git a/src/renderer/src/modals/AdvancedSettingsModal.vue b/src/renderer/src/modals/AdvancedSettingsModal.vue index 198b0ab2..cab59ce3 100644 --- a/src/renderer/src/modals/AdvancedSettingsModal.vue +++ b/src/renderer/src/modals/AdvancedSettingsModal.vue @@ -13,7 +13,7 @@ let modalInstance: Modal | null = null; const dataPath = ref(''); const browseClicked = async () => { - const newDataPath = await window.electron.showSelectFolderDialog(); + const newDataPath = await window.electron.showOpenDialog(true, false, undefined); if (newDataPath) { dataPath.value = newDataPath; await window.electron.database.setConfig('dataPath', newDataPath); diff --git a/src/renderer/src/test_util.ts b/src/renderer/src/test_util.ts index 6e9fc491..e2f1f7b8 100644 --- a/src/renderer/src/test_util.ts +++ b/src/renderer/src/test_util.ts @@ -10,9 +10,8 @@ export const stubElectron = () => { shouldOpenDevtools: cy.stub().resolves(false), showMessage: cy.stub(), showError: cy.stub(), - showQuestion: cy.stub().resolves(true), - showSelectZIPFileDialog: cy.stub().resolves(null), - showSelectFolderDialog: cy.stub().resolves(null), + showQuestion: cy.stub(), + showOpenDialog: cy.stub(), openURL: cy.stub(), loadFileInWebview: cy.stub(), getAccountDataPath: cy.stub().resolves(null), diff --git a/src/renderer/src/views/x/XWizardImportingPage.vue b/src/renderer/src/views/x/XWizardImportingPage.vue index 416adaf8..8a3b6f57 100644 --- a/src/renderer/src/views/x/XWizardImportingPage.vue +++ b/src/renderer/src/views/x/XWizardImportingPage.vue @@ -1,7 +1,8 @@