From 85c8621d4e77ce639a7cdd91d1cdcfd55c77c62f Mon Sep 17 00:00:00 2001 From: Nayam Amarshe <25067102+NayamAmarshe@users.noreply.github.com> Date: Thu, 2 Nov 2023 20:33:21 +0530 Subject: [PATCH] Add mas build --- common/feature-flags.ts | 4 +- electron/commands/custom-models-select.ts | 14 +++++- electron/commands/select-file.ts | 9 +++- electron/commands/select-folder.ts | 13 ++++- electron/index.ts | 15 ++++++ electron/utils/settings.ts | 36 +++++++++++++ mas-dev.json | 29 +++++++++++ mas.json | 50 +++++++++++++++++++ package-lock.json | 4 +- package.json | 16 ++++-- renderer/components/settings-tab/index.tsx | 28 ++++++----- .../upscayl-tab/config/LeftPaneImageSteps.tsx | 22 ++++++-- renderer/pages/index.tsx | 18 ++++--- resources/entitlements.mas.plist | 8 ++- 14 files changed, 231 insertions(+), 35 deletions(-) create mode 100644 electron/utils/settings.ts create mode 100644 mas-dev.json create mode 100644 mas.json diff --git a/common/feature-flags.ts b/common/feature-flags.ts index 9ecff52..7436ffb 100644 --- a/common/feature-flags.ts +++ b/common/feature-flags.ts @@ -1,7 +1,9 @@ type FeatureFlags = { APP_STORE_BUILD: boolean; + SHOW_UPSCAYL_CLOUD_INFO: boolean; }; export const featureFlags: FeatureFlags = { - APP_STORE_BUILD: false, + APP_STORE_BUILD: true, + SHOW_UPSCAYL_CLOUD_INFO: false, }; diff --git a/electron/commands/custom-models-select.ts b/electron/commands/custom-models-select.ts index 56e05cb..0f9ad48 100644 --- a/electron/commands/custom-models-select.ts +++ b/electron/commands/custom-models-select.ts @@ -8,16 +8,28 @@ import slash from "../utils/slash"; import COMMAND from "../constants/commands"; import getModels from "../utils/get-models"; import { getMainWindow } from "../main-window"; +import { settings } from "../utils/settings"; const customModelsSelect = async (event, message) => { const mainWindow = getMainWindow(); if (!mainWindow) return; - const { canceled, filePaths: folderPaths } = await dialog.showOpenDialog({ + const { + canceled, + filePaths: folderPaths, + bookmarks, + } = await dialog.showOpenDialog({ properties: ["openDirectory"], title: "Select Custom Models Folder", defaultPath: customModelsFolderPath, + securityScopedBookmarks: true, }); + + if (bookmarks && bookmarks.length > 0) { + logit("πŸ“ Bookmarks: ", bookmarks); + settings.set("custom-models-bookmarks", bookmarks[0]); + } + if (canceled) { logit("🚫 Select Custom Models Folder Operation Cancelled"); return null; diff --git a/electron/commands/select-file.ts b/electron/commands/select-file.ts index fbcdf21..9cb0026 100644 --- a/electron/commands/select-file.ts +++ b/electron/commands/select-file.ts @@ -2,16 +2,23 @@ import { MessageBoxOptions, dialog } from "electron"; import { getMainWindow } from "../main-window"; import { imagePath, setImagePath } from "../utils/config-variables"; import logit from "../utils/logit"; +import { settings } from "../utils/settings"; const selectFile = async () => { const mainWindow = getMainWindow(); - const { canceled, filePaths } = await dialog.showOpenDialog({ + const { canceled, filePaths, bookmarks } = await dialog.showOpenDialog({ properties: ["openFile", "multiSelections"], title: "Select Image", defaultPath: imagePath, + securityScopedBookmarks: true, }); + if (bookmarks && bookmarks.length > 0) { + logit("πŸ“ Bookmarks: ", bookmarks); + settings.set("file-bookmarks", bookmarks[0]); + } + if (canceled) { logit("🚫 File Operation Cancelled"); return null; diff --git a/electron/commands/select-folder.ts b/electron/commands/select-folder.ts index f92b01a..31c243c 100644 --- a/electron/commands/select-folder.ts +++ b/electron/commands/select-folder.ts @@ -1,13 +1,24 @@ import { dialog } from "electron"; import { folderPath, setFolderPath } from "../utils/config-variables"; import logit from "../utils/logit"; +import { settings } from "../utils/settings"; const selectFolder = async (event, message) => { - const { canceled, filePaths: folderPaths } = await dialog.showOpenDialog({ + const { + canceled, + filePaths: folderPaths, + bookmarks, + } = await dialog.showOpenDialog({ properties: ["openDirectory"], defaultPath: folderPath, + securityScopedBookmarks: true, }); + if (bookmarks && bookmarks.length > 0) { + logit("πŸ“ Bookmarks: ", bookmarks); + settings.set("folder-bookmarks", bookmarks[0]); + } + if (canceled) { logit("🚫 Select Folder Operation Cancelled"); return null; diff --git a/electron/index.ts b/electron/index.ts index 0b7dc60..fc32cd8 100644 --- a/electron/index.ts +++ b/electron/index.ts @@ -19,12 +19,27 @@ import doubleUpscayl from "./commands/double-upscayl"; import autoUpdate from "./commands/auto-update"; import sharp from "sharp"; import { featureFlags } from "../common/feature-flags"; +import { settings } from "./utils/settings"; // INITIALIZATION log.initialize({ preload: true }); sharp.cache(false); logit("πŸšƒ App Path: ", app.getAppPath()); +// SECURITY SCOPED BOOKMARKS +const fileBookmarks = settings.get("file-bookmarks", true); +const folderBookmarks = settings.get("folder-bookmarks", true); +const customModelsBookmarks = settings.get("custom-models-bookmarks", true); +if (fileBookmarks) { + app.startAccessingSecurityScopedResource(fileBookmarks); +} +if (folderBookmarks) { + app.startAccessingSecurityScopedResource(folderBookmarks as string); +} +if (customModelsBookmarks) { + app.startAccessingSecurityScopedResource(customModelsBookmarks as string); +} + app.on("ready", async () => { await prepareNext("./renderer"); diff --git a/electron/utils/settings.ts b/electron/utils/settings.ts new file mode 100644 index 0000000..b615dd7 --- /dev/null +++ b/electron/utils/settings.ts @@ -0,0 +1,36 @@ +import { getMainWindow } from "../main-window"; + +/** + * @description LocalStorage wrapper for the main window + * @example + * import { settings } from "./utils/settings"; + * + * // Get a value + * const value = settings.get("key", true); + * + * // Set a value + * settings.set("key", value); + */ +export const settings = { + get: (key: string, parse: boolean = false) => { + const mainWindow = getMainWindow(); + if (!mainWindow) return; + let result = null; + mainWindow.webContents + .executeJavaScript(`localStorage.getItem("${key}");`, true) + .then((localStorageValue: any) => { + if (localStorageValue) { + result = parse ? JSON.parse(localStorageValue) : localStorageValue; + } + }); + return result; + }, + set: (key: string, value: any) => { + const mainWindow = getMainWindow(); + if (!mainWindow) return; + mainWindow.webContents.executeJavaScript( + `localStorage.setItem("${key}", ${JSON.stringify(value)});`, + true + ); + }, +}; diff --git a/mas-dev.json b/mas-dev.json new file mode 100644 index 0000000..818989f --- /dev/null +++ b/mas-dev.json @@ -0,0 +1,29 @@ +{ + "appId": "org.upscayl.Upscayl", + "extraFiles": [ + { + "from": "resources/${os}/bin", + "to": "resources/bin", + "filter": ["**/*"] + }, + { + "from": "resources/models", + "to": "resources/models", + "filter": ["**/*"] + } + ], + "mac": { + "type": "development", + "identity": null, + "mergeASARs": false, + "x64ArchFiles": "*" + }, + "masDev": { + "type": "development", + "artifactName": "${name}_${version}_macos.${ext}", + "category": "public.app-category.photography", + "hardenedRuntime": false, + "entitlements": "resources/entitlements.mas.plist", + "entitlementsInherit": "resources/entitlements.mas.plist" + } +} diff --git a/mas.json b/mas.json new file mode 100644 index 0000000..2f09326 --- /dev/null +++ b/mas.json @@ -0,0 +1,50 @@ +{ + "productName": "Upscayl", + "appId": "org.upscayl.Upscayl", + "afterSign": "./notarize.js", + "asar": true, + "asarUnpack": ["**/node_modules/sharp/**/*"], + "extraFiles": [ + { + "from": "resources/${os}/bin", + "to": "resources/bin", + "filter": ["**/*"] + }, + { + "from": "resources/models", + "to": "resources/models", + "filter": ["**/*"] + } + ], + "buildVersion": "3.11.23", + "mas": { + "type": "distribution", + "hardenedRuntime": false, + "electronLanguages": ["en"], + "category": "public.app-category.photography", + "entitlements": "resources/entitlements.mas.plist", + "entitlementsInherit": "resources/entitlements.mas.plist", + "provisioningProfile": "prod.provisionprofile", + "mergeASARs": false, + "gatekeeperAssess": false, + "icon": "build/icon.icns", + "x64ArchFiles": "*", + "target": [ + { + "target": "mas", + "arch": ["universal"] + } + ] + }, + "mac": { + "type": "distribution", + "mergeASARs": false, + "x64ArchFiles": "*", + "provisioningProfile": "prod.provisionprofile", + "category": "public.app-category.photography", + "hardenedRuntime": true, + "gatekeeperAssess": false, + "entitlements": "resources/entitlements.mac.plist", + "entitlementsInherit": "resources/entitlements.mac.plist" + } +} diff --git a/package-lock.json b/package-lock.json index 73cfc56..2313531 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "upscayl", - "version": "2.8.5", + "version": "2.9.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "upscayl", - "version": "2.8.5", + "version": "2.9.3", "license": "AGPL-3.0", "dependencies": { "dotenv": "^16.3.1", diff --git a/package.json b/package.json index b7fb41b..e32031b 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,13 @@ { "name": "upscayl", "private": true, - "version": "2.9.1", + "version": "2.9.3", "productName": "Upscayl", + "author": { + "name": "Nayam Amarshe", + "email": "nayam.emikx@aleeas.com", + "url": "https://github.com/NayamAmarshe" + }, "homepage": "https://github.com/TGS963/upscayl", "contributors": [ { @@ -49,7 +54,8 @@ "dist:pkg": "tsc && npm run build && cross-env DEBUG=* electron-builder build -m pkg", "dist:mac": "tsc && npm run build && electron-builder --mac --universal", "dist:mac-arm64": "tsc && npm run build && electron-builder --mac --arm64", - "dist:mac-mas": "tsc && npm run build && electron-builder --mac mas --universal", + "dist:mas": "tsc && npm run build && electron-builder --mac mas --universal", + "dist:mas-dev": "tsc && npm run build && electron-builder --mac mas-dev --universal -c mas-dev.json", "dist:win": "tsc && npm run build && electron-builder --win", "dist:linux": "tsc && npm run build && electron-builder --linux", "publish-app": "tsc && npm run build && electron-builder -wlm --publish always", @@ -66,6 +72,7 @@ "artifactName": "${name}-${version}-${os}.${ext}", "afterSign": "./notarize.js", "asar": true, + "buildVersion": "23.11.3", "asarUnpack": [ "**/node_modules/sharp/**/*" ], @@ -99,7 +106,9 @@ ], "mas": { "hardenedRuntime": false, - "type": "distribution", + "electronLanguages": [ + "en" + ], "category": "public.app-category.photography", "entitlements": "resources/entitlements.mas.plist", "entitlementsInherit": "resources/entitlements.mas.inherit.plist", @@ -123,6 +132,7 @@ "gatekeeperAssess": false, "entitlements": "resources/entitlements.mac.plist", "entitlementsInherit": "resources/entitlements.mac.plist", + "provisioningProfile": "embedded.provisionprofile", "mergeASARs": false, "target": [ { diff --git a/renderer/components/settings-tab/index.tsx b/renderer/components/settings-tab/index.tsx index 5e1ce1c..304408b 100644 --- a/renderer/components/settings-tab/index.tsx +++ b/renderer/components/settings-tab/index.tsx @@ -245,19 +245,23 @@ function SettingsTab({ {/* RESET SETTINGS */} - + {featureFlags.SHOW_UPSCAYL_CLOUD_INFO && ( + <> + - + + + )} ); } diff --git a/renderer/components/upscayl-tab/config/LeftPaneImageSteps.tsx b/renderer/components/upscayl-tab/config/LeftPaneImageSteps.tsx index eb1e69e..e15763a 100644 --- a/renderer/components/upscayl-tab/config/LeftPaneImageSteps.tsx +++ b/renderer/components/upscayl-tab/config/LeftPaneImageSteps.tsx @@ -9,6 +9,7 @@ import { noImageProcessingAtom, scaleAtom, } from "../../../atoms/userSettingsAtom"; +import { featureFlags } from "@common/feature-flags"; interface IProps { progress: string; @@ -236,10 +237,21 @@ function LeftPaneImageSteps({ className="animate-step-in" data-tooltip-content={outputPath} data-tooltip-id="tooltip"> -

Step 3

-

- Defaults to {!batchMode ? "Image's" : "Folder's"} path -

+
+ Step 3 + {!outputPath && ( +
+ + Not selected + +
+ )} +
+ {!batchMode && !featureFlags.APP_STORE_BUILD && ( +

+ Defaults to {!batchMode ? "Image's" : "Folder's"} path +

+ )} @@ -263,7 +275,7 @@ function LeftPaneImageSteps({ diff --git a/renderer/pages/index.tsx b/renderer/pages/index.tsx index b7bf9cf..3ef8e82 100644 --- a/renderer/pages/index.tsx +++ b/renderer/pages/index.tsx @@ -292,7 +292,9 @@ const Home = () => { SetImagePath(path); var dirname = path.match(/(.*)[\/\\]/)[1] || ""; logit("πŸ“ Selected Image Directory: ", dirname); - setOutputPath(dirname); + if (!featureFlags.APP_STORE_BUILD) { + setOutputPath(dirname); + } } }; @@ -495,17 +497,19 @@ const Home = () => { return (
- + {featureFlags.SHOW_UPSCAYL_CLOUD_INFO && ( + + )} {window.electron.platform === "mac" && (
)} {/* HEADER */}
- {!dontShowCloudModal && !featureFlags.APP_STORE_BUILD && ( + {!dontShowCloudModal && featureFlags.SHOW_UPSCAYL_CLOUD_INFO && (