diff --git a/dist-electron/main.js b/dist-electron/main.js index 442491f..d5b2133 100644 --- a/dist-electron/main.js +++ b/dist-electron/main.js @@ -3,9 +3,9 @@ import "node:fs"; import "node:url"; import "electron"; import "module"; -import { M, R, V } from "./main-BHNwIsv4.js"; +import { M, R, V } from "./main-YnXY0Ehi.js"; export { - i as MAIN_DIST, - _ as RENDERER_DIST, - D as VITE_DEV_SERVER_URL + M as MAIN_DIST, + R as RENDERER_DIST, + V as VITE_DEV_SERVER_URL }; diff --git a/electron/services/copy/selectedText.ts b/electron/services/copy/selectedText.ts index 86adf8b..c90686b 100644 --- a/electron/services/copy/selectedText.ts +++ b/electron/services/copy/selectedText.ts @@ -26,16 +26,12 @@ export async function getSelectedText(): Promise { } return new Promise((resolve, reject) => { - const previousContent = clipboard.readText(); - exec(getCopyCommand(), (error) => { if (error) { - clipboard.writeText(previousContent); return reject(error); } setTimeout(() => { const selectedText = clipboard.readText(); - clipboard.writeText(previousContent); resolve(selectedText); }, 150); }); diff --git a/electron/windows/settingWindow.ts b/electron/windows/settingWindow.ts index b55f75c..74aebab 100644 --- a/electron/windows/settingWindow.ts +++ b/electron/windows/settingWindow.ts @@ -37,7 +37,7 @@ export function createSettingWindow() { const target = `${VITE_DEV_SERVER_URL.replace(/\/$/, '')}/#${'/setting'}`; settingWin.loadURL(target); } else { - settingWin.loadFile('index.html'); + settingWin.loadFile(path.join(RENDERER_DIST, 'index.html')); settingWin.webContents.once('did-finish-load', () => { settingWin?.webContents.send('navigate-to', '/setting'); }); diff --git a/forge.config.js b/forge.config.js index 8b6ff87..e210b4f 100644 --- a/forge.config.js +++ b/forge.config.js @@ -4,7 +4,7 @@ import { FuseV1Options, FuseVersion } from '@electron/fuses'; export default { packagerConfig: { asar: true, - icons: './src/assets/matmal-icon', + icon: './src/assets/matmal-icon', executableName: 'matmal', name: 'MATMAL', }, @@ -12,7 +12,9 @@ export default { makers: [ { name: '@electron-forge/maker-squirrel', - config: {}, + config: { + setupIcon: './src/assets/matmal-icon.ico', + }, }, { name: '@electron-forge/maker-zip', @@ -20,11 +22,21 @@ export default { }, { name: '@electron-forge/maker-deb', - config: {}, + config: { + icon: '/src/assets/matmal-icon.png', + }, + }, + { + name: '@electron-forge/maker-dmg', + config: { + icon: '/src/assets/matmal-icon.icns', + }, }, { name: '@electron-forge/maker-rpm', - config: {}, + config: { + icon: '/src/assets/matmal-icon.png', + }, }, ], publishers: [ diff --git a/package-lock.json b/package-lock.json index dca6767..8177b42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "matmal", - "version": "0.0.2-test", + "version": "0.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "matmal", - "version": "0.0.2-test", + "version": "0.0.3", "license": "MIT", "dependencies": { "@google/genai": "^1.29.0", @@ -27,6 +27,7 @@ "devDependencies": { "@electron-forge/cli": "^7.10.2", "@electron-forge/maker-deb": "^7.10.2", + "@electron-forge/maker-dmg": "^7.10.2", "@electron-forge/maker-rpm": "^7.10.2", "@electron-forge/maker-squirrel": "^7.10.2", "@electron-forge/maker-zip": "^7.10.2", @@ -854,6 +855,62 @@ "electron-installer-debian": "^3.2.0" } }, + "node_modules/@electron-forge/maker-dmg": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.10.2.tgz", + "integrity": "sha512-ksSX6/Ioxa3h3rEGIg26qfDcJgB3aFGivitRdSkEnzUCLWJSUoThEwLToA7CAq4J/4ZREK0PDJ7FPsB+F8CYfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "7.10.2", + "@electron-forge/shared-types": "7.10.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-installer-dmg": "^5.0.1" + } + }, + "node_modules/@electron-forge/maker-dmg/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/maker-dmg/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/maker-dmg/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@electron-forge/maker-rpm": { "version": "7.10.2", "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.10.2.tgz", @@ -4226,6 +4283,17 @@ "node": ">= 10" } }, + "node_modules/@types/appdmg": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@types/appdmg/-/appdmg-0.5.5.tgz", + "integrity": "sha512-G+n6DgZTZFOteITE30LnWj+HRVIGr7wMlAiLWOO02uJFWVEitaPU9JVXm9wJokkgshBawb2O1OykdcsmkkZfgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -5364,6 +5432,44 @@ "node": ">= 10.0.0" } }, + "node_modules/appdmg": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz", + "integrity": "sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "async": "^1.4.2", + "ds-store": "^0.1.5", + "execa": "^1.0.0", + "fs-temp": "^1.0.0", + "fs-xattr": "^0.3.0", + "image-size": "^0.7.4", + "is-my-json-valid": "^2.20.0", + "minimist": "^1.1.3", + "parse-color": "^1.0.0", + "path-exists": "^4.0.0", + "repeat-string": "^1.5.4" + }, + "bin": { + "appdmg": "bin/appdmg.js" + }, + "engines": { + "node": ">=8.5" + } + }, + "node_modules/appdmg/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -5453,6 +5559,17 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/base32-encode": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", + "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "to-data-view": "^1.1.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -5534,6 +5651,17 @@ "dev": true, "license": "MIT" }, + "node_modules/bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "stream-buffers": "~2.2.0" + } + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -6656,6 +6784,19 @@ "url": "https://dotenvx.com" } }, + "node_modules/ds-store": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ds-store/-/ds-store-0.1.6.tgz", + "integrity": "sha512-kY21M6Lz+76OS3bnCzjdsJSF7LBpLYGCVfavW8TgQD2XkcqIZ86W0y9qUDZu6fp7SIZzqosMDW2zi7zVFfv4hw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "bplist-creator": "~0.0.3", + "macos-alias": "~0.2.5", + "tn1150": "^0.1.0" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -6982,6 +7123,28 @@ "node": ">=10" } }, + "node_modules/electron-installer-dmg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/electron-installer-dmg/-/electron-installer-dmg-5.0.1.tgz", + "integrity": "sha512-qOa1aAQdX57C+vzhDk3549dd/PRlNL4F8y736MTD1a43qptD+PvHY97Bo9gSf+OZ8iUWE7BrYSpk/FgLUe40EA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@types/appdmg": "^0.5.5", + "debug": "^4.3.2", + "minimist": "^1.2.7" + }, + "bin": { + "electron-installer-dmg": "dist/electron-installer-dmg-bin.js" + }, + "engines": { + "node": ">= 16" + }, + "optionalDependencies": { + "appdmg": "^0.6.4" + } + }, "node_modules/electron-installer-redhat": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz", @@ -7223,6 +7386,14 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", @@ -8119,6 +8290,17 @@ "node": ">= 10.0.0" } }, + "node_modules/fmix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", + "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "imul": "^1.0.0" + } + }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -8212,6 +8394,32 @@ "dev": true, "license": "ISC" }, + "node_modules/fs-temp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fs-temp/-/fs-temp-1.2.1.tgz", + "integrity": "sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "random-path": "^0.1.0" + } + }, + "node_modules/fs-xattr": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fs-xattr/-/fs-xattr-0.3.1.tgz", + "integrity": "sha512-UVqkrEW0GfDabw4C3HOrFlxKfx0eeigfRne69FxSBdHIP8Qt5Sq6Pu3RM9KmMlkygtC4pPKkj5CiPO5USnj2GA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8400,6 +8608,28 @@ "node": ">=18" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-property": "^1.0.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -8992,6 +9222,20 @@ "node": ">= 4" } }, + "node_modules/image-size": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", + "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -9009,6 +9253,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/imul": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", + "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -9170,6 +9425,29 @@ "dev": true, "license": "MIT" }, + "node_modules/is-my-ip-valid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", + "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/is-my-json-valid": { + "version": "2.20.6", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", + "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^5.0.0", + "xtend": "^4.0.0" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9190,6 +9468,14 @@ "node": ">=8" } }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -9405,6 +9691,17 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/junk": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", @@ -10147,6 +10444,21 @@ "yallist": "^3.0.2" } }, + "node_modules/macos-alias": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.12.tgz", + "integrity": "sha512-yiLHa7cfJcGRFq4FrR4tMlpNHb4Vy4mWnpajlSSIFM5k4Lv8/7BbbDLzCAVogWNl0LlLhizRp1drXv0hK9h0Yw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "nan": "^2.4.0" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -10610,6 +10922,19 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/murmur-32": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/murmur-32/-/murmur-32-0.2.0.tgz", + "integrity": "sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "encode-utf8": "^1.0.3", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, "node_modules/mute-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", @@ -10620,6 +10945,14 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/nan": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.1.tgz", + "integrity": "sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -11080,6 +11413,24 @@ "node": ">=0.10.0" } }, + "node_modules/parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "~0.5.0" + } + }, + "node_modules/parse-color/node_modules/color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==", + "dev": true, + "optional": true + }, "node_modules/parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -11403,6 +11754,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/random-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", + "integrity": "sha512-4jY0yoEaQ5v9StCl5kZbNIQlg1QheIDBrdkDn53EynpPb9FgO6//p3X/tgMnrC45XN6QZCzU1Xz/+pSSsJBpRw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "base32-encode": "^0.1.0 || ^1.0.0", + "murmur-32": "^0.1.0 || ^0.2.0" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -11657,6 +12020,17 @@ "node": ">= 10.13.0" } }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -12307,6 +12681,17 @@ "node": ">= 6" } }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "dev": true, + "license": "Unlicense", + "optional": true, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -12728,6 +13113,28 @@ "tmp": "^0.2.0" } }, + "node_modules/tn1150": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tn1150/-/tn1150-0.1.0.tgz", + "integrity": "sha512-DbplOfQFkqG5IHcDyyrs/lkvSr3mPUVsFf/RbDppOshs22yTPnSJWEe6FkYd1txAwU/zcnR905ar2fi4kwF29w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "unorm": "^1.4.1" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/to-data-view": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -12884,6 +13291,17 @@ "node": ">= 4.0.0" } }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "license": "MIT or GPL-2.0", + "optional": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", @@ -13294,6 +13712,17 @@ "node": ">=8.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index e00b9d9..c0605d3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "matmal", "private": true, - "version": "0.0.3", + "version": "0.0.4", "productName": "matmal", "description": "간편한 한국어 맞춤법 검사 데스크탑 앱", "author": "zzzryt ", @@ -106,6 +106,7 @@ "devDependencies": { "@electron-forge/cli": "^7.10.2", "@electron-forge/maker-deb": "^7.10.2", + "@electron-forge/maker-dmg": "^7.10.2", "@electron-forge/maker-rpm": "^7.10.2", "@electron-forge/maker-squirrel": "^7.10.2", "@electron-forge/maker-zip": "^7.10.2", @@ -124,11 +125,11 @@ "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", + "prettier": "^2.8.8", "typescript": "^5.2.2", "vite": "^5.1.6", "vite-plugin-electron": "^0.28.6", - "vite-plugin-electron-renderer": "^0.14.5", - "prettier": "^2.8.8" + "vite-plugin-electron-renderer": "^0.14.5" }, "main": "dist-electron/main.js" } diff --git a/src/apps/quick/QuickSpell.tsx b/src/apps/quick/QuickSpell.tsx index 001c0a7..4891271 100644 --- a/src/apps/quick/QuickSpell.tsx +++ b/src/apps/quick/QuickSpell.tsx @@ -1,42 +1,70 @@ +import { useEffect, useState, useCallback } from 'react'; +import { useStore } from 'zustand'; + +import { SpellCheckerApiResponse } from '../../../electron/services/schema'; + import HighlightSpelling from '../spellChecker/components/HighlightSpelling'; +import { handleClipboard } from '../spellChecker/utils'; -import Button from '../../shared/components/ui/Button'; -import { useStore } from 'zustand'; import { useSpellCheck } from '../../shared/stores/spell'; -import { handleClipboard } from '../spellChecker/utils'; -import { useEffect, useRef, useState, useCallback } from 'react'; -import { SpellCheckerApiResponse } from '../../../electron/services/schema'; +import { LoadingSpinner } from '../../shared/components/ui/Loading'; +import Button from '../../shared/components/ui/Button'; + +type Status = 'loading' | 'success' | 'error'; function QuickSpell() { const { spell, setSpell, clearSpell } = useStore(useSpellCheck); const [resultData, setResultData] = useState(null); - const [error, setError] = useState(null); - const didMountRef = useRef(false); + const [status, setStatus] = useState('loading'); + const [errorMessage, setErrorMessage] = useState(null); const callGenerateSpell = useCallback( async (sentence: string) => { + setStatus('loading'); + setSpell(sentence); try { - const resultData = await window.api.generate({ sentence }); - setResultData(resultData); - setSpell(sentence); + const result = await window.api.generate({ sentence }); + setResultData(result); + setStatus('success'); } catch (err) { - setError(err as Error); + setErrorMessage((err as Error).message || '맞춤법 검사에 실패했습니다.'); + setStatus('error'); } }, [setSpell] ); useEffect(() => { - if (didMountRef.current) return; - didMountRef.current = true; + const handleQuickSpellLoading = () => { + setStatus('loading'); + setResultData(null); + setErrorMessage(null); + clearSpell(); + }; + const handleQuickSelection = (_event: unknown, text: string) => { - callGenerateSpell(text); + setTimeout(() => { + callGenerateSpell(text); + }, 200); }; + + const handleQuickSelectionError = (_event: unknown, message: string) => { + setErrorMessage(message); + setStatus('error'); + }; + + window.ipcRenderer.on('quick-spell-loading', handleQuickSpellLoading); window.ipcRenderer.on('quick-selection', handleQuickSelection); + window.ipcRenderer.on('quick-selection-error', handleQuickSelectionError); + + handleQuickSpellLoading(); + return () => { + window.ipcRenderer.off('quick-spell-loading', handleQuickSpellLoading); window.ipcRenderer.off('quick-selection', handleQuickSelection); + window.ipcRenderer.off('quick-selection-error', handleQuickSelectionError); }; - }, [callGenerateSpell]); + }, [callGenerateSpell, clearSpell]); const handleNewCheck = () => { clearSpell(); @@ -47,26 +75,41 @@ function QuickSpell() { window.api.onNavigate('/result'); }; - if (error) { - throw error; - } + const renderContent = () => { + switch (status) { + case 'loading': + return ; + case 'success': + return resultData ? ( + + ) : ( +
결과가 없습니다.
+ ); + case 'error': + return
{errorMessage}
; + default: + return null; + } + }; return (
- 텍스트 수: {spell.length} + {status === 'success' && ( + 텍스트 수: {spell.length} + )}
- {resultData ? ( - - ) : ( -
검사중...
- )} + {renderContent()}
- - + {status === 'success' && ( + <> + + + + )}
); diff --git a/src/apps/spellChecker/components/SpellChecker.tsx b/src/apps/spellChecker/components/SpellChecker.tsx index 9e8f01d..e93a783 100644 --- a/src/apps/spellChecker/components/SpellChecker.tsx +++ b/src/apps/spellChecker/components/SpellChecker.tsx @@ -9,6 +9,7 @@ import { getCandWord, handleClipboard } from '../utils'; import Button from '../../../shared/components/ui/Button'; import { useSpellCheck } from '../../../shared/stores/spell'; +import { LoadingSpinner } from '../../../shared/components/ui/Loading'; interface SpellChecker { inputText: string; @@ -52,7 +53,7 @@ function SpellChecker({ inputText }: SpellChecker) { {resultData ? ( ) : ( -
검사중...
+ )}
diff --git a/src/main.tsx b/src/main.tsx index f974454..617ca3f 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -9,8 +9,8 @@ import './index.css'; import SpellCheckerPage from './page/spell-checker/index.tsx'; import QuickSpellPage from './page/quick/index.tsx'; import UserInputPage from './page/user-input/index.tsx'; -import ErrorFallback from './shared/components/ErrorFallback.tsx'; import SettingPage from './page/setting/index.tsx'; +import ErrorFallback from './shared/components/ErrorFallback.tsx'; ReactDOM.createRoot(document.getElementById('root')!).render( diff --git a/src/shared/components/ui/Loading.tsx b/src/shared/components/ui/Loading.tsx new file mode 100644 index 0000000..c67b1b2 --- /dev/null +++ b/src/shared/components/ui/Loading.tsx @@ -0,0 +1,30 @@ +export function LoadingSpinner() { + return ( +
+ + + + +
+ ); +}