diff --git a/.vscode/settings.json b/.vscode/settings.json index 687e2026..3965bd1e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -20,5 +20,14 @@ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }, + "i18n-ally.localesPaths": ["src\\renderer\\i18n\\locales"], + "i18n-ally.keystyle": "nested", + "i18n-ally.sortKeys": true, + "i18n-ally.namespace": true, + "i18n-ally.enabledParsers": ["json"], + "i18n-ally.sourceLanguage": "en", + "i18n-ally.displayLanguage": "zh-CN", + "i18n-ally.enabledFrameworks": ["vue"], + "i18n-ally.editor.preferEditor": true, "typescript.tsdk": "node_modules\\typescript\\lib" } \ No newline at end of file diff --git a/UI_COMPONENTS_README.md b/UI_COMPONENTS_README.md new file mode 100644 index 00000000..e69de29b diff --git a/package.json b/package.json index 9f9a5595..4da4aaf1 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "link": "node ./scripts/link.js", "lint": "eslint --ext .js,.jsx,.ts,.tsx,.vue src/", "lint:dpdm": "dpdm -T --tsconfig ./tsconfig.json --no-tree --no-warning --exit-code circular:1 src/main/index.ts", + "lint:dpdm:renderer": "dpdm -T --tsconfig ./tsconfig.json --no-tree --no-warning --exit-code circular:1 src/renderer/main.ts", "lint:fix": "eslint --fix --ext .js,.jsx,.ts,.tsx,.vue src/", "ncu": "node ./scripts/check-dep.js", "postinstall": "electron-builder install-app-deps", diff --git a/resources/i18n/en.yml b/resources/i18n/en.yml index 0301eeac..1a4bf900 100644 --- a/resources/i18n/en.yml +++ b/resources/i18n/en.yml @@ -65,3 +65,5 @@ TIPS_FIND_NEW_VERSION: Find new version ${v}, update many new features, do you w UPDATE_DOWNLOADED: Update downloaded TIPS_UPDATE_DOWNLOADED: The update has been downloaded and will be installed on the next app restart. Would you like to restart now? QUIT: Quit +OPERATION_SUCCEED: "Operation Succeed" +OPERATION_FAILED: "Operation Failed" \ No newline at end of file diff --git a/resources/i18n/zh-CN.yml b/resources/i18n/zh-CN.yml index 49d9e72e..954a8636 100644 --- a/resources/i18n/zh-CN.yml +++ b/resources/i18n/zh-CN.yml @@ -65,3 +65,5 @@ TIPS_FIND_NEW_VERSION: 发现新版本${v},更新了很多功能,是否后 UPDATE_DOWNLOADED: 更新已下载 TIPS_UPDATE_DOWNLOADED: 更新已下载,将在下次启动时安装,是否现在重启? QUIT: 退出 +OPERATION_SUCCEED: "操作成功" +OPERATION_FAILED: "操作失败" \ No newline at end of file diff --git a/resources/i18n/zh-TW.yml b/resources/i18n/zh-TW.yml index a5567a79..354805d3 100644 --- a/resources/i18n/zh-TW.yml +++ b/resources/i18n/zh-TW.yml @@ -65,3 +65,5 @@ TIPS_FIND_NEW_VERSION: 發現新版本${v},更新了很多功能,是否後 UPDATE_DOWNLOADED: 更新已下載 TIPS_UPDATE_DOWNLOADED: 更新已下載,将在下次啟動時安裝,是否立即重啟? QUIT: 退出 +OPERATION_SUCCEED: "操作成功" +OPERATION_FAILED: "操作失敗" \ No newline at end of file diff --git a/src/main/apis/app/remoteNotice/index.ts b/src/main/apis/app/remoteNotice/index.ts index 1eaeac16..62587142 100644 --- a/src/main/apis/app/remoteNotice/index.ts +++ b/src/main/apis/app/remoteNotice/index.ts @@ -6,9 +6,9 @@ import { app, clipboard, dialog, shell } from 'electron' import fs from 'fs-extra' import { gte, lte } from 'semver' -import { IRemoteNoticeActionType, IRemoteNoticeTriggerCount, IRemoteNoticeTriggerHook } from '#/types/enum' -import { IRemoteNotice, IRemoteNoticeAction, IRemoteNoticeLocalCountStorage } from '#/types/types' +import type { IRemoteNotice, IRemoteNoticeAction, IRemoteNoticeLocalCountStorage } from '#/types/types' import { showNotification } from '~/utils/common' +import { IRemoteNoticeActionType, IRemoteNoticeTriggerCount } from '~/utils/enum' // for test const REMOTE_NOTICE_URL = 'https://release.piclist.cn/remote-notice.json' @@ -163,7 +163,7 @@ class RemoteNoticeHandler { } } - triggerHook (hook: IRemoteNoticeTriggerHook) { + triggerHook (hook: string) { if (!this.remoteNotice || !this.remoteNotice.list) { return } diff --git a/src/main/apis/app/shortKey/shortKeyHandler.ts b/src/main/apis/app/shortKey/shortKeyHandler.ts index 67b80d3c..53df405f 100644 --- a/src/main/apis/app/shortKey/shortKeyHandler.ts +++ b/src/main/apis/app/shortKey/shortKeyHandler.ts @@ -6,9 +6,9 @@ import shortKeyService from 'apis/app/shortKey/shortKeyService' import GuiApi from 'apis/gui' import { globalShortcut } from 'electron' -import { TOGGLE_SHORTKEY_MODIFIED_MODE } from '#/events/constants' -import { IKeyCommandType, IPluginShortKeyConfig, IShortKeyConfig, IShortKeyConfigs, IShortKeyHandler } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import type { IKeyCommandType, IPluginShortKeyConfig, IShortKeyConfig, IShortKeyConfigs, IShortKeyHandler } from '#/types/types' +import { TOGGLE_SHORTKEY_MODIFIED_MODE } from '~/events/constant' +import { configPaths } from '~/utils/configPaths' class ShortKeyHandler { private isInModifiedMode: boolean = false diff --git a/src/main/apis/app/shortKey/shortKeyService.ts b/src/main/apis/app/shortKey/shortKeyService.ts index 022ca596..3811e032 100644 --- a/src/main/apis/app/shortKey/shortKeyService.ts +++ b/src/main/apis/app/shortKey/shortKeyService.ts @@ -1,6 +1,6 @@ import logger from '@core/picgo/logger' -import { IShortKeyHandler } from '#/types/types' +import type { IShortKeyHandler } from '#/types/types' class ShortKeyService { private commandList: Map = new Map() diff --git a/src/main/apis/app/system/index.ts b/src/main/apis/app/system/index.ts index e04afd03..8e9f6526 100644 --- a/src/main/apis/app/system/index.ts +++ b/src/main/apis/app/system/index.ts @@ -18,13 +18,13 @@ import fs from 'fs-extra' import { cloneDeep } from 'lodash-es' import pkg from 'root/package.json' -import { IPasteStyle, IWindowList } from '#/types/enum' -import { IBounds, ImgInfo } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import type { IBounds, ImgInfo } from '#/types/types' import { buildPicBedListMenu } from '~/events/remotes/menu' import { T as $t } from '~/i18n' import clipboardPoll from '~/utils/clipboardPoll' import { ensureFilePath, handleCopyUrl, setTray, tray } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' +import { IPasteStyle, IWindowList } from '~/utils/enum' import { isMacOSVersionGreaterThanOrEqualTo } from '~/utils/getMacOSVersion' import pasteTemplate from '~/utils/pasteTemplate' import { hideMiniWindow, openMainWindow, openMiniWindow } from '~/utils/windowHelper' diff --git a/src/main/apis/app/uploader/apis.ts b/src/main/apis/app/uploader/apis.ts index 6af03269..67f0afdc 100644 --- a/src/main/apis/app/uploader/apis.ts +++ b/src/main/apis/app/uploader/apis.ts @@ -5,13 +5,13 @@ import windowManager from 'apis/app/window/windowManager' import { Notification, WebContents } from 'electron' import fs from 'fs-extra' import { cloneDeep } from 'lodash-es' -import { IPicGo } from 'piclist' +import type { IPicGo } from 'piclist' -import { IPasteStyle, IWindowList } from '#/types/enum' -import { IFileWithPath, ImgInfo, IStringKeyMap, IUploadOption } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import type { IFileWithPath, ImgInfo, IStringKeyMap, IUploadOption } from '#/types/types' import { T as $t } from '~/i18n/index' import { handleCopyUrl, handleUrlEncodeWithSetting } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' +import { IPasteStyle, IWindowList } from '~/utils/enum' import { changeCurrentUploader } from '~/utils/handleUploaderConfig' import pasteTemplate from '~/utils/pasteTemplate' diff --git a/src/main/apis/app/uploader/index.ts b/src/main/apis/app/uploader/index.ts index fe52e803..d80f5f17 100644 --- a/src/main/apis/app/uploader/index.ts +++ b/src/main/apis/app/uploader/index.ts @@ -11,13 +11,13 @@ import fs from 'fs-extra' import type { IPicGo } from 'piclist' import writeFile from 'write-file-atomic' -import { GET_RENAME_FILE_NAME, RENAME_FILE_NAME } from '#/events/constants' -import { ICOREBuildInEvent, IWindowList } from '#/types/enum' -import { ImgInfo, IUploadOption } from '#/types/types' -import { configPaths } from '#/utils/configPaths' -import { CLIPBOARD_IMAGE_FOLDER } from '#/utils/static' +import type { ImgInfo, IUploadOption } from '#/types/types' +import { GET_RENAME_FILE_NAME, RENAME_FILE_NAME } from '~/events/constant' import { T as $t } from '~/i18n' import { getClipboardFilePath, showNotification } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' +import { ICOREBuildInEvent, IWindowList } from '~/utils/enum' +import { CLIPBOARD_IMAGE_FOLDER } from '~/utils/static' const waitForRename = (window: BrowserWindow, id: number): Promise => { return new Promise(resolve => { diff --git a/src/main/apis/app/window/windowList.ts b/src/main/apis/app/window/windowList.ts index 8b2b5436..27edc10a 100644 --- a/src/main/apis/app/window/windowList.ts +++ b/src/main/apis/app/window/windowList.ts @@ -6,16 +6,16 @@ import { CREATE_APP_MENU } from '@core/bus/constants' import db from '@core/datastore' import { app, BrowserWindow, Rectangle } from 'electron' -import { TOGGLE_SHORTKEY_MODIFIED_MODE } from '#/events/constants' -import { IWindowListItem } from '#/types/electron' -import { IWindowList } from '#/types/enum' -import { IBrowserWindowOptions } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import type { IWindowListItem } from '#/types/electron' +import type { IBrowserWindowOptions } from '#/types/types' +import { TOGGLE_SHORTKEY_MODIFIED_MODE } from '~/events/constant' import { T as $t } from '~/i18n' +import { configPaths } from '~/utils/configPaths' +import { IWindowList } from '~/utils/enum' import logo from '../../../../../resources/logo.png?asset' -const windowList = new Map() +const windowList = new Map() const getDefaultWindowSizes = (): { width: number; height: number } => { const [mainWindowWidth, mainWindowHeight] = db.get([ diff --git a/src/main/apis/app/window/windowManager.ts b/src/main/apis/app/window/windowManager.ts index 0eb6d300..fb185890 100644 --- a/src/main/apis/app/window/windowManager.ts +++ b/src/main/apis/app/window/windowManager.ts @@ -1,14 +1,14 @@ import windowList from 'apis/app/window/windowList' import { BrowserWindow } from 'electron' -import { IWindowListItem, IWindowManager } from '#/types/electron' -import { IWindowList } from '#/types/enum' +import type { IWindowListItem, IWindowManager } from '#/types/electron' +import { IWindowList } from '~/utils/enum' class WindowManager implements IWindowManager { - #windowMap: Map = new Map() - #windowIdMap: Map = new Map() + #windowMap: Map< string, BrowserWindow> = new Map() + #windowIdMap: Map = new Map() - create (name: IWindowList) { + create (name: string) { const windowConfig: IWindowListItem = windowList.get(name)! if (!windowConfig.isValid) return null @@ -30,14 +30,14 @@ class WindowManager implements IWindowManager { return window } - get (name: IWindowList) { + get (name: string) { if (this.has(name)) { return this.#windowMap.get(name)! } return this.create(name) } - has (name: IWindowList) { + has (name: string) { return this.#windowMap.has(name) } diff --git a/src/main/apis/core/bus/apis.ts b/src/main/apis/core/bus/apis.ts index 7b59474d..8a308913 100644 --- a/src/main/apis/core/bus/apis.ts +++ b/src/main/apis/core/bus/apis.ts @@ -10,7 +10,7 @@ import { } from '@core/bus/constants' import bus from '@core/bus/index' -import { IFileWithPath } from '#/types/types' +import type { IFileWithPath } from '#/types/types' export const uploadWithClipboardFiles = (): Promise<{ success: boolean diff --git a/src/main/apis/core/datastore/dbChecker.ts b/src/main/apis/core/datastore/dbChecker.ts index 25ba211c..948e017b 100644 --- a/src/main/apis/core/datastore/dbChecker.ts +++ b/src/main/apis/core/datastore/dbChecker.ts @@ -6,8 +6,8 @@ import { app } from 'electron' import fs from 'fs-extra' import writeFile from 'write-file-atomic' -import { notificationList } from '#/utils/notification' import { T as $t } from '~/i18n' +import { notificationList } from '~/utils/notification' const STORE_PATH = app.getPath('userData') diff --git a/src/main/apis/core/datastore/index.ts b/src/main/apis/core/datastore/index.ts index 4efd72ba..d0b53dca 100644 --- a/src/main/apis/core/datastore/index.ts +++ b/src/main/apis/core/datastore/index.ts @@ -1,10 +1,10 @@ import { dbPathChecker, dbPathDir, getGalleryDBPath } from '@core/datastore/dbChecker' import { DBStore, JSONStore } from '@piclist/store' import fs from 'fs-extra' -import { IConfig } from 'piclist' +import type { IConfig } from 'piclist' -import { configPaths } from '#/utils/configPaths' import { T as $t } from '~/i18n' +import { configPaths } from '~/utils/configPaths' interface IJSON { [propsName: string]: string | number | IJSON } diff --git a/src/main/apis/core/picgo/index.ts b/src/main/apis/core/picgo/index.ts index 9956c9a8..b0a66278 100644 --- a/src/main/apis/core/picgo/index.ts +++ b/src/main/apis/core/picgo/index.ts @@ -4,7 +4,7 @@ import { debounce } from 'lodash-es' import { PicGo } from 'piclist' import pkg from 'root/package.json' -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' const CONFIG_PATH = dbPathChecker() diff --git a/src/main/apis/core/utils/localLogger.ts b/src/main/apis/core/utils/localLogger.ts index 8d745013..fbea8133 100644 --- a/src/main/apis/core/utils/localLogger.ts +++ b/src/main/apis/core/utils/localLogger.ts @@ -3,7 +3,7 @@ import util from 'node:util' import dayjs from 'dayjs' import fs from 'fs-extra' -import { ILogArgvTypeWithError } from '#/types/types' +import type { ILogArgvTypeWithError } from '#/types/types' const MB = 1024 * 1024 const DEFAULT_LOG_FILE_SIZE_LIMIT = 10 * MB diff --git a/src/main/apis/delete/aliyun.ts b/src/main/apis/delete/aliyun.ts index 258c1c0c..cc53223c 100644 --- a/src/main/apis/delete/aliyun.ts +++ b/src/main/apis/delete/aliyun.ts @@ -1,6 +1,6 @@ import OSS from 'ali-oss' -import { IAliYunConfig, PartialKeys } from '#/types/types' +import type { IAliYunConfig, PartialKeys } from '#/types/types' import { deleteFailedLog, deleteLog } from '~/utils/deleteLog' interface IConfigMap { diff --git a/src/main/apis/delete/allApi.ts b/src/main/apis/delete/allApi.ts index 0489e1ce..225bb257 100644 --- a/src/main/apis/delete/allApi.ts +++ b/src/main/apis/delete/allApi.ts @@ -1,4 +1,4 @@ -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' import AlistApi from '~/apis/delete/alist' import AlistplistApi from '~/apis/delete/alistplist' import AliyunApi from '~/apis/delete/aliyun' diff --git a/src/main/apis/delete/awss3.ts b/src/main/apis/delete/awss3.ts index 663c0624..d6b40bbb 100644 --- a/src/main/apis/delete/awss3.ts +++ b/src/main/apis/delete/awss3.ts @@ -1,5 +1,5 @@ -import { getRawData } from '@/utils/common' -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' +import { getRawData } from '~/utils/common' import { removeFileFromS3InMain } from '~/utils/deleteFunc' import { deleteFailedLog } from '~/utils/deleteLog' diff --git a/src/main/apis/delete/dogecloud.ts b/src/main/apis/delete/dogecloud.ts index 3aae3d8c..6b6032aa 100644 --- a/src/main/apis/delete/dogecloud.ts +++ b/src/main/apis/delete/dogecloud.ts @@ -1,5 +1,5 @@ -import { getRawData } from '@/utils/common' -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' +import { getRawData } from '~/utils/common' import { removeFileFromDogeInMain } from '~/utils/deleteFunc' import { deleteFailedLog } from '~/utils/deleteLog' diff --git a/src/main/apis/delete/github.ts b/src/main/apis/delete/github.ts index 918dbddc..341b6a73 100644 --- a/src/main/apis/delete/github.ts +++ b/src/main/apis/delete/github.ts @@ -1,6 +1,6 @@ import { Octokit } from '@octokit/rest' -import { IGitHubConfig, PartialKeys } from '#/types/types' +import type { IGitHubConfig, PartialKeys } from '#/types/types' import { deleteFailedLog, deleteLog } from '~/utils/deleteLog' interface IConfigMap { diff --git a/src/main/apis/delete/huaweiyun.ts b/src/main/apis/delete/huaweiyun.ts index efc50fb6..3bd8ef33 100644 --- a/src/main/apis/delete/huaweiyun.ts +++ b/src/main/apis/delete/huaweiyun.ts @@ -1,5 +1,5 @@ -import { getRawData } from '@/utils/common' -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' +import { getRawData } from '~/utils/common' import { removeFileFromHuaweiInMain } from '~/utils/deleteFunc' import { deleteFailedLog } from '~/utils/deleteLog' diff --git a/src/main/apis/delete/imgur.ts b/src/main/apis/delete/imgur.ts index 09330c86..06d0d8cf 100644 --- a/src/main/apis/delete/imgur.ts +++ b/src/main/apis/delete/imgur.ts @@ -1,6 +1,6 @@ import axios, { AxiosResponse } from 'axios' -import { IImgurConfig } from '#/types/types' +import type { IImgurConfig } from '#/types/types' import { deleteFailedLog, deleteLog } from '~/utils/deleteLog' interface IConfigMap { diff --git a/src/main/apis/delete/lskyplist.ts b/src/main/apis/delete/lskyplist.ts index e3a53db4..dfb073b3 100644 --- a/src/main/apis/delete/lskyplist.ts +++ b/src/main/apis/delete/lskyplist.ts @@ -2,7 +2,7 @@ import https from 'node:https' import axios, { AxiosResponse } from 'axios' -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' import { deleteFailedLog, deleteLog } from '~/utils/deleteLog' export default class LskyplistApi { diff --git a/src/main/apis/delete/piclist.ts b/src/main/apis/delete/piclist.ts index 60f5203b..4fd98f66 100644 --- a/src/main/apis/delete/piclist.ts +++ b/src/main/apis/delete/piclist.ts @@ -1,6 +1,6 @@ import axios, { AxiosResponse } from 'axios' -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' import { deleteFailedLog, deleteLog } from '~/utils/deleteLog' export default class PiclistApi { diff --git a/src/main/apis/delete/qiniu.ts b/src/main/apis/delete/qiniu.ts index 899dcdc0..412a43e6 100644 --- a/src/main/apis/delete/qiniu.ts +++ b/src/main/apis/delete/qiniu.ts @@ -1,6 +1,6 @@ import qiniu from 'qiniu' -import { IQiniuConfig, PartialKeys } from '#/types/types' +import type { IQiniuConfig, PartialKeys } from '#/types/types' import { deleteFailedLog, deleteLog } from '~/utils/deleteLog' interface IConfigMap { fileName: string diff --git a/src/main/apis/delete/sftpplist.ts b/src/main/apis/delete/sftpplist.ts index 0b00ce1f..888dd9f3 100644 --- a/src/main/apis/delete/sftpplist.ts +++ b/src/main/apis/delete/sftpplist.ts @@ -1,5 +1,5 @@ -import { getRawData } from '@/utils/common' -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' +import { getRawData } from '~/utils/common' import { removeFileFromSFTPInMain } from '~/utils/deleteFunc' import { deleteFailedLog } from '~/utils/deleteLog' diff --git a/src/main/apis/delete/smms.ts b/src/main/apis/delete/smms.ts index 7460a8ce..20431534 100644 --- a/src/main/apis/delete/smms.ts +++ b/src/main/apis/delete/smms.ts @@ -1,6 +1,6 @@ import axios, { AxiosResponse } from 'axios' -import { ISMMSConfig } from '#/types/types' +import type { ISMMSConfig } from '#/types/types' import { deleteFailedLog, deleteLog } from '~/utils/deleteLog' interface IConfigMap { diff --git a/src/main/apis/delete/tcyun.ts b/src/main/apis/delete/tcyun.ts index 919ab092..b8f898d2 100644 --- a/src/main/apis/delete/tcyun.ts +++ b/src/main/apis/delete/tcyun.ts @@ -1,6 +1,6 @@ import COS from 'cos-nodejs-sdk-v5' -import { ITcYunConfig, PartialKeys } from '#/types/types' +import type { ITcYunConfig, PartialKeys } from '#/types/types' import { deleteFailedLog, deleteLog } from '~/utils/deleteLog' interface IConfigMap { fileName: string diff --git a/src/main/apis/delete/upyun.ts b/src/main/apis/delete/upyun.ts index d7391df9..26f0cbab 100644 --- a/src/main/apis/delete/upyun.ts +++ b/src/main/apis/delete/upyun.ts @@ -1,6 +1,6 @@ import Upyun from 'upyun' -import { IUpYunConfig, PartialKeys } from '#/types/types' +import type { IUpYunConfig, PartialKeys } from '#/types/types' import { deleteFailedLog, deleteLog } from '~/utils/deleteLog' interface IConfigMap { diff --git a/src/main/apis/delete/webdav.ts b/src/main/apis/delete/webdav.ts index 6b6d62c3..fc1c3361 100644 --- a/src/main/apis/delete/webdav.ts +++ b/src/main/apis/delete/webdav.ts @@ -1,7 +1,7 @@ import { AuthType, createClient, WebDAVClientOptions } from 'webdav' -import { IWebdavPlistConfig, PartialKeys } from '#/types/types' -import { formatEndpoint } from '#/utils/common' +import type { IWebdavPlistConfig, PartialKeys } from '#/types/types' +import { formatEndpoint } from '~/utils/common' import { deleteFailedLog, deleteLog } from '~/utils/deleteLog' interface IConfigMap { diff --git a/src/main/apis/gui/index.ts b/src/main/apis/gui/index.ts index 211e0c8a..fb020fc3 100644 --- a/src/main/apis/gui/index.ts +++ b/src/main/apis/gui/index.ts @@ -8,12 +8,12 @@ import { BrowserWindow, dialog, ipcMain, IpcMainEvent, MessageBoxOptions, Notifi import fs from 'fs-extra' import { cloneDeep } from 'lodash-es' -import { SHOW_INPUT_BOX } from '#/events/constants' -import { IPasteStyle } from '#/types/enum' -import { IGuiApi, ImgInfo, IShowFileExplorerOption, IShowInputBoxOption, IShowMessageBoxOption, IShowMessageBoxResult, IShowNotificationOption, IUploadOption } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import type { IGuiApi, ImgInfo, IShowFileExplorerOption, IShowInputBoxOption, IShowMessageBoxOption, IShowMessageBoxResult, IShowNotificationOption, IUploadOption } from '#/types/types' +import { SHOW_INPUT_BOX } from '~/events/constant' import { T as $t } from '~/i18n' import { handleCopyUrl } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' +import { IPasteStyle } from '~/utils/enum' import pasteTemplate from '~/utils/pasteTemplate' // Cross-process support may be required in the future diff --git a/src/main/events/busEventList.ts b/src/main/events/busEventList.ts index d41f3a02..2f7d658d 100644 --- a/src/main/events/busEventList.ts +++ b/src/main/events/busEventList.ts @@ -14,8 +14,8 @@ import { createMenu } from 'apis/app/system' import { uploadChoosedFiles, uploadClipboardFiles } from 'apis/app/uploader/apis' import windowManager from 'apis/app/window/windowManager' -import { IWindowList } from '#/types/enum' -import { IFileWithPath } from '#/types/types' +import type { IFileWithPath } from '#/types/types' +import { IWindowList } from '~/utils/enum' function initEventCenter () { const eventList: any = { diff --git a/src/universal/events/constants.ts b/src/main/events/constant.ts similarity index 91% rename from src/universal/events/constants.ts rename to src/main/events/constant.ts index 3df1bc91..f58ba94f 100644 --- a/src/universal/events/constants.ts +++ b/src/main/events/constant.ts @@ -1,17 +1,15 @@ -export const SHOW_INPUT_BOX = 'SHOW_INPUT_BOX' -export const SHOW_INPUT_BOX_RESPONSE = 'SHOW_INPUT_BOX_RESPONSE' -export const TOGGLE_SHORTKEY_MODIFIED_MODE = 'TOGGLE_SHORTKEY_MODIFIED_MODE' -// picgo plugin -export const PICGO_CONFIG_PLUGIN = 'PICGO_CONFIG_PLUGIN' -export const PICGO_HANDLE_PLUGIN_ING = 'PICGO_HANDLE_PLUGIN_ING' -export const PICGO_HANDLE_PLUGIN_DONE = 'PICGO_HANDLE_PLUGIN_DONE' -export const PICGO_TOGGLE_PLUGIN = 'PICGO_TOGGLE_PLUGIN' -// picgo uploader -export const RENAME_FILE_NAME = 'RENAME_FILE_NAME' -export const GET_RENAME_FILE_NAME = 'GET_RENAME_FILE_NAME' -export const SHOW_MAIN_PAGE_QRCODE = 'SHOW_MAIN_PAGE_QRCODE' -// rpc -export const RPC_ACTIONS = 'RPC_ACTIONS' -export const RPC_ACTIONS_INVOKE = 'RPC_ACTIONS_INVOKE' -// i18n -export const SET_CURRENT_LANGUAGE = 'SET_CURRENT_LANGUAGE' +export const SHOW_INPUT_BOX = 'SHOW_INPUT_BOX' +export const SHOW_INPUT_BOX_RESPONSE = 'SHOW_INPUT_BOX_RESPONSE' +export const TOGGLE_SHORTKEY_MODIFIED_MODE = 'TOGGLE_SHORTKEY_MODIFIED_MODE' +// picgo plugin +export const PICGO_CONFIG_PLUGIN = 'PICGO_CONFIG_PLUGIN' +export const PICGO_HANDLE_PLUGIN_ING = 'PICGO_HANDLE_PLUGIN_ING' +export const PICGO_HANDLE_PLUGIN_DONE = 'PICGO_HANDLE_PLUGIN_DONE' +export const PICGO_TOGGLE_PLUGIN = 'PICGO_TOGGLE_PLUGIN' +// picgo uploader +export const RENAME_FILE_NAME = 'RENAME_FILE_NAME' +export const GET_RENAME_FILE_NAME = 'GET_RENAME_FILE_NAME' +export const SHOW_MAIN_PAGE_QRCODE = 'SHOW_MAIN_PAGE_QRCODE' +// rpc +export const RPC_ACTIONS = 'RPC_ACTIONS' +export const RPC_ACTIONS_INVOKE = 'RPC_ACTIONS_INVOKE' diff --git a/src/main/events/remotes/menu.ts b/src/main/events/remotes/menu.ts index 10cc254e..cc44b7e6 100644 --- a/src/main/events/remotes/menu.ts +++ b/src/main/events/remotes/menu.ts @@ -7,20 +7,20 @@ import { app, BrowserWindow, dialog, Menu, MenuItem, MenuItemConstructorOptions, import { PicGo as PicGoCore } from 'piclist' import pkg from 'root/package.json' +import type { IPicGoPlugin, IUploaderConfig } from '#/types/types' import { PICGO_CONFIG_PLUGIN, PICGO_HANDLE_PLUGIN_DONE, PICGO_HANDLE_PLUGIN_ING, PICGO_TOGGLE_PLUGIN, SHOW_MAIN_PAGE_QRCODE -} from '#/events/constants' -import { IWindowList } from '#/types/enum' -import { IPicGoPlugin, IUploaderConfig } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +} from '~/events/constant' import { handlePluginUninstall, handlePluginUpdate } from '~/events/rpc/routes/plugin/utils' import { T as $t } from '~/i18n' import clipboardPoll from '~/utils/clipboardPoll' import { setTrayToolTip } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' +import { IWindowList } from '~/utils/enum' import getPicBeds from '~/utils/getPicBeds' import { changeCurrentUploader, changeSecondUploader } from '~/utils/handleUploaderConfig' import { openMainWindow } from '~/utils/windowHelper' diff --git a/src/main/events/rpc/index.ts b/src/main/events/rpc/index.ts index 26b0d137..70976b97 100644 --- a/src/main/events/rpc/index.ts +++ b/src/main/events/rpc/index.ts @@ -1,9 +1,8 @@ import logger from '@core/picgo/logger' import { ipcMain, IpcMainEvent, IpcMainInvokeEvent } from 'electron' -import { RPC_ACTIONS, RPC_ACTIONS_INVOKE } from '#/events/constants' -import { IRPCActionType, IRPCType } from '#/types/enum' -import { IRPCRoutes, IRPCServer } from '#/types/rpc' +import type { IRPCRoutes, IRPCServer } from '#/types/rpc' +import { RPC_ACTIONS, RPC_ACTIONS_INVOKE } from '~/events/constant' import { galleryRouter } from '~/events/rpc/routes/gallery' import { manageRouter } from '~/events/rpc/routes/manage' import { picbedRouter } from '~/events/rpc/routes/picbed' @@ -13,12 +12,13 @@ import { systemRouter } from '~/events/rpc/routes/system' import { toolboxRouter } from '~/events/rpc/routes/toolbox' import { trayRouter } from '~/events/rpc/routes/tray' import { uploadRouter } from '~/events/rpc/routes/upload' +import { IRPCType } from '~/utils/enum' class RPCServer implements IRPCServer { private routes: IRPCRoutes = new Map() private routesWithResponse: IRPCRoutes = new Map() - private rpcEventHandler = async (event: IpcMainEvent, action: IRPCActionType, args: any[]) => { + private rpcEventHandler = async (event: IpcMainEvent, action: string, args: any[]) => { try { const route = this.routes.get(action) await route?.handler?.(event, args) @@ -27,7 +27,7 @@ class RPCServer implements IRPCServer { } } - private rpcEventHandlerWithResponse = async (event: IpcMainInvokeEvent, action: IRPCActionType, args: any[]) => { + private rpcEventHandlerWithResponse = async (event: IpcMainInvokeEvent, action: string, args: any[]) => { try { const route = this.routesWithResponse.get(action) return await route?.handler?.(event, args) diff --git a/src/main/events/rpc/router.ts b/src/main/events/rpc/router.ts index eff53432..526b21bf 100644 --- a/src/main/events/rpc/router.ts +++ b/src/main/events/rpc/router.ts @@ -1,15 +1,15 @@ -import { IRPCActionType, IRPCType } from '#/types/enum' -import { IRPCHandler, IRPCRouter, IRPCRoutes } from '#/types/rpc' +import type { IRPCHandler, IRPCRouter, IRPCRoutes } from '#/types/rpc' +import { IRPCType } from '~/utils/enum' interface IBatchAddParams { - action: IRPCActionType + action: string handler: IRPCHandler - type?: IRPCType + type?: string } export class RPCRouter implements IRPCRouter { private routeMap: IRPCRoutes = new Map() - add = (action: IRPCActionType, handler: IRPCHandler, type: IRPCType = IRPCType.SEND): this => { + add = (action: string, handler: IRPCHandler, type: string = IRPCType.SEND): this => { this.routeMap.set(action, { handler, type }) return this } diff --git a/src/main/events/rpc/routes/gallery/index.ts b/src/main/events/rpc/routes/gallery/index.ts index a836af68..34aee5cf 100644 --- a/src/main/events/rpc/routes/gallery/index.ts +++ b/src/main/events/rpc/routes/gallery/index.ts @@ -3,11 +3,11 @@ import picgo from '@core/picgo' import GuiApi from 'apis/gui' import { clipboard } from 'electron' -import { ICOREBuildInEvent, IPasteStyle, IRPCActionType, IRPCType } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { ImgInfo } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import type { IIPCEvent } from '#/types/rpc' +import type { ImgInfo } from '#/types/types' import { RPCRouter } from '~/events/rpc/router' +import { configPaths } from '~/utils/configPaths' +import { ICOREBuildInEvent, IPasteStyle, IRPCActionType, IRPCType } from '~/utils/enum' import pasteTemplate from '~/utils/pasteTemplate' interface IFilter { orderBy?: 'asc' | 'desc' @@ -26,7 +26,7 @@ const galleryRoutes = [ action: IRPCActionType.GALLERY_PASTE_TEXT, handler: async (_: IIPCEvent, args: [item: ImgInfo, copy?: boolean]) => { const [item, copy = true] = args - const pasteStyle = picgo.getConfig(configPaths.settings.pasteStyle) || IPasteStyle.MARKDOWN + const pasteStyle = picgo.getConfig(configPaths.settings.pasteStyle) || IPasteStyle.MARKDOWN const customLink = picgo.getConfig(configPaths.settings.customLink) const [txt, shortUrl] = await pasteTemplate(pasteStyle, item, customLink) if (copy) { diff --git a/src/main/events/rpc/routes/manage/bucket.ts b/src/main/events/rpc/routes/manage/bucket.ts index e97c2f19..59abe81b 100644 --- a/src/main/events/rpc/routes/manage/bucket.ts +++ b/src/main/events/rpc/routes/manage/bucket.ts @@ -1,7 +1,7 @@ -import { IRPCActionType, IRPCType } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { IStringKeyMap } from '#/types/types' +import type { IIPCEvent } from '#/types/rpc' +import type { IStringKeyMap } from '#/types/types' import { ManageApi } from '~/manage/manageApi' +import { IRPCActionType, IRPCType } from '~/utils/enum' export default [ { diff --git a/src/main/events/rpc/routes/manage/config.ts b/src/main/events/rpc/routes/manage/config.ts index e8b8862a..03e6a5e7 100644 --- a/src/main/events/rpc/routes/manage/config.ts +++ b/src/main/events/rpc/routes/manage/config.ts @@ -1,7 +1,7 @@ -import { IRPCActionType, IRPCType } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { IObj } from '#/types/types' +import type { IIPCEvent } from '#/types/rpc' +import type { IObj } from '#/types/types' import getManageApi from '~/manage/Main' +import { IRPCActionType, IRPCType } from '~/utils/enum' const manageApi = getManageApi() diff --git a/src/main/events/rpc/routes/manage/upDownload.ts b/src/main/events/rpc/routes/manage/upDownload.ts index 54ab4cfd..1a8f1226 100644 --- a/src/main/events/rpc/routes/manage/upDownload.ts +++ b/src/main/events/rpc/routes/manage/upDownload.ts @@ -3,10 +3,10 @@ import path from 'node:path' import { app, dialog, shell } from 'electron' import fs from 'fs-extra' -import { IRPCActionType, IRPCType } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' +import type { IIPCEvent } from '#/types/rpc' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { downloadFileFromUrl } from '~/manage/utils/common' +import { IRPCActionType, IRPCType } from '~/utils/enum' export default [ { diff --git a/src/main/events/rpc/routes/picbed/delete.ts b/src/main/events/rpc/routes/picbed/delete.ts index 497626c1..b87be701 100644 --- a/src/main/events/rpc/routes/picbed/delete.ts +++ b/src/main/events/rpc/routes/picbed/delete.ts @@ -1,8 +1,8 @@ import ALLApi from 'apis/delete/allApi' -import { IRPCActionType, IRPCType } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { ImgInfo } from '#/types/types' +import type { IIPCEvent } from '#/types/rpc' +import type { ImgInfo } from '#/types/types' +import { IRPCActionType, IRPCType } from '~/utils/enum' export default [ { diff --git a/src/main/events/rpc/routes/picbed/index.ts b/src/main/events/rpc/routes/picbed/index.ts index 07be42d8..014932ee 100644 --- a/src/main/events/rpc/routes/picbed/index.ts +++ b/src/main/events/rpc/routes/picbed/index.ts @@ -1,10 +1,10 @@ import picgo from '@core/picgo' -import { IRPCActionType, IRPCType } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { IStringKeyMap } from '#/types/types' +import type { IIPCEvent } from '#/types/rpc' +import type { IStringKeyMap } from '#/types/types' import { RPCRouter } from '~/events/rpc/router' import deleteRoutes from '~/events/rpc/routes/picbed/delete' +import { IRPCActionType, IRPCType } from '~/utils/enum' import { deleteUploaderConfig, getUploaderConfigList, diff --git a/src/main/events/rpc/routes/plugin/index.ts b/src/main/events/rpc/routes/plugin/index.ts index 17b93f35..48cc9efa 100644 --- a/src/main/events/rpc/routes/plugin/index.ts +++ b/src/main/events/rpc/routes/plugin/index.ts @@ -1,4 +1,3 @@ -import { IRPCActionType } from '#/types/enum' import { RPCRouter } from '~/events/rpc/router' import { pluginGetListFunc, @@ -6,6 +5,7 @@ import { pluginInstallFunc, pluginUpdateAllFunc } from '~/events/rpc/routes/plugin/utils' +import { IRPCActionType } from '~/utils/enum' const pluginRouter = new RPCRouter() diff --git a/src/main/events/rpc/routes/plugin/utils.ts b/src/main/events/rpc/routes/plugin/utils.ts index 14fda2fd..267f4c45 100644 --- a/src/main/events/rpc/routes/plugin/utils.ts +++ b/src/main/events/rpc/routes/plugin/utils.ts @@ -8,17 +8,16 @@ import { dialog, shell } from 'electron' import fs from 'fs-extra' import { IGuiMenuItem, PicGo as PicGoCore } from 'piclist' -import { ICOREBuildInEvent, IPicGoHelperType, IWindowList } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { IDispose, IPicGoPlugin } from '#/types/types' -import { handleStreamlinePluginName, simpleClone } from '#/utils/common' +import type { IIPCEvent } from '#/types/rpc' +import type { IDispose, IPicGoPlugin } from '#/types/types' import { T as $t } from '~/i18n' -import { showNotification } from '~/utils/common' +import { handleStreamlinePluginName, showNotification, simpleClone } from '~/utils/common' +import { ICOREBuildInEvent, IPicGoHelperType, IWindowList } from '~/utils/enum' const STORE_PATH = dbPathDir() // get uploader or transformer config -const getConfig = (name: string, type: IPicGoHelperType, ctx: PicGoCore) => { +const getConfig = (name: string, type: keyof typeof IPicGoHelperType, ctx: PicGoCore) => { let config: any[] = [] if (name === '') { return config @@ -86,11 +85,11 @@ const getPluginList = async (): Promise => { }, uploader: { name: uploaderName, - config: handleConfigWithFunction(getConfig(uploaderName, IPicGoHelperType.uploader, picgo)) + config: handleConfigWithFunction(getConfig(uploaderName, IPicGoHelperType.uploader as keyof typeof IPicGoHelperType, picgo)) }, transformer: { name: transformerName, - config: handleConfigWithFunction(getConfig(uploaderName, IPicGoHelperType.transformer, picgo)) + config: handleConfigWithFunction(getConfig(uploaderName, IPicGoHelperType.transformer as keyof typeof IPicGoHelperType, picgo)) } }, enabled: picgo.getConfig(`picgoPlugins.${pluginList[i]}`), diff --git a/src/main/events/rpc/routes/setting/advanced.ts b/src/main/events/rpc/routes/setting/advanced.ts index 75619c7e..fe6a69dc 100644 --- a/src/main/events/rpc/routes/setting/advanced.ts +++ b/src/main/events/rpc/routes/setting/advanced.ts @@ -1,6 +1,6 @@ -import { IRPCActionType } from '#/types/enum' import server from '~/server' import webServer from '~/server/webServer' +import { IRPCActionType } from '~/utils/enum' export default [ { diff --git a/src/main/events/rpc/routes/setting/configure.ts b/src/main/events/rpc/routes/setting/configure.ts index 278f80f1..012b221c 100644 --- a/src/main/events/rpc/routes/setting/configure.ts +++ b/src/main/events/rpc/routes/setting/configure.ts @@ -4,7 +4,7 @@ import logger from '@core/picgo/logger' import { app } from 'electron' import fs from 'fs-extra' -import { IRPCActionType, IRPCType } from '#/types/enum' +import { IRPCActionType, IRPCType } from '~/utils/enum' import { downloadFile, uploadFile } from '~/utils/syncSettings' const STORE_PATH = app.getPath('userData') diff --git a/src/main/events/rpc/routes/setting/mainApp.ts b/src/main/events/rpc/routes/setting/mainApp.ts index ece50fa9..27062406 100644 --- a/src/main/events/rpc/routes/setting/mainApp.ts +++ b/src/main/events/rpc/routes/setting/mainApp.ts @@ -5,9 +5,9 @@ import picgo from '@core/picgo' import { app, IpcMainEvent, shell } from 'electron' import fs from 'fs-extra' -import { IRPCActionType, IRPCType } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { IObj } from '#/types/types' +import type { IIPCEvent } from '#/types/rpc' +import type { IObj } from '#/types/types' +import { IRPCActionType, IRPCType } from '~/utils/enum' const STORE_PATH = dbPathDir() diff --git a/src/main/events/rpc/routes/setting/shortKey.ts b/src/main/events/rpc/routes/setting/shortKey.ts index 58e399cf..fbab28a0 100644 --- a/src/main/events/rpc/routes/setting/shortKey.ts +++ b/src/main/events/rpc/routes/setting/shortKey.ts @@ -2,11 +2,11 @@ import bus from '@core/bus' import shortKeyHandler from 'apis/app/shortKey/shortKeyHandler' import { Notification } from 'electron' -import { TOGGLE_SHORTKEY_MODIFIED_MODE } from '#/events/constants' -import { IRPCActionType, IRPCType } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { IShortKeyConfig } from '#/types/types' +import type { IIPCEvent } from '#/types/rpc' +import type { IShortKeyConfig } from '#/types/types' +import { TOGGLE_SHORTKEY_MODIFIED_MODE } from '~/events/constant' import { T as $t } from '~/i18n' +import { IRPCActionType, IRPCType } from '~/utils/enum' const notificationFunc = (result: boolean) => { const notification = new Notification({ diff --git a/src/main/events/rpc/routes/system/app.ts b/src/main/events/rpc/routes/system/app.ts index 6fc6c7b4..61ecf38d 100644 --- a/src/main/events/rpc/routes/system/app.ts +++ b/src/main/events/rpc/routes/system/app.ts @@ -1,9 +1,9 @@ import picgo from '@core/picgo' import { app, shell } from 'electron' -import { IRPCActionType } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' +import type { IIPCEvent } from '#/types/rpc' import { i18nManager } from '~/i18n' +import { IRPCActionType } from '~/utils/enum' export default [ { diff --git a/src/main/events/rpc/routes/system/window.ts b/src/main/events/rpc/routes/system/window.ts index 81544e86..a4909393 100644 --- a/src/main/events/rpc/routes/system/window.ts +++ b/src/main/events/rpc/routes/system/window.ts @@ -1,9 +1,8 @@ import windowManager from 'apis/app/window/windowManager' import { app, BrowserWindow } from 'electron' -import { IRPCActionType, IWindowList } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { IMiniWindowPos, IPicGoPlugin } from '#/types/types' +import type { IIPCEvent } from '#/types/rpc' +import type { IMiniWindowPos, IPicGoPlugin } from '#/types/types' import { buildMainPageMenu, buildMiniPageMenu, @@ -11,6 +10,7 @@ import { buildPluginPageMenu, buildSecondPicBedMenu } from '~/events/remotes/menu' +import { IRPCActionType, IWindowList } from '~/utils/enum' import { openMiniWindow } from '~/utils/windowHelper' export default [ @@ -22,7 +22,7 @@ export default [ }, { action: IRPCActionType.OPEN_WINDOW, - handler: async (_: IIPCEvent, args: [windowName: IWindowList]) => { + handler: async (_: IIPCEvent, args: [windowName: string]) => { const window = windowManager.get(args[0]) if (window) { window.show() diff --git a/src/main/events/rpc/routes/toolbox/checkClipboardUpload.ts b/src/main/events/rpc/routes/toolbox/checkClipboardUpload.ts index ea7891bf..07a8d65f 100644 --- a/src/main/events/rpc/routes/toolbox/checkClipboardUpload.ts +++ b/src/main/events/rpc/routes/toolbox/checkClipboardUpload.ts @@ -3,17 +3,17 @@ import path from 'node:path' import { dbPathChecker, defaultConfigPath } from '@core/datastore/dbChecker' import fs from 'fs-extra' -import { IToolboxItemCheckStatus, IToolboxItemType } from '#/types/enum' -import { IToolboxCheckerMap, IToolboxFixMap } from '#/types/rpc' -import { CLIPBOARD_IMAGE_FOLDER } from '#/utils/static' +import type { IToolboxCheckerMap, IToolboxFixMap } from '#/types/rpc' import { sendToolboxResWithType } from '~/events/rpc/routes/toolbox/utils' import { T as $t } from '~/i18n' +import { IToolboxItemCheckStatus, IToolboxItemType } from '~/utils/enum' +import { CLIPBOARD_IMAGE_FOLDER } from '~/utils/static' const sendToolboxRes = sendToolboxResWithType(IToolboxItemType.HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD) const defaultClipboardImagePath = path.join(defaultConfigPath, CLIPBOARD_IMAGE_FOLDER) -export const checkClipboardUploadMap: IToolboxCheckerMap = { +export const checkClipboardUploadMap: IToolboxCheckerMap = { [IToolboxItemType.HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD]: async event => { sendToolboxRes(event, { status: IToolboxItemCheckStatus.LOADING @@ -51,7 +51,7 @@ export const checkClipboardUploadMap: IToolboxCheckerMap = { +export const fixClipboardUploadMap: IToolboxFixMap = { [IToolboxItemType.HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD]: async () => { const configFilePath = dbPathChecker() const dirPath = path.dirname(configFilePath) diff --git a/src/main/events/rpc/routes/toolbox/checkFile.ts b/src/main/events/rpc/routes/toolbox/checkFile.ts index dde8ea80..ac2aaa60 100644 --- a/src/main/events/rpc/routes/toolbox/checkFile.ts +++ b/src/main/events/rpc/routes/toolbox/checkFile.ts @@ -5,13 +5,13 @@ import { dbPathChecker } from '@core/datastore/dbChecker' import type { IpcMainEvent } from 'electron' import fs from 'fs-extra' -import { IToolboxItemCheckStatus, IToolboxItemType } from '#/types/enum' import type { IToolboxCheckerMap, IToolboxFixMap } from '#/types/rpc' import { sendToolboxResWithType } from '~/events/rpc/routes/toolbox/utils' import { T as $t } from '~/i18n' +import { IToolboxItemCheckStatus, IToolboxItemType } from '~/utils/enum' export const checkFileMap: IToolboxCheckerMap< - IToolboxItemType.IS_CONFIG_FILE_BROKEN | IToolboxItemType.IS_GALLERY_FILE_BROKEN + string > = { [IToolboxItemType.IS_CONFIG_FILE_BROKEN]: async (event: IpcMainEvent) => { const sendToolboxRes = sendToolboxResWithType(IToolboxItemType.IS_CONFIG_FILE_BROKEN) @@ -63,7 +63,7 @@ export const checkFileMap: IToolboxCheckerMap< } export const fixFileMap: IToolboxFixMap< - IToolboxItemType.IS_CONFIG_FILE_BROKEN | IToolboxItemType.IS_GALLERY_FILE_BROKEN + string > = { [IToolboxItemType.IS_CONFIG_FILE_BROKEN]: async () => { try { diff --git a/src/main/events/rpc/routes/toolbox/checkProxy.ts b/src/main/events/rpc/routes/toolbox/checkProxy.ts index 8996e981..055d6c50 100644 --- a/src/main/events/rpc/routes/toolbox/checkProxy.ts +++ b/src/main/events/rpc/routes/toolbox/checkProxy.ts @@ -4,10 +4,10 @@ import fs from 'fs-extra' import { IConfig } from 'piclist' import tunnel from 'tunnel' -import { IToolboxItemCheckStatus, IToolboxItemType } from '#/types/enum' -import { IToolboxCheckerMap } from '#/types/rpc' +import type { IToolboxCheckerMap } from '#/types/rpc' import { sendToolboxResWithType } from '~/events/rpc/routes/toolbox/utils' import { T as $t } from '~/i18n' +import { IToolboxItemCheckStatus, IToolboxItemType } from '~/utils/enum' function getProxy (proxyStr: string): AxiosRequestConfig['proxy'] | null { if (proxyStr) { @@ -25,7 +25,7 @@ function getProxy (proxyStr: string): AxiosRequestConfig['proxy'] | null { const sendToolboxRes = sendToolboxResWithType(IToolboxItemType.HAS_PROBLEM_WITH_PROXY) -export const checkProxyMap: IToolboxCheckerMap = { +export const checkProxyMap: IToolboxCheckerMap = { [IToolboxItemType.HAS_PROBLEM_WITH_PROXY]: async event => { sendToolboxRes(event, { status: IToolboxItemCheckStatus.LOADING diff --git a/src/main/events/rpc/routes/toolbox/index.ts b/src/main/events/rpc/routes/toolbox/index.ts index 39d2a3ef..288c4d31 100644 --- a/src/main/events/rpc/routes/toolbox/index.ts +++ b/src/main/events/rpc/routes/toolbox/index.ts @@ -1,21 +1,21 @@ import { IpcMainEvent } from 'electron' -import { IRPCActionType, IRPCType, IToolboxItemType } from '#/types/enum' -import { IToolboxCheckArgs, IToolboxCheckerMap, IToolboxFixMap } from '#/types/rpc' +import type { IToolboxCheckArgs, IToolboxCheckerMap, IToolboxFixMap } from '#/types/rpc' import { RPCRouter } from '~/events/rpc/router' import { checkClipboardUploadMap, fixClipboardUploadMap } from '~/events/rpc/routes/toolbox/checkClipboardUpload' import { checkFileMap, fixFileMap } from '~/events/rpc/routes/toolbox/checkFile' import { checkProxyMap } from '~/events/rpc/routes/toolbox/checkProxy' +import { IRPCActionType, IRPCType } from '~/utils/enum' const toolboxRouter = new RPCRouter() -const toolboxCheckMap: Partial> = { +const toolboxCheckMap: Partial> = { ...checkFileMap, ...checkClipboardUploadMap, ...checkProxyMap } -const toolboxFixMap: Partial> = { +const toolboxFixMap: Partial> = { ...fixFileMap, ...fixClipboardUploadMap } @@ -33,7 +33,7 @@ toolboxRouter } else { // do check all for (const key in toolboxCheckMap) { - const handler = toolboxCheckMap[key as IToolboxItemType] + const handler = toolboxCheckMap[key] if (handler) { handler(event as IpcMainEvent) } diff --git a/src/main/events/rpc/routes/toolbox/utils.ts b/src/main/events/rpc/routes/toolbox/utils.ts index f56a7ac5..52c79e57 100644 --- a/src/main/events/rpc/routes/toolbox/utils.ts +++ b/src/main/events/rpc/routes/toolbox/utils.ts @@ -1,9 +1,9 @@ import { IpcMainEvent } from 'electron' -import { IRPCActionType, IToolboxItemType } from '#/types/enum' -import { IToolboxCheckRes } from '#/types/rpc' +import type { IToolboxCheckRes } from '#/types/rpc' +import { IRPCActionType } from '~/utils/enum' -export function sendToolboxResWithType (type: IToolboxItemType) { +export function sendToolboxResWithType (type: string) { return (event: IpcMainEvent, res?: Omit) => { return event.sender.send(IRPCActionType.TOOLBOX_CHECK_RES, { ...res, diff --git a/src/main/events/rpc/routes/tray/index.ts b/src/main/events/rpc/routes/tray/index.ts index 9036c4cd..3927b5dd 100644 --- a/src/main/events/rpc/routes/tray/index.ts +++ b/src/main/events/rpc/routes/tray/index.ts @@ -3,12 +3,12 @@ import uploader from 'apis/app/uploader' import windowManager from 'apis/app/window/windowManager' import { Notification } from 'electron' -import { IPasteStyle, IRPCActionType, IRPCType, IWindowList } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { configPaths } from '#/utils/configPaths' +import type { IIPCEvent } from '#/types/rpc' import { RPCRouter } from '~/events/rpc/router' import { T as $t } from '~/i18n' import { generateShortUrl, handleCopyUrl, setTrayToolTip } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' +import { IPasteStyle, IRPCActionType, IRPCType, IWindowList } from '~/utils/enum' import pasteTemplate from '~/utils/pasteTemplate' const trayRouter = new RPCRouter() diff --git a/src/main/events/rpc/routes/upload/index.ts b/src/main/events/rpc/routes/upload/index.ts index 9e87ba6b..8fcfd0d3 100644 --- a/src/main/events/rpc/routes/upload/index.ts +++ b/src/main/events/rpc/routes/upload/index.ts @@ -1,9 +1,9 @@ import { uploadChoosedFiles, uploadClipboardFiles } from 'apis/app/uploader/apis' -import { IRPCActionType, IRPCType } from '#/types/enum' -import { IIPCEvent } from '#/types/rpc' -import { IFileWithPath } from '#/types/types' +import type { IIPCEvent } from '#/types/rpc' +import type { IFileWithPath } from '#/types/types' import { RPCRouter } from '~/events/rpc/router' +import { IRPCActionType, IRPCType } from '~/utils/enum' import getPicBeds from '~/utils/getPicBeds' const uploadRouter = new RPCRouter() diff --git a/src/main/i18n/index.ts b/src/main/i18n/index.ts index 68c4a833..aeee2c11 100644 --- a/src/main/i18n/index.ts +++ b/src/main/i18n/index.ts @@ -4,10 +4,23 @@ import { I18n, ObjectAdapter } from '@piclist/i18n' import fs from 'fs-extra' import yaml from 'js-yaml' -import { builtinI18nList } from '#/i18n' -import { ILocales, ILocalesKey } from '#/types/i18n' -import { II18nItem, IStringKeyMap } from '#/types/types' +import type { ILocales, ILocalesKey } from '#/types/i18n' +import type { II18nItem, IStringKeyMap } from '#/types/types' +const builtinI18nList: II18nItem[] = [ + { + label: '简体中文', + value: 'zh-CN' + }, + { + label: '繁體中文', + value: 'zh-TW' + }, + { + label: 'English', + value: 'en' + } +] class I18nManager { private i18n: I18n | null = null private builtinI18nFolder = path.join('./resources', 'i18n') diff --git a/src/main/lifeCycle/index.ts b/src/main/lifeCycle/index.ts index b177ecfe..a05b9121 100644 --- a/src/main/lifeCycle/index.ts +++ b/src/main/lifeCycle/index.ts @@ -16,10 +16,6 @@ import { app, dialog, globalShortcut, Notification, protocol, screen, shell } fr import updater from 'electron-updater' import fs from 'fs-extra' -import { II18nLanguage, IRemoteNoticeTriggerHook, ISartMode, IWindowList } from '#/types/enum' -import { configPaths } from '#/utils/configPaths' -import { notificationList } from '#/utils/notification' -import { CLIPBOARD_IMAGE_FOLDER } from '#/utils/static' import busEventList from '~/events/busEventList' import { rpcServer } from '~/events/rpc' import { startFileServer, stopFileServer } from '~/fileServer' @@ -32,8 +28,12 @@ import server from '~/server/index' import webServer from '~/server/webServer' import beforeOpen from '~/utils/beforeOpen' import clipboardPoll from '~/utils/clipboardPoll' +import { configPaths } from '~/utils/configPaths' +import { II18nLanguage, IRemoteNoticeTriggerHook, ISartMode, IWindowList } from '~/utils/enum' import { getUploadFiles } from '~/utils/handleArgv' import { initI18n } from '~/utils/handleI18n' +import { notificationList } from '~/utils/notification' +import { CLIPBOARD_IMAGE_FOLDER } from '~/utils/static' import updateChecker from '~/utils/updateChecker' const isDevelopment = process.env.NODE_ENV !== 'production' @@ -169,6 +169,8 @@ class LifeCycle { const readyFunction = async () => { windowManager.create(IWindowList.TRAY_WINDOW) windowManager.create(IWindowList.SETTING_WINDOW) + const setwin = windowManager.get(IWindowList.SETTING_WINDOW) + setwin?.webContents?.openDevTools({ mode: 'detach' }) const isAutoListenClipboard = db.get(configPaths.settings.isAutoListenClipboard) || false const ClipboardWatcher = clipboardPoll if (isAutoListenClipboard) { diff --git a/src/main/manage/apis/aliyun.ts b/src/main/manage/apis/aliyun.ts index d3c1d4d8..81613306 100644 --- a/src/main/manage/apis/aliyun.ts +++ b/src/main/manage/apis/aliyun.ts @@ -6,9 +6,7 @@ import axios from 'axios' import { ipcMain, IpcMainEvent } from 'electron' import * as fastxml from 'fast-xml-parser' -import { commonTaskStatus, IWindowList, uploadTaskSpecialStatus } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { ConcurrencyPromisePool, @@ -19,6 +17,8 @@ import { } from '~/manage/utils/common' import { ManageLogger } from '~/manage/utils/logger' import { isImage } from '~/utils/common' +import { commonTaskStatus, IWindowList, uploadTaskSpecialStatus } from '~/utils/enum' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '~/utils/static' // 坑爹阿里云 返回数据类型标注和实际各种不一致 class AliyunApi { diff --git a/src/main/manage/apis/github.ts b/src/main/manage/apis/github.ts index 055a9762..6831d55e 100644 --- a/src/main/manage/apis/github.ts +++ b/src/main/manage/apis/github.ts @@ -5,10 +5,7 @@ import { ipcMain, IpcMainEvent } from 'electron' import fs from 'fs-extra' import got from 'got' -import { commonTaskStatus, IWindowList } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' -import { formatHttpProxy, trimPath } from '#/utils/common' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { ConcurrencyPromisePool, @@ -19,7 +16,9 @@ import { NewDownloader } from '~/manage/utils/common' import { ManageLogger } from '~/manage/utils/logger' -import { isImage } from '~/utils/common' +import { formatHttpProxy, isImage, trimPath } from '~/utils/common' +import { commonTaskStatus, IWindowList } from '~/utils/enum' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '~/utils/static' class GithubApi { token: string diff --git a/src/main/manage/apis/imgur.ts b/src/main/manage/apis/imgur.ts index 334971a5..de00fb9c 100644 --- a/src/main/manage/apis/imgur.ts +++ b/src/main/manage/apis/imgur.ts @@ -6,9 +6,7 @@ import FormData from 'form-data' import fs from 'fs-extra' import got from 'got' -import { commonTaskStatus, IWindowList } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' -import { formatHttpProxy } from '#/utils/common' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { ConcurrencyPromisePool, @@ -20,7 +18,8 @@ import { NewDownloader } from '~/manage/utils/common' import ManageLogger from '~/manage/utils/logger' -import { isImage } from '~/utils/common' +import { formatHttpProxy, isImage } from '~/utils/common' +import { commonTaskStatus, IWindowList } from '~/utils/enum' class ImgurApi { userName: string diff --git a/src/main/manage/apis/local.ts b/src/main/manage/apis/local.ts index 0ea443b4..dfc94f0b 100644 --- a/src/main/manage/apis/local.ts +++ b/src/main/manage/apis/local.ts @@ -5,13 +5,13 @@ import windowManager from 'apis/app/window/windowManager' import { ipcMain, IpcMainEvent } from 'electron' import fs from 'fs-extra' -import { commonTaskStatus, downloadTaskSpecialStatus, IWindowList, uploadTaskSpecialStatus } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { formatError } from '~/manage/utils/common' import ManageLogger from '~/manage/utils/logger' import { isImage } from '~/utils/common' +import { commonTaskStatus, downloadTaskSpecialStatus, IWindowList, uploadTaskSpecialStatus } from '~/utils/enum' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '~/utils/static' class LocalApi { logger: ManageLogger diff --git a/src/main/manage/apis/qiniu.ts b/src/main/manage/apis/qiniu.ts index 970e7c6b..9b7c67db 100644 --- a/src/main/manage/apis/qiniu.ts +++ b/src/main/manage/apis/qiniu.ts @@ -5,9 +5,7 @@ import axios from 'axios' import { ipcMain, IpcMainEvent } from 'electron' import qiniu from 'qiniu' -import { commonTaskStatus, IWindowList, uploadTaskSpecialStatus } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { ConcurrencyPromisePool, @@ -18,6 +16,8 @@ import { } from '~/manage/utils/common' import { ManageLogger } from '~/manage/utils/logger' import { isImage } from '~/utils/common' +import { commonTaskStatus, IWindowList, uploadTaskSpecialStatus } from '~/utils/enum' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '~/utils/static' class QiniuApi { mac: qiniu.auth.digest.Mac diff --git a/src/main/manage/apis/s3plist.ts b/src/main/manage/apis/s3plist.ts index 3deace63..29f89082 100644 --- a/src/main/manage/apis/s3plist.ts +++ b/src/main/manage/apis/s3plist.ts @@ -27,15 +27,14 @@ import windowManager from 'apis/app/window/windowManager' import { ipcMain, IpcMainEvent } from 'electron' import fs from 'fs-extra' -import { commonTaskStatus, IWindowList, uploadTaskSpecialStatus } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' -import { formatEndpoint, formatHttpProxy } from '#/utils/common' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { ConcurrencyPromisePool, formatError, getAgent, getFileMimeType, NewDownloader } from '~/manage/utils/common' import { dogecloudApi, DogecloudToken, getTempToken } from '~/manage/utils/dogeAPI' import { ManageLogger } from '~/manage/utils/logger' -import { isImage } from '~/utils/common' +import { formatEndpoint, formatHttpProxy, isImage } from '~/utils/common' +import { commonTaskStatus, IWindowList, uploadTaskSpecialStatus } from '~/utils/enum' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '~/utils/static' class S3plistApi { baseOptions: S3ClientConfig diff --git a/src/main/manage/apis/sftp.ts b/src/main/manage/apis/sftp.ts index e01bd3a4..bc35e431 100644 --- a/src/main/manage/apis/sftp.ts +++ b/src/main/manage/apis/sftp.ts @@ -3,15 +3,15 @@ import path from 'node:path' import windowManager from 'apis/app/window/windowManager' import { ipcMain, IpcMainEvent } from 'electron' -import { commonTaskStatus, downloadTaskSpecialStatus, IWindowList, uploadTaskSpecialStatus } from '#/types/enum' -import { Undefinable } from '#/types/manage' -import { IStringKeyMap } from '#/types/types' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import type { Undefinable } from '#/types/manage' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { formatError } from '~/manage/utils/common' import ManageLogger from '~/manage/utils/logger' import { isImage } from '~/utils/common' +import { commonTaskStatus, downloadTaskSpecialStatus, IWindowList, uploadTaskSpecialStatus } from '~/utils/enum' import SSHClient from '~/utils/sshClient' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '~/utils/static' interface listDirResult { permissions: string diff --git a/src/main/manage/apis/smms.ts b/src/main/manage/apis/smms.ts index a696a1b0..9a069ab8 100644 --- a/src/main/manage/apis/smms.ts +++ b/src/main/manage/apis/smms.ts @@ -7,12 +7,12 @@ import { ipcMain, IpcMainEvent } from 'electron' import FormData from 'form-data' import fs from 'fs-extra' -import { commonTaskStatus, IWindowList } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { ConcurrencyPromisePool, formatError, getFileMimeType, gotUpload, NewDownloader } from '~/manage/utils/common' import { ManageLogger } from '~/manage/utils/logger' import { isImage } from '~/utils/common' +import { commonTaskStatus, IWindowList } from '~/utils/enum' class SmmsApi { baseUrl = 'https://smms.app/api/v2' diff --git a/src/main/manage/apis/tcyun.ts b/src/main/manage/apis/tcyun.ts index a4215cfa..bdee2474 100644 --- a/src/main/manage/apis/tcyun.ts +++ b/src/main/manage/apis/tcyun.ts @@ -5,14 +5,13 @@ import COS from 'cos-nodejs-sdk-v5' import { ipcMain, IpcMainEvent } from 'electron' import fs from 'fs-extra' -import { commonTaskStatus, downloadTaskSpecialStatus, IWindowList, uploadTaskSpecialStatus } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' -import { handleUrlEncode } from '#/utils/common' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { formatError, getFileMimeType } from '~/manage/utils/common' import { ManageLogger } from '~/manage/utils/logger' -import { isImage } from '~/utils/common' +import { handleUrlEncode, isImage } from '~/utils/common' +import { commonTaskStatus, downloadTaskSpecialStatus, IWindowList, uploadTaskSpecialStatus } from '~/utils/enum' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '~/utils/static' class TcyunApi { ctx: COS diff --git a/src/main/manage/apis/upyun.ts b/src/main/manage/apis/upyun.ts index 04486652..eac881c6 100644 --- a/src/main/manage/apis/upyun.ts +++ b/src/main/manage/apis/upyun.ts @@ -7,9 +7,7 @@ import FormData from 'form-data' import fs from 'fs-extra' import Upyun from 'upyun' -import { commonTaskStatus, IWindowList } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { ConcurrencyPromisePool, @@ -22,6 +20,8 @@ import { } from '~/manage/utils/common' import { ManageLogger } from '~/manage/utils/logger' import { isImage } from '~/utils/common' +import { commonTaskStatus, IWindowList } from '~/utils/enum' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '~/utils/static' class UpyunApi { ser: Upyun.Service diff --git a/src/main/manage/apis/webdavplist.ts b/src/main/manage/apis/webdavplist.ts index 78abbc86..19cf3eaf 100644 --- a/src/main/manage/apis/webdavplist.ts +++ b/src/main/manage/apis/webdavplist.ts @@ -7,15 +7,14 @@ import { ipcMain, IpcMainEvent } from 'electron' import fs from 'fs-extra' import { AuthType, createClient, FileStat, ProgressEvent, WebDAVClient, WebDAVClientOptions } from 'webdav' -import { commonTaskStatus, IWindowList, uploadTaskSpecialStatus } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' -import { formatEndpoint, formatHttpProxy } from '#/utils/common' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import type { IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { ConcurrencyPromisePool, formatError, getInnerAgent, NewDownloader } from '~/manage/utils/common' import ManageLogger from '~/manage/utils/logger' -import { isImage } from '~/utils/common' +import { formatEndpoint, formatHttpProxy, isImage } from '~/utils/common' import { getAuthHeader } from '~/utils/digestAuth' +import { commonTaskStatus, IWindowList, uploadTaskSpecialStatus } from '~/utils/enum' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '~/utils/static' class WebdavplistApi { endpoint: string diff --git a/src/main/manage/datastore/db.ts b/src/main/manage/datastore/db.ts index 3f94d0e3..51b0f302 100644 --- a/src/main/manage/datastore/db.ts +++ b/src/main/manage/datastore/db.ts @@ -1,7 +1,7 @@ import { JSONStore } from '@piclist/store' -import { IManageApiType, IManageConfigType } from '#/types/manage' -import { IStringKeyMap } from '#/types/types' +import type { IManageApiType, IManageConfigType } from '#/types/manage' +import type { IStringKeyMap } from '#/types/types' interface IJSON { [propsName: string]: string | number | IJSON } diff --git a/src/main/manage/datastore/dbChecker.ts b/src/main/manage/datastore/dbChecker.ts index 2c69dca4..2c6d75c1 100644 --- a/src/main/manage/datastore/dbChecker.ts +++ b/src/main/manage/datastore/dbChecker.ts @@ -6,7 +6,7 @@ import { app } from 'electron' import fs from 'fs-extra' import writeFile from 'write-file-atomic' -import { notificationList } from '#/utils/notification' +import { notificationList } from '~/utils/notification' import { T as $t } from '~/i18n' const STORE_PATH = app.getPath('userData') diff --git a/src/main/manage/datastore/upDownTaskQueue.ts b/src/main/manage/datastore/upDownTaskQueue.ts index 872446ab..4c197a15 100644 --- a/src/main/manage/datastore/upDownTaskQueue.ts +++ b/src/main/manage/datastore/upDownTaskQueue.ts @@ -6,8 +6,8 @@ import path from 'node:path' import { app } from 'electron' import fs from 'fs-extra' -import { commonTaskStatus, downloadTaskSpecialStatus, uploadTaskSpecialStatus } from '#/types/enum' -import { IDownloadTask, IUploadTask } from '#/types/manage' +import type { IDownloadTask, IUploadTask } from '#/types/manage' +import { commonTaskStatus, downloadTaskSpecialStatus, uploadTaskSpecialStatus } from '~/utils/enum' class UpDownTaskQueue { private static instance: UpDownTaskQueue diff --git a/src/main/manage/manageApi.ts b/src/main/manage/manageApi.ts index 67e5a387..5f98f313 100644 --- a/src/main/manage/manageApi.ts +++ b/src/main/manage/manageApi.ts @@ -7,15 +7,15 @@ import { ipcMain } from 'electron' import fs from 'fs-extra' import { get, set, unset } from 'lodash-es' -import { IWindowList } from '#/types/enum' -import { IManageApiType, IManageConfigType, IManageError, IPicBedMangeConfig } from '#/types/manage' -import { IStringKeyMap } from '#/types/types' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import type { IManageApiType, IManageConfigType, IManageError, IPicBedMangeConfig } from '#/types/manage' +import type { IStringKeyMap } from '#/types/types' import API from '~/manage/apis/api' import ManageDB from '~/manage/datastore/db' import { managePathChecker } from '~/manage/datastore/dbChecker' import { formatError, isInputConfigValid } from '~/manage/utils/common' import { ManageLogger } from '~/manage/utils/logger' +import { IWindowList } from '~/utils/enum' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '~/utils/static' export class ManageApi extends EventEmitter implements IManageApiType { private _config!: Partial diff --git a/src/main/manage/utils/common.ts b/src/main/manage/utils/common.ts index 43bc22c6..d697b211 100644 --- a/src/main/manage/utils/common.ts +++ b/src/main/manage/utils/common.ts @@ -13,11 +13,11 @@ import { HttpProxyAgent, HttpsProxyAgent } from 'hpagent' import mime from 'mime-types' import Downloader from 'nodejs-file-downloader' -import { commonTaskStatus, downloadTaskSpecialStatus, uploadTaskSpecialStatus } from '#/types/enum' -import { IHTTPProxy, IStringKeyMap } from '#/types/types' -import { formatHttpProxy } from '#/utils/common' +import type { IHTTPProxy, IStringKeyMap } from '#/types/types' import UpDownTaskQueue from '~/manage/datastore/upDownTaskQueue' import { ManageLogger } from '~/manage/utils/logger' +import { formatHttpProxy } from '~/utils/common' +import { commonTaskStatus, downloadTaskSpecialStatus, uploadTaskSpecialStatus } from '~/utils/enum' export const getFSFile = async (filePath: string, stream: boolean = false): Promise => { try { diff --git a/src/main/manage/utils/dogeAPI.ts b/src/main/manage/utils/dogeAPI.ts index f603daa9..918a9464 100644 --- a/src/main/manage/utils/dogeAPI.ts +++ b/src/main/manage/utils/dogeAPI.ts @@ -4,7 +4,7 @@ import querystring from 'node:querystring' import picgo from '@core/picgo' import axios from 'axios' -import { IObj } from '#/types/types' +import type { IObj } from '#/types/types' export interface DogecloudToken { accessKeyId: string diff --git a/src/main/manage/utils/logger.ts b/src/main/manage/utils/logger.ts index 8d096d9c..94f48540 100644 --- a/src/main/manage/utils/logger.ts +++ b/src/main/manage/utils/logger.ts @@ -6,11 +6,11 @@ import dayjs from 'dayjs' import fs from 'fs-extra' import { ILogColor, ILogger } from 'piclist/dist/types' -import { ILogType } from '#/types/enum' -import { IManageApiType, Undefinable } from '#/types/manage' -import { ILogArgvType, ILogArgvTypeWithError } from '#/types/types' -import { enforceNumber } from '#/utils/common' -import { configPaths } from '#/utils/configPaths' +import type { IManageApiType, Undefinable } from '#/types/manage' +import type { ILogArgvType, ILogArgvTypeWithError } from '#/types/types' +import { enforceNumber } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' +import { ILogType } from '~/utils/enum' export class ManageLogger implements ILogger { readonly #level = { @@ -28,7 +28,7 @@ export class ManageLogger implements ILogger { this.#ctx = ctx } - #handleLog (type: ILogType, ...msg: ILogArgvTypeWithError[]): void { + #handleLog (type: string, ...msg: ILogArgvTypeWithError[]): void { const logHeader = chalk[this.#level[type] as ILogColor](`[PicList ${type.toUpperCase()}]`) console.log(logHeader, ...msg) this.#logLevel = this.#ctx.getConfig(configPaths.settings.logLevel) diff --git a/src/main/server/index.ts b/src/main/server/index.ts index cd23c649..0e56980b 100644 --- a/src/main/server/index.ts +++ b/src/main/server/index.ts @@ -8,10 +8,10 @@ import { app } from 'electron' import fs from 'fs-extra' import multer from 'multer' -import { ErrnoException, IObj, IServerConfig } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import type { ErrnoException, IObj, IServerConfig } from '#/types/types' import routers from '~/server/routerManager' import { ensureHTTPLink, handleResponse } from '~/server/utils' +import { configPaths } from '~/utils/configPaths' const DEFAULT_PORT = 36677 const DEFAULT_HOST = '0.0.0.0' diff --git a/src/main/server/router.ts b/src/main/server/router.ts index 4a587f25..8d1b80f0 100644 --- a/src/main/server/router.ts +++ b/src/main/server/router.ts @@ -1,4 +1,4 @@ -import { routeHandler } from '#/types/types' +import type { routeHandler } from '#/types/types' type HttpMethod = 'GET' | 'POST' diff --git a/src/main/server/routerManager.ts b/src/main/server/routerManager.ts index a9942c5e..db95b678 100644 --- a/src/main/server/routerManager.ts +++ b/src/main/server/routerManager.ts @@ -10,12 +10,12 @@ import { app } from 'electron' import fs from 'fs-extra' import { marked } from 'marked' -import { IHttpResponse, IStringKeyMap } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import type { IHttpResponse, IStringKeyMap } from '#/types/types' import { markdownContent } from '~/server/apiDoc' import router from '~/server/router' import { deleteChoosedFiles, handleResponse } from '~/server/utils' import { AESHelper } from '~/utils/aesHelper' +import { configPaths } from '~/utils/configPaths' import { changeCurrentUploader } from '~/utils/handleUploaderConfig' const appPath = app.getPath('userData') diff --git a/src/main/server/utils.ts b/src/main/server/utils.ts index 39a6bf89..e7606ca2 100644 --- a/src/main/server/utils.ts +++ b/src/main/server/utils.ts @@ -6,11 +6,11 @@ import ALLApi from 'apis/delete/allApi' import GuiApi from 'apis/gui' import { Notification } from 'electron' -import { ICOREBuildInEvent, IWindowList } from '#/types/enum' -import { IHttpResponse, ImgInfo, IObj } from '#/types/types' -import { configPaths } from '#/utils/configPaths' -import { picBedsCanbeDeleted } from '#/utils/static' +import type { IHttpResponse, ImgInfo, IObj } from '#/types/types' import { T as $t } from '~/i18n/index' +import { configPaths } from '~/utils/configPaths' +import { ICOREBuildInEvent, IWindowList } from '~/utils/enum' +import { picBedsCanbeDeleted } from '~/utils/static' export const handleResponse = ({ response, diff --git a/src/main/server/webServer/index.ts b/src/main/server/webServer/index.ts index 87dbe1d9..47532c33 100644 --- a/src/main/server/webServer/index.ts +++ b/src/main/server/webServer/index.ts @@ -5,9 +5,9 @@ import picgo from '@core/picgo' import logger from '@core/picgo/logger' import fs from 'fs-extra' -import { IStringKeyMap } from '#/types/types' -import { encodeFilePath } from '#/utils/common' -import { configPaths } from '#/utils/configPaths' +import type { IStringKeyMap } from '#/types/types' +import { encodeFilePath } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' const defaultPath = process.platform === 'win32' ? 'C:\\Users' : '/' diff --git a/src/main/utils/aesHelper.ts b/src/main/utils/aesHelper.ts index ff56a434..52c0cf9d 100644 --- a/src/main/utils/aesHelper.ts +++ b/src/main/utils/aesHelper.ts @@ -2,12 +2,11 @@ import crypto from 'node:crypto' import picgo from '@core/picgo' -import { configPaths } from '#/utils/configPaths' -import { DEFAULT_AES_PASSWORD } from '#/utils/static' +import { configPaths } from '~/utils/configPaths' export class AESHelper { private key: Buffer = crypto.pbkdf2Sync( - picgo.getConfig(configPaths.settings.aesPassword) || DEFAULT_AES_PASSWORD, + picgo.getConfig(configPaths.settings.aesPassword) || 'aesPassword', Buffer.from('a8b3c4d2e4f5098712345678feedc0de', 'hex'), 100000, 32, diff --git a/src/main/utils/beforeOpen.ts b/src/main/utils/beforeOpen.ts index 6a506ba6..1daa9301 100644 --- a/src/main/utils/beforeOpen.ts +++ b/src/main/utils/beforeOpen.ts @@ -5,7 +5,7 @@ import { dbPathChecker } from '@core/datastore/dbChecker' import fs from 'fs-extra' import yaml from 'js-yaml' -import { ILocales } from '#/types/i18n' +import type { ILocales } from '#/types/i18n' import { i18nManager } from '~/i18n' const configPath = dbPathChecker() diff --git a/src/main/utils/common.ts b/src/main/utils/common.ts index 3e5cfaa5..d0d5039d 100644 --- a/src/main/utils/common.ts +++ b/src/main/utils/common.ts @@ -6,11 +6,28 @@ import axios from 'axios' import { clipboard, dialog, Notification, Tray } from 'electron' import FormData from 'form-data' import fs from 'fs-extra' +import { isReactive, isRef, toRaw, unref } from 'vue' -import { IShortUrlServer } from '#/types/enum' -import { IPrivateShowNotificationOption, IShowMessageBoxResult } from '#/types/types' -import { handleUrlEncode } from '#/utils/common' -import { configPaths } from '#/utils/configPaths' +import type { IHTTPProxy, IPrivateShowNotificationOption, IShowMessageBoxResult, IStringKeyMap } from '#/types/types' +import { configPaths } from '~/utils/configPaths' +import { IShortUrlServer } from '~/utils/enum' + +/** + * get raw data from reactive or ref + */ +export const getRawData = (args: any): any => { + if (isRef(args)) return unref(args) + if (isReactive(args)) return toRaw(args) + if (Array.isArray(args)) return args.map(getRawData) + if (typeof args === 'object' && args !== null) { + const data = {} as Record + for (const key in args) { + data[key] = getRawData(args[key]) + } + return data + } + return args +} const getExtension = (fileName: string) => path.extname(fileName).slice(1) @@ -123,9 +140,6 @@ export const getClipboardFilePath = (): string => { return '' } -export const handleUrlEncodeWithSetting = (url: string) => - db.get(configPaths.settings.encodeOutputURL) ? handleUrlEncode(url) : url - const c1nApi = 'https://c1n.cn/link/short' const generateC1NShortUrl = async (url: string) => { @@ -246,3 +260,76 @@ export const generateShortUrl = async (url: string) => { return url } } + +export const isUrl = (url: string): boolean => { + try { + return Boolean(new URL(url)) + } catch { + return false + } +} + +export const isUrlEncode = (url: string): boolean => { + url = url || '' + try { + return url !== decodeURI(url) + } catch { + return false + } +} + +export const handleUrlEncode = (url: string): string => (isUrlEncode(url) ? url : encodeURI(url)) + +export const handleUrlEncodeWithSetting = (url: string) => + db.get(configPaths.settings.encodeOutputURL) ? handleUrlEncode(url) : url + +export const handleStreamlinePluginName = (name: string) => name.replace(/(@[^/]+\/)?picgo-plugin-/, '') +export const simpleClone = (obj: any) => JSON.parse(JSON.stringify(obj)) +export const enforceNumber = (num: number | string) => (isNaN(+num) ? 0 : +num) + +export const trimValues = ( + obj: T +): { [K in keyof T]: T[K] extends string ? string : T[K] } => { + return Object.fromEntries( + Object.entries(obj).map(([key, value]) => [key, typeof value === 'string' ? value.trim() : value]) + ) as { [K in keyof T]: T[K] extends string ? string : T[K] } +} + +export const formatEndpoint = (endpoint: string, sslEnabled: boolean): string => { + const hasProtocol = /^https?:\/\//.test(endpoint) + if (!hasProtocol) { + return `${sslEnabled ? 'https' : 'http'}://${endpoint}` + } + return sslEnabled ? endpoint.replace(/^http:\/\//, 'https://') : endpoint.replace(/^https:\/\//, 'http://') +} + +export const formatHttpProxy = ( + proxy: string | undefined, + type: 'object' | 'string' +): IHTTPProxy | undefined | string => { + if (!proxy) return undefined + if (/^https?:\/\//.test(proxy)) { + const { protocol, hostname, port } = new URL(proxy) + return type === 'string' + ? `${protocol}//${hostname}:${port}` + : { + host: hostname, + port: Number(port), + protocol: protocol.slice(0, -1) + } + } + const [host, port] = proxy.split(':') + return type === 'string' + ? `http://${host}:${port}` + : { + host, + port: port ? Number(port) : 80, + protocol: 'http' + } +} + +export function encodeFilePath (filePath: string) { + return filePath.replace(/\\/g, '/').split('/').map(encodeURIComponent).join('/') +} + +export const trimPath = (path: string) => path.replace(/^\/+|\/+$/g, '').replace(/\/+/g, '/') diff --git a/src/universal/utils/configPaths.ts b/src/main/utils/configPaths.ts similarity index 86% rename from src/universal/utils/configPaths.ts rename to src/main/utils/configPaths.ts index 68acadb4..92cb6fb1 100644 --- a/src/universal/utils/configPaths.ts +++ b/src/main/utils/configPaths.ts @@ -1,194 +1,188 @@ -import type { IBuildInCompressOptions, IBuildInWaterMarkOptions } from 'piclist' - -import { II18nLanguage, IPasteStyle, ISartMode, IShortUrlServer } from '#/types/enum' - -import { IAliYunConfig, IAwsS3PListUserConfig, IGitHubConfig, IImgurConfig, ILocalConfig, ILskyConfig, IPicBedType, IQiniuConfig, IServerConfig, ISftpPlistConfig, IShortKeyConfig, ISMMSConfig, ISyncConfig, ITcYunConfig, IUploaderConfig, IUpYunConfig, IWebdavPlistConfig } from '../types/types' - -export type ISartModeValues = (typeof ISartMode)[keyof typeof ISartMode] -export type IPasteStyleValues = (typeof IPasteStyle)[keyof typeof IPasteStyle] -export type II18nLanguageValues = (typeof II18nLanguage)[keyof typeof II18nLanguage] -export type IShortUrlServerValues = (typeof IShortUrlServer)[keyof typeof IShortUrlServer] -export type manualPageOpenType = 'window' | 'browser' - -interface IPicGoPlugins { - [key: `picgo-plugin-${string}`]: boolean -} - -export interface IConfigStruct { - picBed: { - uploader: string - current?: string - smms?: ISMMSConfig - qiniu?: IQiniuConfig - upyun?: IUpYunConfig - tcyun?: ITcYunConfig - github?: IGitHubConfig - aliyun?: IAliYunConfig - imgur?: IImgurConfig - webdavplist?: IWebdavPlistConfig - local?: ILocalConfig - sftpplist?: ISftpPlistConfig - lskyplist?: ILskyConfig - 'aws-s3-plist': IAwsS3PListUserConfig - proxy?: string - transformer?: string - list: IPicBedType[] - [others: string]: any - } - settings: { - shortKey: { - [key: string]: IShortKeyConfig - } - logLevel: string[] - logPath: string - logFileSizeLimit: number - isAutoListenClipboard: boolean - isListeningClipboard: boolean - showUpdateTip: boolean - miniWindowPosition: [number, number] - miniWindowOntop: boolean - mainWindowWidth: number - mainWindowHeight: number - isHideDock: boolean - autoCloseMiniWindow: boolean - autoCloseMainWindow: boolean - isCustomMiniIcon: boolean - customMiniIcon: string - startMode: ISartModeValues - autoRename: boolean - deleteCloudFile: boolean - server: IServerConfig - serverKey: string - pasteStyle: IPasteStyleValues - aesPassword: string - rename: boolean - sync: ISyncConfig - tempDirPath: string - language: II18nLanguageValues - customLink: string - manualPageOpen: manualPageOpenType - encodeOutputURL: boolean - useShortUrl: boolean - shortUrlServer: IShortUrlServerValues - c1nToken: string - cfWorkerHost: string - yourlsDomain: string - yourlsSignature: string - sinkDomain: string - sinkToken: string - isSilentNotice: boolean - proxy: string - registry: string - autoCopy: boolean - enableWebServer: boolean - webServerHost: string - webServerPort: number - webServerPath: string - deleteLocalFile: boolean - uploadResultNotification: boolean - uploadNotification: boolean - useBuiltinClipboard: boolean - autoStart: boolean - autoImport: boolean - autoImportPicBed: string[] - } - needReload: boolean - picgoPlugins: IPicGoPlugins - uploader: IUploaderConfig - buildIn: { - compress: IBuildInCompressOptions - watermark: IBuildInWaterMarkOptions - rename: { - enable: boolean - format: string - } - skipProcess: { - skipProcessExtList: string - } - } - debug: boolean - PICGO_ENV: string -} - -export const configPaths = { - picBed: { - current: 'picBed.current', - uploader: 'picBed.uploader', - secondUploader: 'picBed.secondUploader', - secondUploaderId: 'picBed.secondUploaderId', - secondUploaderConfig: 'picBed.secondUploaderConfig', - proxy: 'picBed.proxy', - transformer: 'picBed.transformer', - list: 'picBed.list' - }, - settings: { - shortKey: { - _path: 'settings.shortKey', - 'picgo:upload': 'settings.shortKey[picgo:upload]' - }, - logLevel: 'settings.logLevel', - logPath: 'settings.logPath', - logFileSizeLimit: 'settings.logFileSizeLimit', - isAutoListenClipboard: 'settings.isAutoListenClipboard', - isListeningClipboard: 'settings.isListeningClipboard', - showUpdateTip: 'settings.showUpdateTip', - miniWindowPosition: 'settings.miniWindowPosition', - miniWindowOntop: 'settings.miniWindowOntop', - isHideDock: 'settings.isHideDock', - mainWindowWidth: 'settings.mainWindowWidth', - mainWindowHeight: 'settings.mainWindowHeight', - autoCloseMiniWindow: 'settings.autoCloseMiniWindow', - autoCloseMainWindow: 'settings.autoCloseMainWindow', - isCustomMiniIcon: 'settings.isCustomMiniIcon', - customMiniIcon: 'settings.customMiniIcon', - startMode: 'settings.startMode', - autoRename: 'settings.autoRename', - deleteCloudFile: 'settings.deleteCloudFile', - server: 'settings.server', - serverKey: 'settings.serverKey', - pasteStyle: 'settings.pasteStyle', - aesPassword: 'settings.aesPassword', - rename: 'settings.rename', - sync: 'settings.sync', - tempDirPath: 'settings.tempDirPath', - language: 'settings.language', - customLink: 'settings.customLink', - manualPageOpen: 'settings.manualPageOpen', - encodeOutputURL: 'settings.encodeOutputURL', - useShortUrl: 'settings.useShortUrl', - shortUrlServer: 'settings.shortUrlServer', - c1nToken: 'settings.c1nToken', - cfWorkerHost: 'settings.cfWorkerHost', - yourlsDomain: 'settings.yourlsDomain', - yourlsSignature: 'settings.yourlsSignature', - sinkDomain: 'settings.sinkDomain', - sinkToken: 'settings.sinkToken', - isSilentNotice: 'settings.isSilentNotice', - proxy: 'settings.proxy', - registry: 'settings.registry', - autoCopy: 'settings.autoCopy', - enableWebServer: 'settings.enableWebServer', - webServerHost: 'settings.webServerHost', - webServerPort: 'settings.webServerPort', - webServerPath: 'settings.webServerPath', - deleteLocalFile: 'settings.deleteLocalFile', - uploadResultNotification: 'settings.uploadResultNotification', - uploadNotification: 'settings.uploadNotification', - useBuiltinClipboard: 'settings.useBuiltinClipboard', - autoStart: 'settings.autoStart', - autoImport: 'settings.autoImport', - autoImportPicBed: 'settings.autoImportPicBed', - enableSecondUploader: 'settings.enableSecondUploader' - }, - needReload: 'needReload', - picgoPlugins: 'picgoPlugins', - uploader: 'uploader', - buildIn: { - compress: 'buildIn.compress', - watermark: 'buildIn.watermark', - rename: 'buildIn.rename', - skipProcess: 'buildIn.skipProcess' - }, - debug: 'debug', - PICGO_ENV: 'PICGO_ENV' -} +import type { IBuildInCompressOptions, IBuildInWaterMarkOptions } from 'piclist' + +import type { IAliYunConfig, IAwsS3PListUserConfig, IGitHubConfig, IImgurConfig, ILocalConfig, ILskyConfig, IPicBedType, IQiniuConfig, IServerConfig, ISftpPlistConfig, IShortKeyConfig, ISMMSConfig, ISyncConfig, ITcYunConfig, IUploaderConfig, IUpYunConfig, IWebdavPlistConfig } from '#/types/types' + +export type manualPageOpenType = 'window' | 'browser' + +interface IPicGoPlugins { + [key: `picgo-plugin-${string}`]: boolean +} + +export interface IConfigStruct { + picBed: { + uploader: string + current?: string + smms?: ISMMSConfig + qiniu?: IQiniuConfig + upyun?: IUpYunConfig + tcyun?: ITcYunConfig + github?: IGitHubConfig + aliyun?: IAliYunConfig + imgur?: IImgurConfig + webdavplist?: IWebdavPlistConfig + local?: ILocalConfig + sftpplist?: ISftpPlistConfig + lskyplist?: ILskyConfig + 'aws-s3-plist': IAwsS3PListUserConfig + proxy?: string + transformer?: string + list: IPicBedType[] + [others: string]: any + } + settings: { + shortKey: { + [key: string]: IShortKeyConfig + } + logLevel: string[] + logPath: string + logFileSizeLimit: number + isAutoListenClipboard: boolean + isListeningClipboard: boolean + showUpdateTip: boolean + miniWindowPosition: [number, number] + miniWindowOntop: boolean + mainWindowWidth: number + mainWindowHeight: number + isHideDock: boolean + autoCloseMiniWindow: boolean + autoCloseMainWindow: boolean + isCustomMiniIcon: boolean + customMiniIcon: string + startMode: string + autoRename: boolean + deleteCloudFile: boolean + server: IServerConfig + serverKey: string + pasteStyle: string + aesPassword: string + rename: boolean + sync: ISyncConfig + tempDirPath: string + language: string + customLink: string + manualPageOpen: manualPageOpenType + encodeOutputURL: boolean + useShortUrl: boolean + shortUrlServer: string + c1nToken: string + cfWorkerHost: string + yourlsDomain: string + yourlsSignature: string + sinkDomain: string + sinkToken: string + isSilentNotice: boolean + proxy: string + registry: string + autoCopy: boolean + enableWebServer: boolean + webServerHost: string + webServerPort: number + webServerPath: string + deleteLocalFile: boolean + uploadResultNotification: boolean + uploadNotification: boolean + useBuiltinClipboard: boolean + autoStart: boolean + autoImport: boolean + autoImportPicBed: string[] + } + needReload: boolean + picgoPlugins: IPicGoPlugins + uploader: IUploaderConfig + buildIn: { + compress: IBuildInCompressOptions + watermark: IBuildInWaterMarkOptions + rename: { + enable: boolean + format: string + } + skipProcess: { + skipProcessExtList: string + } + } + debug: boolean + PICGO_ENV: string +} + +export const configPaths = { + picBed: { + current: 'picBed.current', + uploader: 'picBed.uploader', + secondUploader: 'picBed.secondUploader', + secondUploaderId: 'picBed.secondUploaderId', + secondUploaderConfig: 'picBed.secondUploaderConfig', + proxy: 'picBed.proxy', + transformer: 'picBed.transformer', + list: 'picBed.list' + }, + settings: { + shortKey: { + _path: 'settings.shortKey', + 'picgo:upload': 'settings.shortKey[picgo:upload]' + }, + logLevel: 'settings.logLevel', + logPath: 'settings.logPath', + logFileSizeLimit: 'settings.logFileSizeLimit', + isAutoListenClipboard: 'settings.isAutoListenClipboard', + isListeningClipboard: 'settings.isListeningClipboard', + showUpdateTip: 'settings.showUpdateTip', + miniWindowPosition: 'settings.miniWindowPosition', + miniWindowOntop: 'settings.miniWindowOntop', + isHideDock: 'settings.isHideDock', + mainWindowWidth: 'settings.mainWindowWidth', + mainWindowHeight: 'settings.mainWindowHeight', + autoCloseMiniWindow: 'settings.autoCloseMiniWindow', + autoCloseMainWindow: 'settings.autoCloseMainWindow', + isCustomMiniIcon: 'settings.isCustomMiniIcon', + customMiniIcon: 'settings.customMiniIcon', + startMode: 'settings.startMode', + autoRename: 'settings.autoRename', + deleteCloudFile: 'settings.deleteCloudFile', + server: 'settings.server', + serverKey: 'settings.serverKey', + pasteStyle: 'settings.pasteStyle', + aesPassword: 'settings.aesPassword', + rename: 'settings.rename', + sync: 'settings.sync', + tempDirPath: 'settings.tempDirPath', + language: 'settings.language', + customLink: 'settings.customLink', + manualPageOpen: 'settings.manualPageOpen', + encodeOutputURL: 'settings.encodeOutputURL', + useShortUrl: 'settings.useShortUrl', + shortUrlServer: 'settings.shortUrlServer', + c1nToken: 'settings.c1nToken', + cfWorkerHost: 'settings.cfWorkerHost', + yourlsDomain: 'settings.yourlsDomain', + yourlsSignature: 'settings.yourlsSignature', + sinkDomain: 'settings.sinkDomain', + sinkToken: 'settings.sinkToken', + isSilentNotice: 'settings.isSilentNotice', + proxy: 'settings.proxy', + registry: 'settings.registry', + autoCopy: 'settings.autoCopy', + enableWebServer: 'settings.enableWebServer', + webServerHost: 'settings.webServerHost', + webServerPort: 'settings.webServerPort', + webServerPath: 'settings.webServerPath', + deleteLocalFile: 'settings.deleteLocalFile', + uploadResultNotification: 'settings.uploadResultNotification', + uploadNotification: 'settings.uploadNotification', + useBuiltinClipboard: 'settings.useBuiltinClipboard', + autoStart: 'settings.autoStart', + autoImport: 'settings.autoImport', + autoImportPicBed: 'settings.autoImportPicBed', + enableSecondUploader: 'settings.enableSecondUploader' + }, + needReload: 'needReload', + picgoPlugins: 'picgoPlugins', + uploader: 'uploader', + buildIn: { + compress: 'buildIn.compress', + watermark: 'buildIn.watermark', + rename: 'buildIn.rename', + skipProcess: 'buildIn.skipProcess' + }, + debug: 'debug', + PICGO_ENV: 'PICGO_ENV' +} diff --git a/src/main/utils/deleteFunc.ts b/src/main/utils/deleteFunc.ts index df785c30..dd9eccd5 100644 --- a/src/main/utils/deleteFunc.ts +++ b/src/main/utils/deleteFunc.ts @@ -9,7 +9,7 @@ import { NodeHttpHandler } from '@smithy/node-http-handler' import axios from 'axios' import { ISftpPlistConfig } from 'piclist' -import { IObj, IStringKeyMap } from '#/types/types' +import type { IObj, IStringKeyMap } from '#/types/types' import { getAgent } from '~/manage/utils/common' import SSHClient from '~/utils/sshClient' diff --git a/src/main/utils/digestAuth.ts b/src/main/utils/digestAuth.ts index 725af270..39da1cd8 100644 --- a/src/main/utils/digestAuth.ts +++ b/src/main/utils/digestAuth.ts @@ -2,7 +2,8 @@ import crypto from 'node:crypto' import axios from 'axios' -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' + const AUTH_KEY_VALUE_RE = /(\w+)=["']?([^'"]{1,10000})["']?/ let NC = 0 const NC_PAD = '00000000' diff --git a/src/main/utils/enum.ts b/src/main/utils/enum.ts new file mode 100644 index 00000000..380d1ccd --- /dev/null +++ b/src/main/utils/enum.ts @@ -0,0 +1,242 @@ +export const ILogType = { + success: 'success', + info: 'info', + warn: 'warn', + error: 'error' +} + +export const ICOREBuildInEvent = { + UPLOAD_PROGRESS: 'uploadProgress', + FAILED: 'failed', + BEFORE_TRANSFORM: 'beforeTransform', + BEFORE_UPLOAD: 'beforeUpload', + AFTER_UPLOAD: 'afterUpload', + FINISHED: 'finished', + INSTALL: 'install', + UNINSTALL: 'uninstall', + UPDATE: 'update', + NOTIFICATION: 'notification', + REMOVE: 'remove' +} + +export const IPicGoHelperType = { + afterUploadPlugins: 'afterUploadPlugins', + beforeTransformPlugins: 'beforeTransformPlugins', + beforeUploadPlugins: 'beforeUploadPlugins', + uploader: 'uploader', + transformer: 'transformer' +} + +export const IPasteStyle = { + MARKDOWN: 'markdown', + HTML: 'HTML', + URL: 'URL', + UBB: 'UBB', + CUSTOM: 'Custom' +} + +export const IWindowList = { + SETTING_WINDOW: 'SETTING_WINDOW', + TRAY_WINDOW: 'TRAY_WINDOW', + MINI_WINDOW: 'MINI_WINDOW', + RENAME_WINDOW: 'RENAME_WINDOW', + TOOLBOX_WINDOW: 'TOOLBOX_WINDOW' +} + +export const IRemoteNoticeActionType = { + OPEN_URL: 'OPEN_URL', + SHOW_NOTICE: 'SHOW_NOTICE', // notification + SHOW_DIALOG: 'SHOW_DIALOG', // dialog notice + COMMON: 'COMMON', + VOID: 'VOID', // do nothing + SHOW_MESSAGE_BOX: 'SHOW_MESSAGE_BOX' +} + +export const IRemoteNoticeTriggerHook = { + APP_START: 'APP_START', + SETTING_WINDOW_OPEN: 'SETTING_WINDOW_OPEN' +} + +export const IRemoteNoticeTriggerCount = { + ONCE: 'ONCE', // default + ALWAYS: 'ALWAYS' +} + +export const IRPCType = { + INVOKE: 'INVOKE', + SEND: 'SEND' +} + +export const IRPCActionType = { + // system rpc + RELOAD_APP: 'RELOAD_APP', + OPEN_URL: 'OPEN_URL', + OPEN_FILE: 'OPEN_FILE', + HIDE_DOCK: 'HIDE_DOCK', + SET_CURRENT_LANGUAGE: 'SET_CURRENT_LANGUAGE', + OPEN_WINDOW: 'OPEN_WINDOW', + OPEN_MINI_WINDOW: 'OPEN_MINI_WINDOW', + CLOSE_WINDOW: 'CLOSE_WINDOW', + MINIMIZE_WINDOW: 'MINIMIZE_WINDOW', + SHOW_MINI_PAGE_MENU: 'SHOW_MINI_PAGE_MENU', + SHOW_MAIN_PAGE_MENU: 'SHOW_MAIN_PAGE_MENU', + SHOW_UPLOAD_PAGE_MENU: 'SHOW_UPLOAD_PAGE_MENU', + SHOW_SECOND_UPLOADER_MENU: 'SHOW_SECOND_UPLOADER_MENU', + SHOW_PLUGIN_PAGE_MENU: 'SHOW_PLUGIN_PAGE_MENU', + SET_MINI_WINDOW_POS: 'SET_MINI_WINDOW_POS', + MINI_WINDOW_ON_TOP: 'MINI_WINDOW_ON_TOP', + MAIN_WINDOW_ON_TOP: 'MAIN_WINDOW_ON_TOP', + UPDATE_MINI_WINDOW_ICON: 'UPDATE_MINI_WINDOW_ICON', + REFRESH_SETTING_WINDOW: 'REFRESH_SETTING_WINDOW', + // picbed RPC + PICBED_GET_PICBED_CONFIG: 'PICBED_GET_PICBED_CONFIG', + PICBED_GET_CONFIG_LIST: 'PICBED_GET_CONFIG_LIST', + PICBED_DELETE_CONFIG: 'PICBED_DELETE_CONFIG', + UPLOADER_CHANGE_CURRENT: 'UPLOADER_CHANGE_CURRENT', + UPLOADER_SELECT: 'UPLOADER_SELECT', + UPLOADER_UPDATE_CONFIG: 'UPLOADER_UPDATE_CONFIG', + UPLOADER_RESET_CONFIG: 'UPLOADER_RESET_CONFIG', + DELETE_ALL_API: 'DELETE_ALL_API', + + // toolbox rpc + TOOLBOX_CHECK: 'TOOLBOX_CHECK', + TOOLBOX_CHECK_RES: 'TOOLBOX_CHECK_RES', + TOOLBOX_CHECK_FIX: 'TOOLBOX_CHECK_FIX', + + // main app setting rpc + PICLIST_GET_CONFIG: 'PICLIST_GET_CONFIG', + PICLIST_GET_CONFIG_SYNC: 'PICLIST_GET_CONFIG_SYNC', + PICLIST_SAVE_CONFIG: 'PICLIST_SAVE_CONFIG', + PICLIST_OPEN_FILE: 'PICLIST_OPEN_FILE', + PICLIST_OPEN_DIRECTORY: 'PICLIST_OPEN_DIRECTORY', + PICLIST_AUTO_START: 'PICLIST_AUTO_START', + + // shortkey setting rpc + SHORTKEY_UPDATE: 'SHORTKEY_UPDATE', + SHORTKEY_BIND_OR_UNBIND: 'SHORTKEY_BIND_OR_UNBIND', + SHORTKEY_TOGGLE_SHORTKEY_MODIFIED_MODE: 'SHORTKEY_TOGGLE_SHORTKEY_MODIFIED_MODE', + + // configuration setting rpc + CONFIGURE_MIGRATE_FROM_PICGO: 'CONFIGURE_MIGRATE_FROM_PICGO', + CONFIGURE_UPLOAD_COMMON_CONFIG: 'CONFIGURE_UPLOAD_COMMON_CONFIG', + CONFIGURE_UPLOAD_MANAGE_CONFIG: 'CONFIGURE_UPLOAD_MANAGE_CONFIG', + CONFIGURE_UPLOAD_ALL_CONFIG: 'CONFIGURE_UPLOAD_ALL_CONFIG', + CONFIGURE_DOWNLOAD_COMMON_CONFIG: 'CONFIGURE_DOWNLOAD_COMMON_CONFIG', + CONFIGURE_DOWNLOAD_MANAGE_CONFIG: 'CONFIGURE_DOWNLOAD_MANAGE_CONFIG', + CONFIGURE_DOWNLOAD_ALL_CONFIG: 'CONFIGURE_DOWNLOAD_ALL_CONFIG', + + // advanced setting rpc + ADVANCED_UPDATE_SERVER: 'ADVANCED_UPDATE_SERVER', + ADVANCED_STOP_WEB_SERVER: 'ADVANCED_STOP_WEB_SERVER', + ADVANCED_RESTART_WEB_SERVER: 'ADVANCED_RESTART_WEB_SERVER', + + // upload and main page rpc + MAIN_GET_PICBED: 'MAIN_GET_PICBED', + UPLOAD_CLIPBOARD_FILES_FROM_UPLOAD_PAGE: 'UPLOAD_CLIPBOARD_FILES_FROM_UPLOAD_PAGE', + UPLOAD_CHOOSED_FILES: 'UPLOAD_CHOOSED_FILES', + + // gallery rpc + GALLERY_PASTE_TEXT: 'GALLERY_PASTE_TEXT', + GALLERY_REMOVE_FILES: 'GALLERY_REMOVE_FILES', + GALLERY_GET_DB: 'GALLERY_GET_DB', + GALLERY_GET_BY_ID_DB: 'GALLERY_GET_BY_ID_DB', + GALLERY_UPDATE_BY_ID_DB: 'GALLERY_UPDATE_BY_ID_DB', + GALLERY_REMOVE_BY_ID_DB: 'GALLERY_REMOVE_BY_ID_DB', + GALLERY_INSERT_DB: 'GALLERY_INSERT_DB', + GALLERY_INSERT_DB_BATCH: 'GALLERY_INSERT_DB_BATCH', + // plugin rpc + PLUGIN_GET_LIST: 'PLUGIN_GET_LIST', + PLUGIN_INSTALL: 'PLUGIN_INSTALL', + PLUGIN_IMPORT_LOCAL: 'PLUGIN_IMPORT_LOCAL', + PLUGIN_UPDATE_ALL: 'PLUGIN_UPDATE_ALL', + + // tray rpc + TRAY_SET_TOOL_TIP: 'TRAY_SET_TOOL_TIP', + TRAY_GET_SHORT_URL: 'TRAY_GET_SHORT_URL', + TRAY_UPLOAD_CLIPBOARD_FILES: 'TRAY_UPLOAD_CLIPBOARD_FILES', + + // manage rpc + MANAGE_GET_CONFIG: 'MANAGE_GET_CONFIG', + MANAGE_SAVE_CONFIG: 'MANAGE_SAVE_CONFIG', + MANAGE_REMOVE_CONFIG: 'MANAGE_REMOVE_CONFIG', + MANAGE_GET_BUCKET_LIST: 'MANAGE_GET_BUCKET_LIST', + MANAGE_GET_BUCKET_LIST_BACKSTAGE: 'MANAGE_GET_BUCKET_LIST_BACKSTAGE', + MANAGE_GET_BUCKET_LIST_RECURSIVELY: 'MANAGE_GET_BUCKET_LIST_RECURSIVELY', + MANAGE_CREATE_BUCKET: 'MANAGE_CREATE_BUCKET', + MANAGE_GET_BUCKET_FILE_LIST: 'MANAGE_GET_BUCKET_FILE_LIST', + MANAGE_GET_BUCKET_DOMAIN: 'MANAGE_GET_BUCKET_DOMAIN', + MANAGE_SET_BUCKET_ACL_POLICY: 'MANAGE_SET_BUCKET_ACL_POLICY', + MANAGE_RENAME_BUCKET_FILE: 'MANAGE_RENAME_BUCKET_FILE', + MANAGE_DELETE_BUCKET_FILE: 'MANAGE_DELETE_BUCKET_FILE', + MANAGE_DELETE_BUCKET_FOLDER: 'MANAGE_DELETE_BUCKET_FOLDER', + MANAGE_GET_PRE_SIGNED_URL: 'MANAGE_GET_PRE_SIGNED_URL', + MANAGE_UPLOAD_BUCKET_FILE: 'MANAGE_UPLOAD_BUCKET_FILE', + MANAGE_DOWNLOAD_BUCKET_FILE: 'MANAGE_DOWNLOAD_BUCKET_FILE', + MANAGE_CREATE_BUCKET_FOLDER: 'MANAGE_CREATE_BUCKET_FOLDER', + MANAGE_OPEN_FILE_SELECT_DIALOG: 'MANAGE_OPEN_FILE_SELECT_DIALOG', + MANAGE_GET_UPLOAD_TASK_LIST: 'MANAGE_GET_UPLOAD_TASK_LIST', + MANAGE_GET_DOWNLOAD_TASK_LIST: 'MANAGE_GET_DOWNLOAD_TASK_LIST', + MANAGE_DELETE_UPLOADED_TASK: 'MANAGE_DELETE_UPLOADED_TASK', + MANAGE_DELETE_ALL_UPLOADED_TASK: 'MANAGE_DELETE_ALL_UPLOADED_TASK', + MANAGE_DELETE_DOWNLOADED_TASK: 'MANAGE_DELETE_DOWNLOADED_TASK', + MANAGE_DELETE_ALL_DOWNLOADED_TASK: 'MANAGE_DELETE_ALL_DOWNLOADED_TASK', + MANAGE_SELECT_DOWNLOAD_FOLDER: 'MANAGE_SELECT_DOWNLOAD_FOLDER', + MANAGE_GET_DEFAULT_DOWNLOAD_FOLDER: 'MANAGE_GET_DEFAULT_DOWNLOAD_FOLDER', + MANAGE_OPEN_DOWNLOADED_FOLDER: 'MANAGE_OPEN_DOWNLOADED_FOLDER', + MANAGE_OPEN_LOCAL_FILE: 'MANAGE_OPEN_LOCAL_FILE', + MANAGE_DOWNLOAD_FILE_FROM_URL: 'MANAGE_DOWNLOAD_FILE_FROM_URL', + MANAGE_CONVERT_PATH_TO_BASE64: 'MANAGE_CONVERT_PATH_TO_BASE64' +} + +export const IToolboxItemType = { + IS_CONFIG_FILE_BROKEN: 'IS_CONFIG_FILE_BROKEN', + IS_GALLERY_FILE_BROKEN: 'IS_GALLERY_FILE_BROKEN', + HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD: 'HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD', + HAS_PROBLEM_WITH_PROXY: 'HAS_PROBLEM_WITH_PROXY' +} + +export const IToolboxItemCheckStatus = { + INIT: 'init', + LOADING: 'loading', + SUCCESS: 'success', + ERROR: 'error' +} + +export const ISartMode = { + QUIET: 'quiet', + MINI: 'mini', + MAIN: 'main', + NO_TRAY: 'no-tray' +} + +export const II18nLanguage = { + ZH_CN: 'zh-CN', + ZH_TW: 'zh-TW', + EN: 'en' +} + +export const IShortUrlServer = { + C1N: 'c1n', + YOURLS: 'yourls', + CFWORKER: 'cf_worker', + SINK: 'sink' +} + +export const commonTaskStatus = { + queuing: 'queuing', + failed: 'failed', + canceled: 'canceled', + paused: 'paused' +} + +// manage task status + +export const uploadTaskSpecialStatus = { + uploading: 'uploading', + uploaded: 'uploaded' +} + +export const downloadTaskSpecialStatus = { + downloading: 'downloading', + downloaded: 'downloaded' +} diff --git a/src/main/utils/getPicBeds.ts b/src/main/utils/getPicBeds.ts index cf685184..dee37c16 100644 --- a/src/main/utils/getPicBeds.ts +++ b/src/main/utils/getPicBeds.ts @@ -1,7 +1,7 @@ import picgo from '@core/picgo' -import { IPicBedType } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import type { IPicBedType } from '#/types/types' +import { configPaths } from '~/utils/configPaths' const getPicBeds = () => { const picBedTypes = picgo.helper.uploader.getIdList() diff --git a/src/main/utils/handleArgv.ts b/src/main/utils/handleArgv.ts index 4e63ec59..38aa3692 100644 --- a/src/main/utils/handleArgv.ts +++ b/src/main/utils/handleArgv.ts @@ -3,7 +3,7 @@ import path from 'node:path' import fs from 'fs-extra' import { Logger } from 'piclist' -import { isUrl } from '#/utils/common' +import { isUrl } from '~/utils/common' interface IResultFileObject { path: string diff --git a/src/main/utils/handleI18n.ts b/src/main/utils/handleI18n.ts index d4ae39b1..50fb95c0 100644 --- a/src/main/utils/handleI18n.ts +++ b/src/main/utils/handleI18n.ts @@ -1,8 +1,8 @@ import db from '@core/datastore' -import { II18nLanguage } from '#/types/enum' -import { configPaths } from '#/utils/configPaths' import { i18nManager } from '~/i18n' +import { configPaths } from '~/utils/configPaths' +import { II18nLanguage } from '~/utils/enum' export const initI18n = () => { const currentLanguage = db.get(configPaths.settings.language) || II18nLanguage.ZH_CN diff --git a/src/main/utils/handleUploaderConfig.ts b/src/main/utils/handleUploaderConfig.ts index ca62fd2d..c3c91c96 100644 --- a/src/main/utils/handleUploaderConfig.ts +++ b/src/main/utils/handleUploaderConfig.ts @@ -1,10 +1,9 @@ import picgo from '@core/picgo' import { v4 as uuid } from 'uuid' -import { IPicGoPluginConfig, IPicGoPluginOriginConfig, IStringKeyMap, IUploaderConfigItem, IUploaderConfigListItem } from '#/types/types' -import { trimValues } from '#/utils/common' -import { configPaths } from '#/utils/configPaths' -import { setTrayToolTip } from '~/utils/common' +import type { IPicGoPluginConfig, IPicGoPluginOriginConfig, IStringKeyMap, IUploaderConfigItem, IUploaderConfigListItem } from '#/types/types' +import { setTrayToolTip, trimValues } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' export const handleConfigWithFunction = (config: IPicGoPluginOriginConfig[]): IPicGoPluginConfig[] => { for (const i in config) { diff --git a/src/main/utils/notification.ts b/src/main/utils/notification.ts new file mode 100644 index 00000000..2ff3c7aa --- /dev/null +++ b/src/main/utils/notification.ts @@ -0,0 +1,3 @@ +import type { IAppNotification } from '#/types/types' + +export const notificationList: IAppNotification[] = [] diff --git a/src/main/utils/pasteTemplate.ts b/src/main/utils/pasteTemplate.ts index 8a1c3fb2..2a529298 100644 --- a/src/main/utils/pasteTemplate.ts +++ b/src/main/utils/pasteTemplate.ts @@ -1,9 +1,8 @@ import db from '@core/datastore' -import { IPasteStyle } from '#/types/enum' -import { ImgInfo } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import type { ImgInfo } from '#/types/types' import { generateShortUrl, handleUrlEncodeWithSetting } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' export const formatCustomLink = (customLink: string, item: ImgInfo) => { const fileName = item.fileName!.replace(new RegExp(`\\${item.extname}$`), '') @@ -24,7 +23,7 @@ export const formatCustomLink = (customLink: string, item: ImgInfo) => { return customLink } -export default async (style: IPasteStyle, item: ImgInfo, customLink: string | undefined) => { +export default async (style: string, item: ImgInfo, customLink: string | undefined) => { let url = item.url || item.imgUrl if (item.type === 'aws-s3' || item.type === 'aws-s3-plist') { url = item.imgUrl || item.url || '' @@ -35,7 +34,7 @@ export default async (style: IPasteStyle, item: ImgInfo, customLink: string | un url = item.shortUrl && item.shortUrl !== url ? item.shortUrl : await generateShortUrl(url) } const _customLink = customLink || '![$fileName]($url)' - const tpl = { + const tpl: Record = { markdown: `![](${url})`, HTML: ``, URL: url, diff --git a/src/main/utils/static.ts b/src/main/utils/static.ts new file mode 100644 index 00000000..d591a80a --- /dev/null +++ b/src/main/utils/static.ts @@ -0,0 +1,25 @@ +export const CLIPBOARD_IMAGE_FOLDER = 'piclist-clipboard-images' + +export const cancelDownloadLoadingFileList = 'cancelDownloadLoadingFileList' +export const refreshDownloadFileTransferList = 'refreshDownloadFileTransferList' + +export const picBedsCanbeDeleted = [ + 'aliyun', + 'alist', + 'alistplist', + 'aws-s3', + 'aws-s3-plist', + 'dogecloud', + 'github', + 'huaweicloud-uploader', + 'imgur', + 'local', + 'lskyplist', + 'piclist', + 'qiniu', + 'sftpplist', + 'smms', + 'tcyun', + 'upyun', + 'webdavplist' +] diff --git a/src/main/utils/syncSettings.ts b/src/main/utils/syncSettings.ts index 826631a6..7e67c2be 100644 --- a/src/main/utils/syncSettings.ts +++ b/src/main/utils/syncSettings.ts @@ -9,9 +9,9 @@ import fs from 'fs-extra' import { HttpsProxyAgent } from 'hpagent' import { AuthType, createClient, WebDAVClientOptions } from 'webdav' -import { ISyncConfig } from '#/types/types' -import { formatEndpoint } from '#/utils/common' -import { configPaths } from '#/utils/configPaths' +import type { ISyncConfig } from '#/types/types' +import { formatEndpoint } from '~/utils/common' +import { configPaths } from '~/utils/configPaths' const STORE_PATH = app.getPath('userData') diff --git a/src/main/utils/updateChecker.ts b/src/main/utils/updateChecker.ts index 0f71cfda..b9b44f9d 100644 --- a/src/main/utils/updateChecker.ts +++ b/src/main/utils/updateChecker.ts @@ -1,7 +1,7 @@ import db from '@core/datastore' import updater from 'electron-updater' -import { configPaths } from '#/utils/configPaths' +import { configPaths } from '~/utils/configPaths' const updateChecker = async () => { let showTip = db.get(configPaths.settings.showUpdateTip) diff --git a/src/main/utils/windowHelper.ts b/src/main/utils/windowHelper.ts index f96617dc..d7156b31 100644 --- a/src/main/utils/windowHelper.ts +++ b/src/main/utils/windowHelper.ts @@ -2,8 +2,8 @@ import db from '@core/datastore' import windowManager from 'apis/app/window/windowManager' import { screen } from 'electron' -import { IWindowList } from '#/types/enum' -import { configPaths } from '#/utils/configPaths' +import { configPaths } from '~/utils/configPaths' +import { IWindowList } from '~/utils/enum' export function openMiniWindow (hideSettingWindow: boolean = true) { const miniWindow = windowManager.get(IWindowList.MINI_WINDOW)! diff --git a/src/preload/index.ts b/src/preload/index.ts index a62bdbe1..dc37f741 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -7,9 +7,7 @@ import yaml from 'js-yaml' import mime from 'mime-types' import { isReactive, isRef, toRaw, unref } from 'vue' -import { RPC_ACTIONS, RPC_ACTIONS_INVOKE } from '#/events/constants' -import { IpcRendererListener } from '#/types/electron' -import { IRPCActionType } from '#/types/enum' +import type { IpcRendererListener } from '#/types/electron' export const getRawData = (args: any): any => { if (isRef(args)) return unref(args) @@ -29,16 +27,16 @@ function sendToMain (channel: string, ...args: any[]) { ipcRenderer.send(channel, ...getRawData(args)) } -function sendRPC (action: IRPCActionType, ...args: any[]): void { - ipcRenderer.send(RPC_ACTIONS, action, getRawData(args)) +function sendRPC (action: string, ...args: any[]): void { + ipcRenderer.send('RPC_ACTIONS', action, getRawData(args)) } -async function triggerRPC (action: IRPCActionType, ...args: any[]): Promise { - return await ipcRenderer.invoke(RPC_ACTIONS_INVOKE, action, getRawData(args)) +async function triggerRPC (action: string, ...args: any[]): Promise { + return await ipcRenderer.invoke('RPC_ACTIONS_INVOKE', action, getRawData(args)) } -function sendRpcSync (action: IRPCActionType, ...args: any[]): any { - return ipcRenderer.sendSync(RPC_ACTIONS, action, getRawData(args)) +function sendRpcSync (action: string, ...args: any[]): any { + return ipcRenderer.sendSync('RPC_ACTIONS', action, getRawData(args)) } try { diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 550c170c..f45ebf9d 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -4,6 +4,7 @@ :key="pageReloadCount" > + @@ -11,11 +12,12 @@ import type { IConfig } from 'piclist' import { onBeforeMount, onMounted } from 'vue' +import UIServiceProvider from '@/components/ui/UIServiceProvider.vue' import { useStore } from '@/hooks/useStore' import { getConfig } from '@/utils/dataSender' import { pageReloadCount } from '@/utils/global' -import { useAppStore } from './hooks/appStore' +import { useAppStore } from './hooks/useAppStore' const store = useStore() const appStore = useAppStore() diff --git a/src/renderer/apis/allApi.ts b/src/renderer/apis/allApi.ts index 1ee6df5d..8edd4b46 100644 --- a/src/renderer/apis/allApi.ts +++ b/src/renderer/apis/allApi.ts @@ -1,6 +1,6 @@ import { getRawData } from '@/utils/common' -import { IRPCActionType } from '#/types/enum' -import { IStringKeyMap } from '#/types/types' +import { IRPCActionType } from '@/utils/enum' +import type { IStringKeyMap } from '#/types/types' export default class ALLApi { static async delete (configMap: IStringKeyMap): Promise { diff --git a/src/renderer/components/ConfigForm.vue b/src/renderer/components/ConfigForm.vue index f13a0a34..a288252c 100644 --- a/src/renderer/components/ConfigForm.vue +++ b/src/renderer/components/ConfigForm.vue @@ -110,7 +110,7 @@ import { reactive, ref, toRefs, watch } from 'vue' import { useRoute } from 'vue-router' import { getConfig } from '@/utils/dataSender' -import { IPicGoPluginConfig, IStringKeyMap } from '#/types/types' +import type { IPicGoPluginConfig, IStringKeyMap } from '#/types/types' interface IProps { config: any[] diff --git a/src/renderer/components/ConfigFormForPlugin.vue b/src/renderer/components/ConfigFormForPlugin.vue index 238279b1..41543463 100644 --- a/src/renderer/components/ConfigFormForPlugin.vue +++ b/src/renderer/components/ConfigFormForPlugin.vue @@ -83,7 +83,7 @@ import { cloneDeep, union } from 'lodash-es' import { reactive, ref, watch } from 'vue' import { getConfig } from '@/utils/dataSender' -import { IPicGoPluginConfig, IStringKeyMap } from '#/types/types' +import type { IPicGoPluginConfig, IStringKeyMap } from '#/types/types' interface IProps { config: any[] diff --git a/src/renderer/components/ImagePreSign.vue b/src/renderer/components/ImagePreSign.vue index a5b752a4..eda9ef50 100644 --- a/src/renderer/components/ImagePreSign.vue +++ b/src/renderer/components/ImagePreSign.vue @@ -24,7 +24,7 @@ import { Loading } from '@element-plus/icons-vue' import { computed, onMounted, ref, watch } from 'vue' import { getFileIconPath } from '@/manage/utils/common' -import { IRPCActionType } from '#/types/enum' +import { IRPCActionType } from '@/utils/enum' const preSignedUrl = ref('') diff --git a/src/renderer/components/ImagePreSignTsx.tsx b/src/renderer/components/ImagePreSignTsx.tsx index 599611fb..e245ae66 100644 --- a/src/renderer/components/ImagePreSignTsx.tsx +++ b/src/renderer/components/ImagePreSignTsx.tsx @@ -3,7 +3,7 @@ import { ElIcon, ElImage } from 'element-plus' import { computed, defineComponent, onMounted, ref, watch } from 'vue' import { getFileIconPath } from '@/manage/utils/common' -import { IRPCActionType } from '#/types/enum' +import { IRPCActionType } from '@/utils/enum' export default defineComponent({ props: { diff --git a/src/renderer/components/ImageProcessSetting.vue b/src/renderer/components/ImageProcessSetting.vue index 2c850de4..229c733e 100644 --- a/src/renderer/components/ImageProcessSetting.vue +++ b/src/renderer/components/ImageProcessSetting.vue @@ -511,8 +511,8 @@ import type { IBuildInCompressOptions, IBuildInWaterMarkOptions } from 'piclist' import { computed, onBeforeMount, reactive, ref, toRaw } from 'vue' import { useI18n } from 'vue-i18n' +import { configPaths } from '@/utils/configPaths' import { getConfig, saveConfig } from '@/utils/dataSender' -import { configPaths } from '#/utils/configPaths' const { t } = useI18n() const imageProcessDialogVisible = defineModel() diff --git a/src/renderer/components/ImageWebdav.vue b/src/renderer/components/ImageWebdav.vue index bd11f87a..7c1d1133 100644 --- a/src/renderer/components/ImageWebdav.vue +++ b/src/renderer/components/ImageWebdav.vue @@ -25,7 +25,7 @@ import { computed, onMounted, ref, watch } from 'vue' import { getFileIconPath } from '@/manage/utils/common' import { getAuthHeader } from '@/manage/utils/digestAuth' -import { formatEndpoint } from '#/utils/common' +import { formatEndpoint } from '@/utils/common' const base64Url = ref('') const success = ref(false) diff --git a/src/renderer/components/ImageWebdavTsx.tsx b/src/renderer/components/ImageWebdavTsx.tsx index 33642281..0b677cfb 100644 --- a/src/renderer/components/ImageWebdavTsx.tsx +++ b/src/renderer/components/ImageWebdavTsx.tsx @@ -4,7 +4,7 @@ import { computed, defineComponent, onMounted, ref, watch } from 'vue' import { getFileIconPath } from '@/manage/utils/common' import { getAuthHeader } from '@/manage/utils/digestAuth' -import { formatEndpoint } from '#/utils/common' +import { formatEndpoint } from '@/utils/common' export default defineComponent({ props: { diff --git a/src/renderer/components/InputBoxDialog.vue b/src/renderer/components/InputBoxDialog.vue index 65236103..ee44c87a 100644 --- a/src/renderer/components/InputBoxDialog.vue +++ b/src/renderer/components/InputBoxDialog.vue @@ -32,8 +32,8 @@ import type { IpcRendererEvent } from 'electron' import { onBeforeMount, onBeforeUnmount, reactive, ref } from 'vue' import $bus from '@/utils/bus' -import { SHOW_INPUT_BOX, SHOW_INPUT_BOX_RESPONSE } from '#/events/constants' -import { IShowInputBoxOption } from '#/types/types' +import { SHOW_INPUT_BOX, SHOW_INPUT_BOX_RESPONSE } from '@/utils/constant' +import type { IShowInputBoxOption } from '#/types/types' const inputBoxValue = ref('') const showInputBoxVisible = ref(false) diff --git a/src/renderer/components/NavigationPage.vue b/src/renderer/components/NavigationPage.vue index e5551276..58109c48 100644 --- a/src/renderer/components/NavigationPage.vue +++ b/src/renderer/components/NavigationPage.vue @@ -218,14 +218,14 @@ import { pick } from 'lodash-es' import { BadgeInfoIcon, CheckIcon, ChevronDownIcon, CopyIcon, DatabaseIcon, FolderIcon, PieChartIcon, PlugIcon, Settings, UploadIcon } from 'lucide-vue-next' import QrcodeVue from 'qrcode.vue' import pkg from 'root/package.json' -import { SHOW_MAIN_PAGE_QRCODE } from 'root/src/universal/events/constants' import { computed, nextTick, onBeforeMount, reactive, Ref, ref, watch } from 'vue' import { useI18n } from 'vue-i18n' import * as config from '@/router/config' +import { SHOW_MAIN_PAGE_QRCODE } from '@/utils/constant' import { getConfig } from '@/utils/dataSender' +import { IRPCActionType } from '@/utils/enum' import { picBedGlobal, updatePicBedGlobal } from '@/utils/global' -import { IRPCActionType } from '#/types/enum' import ThemeSwitcher from './ui/ThemeSwitcher.vue' const version = ref(pkg.version) diff --git a/src/renderer/components/ToolboxHandler.vue b/src/renderer/components/ToolboxHandler.vue index f9fbd6bd..b5b0b9eb 100644 --- a/src/renderer/components/ToolboxHandler.vue +++ b/src/renderer/components/ToolboxHandler.vue @@ -11,10 +11,9 @@ + + + + diff --git a/src/renderer/components/ui/MessageToast.vue b/src/renderer/components/ui/MessageToast.vue new file mode 100644 index 00000000..628b885a --- /dev/null +++ b/src/renderer/components/ui/MessageToast.vue @@ -0,0 +1,260 @@ + + + + + + + diff --git a/src/renderer/components/ui/ThemeSwitcher.vue b/src/renderer/components/ui/ThemeSwitcher.vue index 1fae419f..8895eb3c 100644 --- a/src/renderer/components/ui/ThemeSwitcher.vue +++ b/src/renderer/components/ui/ThemeSwitcher.vue @@ -3,7 +3,7 @@ import { Monitor, Moon, Sun } from 'lucide-vue-next' import { computed } from 'vue' import { useI18n } from 'vue-i18n' -import { useAppStore } from '@/hooks/appStore' +import { useAppStore } from '@/hooks/useAppStore' const { t } = useI18n() const appStore = useAppStore() diff --git a/src/renderer/components/ui/TitleBar.vue b/src/renderer/components/ui/TitleBar.vue index 6278f974..ba954adc 100644 --- a/src/renderer/components/ui/TitleBar.vue +++ b/src/renderer/components/ui/TitleBar.vue @@ -78,7 +78,7 @@ import type { IpcRendererEvent } from 'electron' import { MinusIcon, PinIcon, ShrinkIcon, XIcon } from 'lucide-vue-next' import { onBeforeMount, onBeforeUnmount, ref } from 'vue' -import { IRPCActionType } from '#/types/enum' +import { IRPCActionType } from '@/utils/enum' const isShowprogress = ref(false) const progress = ref(0) diff --git a/src/renderer/components/ui/UIServiceProvider.vue b/src/renderer/components/ui/UIServiceProvider.vue new file mode 100644 index 00000000..463e2b0b --- /dev/null +++ b/src/renderer/components/ui/UIServiceProvider.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/renderer/composables/useConfirm.ts b/src/renderer/composables/useConfirm.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/renderer/composables/useMessage.ts b/src/renderer/composables/useMessage.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/renderer/hooks/useATagClick.ts b/src/renderer/hooks/useATagClick.ts index 1bddee4b..7d3c1462 100644 --- a/src/renderer/hooks/useATagClick.ts +++ b/src/renderer/hooks/useATagClick.ts @@ -1,6 +1,7 @@ -import { IRPCActionType } from 'root/src/universal/types/enum' import { onMounted, onUnmounted } from 'vue' +import { IRPCActionType } from '@/utils/enum' + export function useATagClick () { const handleATagClick = (e: MouseEvent) => { if (e.target instanceof HTMLAnchorElement) { diff --git a/src/renderer/hooks/appStore.ts b/src/renderer/hooks/useAppStore.ts similarity index 93% rename from src/renderer/hooks/appStore.ts rename to src/renderer/hooks/useAppStore.ts index 9aa10424..e323677d 100644 --- a/src/renderer/hooks/appStore.ts +++ b/src/renderer/hooks/useAppStore.ts @@ -1,7 +1,7 @@ import { defineStore } from 'pinia' import { ref } from 'vue' -import { IStringKeyMap } from '#/types/types' +import type { IStringKeyMap } from '#/types/types' export const useAppStore = defineStore('app', () => { const settings = ref({ diff --git a/src/renderer/hooks/useConfirm.ts b/src/renderer/hooks/useConfirm.ts new file mode 100644 index 00000000..3ab6bdb7 --- /dev/null +++ b/src/renderer/hooks/useConfirm.ts @@ -0,0 +1,38 @@ +import { ref } from 'vue' + +export interface ConfirmOptions { + title?: string + message: string + type?: 'info' | 'success' | 'warning' | 'error' + confirmButtonText?: string + cancelButtonText?: string + showClose?: boolean + center?: boolean +} + +interface ConfirmService { + confirm: (options: ConfirmOptions) => Promise +} + +const confirmServiceRef = ref(null) + +export function useConfirm () { + const setConfirmService = (service: ConfirmService) => { + confirmServiceRef.value = service + } + + const confirm = (options: ConfirmOptions): Promise => { + if (confirmServiceRef.value) { + return confirmServiceRef.value.confirm(options) + } + console.warn('Confirm service not initialized') + return Promise.resolve(false) + } + + return { + setConfirmService, + confirm + } +} + +export default useConfirm diff --git a/src/renderer/hooks/useMessage.ts b/src/renderer/hooks/useMessage.ts new file mode 100644 index 00000000..f469c5a1 --- /dev/null +++ b/src/renderer/hooks/useMessage.ts @@ -0,0 +1,60 @@ +import { ref } from 'vue' + +import type { MessageOptions } from '@/components/ui/MessageToast.vue' + +interface MessageService { + success: (message: string, options?: Partial) => string + error: (message: string, options?: Partial) => string + warning: (message: string, options?: Partial) => string + info: (message: string, options?: Partial) => string +} + +const messageServiceRef = ref(null) + +export function useMessage () { + const setMessageService = (service: MessageService) => { + messageServiceRef.value = service + } + + const success = (message: string, options?: Partial) => { + if (messageServiceRef.value) { + return messageServiceRef.value.success(message, options) + } + console.warn('Message service not initialized') + return '' + } + + const error = (message: string, options?: Partial) => { + if (messageServiceRef.value) { + return messageServiceRef.value.error(message, options) + } + console.warn('Message service not initialized') + return '' + } + + const warning = (message: string, options?: Partial) => { + if (messageServiceRef.value) { + return messageServiceRef.value.warning(message, options) + } + console.warn('Message service not initialized') + return '' + } + + const info = (message: string, options?: Partial) => { + if (messageServiceRef.value) { + return messageServiceRef.value.info(message, options) + } + console.warn('Message service not initialized') + return '' + } + + return { + setMessageService, + success, + error, + warning, + info + } +} + +export default useMessage diff --git a/src/renderer/i18n/index.ts b/src/renderer/i18n/index.ts index 1a38494d..0c293cc4 100644 --- a/src/renderer/i18n/index.ts +++ b/src/renderer/i18n/index.ts @@ -1,4 +1,4 @@ -import { IRPCActionType } from '#/types/enum' +import { IRPCActionType } from '@/utils/enum' export function setCurrentLanguage (lang: string) { window.electron.sendRPC(IRPCActionType.SET_CURRENT_LANGUAGE, lang) diff --git a/src/renderer/i18n/locales/en.json b/src/renderer/i18n/locales/en.json index 000eca9d..f476c2a3 100644 --- a/src/renderer/i18n/locales/en.json +++ b/src/renderer/i18n/locales/en.json @@ -128,6 +128,50 @@ "isResizeByPercentHint": "Higher priority", "resizePercent": "Resize Percentage (Enter 50 for 50%)" } + }, + "settings": { + "title": "Settings", + "description": "Configure the PicList application", + "docs": "Documentation", + "clickToSet": "Click to set", + "system": { + "title": "General", + "languageAndAppearance": "Language and Appearance", + "chooseLanguage": "Choose Language", + "startMode": "Startup Mode", + "quietMode": "Quiet Mode", + "miniMode": "Mini Window", + "mainMode": "Main Window", + "noTrayMode": "Hide Tray", + "windowBehavior": "Window Behavior", + "isHideDock": "Hide Dock Icon", + "mainWindowSize": "Set Main Window Size (Requires Restart)", + "autoCloseMiniWindow": "Close Mini Window when Opening Main Window", + "autoCloseMainWindow": "Close Main Window when Opening Mini Window", + "miniWindowOnTop": "Mini Window Always on Top", + "isCustomMiniIcon": "Custom Mini Window Icon", + "customMiniIconPath": "Custom Mini Window Icon Path", + "startupAndShortcuts": "Startup and Shortcuts", + "autoLaunch": "Auto Launch", + "setShortCuts": "Set Shortcuts" + }, + "sync": { + "title": "Configuration/Sync", + "syncConfiguration": "Sync Configuration", + "syncEndpointConfig": "Sync Endpoint Configuration", + "upDownloadSettings": "Upload/Download Settings", + "migrateFromPicGo": "Migrate from PicGo", + "fileManagement": "File Management" + }, + "upload": { + "title": "Upload" + }, + "advanced": { + "title": "Advanced" + }, + "update": { + "title": "Update" + } } }, "OPEN_MAIN_WINDOW": "Open Main Window", @@ -145,15 +189,8 @@ "TOOLBOX_RE_SCAN": "Re scanning", "TOOLBOX_START_FIX": "Start fixing", "TOOLBOX_SUCCESS_TIPS": "Congratulations, no problems were found", - "MANUAL_PAGE_OPEN_TIP": "Please select the way to open the manual", - "MANUAL_PAGE_OPEN_TIP_TITLE": "Tips", - "MANUAL_PAGE_OPEN_BY_BROWSER": "Browser", - "MANUAL_PAGE_OPEN_BY_BUILD_IN": "Built-in Window", - "MANUAL_PAGE_OPEN_SETTING_TIP": "Select the way to open the manual", "UPLOAD_VIEW_HINT": "Click to open picbeds settings", "REFRESH": "Refresh", - "MANUAL": "Manual", - "PICLIST_SETTINGS": "Settings", "PLUGIN_SETTINGS": "Plugins", "CHOOSE_PICBED": "Choose Picbed", "COPY_PICBED_CONFIG": "Copy Picbed Config", @@ -191,11 +228,6 @@ "SETTINGS_MIGRATE_FROM_PICGO_CONTENT": "Migrate from PicGo will overwrite your current settings and gallery, do you want to continue?", "SETTINGS_MIGRATE_FROM_PICGO_SUCCESS": "Import succeed, please restart PicList", "SETTINGS_MIGRATE_FROM_PICGO_FAILED": "Import failed", - "SETTINGS_START_MODE": "Default Start Mode", - "SETTINGS_START_MODE_MINI": "Mini Window", - "SETTINGS_START_MODE_MAIN": "Main Window", - "SETTINGS_START_MODE_NO_TRAY": "No Tray", - "SETTINGS_START_MODE_QUIET": "Quiet Mode", "SETTINGS_CLICK_TO_OPEN": "Click to Open", "SETTINGS_SET_LOG_FILE": "Set Log File", "SETTINGS_CLICK_TO_SET": "Click to Set", @@ -354,11 +386,6 @@ "SETTINGS_SYNC_MANAGE_CONFIG": "Manage configuration", "SETTINGS_AUTO_IMPORT": "Auto import config in manage page", "SETTINGS_AUTO_IMPORT_SELECT_PICBED": "Select picbed", - "SETTINGS_TAB_SYSTEM": "System", - "SETTINGS_TAB_SYNC_CONFIG": "Configuration", - "SETTINGS_TAB_UPLOAD": "Upload", - "SETTINGS_TAB_ADVANCED": "Advanced", - "SETTINGS_TAB_UPDATE": "Update", "BUILTIN_CLIPBOARD_TIPS": "Use builtin clipboard function to upload instead of using scripts", "SHORTCUT_NAME": "Shortcut Name", "SHORTCUT_BIND": "Shortcut Binding", diff --git a/src/renderer/i18n/locales/zh-CN.json b/src/renderer/i18n/locales/zh-CN.json index 2e35ab6f..b5a92729 100644 --- a/src/renderer/i18n/locales/zh-CN.json +++ b/src/renderer/i18n/locales/zh-CN.json @@ -128,6 +128,55 @@ "isResizeByPercentHint": "优先级更高", "resizePercent": "调整比例 (输入 50 表示 50%)" } + }, + "settings": { + "title": "设置", + "description": "配置 PicList 应用程序", + "docs": "文档", + "clickToSet": "点击设置", + "clickToOpen": "点击打开", + "system": { + "title": "通用", + "languageAndAppearance": "语言和外观", + "chooseLanguage": "选择语言", + "startMode": "启动模式", + "quietMode": "静默模式", + "miniMode": "迷你窗口", + "mainMode": "主窗口", + "noTrayMode": "隐藏托盘", + "windowBehavior": "窗口行为", + "isHideDock": "是否隐藏 Dock 图标", + "mainWindowSize": "设置主窗口大小(需重启)", + "autoCloseMiniWindow": "打开主窗口时关闭迷你窗口", + "autoCloseMainWindow": "打开迷你窗口时关闭主窗口", + "miniWindowOnTop": "迷你窗口置顶", + "isCustomMiniIcon": "是否自定义迷你窗口图标", + "customMiniIconPath": "自定义迷你窗口图标路径", + "startupAndShortcuts": "启动和快捷键", + "autoLaunch": "开机自启", + "setShortCuts": "设置快捷键" + }, + "sync": { + "title": "配置/同步", + "syncConfiguration": "同步配置", + "syncEndpointConfig": "同步方案配置", + "upDownloadSettings": "上传下载配置文件", + "migrateFromPicGo": "从PicGo迁移", + "fileManagement": "文件管理", + "openConfigFile": "打开配置文件", + "openConfigFileDir": "打开配置文件目录", + "autoImportInManage": "管理页面自动导入配置" + }, + "upload": { + "title": "上传", + "uploadBehavior": "上传行为" + }, + "advanced": { + "title": "高级" + }, + "update": { + "title": "更新" + } } }, "OPEN_MAIN_WINDOW": "打开主窗口", @@ -145,15 +194,8 @@ "TOOLBOX_RE_SCAN": "重新扫描", "TOOLBOX_START_FIX": "开始修复", "TOOLBOX_SUCCESS_TIPS": "恭喜你,没有检查出问题", - "MANUAL_PAGE_OPEN_TIP": "请选择打开方式", - "MANUAL_PAGE_OPEN_TIP_TITLE": "Tips", - "MANUAL_PAGE_OPEN_BY_BROWSER": "浏览器", - "MANUAL_PAGE_OPEN_BY_BUILD_IN": "内置窗口", - "MANUAL_PAGE_OPEN_SETTING_TIP": "选择手册打开方式", "UPLOAD_VIEW_HINT": "点击打开图床设置", "REFRESH": "刷新", - "MANUAL": "手册", - "PICLIST_SETTINGS": "设置", "PLUGIN_SETTINGS": "插件", "CHOOSE_PICBED": "选择图床", "COPY_PICBED_CONFIG": "复制图床配置", @@ -191,11 +233,6 @@ "SETTINGS_MIGRATE_FROM_PICGO_CONTENT": "即将导入PicGo的配置文件和相册, 这将覆盖当前的配置文件和相册, 是否继续?", "SETTINGS_MIGRATE_FROM_PICGO_SUCCESS": "导入成功, 请重启PicList生效", "SETTINGS_MIGRATE_FROM_PICGO_FAILED": "导入失败", - "SETTINGS_START_MODE": "启动模式", - "SETTINGS_START_MODE_MINI": "mini窗口", - "SETTINGS_START_MODE_MAIN": "主窗口", - "SETTINGS_START_MODE_NO_TRAY": "隐藏托盘", - "SETTINGS_START_MODE_QUIET": "静默启动", "SETTINGS_CLICK_TO_OPEN": "点击打开", "SETTINGS_SET_LOG_FILE": "设置日志文件", "SETTINGS_CLICK_TO_SET": "点击设置", @@ -355,11 +392,6 @@ "SETTINGS_SYNC_MANAGE_CONFIG": "管理配置", "SETTINGS_AUTO_IMPORT": "管理页面自动导入配置", "SETTINGS_AUTO_IMPORT_SELECT_PICBED": "选择需要开启自动导入的图床", - "SETTINGS_TAB_SYSTEM": "系统设置", - "SETTINGS_TAB_SYNC_CONFIG": "同步与配置", - "SETTINGS_TAB_UPLOAD": "上传设置", - "SETTINGS_TAB_ADVANCED": "高级设置", - "SETTINGS_TAB_UPDATE": "更新", "SHORTCUT_NAME": "快捷键名称", "SHORTCUT_BIND": "快捷键绑定", "SHORTCUT_STATUS": "状态", diff --git a/src/renderer/i18n/locales/zh-TW.json b/src/renderer/i18n/locales/zh-TW.json index e632b954..c9926b03 100644 --- a/src/renderer/i18n/locales/zh-TW.json +++ b/src/renderer/i18n/locales/zh-TW.json @@ -128,6 +128,50 @@ "isResizeByPercentHint": "優先級更高", "resizePercent": "調整比例 (輸入 50 表示 50%)" } + }, + "settings": { + "title": "設定", + "description": "配置 PicList 應用程序", + "docs": "文檔", + "clickToSet": "點擊設置", + "system": { + "title": "通用", + "languageAndAppearance": "語言和外觀", + "chooseLanguage": "選擇語言", + "startMode": "啟動模式", + "quietMode": "靜默模式", + "miniMode": "迷你窗口", + "mainMode": "主窗口", + "noTrayMode": "隱藏托盤", + "windowBehavior": "窗口行為", + "isHideDock": "是否隱藏 Dock 圖標", + "mainWindowSize": "設置主窗口大小(需重啟)", + "autoCloseMiniWindow": "打開主窗口時關閉迷你窗口", + "autoCloseMainWindow": "打開迷你窗口時關閉主窗口", + "miniWindowOnTop": "迷你窗口置頂", + "isCustomMiniIcon": "是否自定義迷你窗口圖標", + "customMiniIconPath": "自定義迷你窗口圖標路徑", + "startupAndShortcuts": "啟動和快捷鍵", + "autoLaunch": "開機自啟", + "setShortCuts": "設置快捷鍵" + }, + "sync": { + "title": "配置/同步", + "syncConfiguration": "同步配置", + "syncEndpointConfig": "同步方案配置", + "upDownloadSettings": "上傳下載配置文件", + "migrateFromPicGo": "從PicGo遷移", + "fileManagement": "文件管理" + }, + "upload": { + "title": "上傳" + }, + "advanced": { + "title": "高級" + }, + "update": { + "title": "更新" + } } }, "OPEN_MAIN_WINDOW": "打開主視窗", @@ -145,15 +189,8 @@ "TOOLBOX_RE_SCAN": "重新掃描", "TOOLBOX_START_FIX": "開始修復", "TOOLBOX_SUCCESS_TIPS": "恭喜你,沒有檢查出問題", - "MANUAL_PAGE_OPEN_TIP": "請選擇打開方式", - "MANUAL_PAGE_OPEN_TIP_TITLE": "Tips", - "MANUAL_PAGE_OPEN_BY_BROWSER": "瀏覽器", - "MANUAL_PAGE_OPEN_BY_BUILD_IN": "內置窗口", - "MANUAL_PAGE_OPEN_SETTING_TIP": "選擇打開手冊方式", "UPLOAD_VIEW_HINT": "點擊打開圖床設定", "REFRESH": "刷新", - "MANUAL": "手冊", - "PICLIST_SETTINGS": "設定", "PLUGIN_SETTINGS": "插件", "CHOOSE_PICBED": "選擇圖床", "COPY_PICBED_CONFIG": "複製圖床設定", @@ -191,11 +228,6 @@ "SETTINGS_MIGRATE_FROM_PICGO_CONTENT": "即將導入PicGo的設定文件和相冊, 這將會覆蓋當前的設定, 是否繼續?", "SETTINGS_MIGRATE_FROM_PICGO_SUCCESS": "導入成功, 請重啟應用", "SETTINGS_MIGRATE_FROM_PICGO_FAILED": "導入失敗", - "SETTINGS_START_MODE": "啟動模式", - "SETTINGS_START_MODE_MINI": "mini視窗", - "SETTINGS_START_MODE_MAIN": "主視窗", - "SETTINGS_START_MODE_QUIET": "靜默啟動", - "SETTINGS_START_MODE_NO_TRAY": "隐藏托盘", "SETTINGS_CLICK_TO_OPEN": "點擊打開", "SETTINGS_SET_LOG_FILE": "設定記錄檔案", "SETTINGS_CLICK_TO_SET": "點擊設定", @@ -355,11 +387,6 @@ "SETTINGS_SYNC_MANAGE_CONFIG": "管理配置", "SETTINGS_AUTO_IMPORT": "管理頁面自動導入配置", "SETTINGS_AUTO_IMPORT_SELECT_PICBED": "選擇需要開啟自動導入的圖床", - "SETTINGS_TAB_SYSTEM": "系統設置", - "SETTINGS_TAB_SYNC_CONFIG": "同步與配置", - "SETTINGS_TAB_UPLOAD": "上傳設置", - "SETTINGS_TAB_ADVANCED": "高級設置", - "SETTINGS_TAB_UPDATE": "更新", "SHORTCUT_NAME": "快捷鍵名稱", "SHORTCUT_BIND": "快捷鍵綁定", "SHORTCUT_STATUS": "狀態", diff --git a/src/renderer/main.ts b/src/renderer/main.ts index e25749d7..0191c739 100644 --- a/src/renderer/main.ts +++ b/src/renderer/main.ts @@ -22,7 +22,7 @@ import router from '@/router' import { store } from '@/store' import db from '@/utils/db' -type MessageSchema = typeof en +type MessageSchema = typeof zhCN window.electron.setVisualZoomLevelLimits(1, 1) @@ -33,7 +33,7 @@ app.config.globalProperties.triggerRPC = window.electron.triggerRPC app.config.globalProperties.sendRPC = window.electron.sendRPC app.config.globalProperties.sendToMain = window.electron.sendToMain -const i18n = createI18n({ +const i18n = createI18n<[MessageSchema], 'en' | 'zh-CN' | 'zh-TW'>({ legacy: false, locale: localStorage.getItem('currentLanguage') || 'zh-CN', fallbackLocale: 'zh-CN', diff --git a/src/renderer/manage/pages/BucketPage.vue b/src/renderer/manage/pages/BucketPage.vue index 7e18e351..15b72294 100644 --- a/src/renderer/manage/pages/BucketPage.vue +++ b/src/renderer/manage/pages/BucketPage.vue @@ -1589,11 +1589,11 @@ import { import { getConfig, saveConfig } from '@/manage/utils/dataSender' import { textFileExt } from '@/manage/utils/textfile' import { videoExt } from '@/manage/utils/videofile' -import { IRPCActionType } from '#/types/enum' -import { IDownloadTask, IUploadTask } from '#/types/manage' -import { IStringKeyMap } from '#/types/types' -import { trimPath } from '#/utils/common' -import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '#/utils/static' +import { trimPath } from '@/utils/common' +import { IRPCActionType } from '@/utils/enum' +import { cancelDownloadLoadingFileList, refreshDownloadFileTransferList } from '@/utils/static' +import type { IDownloadTask, IUploadTask } from '#/types/manage' +import type { IStringKeyMap } from '#/types/types' const { t } = useI18n() /* diff --git a/src/renderer/manage/pages/LogInPage.vue b/src/renderer/manage/pages/LogInPage.vue index 5738851c..296e6b18 100644 --- a/src/renderer/manage/pages/LogInPage.vue +++ b/src/renderer/manage/pages/LogInPage.vue @@ -273,10 +273,10 @@ import { useManageStore } from '@/manage/store/manageStore' import { formObjToTableData } from '@/manage/utils/common' import { supportedPicBedList } from '@/manage/utils/constants' import { getConfig, removeConfig, saveConfig } from '@/manage/utils/dataSender' +import { formatEndpoint, isNeedToShorten, safeSliceF } from '@/utils/common' import { getConfig as getPicBedsConfig } from '@/utils/dataSender' -import { IRPCActionType } from '#/types/enum' -import { IStringKeyMap, IUploaderConfigListItem } from '#/types/types' -import { formatEndpoint, isNeedToShorten, safeSliceF } from '#/utils/common' +import { IRPCActionType } from '@/utils/enum' +import type { IStringKeyMap, IUploaderConfigListItem } from '#/types/types' const { t } = useI18n() const manageStore = useManageStore() diff --git a/src/renderer/manage/pages/ManageMain.vue b/src/renderer/manage/pages/ManageMain.vue index e79ddfcb..c9d6fc79 100644 --- a/src/renderer/manage/pages/ManageMain.vue +++ b/src/renderer/manage/pages/ManageMain.vue @@ -279,7 +279,6 @@ import { Tools } from '@element-plus/icons-vue' import { ElNotification } from 'element-plus' -import { IRPCActionType } from 'root/src/universal/types/enum' import { computed, onBeforeMount, reactive, ref, watch } from 'vue' import { useI18n } from 'vue-i18n' import { useRoute, useRouter } from 'vue-router' @@ -287,7 +286,8 @@ import { useRoute, useRouter } from 'vue-router' import { useManageStore } from '@/manage/store/manageStore' import { supportedPicBedList } from '@/manage/utils/constants' import { newBucketConfig } from '@/manage/utils/newBucketConfig' -import { IStringKeyMap } from '#/types/types' +import { IRPCActionType } from '@/utils/enum' +import type { IStringKeyMap } from '#/types/types' const { t } = useI18n() const manageStore = useManageStore() as any diff --git a/src/renderer/manage/pages/ManageSetting.vue b/src/renderer/manage/pages/ManageSetting.vue index bbb8dd31..b726a76c 100644 --- a/src/renderer/manage/pages/ManageSetting.vue +++ b/src/renderer/manage/pages/ManageSetting.vue @@ -225,7 +225,6 @@ - + + diff --git a/src/renderer/pages/Plugin.vue b/src/renderer/pages/Plugin.vue index 911fb7f3..62a9f729 100644 --- a/src/renderer/pages/Plugin.vue +++ b/src/renderer/pages/Plugin.vue @@ -239,18 +239,18 @@ import { computed, onBeforeMount, onBeforeUnmount, onMounted, reactive, ref, toR import { useI18n } from 'vue-i18n' import ConfigForm from '@/components/ConfigFormForPlugin.vue' -import { getConfig, saveConfig } from '@/utils/dataSender' -import { osGlobal, updatePicBedGlobal } from '@/utils/global' +import { handleStreamlinePluginName } from '@/utils/common' +import { configPaths } from '@/utils/configPaths' import { PICGO_CONFIG_PLUGIN, PICGO_HANDLE_PLUGIN_DONE, PICGO_HANDLE_PLUGIN_ING, PICGO_TOGGLE_PLUGIN -} from '#/events/constants' -import { IRPCActionType } from '#/types/enum' -import { INPMSearchResultObject, IPicGoPlugin } from '#/types/types' -import { handleStreamlinePluginName } from '#/utils/common' -import { configPaths } from '#/utils/configPaths' +} from '@/utils/constant' +import { getConfig, saveConfig } from '@/utils/dataSender' +import { IRPCActionType } from '@/utils/enum' +import { osGlobal, updatePicBedGlobal } from '@/utils/global' +import type { INPMSearchResultObject, IPicGoPlugin } from '#/types/types' const { t } = useI18n() const $confirm = ElMessageBox.confirm diff --git a/src/renderer/pages/RenamePage.vue b/src/renderer/pages/RenamePage.vue index 41626185..88a72527 100644 --- a/src/renderer/pages/RenamePage.vue +++ b/src/renderer/pages/RenamePage.vue @@ -56,7 +56,7 @@ import type { IpcRendererEvent } from 'electron' import type { FormInstance } from 'element-plus' import { onBeforeMount, onBeforeUnmount, reactive, ref } from 'vue' -import { GET_RENAME_FILE_NAME, RENAME_FILE_NAME } from '#/events/constants' +import { GET_RENAME_FILE_NAME, RENAME_FILE_NAME } from '@/utils/constant' const id = ref(null) const formRef = ref() diff --git a/src/renderer/pages/ShortKey.vue b/src/renderer/pages/ShortKey.vue index 09f97e17..280b6967 100644 --- a/src/renderer/pages/ShortKey.vue +++ b/src/renderer/pages/ShortKey.vue @@ -116,11 +116,11 @@ - + diff --git a/src/renderer/pages/UploaderConfigPage.vue b/src/renderer/pages/UploaderConfigPage.vue index 76c47a8b..07bebde5 100644 --- a/src/renderer/pages/UploaderConfigPage.vue +++ b/src/renderer/pages/UploaderConfigPage.vue @@ -99,10 +99,10 @@ import { onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router' import { useStore } from '@/hooks/useStore' import { PICBEDS_PAGE, UPLOADER_CONFIG_PAGE } from '@/router/config' +import { configPaths } from '@/utils/configPaths' import { saveConfig } from '@/utils/dataSender' -import { IRPCActionType } from '#/types/enum' -import { IStringKeyMap, IUploaderConfigItem } from '#/types/types' -import { configPaths } from '#/utils/configPaths' +import { IRPCActionType } from '@/utils/enum' +import type { IStringKeyMap, IUploaderConfigItem } from '#/types/types' const { t } = useI18n() const router = useRouter() diff --git a/src/renderer/pages/css/PicgoSetting.css b/src/renderer/pages/css/PicgoSetting.css new file mode 100644 index 00000000..774ab6b9 --- /dev/null +++ b/src/renderer/pages/css/PicgoSetting.css @@ -0,0 +1,676 @@ +.piclist-settings { + padding: 1.5rem; + min-height: 100vh; + background: var(--color-background-secondary); + color: var(--color-text-primary); + overflow-y: auto; + scrollbar-width: none; + -ms-overflow-style: none; +} + +.piclist-settings::-webkit-scrollbar { + display: none; +} + +/* Header */ +.settings-header { + display: flex; + justify-content: space-between; + align-items: center; + background: var(--color-surface); + border-radius: 12px; + padding: 1.5rem; + margin-bottom: 1.5rem; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + border: 1px solid var(--color-border); +} + +.header-content { + display: flex; + align-items: center; + gap: 1rem; +} + +.header-icon { + color: var(--color-accent); +} + +.settings-header h1 { + margin: 0; + font-size: 1.5rem; + font-weight: 600; + color: var(--color-text-primary); +} + +.settings-header p { + margin: 0; + color: var(--color-text-secondary); + font-size: 0.875rem; +} + +.header-actions { + display: flex; + gap: 0.75rem; +} + +/* Tab Navigation */ +.tab-navigation { + display: flex; + background: var(--color-background-primary); + border-radius: 12px; + padding: 0.25rem; + margin-bottom: 1.5rem; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + border: 1px solid var(--color-border); +} + +.tab-button { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.75rem 1rem; + background: transparent; + border: none; + border-radius: 8px; + color: var(--color-text-secondary); + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + flex: 1; + justify-content: center; +} + +.tab-button:hover { + color: var(--color-text-primary); + background: var(--color-background-primary); +} + +.tab-button.active { + background: #409eff; + color: white; + box-shadow: 0 2px 4px rgba(64, 158, 255, 0.3); +} + +/* Settings Content */ +.settings-content { + display: flex; + flex-direction: column; +} + +.tab-content { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.settings-section { + background: var(--color-background-primary); + border-radius: 12px; + padding: 1.5rem; + box-shadow: 0 2px 8px var(--color-border); + border: 1px solid var(--color-border); +} + +.settings-section h2 { + margin: 0 0 0.5rem 0; + font-size: 1.125rem; + font-weight: 600; + color: var(--color-text-primary); +} + +.settings-section p { + margin: 0 0 1.5rem 0; + color: var(--color-text-secondary); + font-size: 0.875rem; +} + +/* Form Elements */ +.form-group { + margin-bottom: 1.5rem; +} + +.form-group:last-child { + margin-bottom: 0; +} + +.form-group > label:not(.switch-label):not(.radio-option) { + display: block; + margin-bottom: 0.5rem; + font-size: 0.875rem; + font-weight: 500; + color: var(--color-text-primary); +} + +.form-input, +.form-textarea, +.form-select { + width: 100%; + padding: 0.75rem; + border: 1px solid var(--color-border); + border-radius: 8px; + background: var(--color-background-primary); + color: var(--color-text-primary); + font-size: 0.875rem; + transition: all 0.2s ease; + box-sizing: border-box; +} + +.form-input:focus, +.form-textarea:focus, +.form-select:focus { + outline: none; + border-color: var(--color-blue-common); + box-shadow: 0 0 0 2px var(--el-color-primary-light-9, rgba(64, 158, 255, 0.2)); +} + +.form-textarea { + resize: vertical; + min-height: 80px; +} + +.form-range { + width: 100%; + height: 6px; + border-radius: 3px; + background: #e4e7ed; + outline: none; + margin-bottom: 0.5rem; + -webkit-appearance: none; + appearance: none; +} + +.form-range::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 20px; + height: 20px; + border-radius: 50%; + background: #409eff; + cursor: pointer; +} + +.form-range::-moz-range-thumb { + width: 20px; + height: 20px; + border-radius: 50%; + background: #409eff; + cursor: pointer; + border: none; +} + +.range-value { + font-size: 0.875rem; + color: var(--color-text-secondary); + text-align: center; +} + +/* Grid Layout */ +.form-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1.5rem; +} + +/* Switch Component */ +.switch-label { + display: flex; + align-items: center; + gap: 0.75rem; + cursor: pointer; + padding: 1rem; + border: 1px solid var(--color-border-secondary); + border-radius: 8px; + background: var(--color-background-tertiary); + transition: all 0.2s ease; +} + +.switch-label:hover { + background: var(--color-background-secondary); + border-color: var(--color-border); +} + +.switch-input { + position: absolute; + opacity: 0; + pointer-events: none; +} + +.switch-slider { + position: relative; + width: 44px; + height: 24px; + background: var(--color-border); + border-radius: 12px; + transition: background-color 0.3s; + flex-shrink: 0; +} + +.switch-slider::before { + content: ''; + position: absolute; + top: 2px; + left: 2px; + width: 20px; + height: 20px; + background: white; + border-radius: 50%; + transition: transform 0.3s; +} + +.switch-input:checked + .switch-slider { + background: #409eff; +} + +.switch-input:checked + .switch-slider::before { + transform: translateX(20px); +} + +.switch-content { + flex: 1; +} + +.switch-title { + font-weight: 500; + color: var(--color-text-primary); + margin-bottom: 0.25rem; +} + +.switch-description { + font-size: 0.75rem; + color: var(--color-text-secondary); +} + +/* Radio Group */ +.radio-group { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.radio-option { + display: flex; + align-items: center; + gap: 0.75rem; + cursor: pointer; + padding: 0.75rem; + border: 1px solid var(--color-border-secondary); + border-radius: 8px; + background: var(--color-background-tertiary); + transition: all 0.2s ease; +} + +.radio-option:hover { + background: var(--color-background-secondary); + border-color: var(--color-border); +} + +.radio-input { + position: absolute; + opacity: 0; + pointer-events: none; +} + +.radio-indicator { + position: relative; + width: 20px; + height: 20px; + border: 2px solid var(--color-border); + border-radius: 50%; + flex-shrink: 0; +} + +.radio-input:checked + .radio-indicator { + border-color: #409eff; +} + +.radio-input:checked + .radio-indicator::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 10px; + height: 10px; + background: #409eff; + border-radius: 50%; + transform: translate(-50%, -50%); +} + +.radio-label { + font-weight: 500; + color: var(--color-text-primary); +} + +/* Buttons */ +.btn { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.75rem 1rem; + border-radius: 8px; + border: none; + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + min-width: fit-content; +} + +.btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.btn:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +} + +.btn-primary { + background: #409eff; + color: white; +} + +.btn-primary:hover:not(:disabled) { + background: #66b1ff; +} + +.btn-secondary { + background: var(--color-background-tertiary); + color: var(--color-text-primary); + border: 1px solid var(--color-border); +} + +.btn-secondary:hover:not(:disabled) { + background: var(--color-background-secondary); +} + +.btn-danger { + background: #f56c6c; + color: white; +} + +.btn-danger:hover:not(:disabled) { + background: #f78989; +} + +/* Checkbox Group */ +.checkbox-group { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; +} + +.checkbox-option { + display: flex; + align-items: center; + gap: 0.5rem; + cursor: pointer; + padding: 0.5rem 0.75rem; + border: 1px solid var(--color-border-secondary); + border-radius: 6px; + background: var(--color-background-tertiary); + transition: all 0.2s ease; +} + +.checkbox-option:hover { + background: var(--color-background-secondary); + border-color: var(--color-border); +} + +.checkbox-input { + position: absolute; + opacity: 0; + pointer-events: none; +} + +.checkbox-indicator { + position: relative; + width: 16px; + height: 16px; + border: 2px solid var(--color-border); + border-radius: 4px; + flex-shrink: 0; +} + +.checkbox-input:checked + .checkbox-indicator { + background: #409eff; + border-color: #409eff; +} + +.checkbox-input:checked + .checkbox-indicator::after { + content: '✓'; + position: absolute; + top: 50%; + left: 50%; + color: white; + font-size: 10px; + transform: translate(-50%, -50%); +} + +.checkbox-label { + font-size: 0.875rem; + color: var(--color-text-primary); +} + +/* Input Groups */ +.input-group { + display: flex; + gap: 0.5rem; +} + +.input-group .form-input { + flex: 1; +} + +.input-addon-btn { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + border: 1px solid var(--color-border); + border-radius: 8px; + background: var(--color-background-tertiary); + color: var(--color-text-secondary); + cursor: pointer; + transition: all 0.2s ease; +} + +.input-addon-btn:hover { + background: var(--color-background-secondary); + color: var(--color-text-primary); +} + +/* Dialog Overlay */ +.dialog-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +} + +.dialog { + background: var(--color-surface); + border-radius: 12px; + padding: 1.5rem; + max-width: 500px; + width: 90%; + max-height: 80vh; + overflow-y: auto; + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15); +} + +.dialog-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; +} + +.dialog-title { + font-size: 1.25rem; + font-weight: 600; + color: var(--color-text-primary); +} + +.dialog-close { + background: none; + border: none; + font-size: 1.5rem; + cursor: pointer; + color: var(--color-text-secondary); + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 6px; + transition: all 0.2s ease; +} + +.dialog-close:hover { + background: var(--color-background-secondary); + color: var(--color-text-primary); +} + +.dialog-content { + margin-bottom: 1.5rem; +} + +.dialog-footer { + display: flex; + justify-content: flex-end; + gap: 0.75rem; +} + +.button-group { + display: flex; + gap: 0.75rem; +} + +.button-group .btn { + flex: 1; +} + +/* Notice Text */ +.notice-text { + background: rgba(64, 158, 255, 0.1); + color: #409eff; + padding: 1rem; + border-radius: 8px; + margin-bottom: 1rem; + text-align: center; + font-size: 0.875rem; +} + +/* Small text */ +small { + font-size: 0.75rem; + color: var(--color-text-secondary); +} + +/* Responsive Design */ +@media (max-width: 768px) { + .piclist-settings { + padding: 1rem; + } + + .tab-navigation { + flex-direction: column; + } + + .tab-button { + justify-content: flex-start; + } + + .form-grid { + grid-template-columns: 1fr; + } + + .dialog { + width: 95%; + margin: 1rem; + } +} + +/* Dark mode adjustments */ +:root.dark .piclist-settings, +:root.auto.dark .piclist-settings { + background: var(--color-background-primary); +} + +:root.dark .settings-header, +:root.dark .tab-navigation, +:root.dark .settings-section, +:root.auto.dark .settings-header, +:root.auto.dark .tab-navigation, +:root.auto.dark .settings-section { + background: var(--color-background-tertiary); + border-color: var(--color-border); +} + +:root.dark .form-input, +:root.dark .form-textarea, +:root.dark .form-select, +:root.auto.dark .form-input, +:root.auto.dark .form-textarea, +:root.auto.dark .form-select { + background: var(--color-background-tertiary); + border-color: var(--color-border); + color: var(--color-text-primary); +} + +:root.dark .switch-slider::before, +:root.auto.dark .switch-slider::before { + background: var(--color-surface); +} + +:root.dark .btn-secondary, +:root.auto.dark .btn-secondary { + background: var(--color-background-tertiary); + border-color: var(--color-border); + color: var(--color-text-primary); +} + +:root.dark .btn-secondary:hover, +:root.auto.dark .btn-secondary:hover { + background: var(--color-background-secondary); +} + +:root.dark .switch-label, +:root.auto.dark .switch-label { + background: var(--color-background-tertiary); + border-color: var(--color-border); +} + +:root.dark .switch-label:hover, +:root.auto.dark .switch-label:hover { + background: var(--color-background-secondary); +} + +:root.dark .radio-option, +:root.dark .checkbox-option, +:root.auto.dark .radio-option, +:root.auto.dark .checkbox-option { + background: var(--color-background-tertiary); + border-color: var(--color-border); +} + +:root.dark .radio-option:hover, +:root.dark .checkbox-option:hover, +:root.auto.dark .radio-option:hover, +:root.auto.dark .checkbox-option:hover { + background: var(--color-background-secondary); +} + +:root.dark .dialog, +:root.auto.dark .dialog { + background: var(--color-background-tertiary); +} diff --git a/src/renderer/pages/css/UploadPage.css b/src/renderer/pages/css/UploadPage.css new file mode 100644 index 00000000..c65e08ef --- /dev/null +++ b/src/renderer/pages/css/UploadPage.css @@ -0,0 +1,682 @@ +/* Global scrolling behavior */ +html, body { + overflow-x: hidden; +} + +/* Container */ +.upload-container { + padding: 1rem; + width: 100%; + margin: 0; + display: flex; + flex-direction: column; + gap: 1.25rem; + min-height: 100vh; + box-sizing: border-box; + overflow-y: auto; +} + +/* Card Base */ +.upload-card { + background: var(--color-surface); + border: 1px solid var(--color-border-secondary); + border-radius: var(--radius-xl); + overflow: hidden; + transition: var(--transition-medium); + box-shadow: var(--shadow-sm); +} + +.upload-card:hover { + box-shadow: var(--shadow-md); + border-color: var(--color-border); +} + +/* Compact cards styling */ +.actions-card, +.settings-card { + border-radius: var(--radius-lg); +} + +.actions-card .card-header, +.settings-card .card-header { + padding: 0.875rem 1.25rem; +} + +/* Header Card */ +.header-card .card-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem 1.5rem; + border-bottom: 1px solid var(--color-border-secondary); + flex-wrap: wrap; + gap: 1rem; +} + +.provider-section { + flex: 1; +} + +.provider-button { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.75rem 1rem; + background: var(--color-surface-elevated); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + cursor: pointer; + transition: var(--transition-fast); + font-family: inherit; + width: auto; + min-width: 200px; + flex-shrink: 0; +} + +.provider-button:hover { + background: var(--color-surface); + border-color: var(--color-accent); + transform: translateY(-1px); + box-shadow: var(--shadow-sm); +} + +.provider-info { + display: flex; + flex-direction: column; + align-items: flex-start; + flex: 1; +} + +.provider-name { + font-size: 0.875rem; + font-weight: 600; + color: var(--color-text-primary); + line-height: 1.2; +} + +.provider-config { + font-size: 0.75rem; + color: var(--color-text-secondary); + line-height: 1.2; +} + +.provider-arrow { + color: var(--color-text-secondary); + transition: var(--transition-fast); +} + +.provider-button:hover .provider-arrow { + color: var(--color-accent); + transform: rotate(180deg); +} + +.header-actions { + display: flex; + align-items: center; + gap: 0.75rem; + flex-wrap: wrap; +} + +.action-button { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.625rem 1rem; + background: var(--color-accent); + color: white; + border: none; + border-radius: var(--radius-md); + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: var(--transition-fast); + font-family: inherit; +} + +.action-button:hover { + background: var(--color-accent-hover); + transform: translateY(-1px); + box-shadow: var(--shadow-md); +} + +.action-button.secondary { + background: var(--color-surface-elevated); + color: var(--color-text-primary); + border: 1px solid var(--color-border); +} + +.action-button.secondary:hover { + background: var(--color-surface); + border-color: var(--color-accent); + color: var(--color-accent); +} + +/* Main Upload Card */ +.main-card { + min-height: 300px; +} + +.upload-zone { + position: relative; + padding: 3rem 2rem; + cursor: pointer; + transition: var(--transition-medium); + border: 2px dashed var(--color-border); + border-radius: var(--radius-xl); + background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-background-secondary) 100%); + margin: 1rem; +} + +.upload-zone:hover, +.upload-zone.drag-active { + border-color: var(--color-accent); + background: linear-gradient(135deg, var(--color-surface-elevated) 0%, rgba(0, 122, 255, 0.05) 100%); + transform: translateY(-2px); + box-shadow: var(--shadow-lg); +} + +.upload-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 1.5rem; + text-align: center; +} + +.upload-icon { + width: 80px; + height: 80px; + border-radius: 50%; + background: linear-gradient(135deg, var(--color-accent) 0%, rgba(0, 122, 255, 0.8) 100%); + display: flex; + align-items: center; + justify-content: center; + color: white; + transition: var(--transition-medium); +} + +.upload-zone:hover .upload-icon, +.upload-zone.drag-active .upload-icon { + transform: scale(1.1); +} + +.upload-text { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.upload-title { + font-size: 1.25rem; + font-weight: 600; + color: var(--color-text-primary); + margin: 0; + letter-spacing: -0.025em; +} + +.upload-subtitle { + font-size: 0.875rem; + color: var(--color-text-secondary); + margin: 0; +} + +.upload-formats { + display: flex; + flex-direction: column; + gap: 0.25rem; + margin-top: 0.5rem; +} + +.format-label { + font-size: 0.75rem; + font-weight: 500; + color: var(--color-text-secondary); + text-transform: uppercase; + letter-spacing: 0.025em; +} + +/* Progress */ +.progress-container { + margin: 1rem 1.5rem; + padding: 1rem; + background: var(--color-surface-elevated); + border-radius: var(--radius-lg); + border: 1px solid var(--color-border-secondary); +} + +.progress-bar { + height: 6px; + background: var(--color-border-secondary); + border-radius: 3px; + overflow: hidden; + margin-bottom: 0.5rem; +} + +.progress-fill { + height: 100%; + background: linear-gradient(90deg, var(--color-accent) 0%, var(--color-primary) 100%); + border-radius: 3px; + transition: width var(--transition-medium); +} + +.progress-fill.progress-error { + background: var(--color-danger); +} + +.progress-text { + font-size: 0.875rem; + font-weight: 500; + color: var(--color-text-secondary); + text-align: center; + display: block; +} + +/* Quick Actions Card */ +.card-header { + padding: 1rem 1.5rem; + border-bottom: 1px solid var(--color-border-secondary); +} + +.card-title { + font-size: 0.9rem; + font-weight: 600; + color: var(--color-text-primary); + margin: 0; + letter-spacing: -0.025em; +} + +.quick-actions { + padding: 1rem 1.5rem; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); + gap: 0.75rem; +} + +.quick-action-button { + display: flex; + flex-direction: row; + align-items: center; + gap: 0.5rem; + padding: 0.875rem 1rem; + background: var(--color-surface-elevated); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + cursor: pointer; + transition: var(--transition-medium); + font-family: inherit; + text-align: left; +} + +.quick-action-button:hover { + background: var(--color-surface); + border-color: var(--color-accent); + transform: translateY(-2px); + box-shadow: var(--shadow-md); +} + +.quick-action-button span { + font-size: 0.8rem; + font-weight: 500; + color: var(--color-text-primary); +} + +/* Settings Card */ +.settings-content { + padding: 1.25rem 1.5rem; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.setting-group { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +@media (min-width: 768px) { + .settings-content { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1.5rem; + align-items: start; + } + + .quick-actions { + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + } +} + +@media (min-width: 1024px) { + .upload-container { + padding: 1.5rem 2rem; + max-width: 1200px; + margin: 0 auto; + } + + .quick-actions { + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + } + + .settings-content { + gap: 2rem; + } +} + +.setting-label { + font-size: 0.875rem; + font-weight: 500; + color: var(--color-text-primary); + margin: 0; +} + +.format-buttons { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(70px, 1fr)); + gap: 0.4rem; +} + +.format-button { + padding: 0.4rem 0.75rem; + background: var(--color-surface-elevated); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + font-size: 0.7rem; + font-weight: 500; + color: var(--color-text-secondary); + cursor: pointer; + transition: var(--transition-fast); + font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; +} + +.format-button:hover { + border-color: var(--color-accent); + color: var(--color-text-primary); +} + +.format-button.active { + background: var(--color-accent); + border-color: var(--color-accent); + color: white; +} + +.url-toggle { + display: flex; + background: var(--color-surface-elevated); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + overflow: hidden; + width: 100%; +} + +.toggle-button { + flex: 1; + padding: 0.625rem 0.875rem; + background: transparent; + border: none; + font-size: 0.8rem; + font-weight: 500; + color: var(--color-text-secondary); + cursor: pointer; + transition: var(--transition-fast); + font-family: inherit; +} + +.toggle-button:hover { + color: var(--color-text-primary); +} + +.toggle-button.active { + background: var(--color-accent); + color: white; +} + +.toggle-button:first-child.active { + border-top-left-radius: calc(var(--radius-md) - 1px); + border-bottom-left-radius: calc(var(--radius-md) - 1px); +} + +.toggle-button:last-child.active { + border-top-right-radius: calc(var(--radius-md) - 1px); + border-bottom-right-radius: calc(var(--radius-md) - 1px); +} + +/* Modal */ +.modal-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.5); + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; + padding: 2rem; + overflow-y: auto; +} + +.modal-container { + background: var(--color-surface); + border-radius: var(--radius-2xl); + border: 1px solid var(--color-border); + box-shadow: var(--shadow-xl); + max-width: 90vw; + width: 80vw; + height: 80vh; + max-height: 90vh; + overflow: hidden; + margin: auto; +} + +.modal-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1.5rem 2rem; + border-bottom: 1px solid var(--color-border-secondary); +} + +.modal-title { + font-size: 1.25rem; + font-weight: 600; + color: var(--color-text-primary); + margin: 0; +} + +.modal-close { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + background: var(--color-surface-elevated); + border: 1px solid var(--color-border); + border-radius: 50%; + cursor: pointer; + transition: var(--transition-fast); + color: var(--color-text-secondary); +} + +.modal-close:hover { + background: var(--color-surface); + border-color: var(--color-danger); + color: var(--color-danger); +} + +.modal-content { + padding: 0.2rem; + overflow-y: auto; + max-height: calc(90vh - 120px); + scrollbar-width: none; + -ms-overflow-style: none; +} + +.modal-content::-webkit-scrollbar { + display: none; +} + +/* Transitions */ +.progress-enter-active, +.progress-leave-active { + transition: all var(--transition-medium); +} + +.progress-enter-from, +.progress-leave-to { + opacity: 0; + transform: translateY(-10px); +} + +.modal-enter-active, +.modal-leave-active { + transition: all var(--transition-medium); +} + +.modal-enter-from, +.modal-leave-to { + opacity: 0; + transform: scale(0.95); +} + +/* Responsive Design */ +@media (max-width: 768px) { + .upload-container { + padding: 0.75rem; + gap: 1rem; + } + + .header-card .card-header { + flex-direction: column; + align-items: stretch; + } + + .provider-section { + order: 1; + } + + .header-actions { + order: 2; + justify-content: stretch; + } + + .action-button { + flex: 1; + justify-content: center; + } + + .upload-zone { + padding: 2rem 1rem; + margin: 0.75rem; + } + + .upload-icon { + width: 60px; + height: 60px; + } + + .quick-actions { + grid-template-columns: 1fr; + padding: 0.875rem 1rem; + } + + .settings-content { + grid-template-columns: 1fr !important; + padding: 1rem 1.25rem; + } + + .format-buttons { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(60px, 1fr)); + } + + .modal-overlay { + padding: 1rem; + } + + .modal-header, + .modal-content { + padding: 1.5rem; + } +} + +@media (max-width: 480px) { + .upload-container { + padding: 0.5rem; + } + + .upload-zone { + margin: 0.5rem; + padding: 1.5rem 1rem; + } + + .upload-title { + font-size: 1.125rem; + } + + .quick-action-button { + padding: 0.75rem 0.875rem; + } + + .action-button { + padding: 0.5rem 0.75rem; + font-size: 0.8rem; + } + + .provider-button { + min-width: unset; + width: 100%; + } +} + +/* Dark mode adjustments */ +:root.dark .upload-zone, +:root.auto.dark .upload-zone { + background: linear-gradient(135deg, var(--color-background-secondary) 0%, var(--color-background-tertiary) 100%); +} + +:root.dark .upload-zone:hover, +:root.dark .upload-zone.drag-active, +:root.auto.dark .upload-zone:hover, +:root.auto.dark .upload-zone.drag-active { + background: linear-gradient(135deg, var(--color-surface) 0%, rgba(0, 122, 255, 0.1) 100%); +} + +/* Animation for upload icon */ +@keyframes float { + 0%, 100% { + transform: translateY(0px); + } + 50% { + transform: translateY(-10px); + } +} + +.upload-zone.drag-active .upload-icon { + animation: float 1.5s ease-in-out infinite; +} + +/* Accessibility */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} + +/* Focus styles for keyboard navigation */ +.provider-button:focus-visible, +.action-button:focus-visible, +.quick-action-button:focus-visible, +.format-button:focus-visible, +.toggle-button:focus-visible, +.modal-close:focus-visible { + outline: 2px solid var(--color-accent); + outline-offset: 2px; +} + +.upload-zone:focus-visible { + outline: 2px solid var(--color-accent); + outline-offset: 4px; +} \ No newline at end of file diff --git a/src/renderer/pages/picbeds/index.vue b/src/renderer/pages/picbeds/index.vue index 35464026..df51b5e8 100644 --- a/src/renderer/pages/picbeds/index.vue +++ b/src/renderer/pages/picbeds/index.vue @@ -99,11 +99,11 @@ import { useI18n } from 'vue-i18n' import { useRoute, useRouter } from 'vue-router' import ConfigForm from '@/components/ConfigForm.vue' +import { configPaths } from '@/utils/configPaths' import { getConfig } from '@/utils/dataSender' -import { II18nLanguage, IRPCActionType } from '#/types/enum' -import { IPicGoPluginConfig, IStringKeyMap, IUploaderConfigItem, IUploaderConfigListItem } from '#/types/types' -import { configPaths } from '#/utils/configPaths' -import { picBedManualUrlList } from '#/utils/static' +import { II18nLanguage, IRPCActionType } from '@/utils/enum' +import { picBedManualUrlList } from '@/utils/static' +import type { IPicGoPluginConfig, IStringKeyMap, IUploaderConfigItem, IUploaderConfigListItem } from '#/types/types' const { t } = useI18n() const type = ref('') diff --git a/src/renderer/store/index.ts b/src/renderer/store/index.ts index d7035e7d..765153da 100644 --- a/src/renderer/store/index.ts +++ b/src/renderer/store/index.ts @@ -1,7 +1,7 @@ import { App, InjectionKey, reactive, readonly, UnwrapRef } from 'vue' +import { configPaths } from '@/utils/configPaths' import { saveConfig } from '@/utils/dataSender' -import { configPaths } from '#/utils/configPaths' export interface IState { defaultPicBed: string diff --git a/src/renderer/utils/bus.ts b/src/renderer/utils/bus.ts index 06b09961..d668fdc3 100644 --- a/src/renderer/utils/bus.ts +++ b/src/renderer/utils/bus.ts @@ -1,6 +1,6 @@ import mitt from 'mitt' -import { SHOW_INPUT_BOX, SHOW_INPUT_BOX_RESPONSE } from '#/events/constants' +import { SHOW_INPUT_BOX, SHOW_INPUT_BOX_RESPONSE } from '@/utils/constant' // eslint-disable-next-line @typescript-eslint/consistent-type-definitions type IEvent = { diff --git a/src/renderer/utils/common.ts b/src/renderer/utils/common.ts index d518c8b3..c17dbdb1 100644 --- a/src/renderer/utils/common.ts +++ b/src/renderer/utils/common.ts @@ -16,3 +16,52 @@ export const getRawData = (args: any): any => { } return args } + +export const isUrl = (url: string): boolean => { + try { + return Boolean(new URL(url)) + } catch { + return false + } +} + +export const isUrlEncode = (url: string): boolean => { + url = url || '' + try { + return url !== decodeURI(url) + } catch { + return false + } +} + +export const handleUrlEncode = (url: string): string => (isUrlEncode(url) ? url : encodeURI(url)) + +export const handleStreamlinePluginName = (name: string) => name.replace(/(@[^/]+\/)?picgo-plugin-/, '') +export const enforceNumber = (num: number | string) => (isNaN(+num) ? 0 : +num) + +export function isNeedToShorten (alias: string, cutOff = 20) { + return [...alias].reduce((len, char) => len + (char.charCodeAt(0) > 255 ? 2 : 1), 0) > cutOff +} + +export function safeSliceF (str: string, total: number) { + let result = '' + let totalLen = 0 + for (const s of str) { + if (totalLen >= total) { + break + } + result += s + totalLen += s.charCodeAt(0) > 255 ? 2 : 1 + } + return result +} + +export const formatEndpoint = (endpoint: string, sslEnabled: boolean): string => { + const hasProtocol = /^https?:\/\//.test(endpoint) + if (!hasProtocol) { + return `${sslEnabled ? 'https' : 'http'}://${endpoint}` + } + return sslEnabled ? endpoint.replace(/^http:\/\//, 'https://') : endpoint.replace(/^https:\/\//, 'http://') +} + +export const trimPath = (path: string) => path.replace(/^\/+|\/+$/g, '').replace(/\/+/g, '/') diff --git a/src/renderer/utils/configPaths.ts b/src/renderer/utils/configPaths.ts new file mode 100644 index 00000000..92cb6fb1 --- /dev/null +++ b/src/renderer/utils/configPaths.ts @@ -0,0 +1,188 @@ +import type { IBuildInCompressOptions, IBuildInWaterMarkOptions } from 'piclist' + +import type { IAliYunConfig, IAwsS3PListUserConfig, IGitHubConfig, IImgurConfig, ILocalConfig, ILskyConfig, IPicBedType, IQiniuConfig, IServerConfig, ISftpPlistConfig, IShortKeyConfig, ISMMSConfig, ISyncConfig, ITcYunConfig, IUploaderConfig, IUpYunConfig, IWebdavPlistConfig } from '#/types/types' + +export type manualPageOpenType = 'window' | 'browser' + +interface IPicGoPlugins { + [key: `picgo-plugin-${string}`]: boolean +} + +export interface IConfigStruct { + picBed: { + uploader: string + current?: string + smms?: ISMMSConfig + qiniu?: IQiniuConfig + upyun?: IUpYunConfig + tcyun?: ITcYunConfig + github?: IGitHubConfig + aliyun?: IAliYunConfig + imgur?: IImgurConfig + webdavplist?: IWebdavPlistConfig + local?: ILocalConfig + sftpplist?: ISftpPlistConfig + lskyplist?: ILskyConfig + 'aws-s3-plist': IAwsS3PListUserConfig + proxy?: string + transformer?: string + list: IPicBedType[] + [others: string]: any + } + settings: { + shortKey: { + [key: string]: IShortKeyConfig + } + logLevel: string[] + logPath: string + logFileSizeLimit: number + isAutoListenClipboard: boolean + isListeningClipboard: boolean + showUpdateTip: boolean + miniWindowPosition: [number, number] + miniWindowOntop: boolean + mainWindowWidth: number + mainWindowHeight: number + isHideDock: boolean + autoCloseMiniWindow: boolean + autoCloseMainWindow: boolean + isCustomMiniIcon: boolean + customMiniIcon: string + startMode: string + autoRename: boolean + deleteCloudFile: boolean + server: IServerConfig + serverKey: string + pasteStyle: string + aesPassword: string + rename: boolean + sync: ISyncConfig + tempDirPath: string + language: string + customLink: string + manualPageOpen: manualPageOpenType + encodeOutputURL: boolean + useShortUrl: boolean + shortUrlServer: string + c1nToken: string + cfWorkerHost: string + yourlsDomain: string + yourlsSignature: string + sinkDomain: string + sinkToken: string + isSilentNotice: boolean + proxy: string + registry: string + autoCopy: boolean + enableWebServer: boolean + webServerHost: string + webServerPort: number + webServerPath: string + deleteLocalFile: boolean + uploadResultNotification: boolean + uploadNotification: boolean + useBuiltinClipboard: boolean + autoStart: boolean + autoImport: boolean + autoImportPicBed: string[] + } + needReload: boolean + picgoPlugins: IPicGoPlugins + uploader: IUploaderConfig + buildIn: { + compress: IBuildInCompressOptions + watermark: IBuildInWaterMarkOptions + rename: { + enable: boolean + format: string + } + skipProcess: { + skipProcessExtList: string + } + } + debug: boolean + PICGO_ENV: string +} + +export const configPaths = { + picBed: { + current: 'picBed.current', + uploader: 'picBed.uploader', + secondUploader: 'picBed.secondUploader', + secondUploaderId: 'picBed.secondUploaderId', + secondUploaderConfig: 'picBed.secondUploaderConfig', + proxy: 'picBed.proxy', + transformer: 'picBed.transformer', + list: 'picBed.list' + }, + settings: { + shortKey: { + _path: 'settings.shortKey', + 'picgo:upload': 'settings.shortKey[picgo:upload]' + }, + logLevel: 'settings.logLevel', + logPath: 'settings.logPath', + logFileSizeLimit: 'settings.logFileSizeLimit', + isAutoListenClipboard: 'settings.isAutoListenClipboard', + isListeningClipboard: 'settings.isListeningClipboard', + showUpdateTip: 'settings.showUpdateTip', + miniWindowPosition: 'settings.miniWindowPosition', + miniWindowOntop: 'settings.miniWindowOntop', + isHideDock: 'settings.isHideDock', + mainWindowWidth: 'settings.mainWindowWidth', + mainWindowHeight: 'settings.mainWindowHeight', + autoCloseMiniWindow: 'settings.autoCloseMiniWindow', + autoCloseMainWindow: 'settings.autoCloseMainWindow', + isCustomMiniIcon: 'settings.isCustomMiniIcon', + customMiniIcon: 'settings.customMiniIcon', + startMode: 'settings.startMode', + autoRename: 'settings.autoRename', + deleteCloudFile: 'settings.deleteCloudFile', + server: 'settings.server', + serverKey: 'settings.serverKey', + pasteStyle: 'settings.pasteStyle', + aesPassword: 'settings.aesPassword', + rename: 'settings.rename', + sync: 'settings.sync', + tempDirPath: 'settings.tempDirPath', + language: 'settings.language', + customLink: 'settings.customLink', + manualPageOpen: 'settings.manualPageOpen', + encodeOutputURL: 'settings.encodeOutputURL', + useShortUrl: 'settings.useShortUrl', + shortUrlServer: 'settings.shortUrlServer', + c1nToken: 'settings.c1nToken', + cfWorkerHost: 'settings.cfWorkerHost', + yourlsDomain: 'settings.yourlsDomain', + yourlsSignature: 'settings.yourlsSignature', + sinkDomain: 'settings.sinkDomain', + sinkToken: 'settings.sinkToken', + isSilentNotice: 'settings.isSilentNotice', + proxy: 'settings.proxy', + registry: 'settings.registry', + autoCopy: 'settings.autoCopy', + enableWebServer: 'settings.enableWebServer', + webServerHost: 'settings.webServerHost', + webServerPort: 'settings.webServerPort', + webServerPath: 'settings.webServerPath', + deleteLocalFile: 'settings.deleteLocalFile', + uploadResultNotification: 'settings.uploadResultNotification', + uploadNotification: 'settings.uploadNotification', + useBuiltinClipboard: 'settings.useBuiltinClipboard', + autoStart: 'settings.autoStart', + autoImport: 'settings.autoImport', + autoImportPicBed: 'settings.autoImportPicBed', + enableSecondUploader: 'settings.enableSecondUploader' + }, + needReload: 'needReload', + picgoPlugins: 'picgoPlugins', + uploader: 'uploader', + buildIn: { + compress: 'buildIn.compress', + watermark: 'buildIn.watermark', + rename: 'buildIn.rename', + skipProcess: 'buildIn.skipProcess' + }, + debug: 'debug', + PICGO_ENV: 'PICGO_ENV' +} diff --git a/src/renderer/utils/constant.ts b/src/renderer/utils/constant.ts new file mode 100644 index 00000000..6b8cddf4 --- /dev/null +++ b/src/renderer/utils/constant.ts @@ -0,0 +1,14 @@ +export const SHOW_INPUT_BOX = 'SHOW_INPUT_BOX' +export const SHOW_INPUT_BOX_RESPONSE = 'SHOW_INPUT_BOX_RESPONSE' +// picgo plugin +export const PICGO_CONFIG_PLUGIN = 'PICGO_CONFIG_PLUGIN' +export const PICGO_HANDLE_PLUGIN_ING = 'PICGO_HANDLE_PLUGIN_ING' +export const PICGO_HANDLE_PLUGIN_DONE = 'PICGO_HANDLE_PLUGIN_DONE' +export const PICGO_TOGGLE_PLUGIN = 'PICGO_TOGGLE_PLUGIN' +// picgo uploader +export const RENAME_FILE_NAME = 'RENAME_FILE_NAME' +export const GET_RENAME_FILE_NAME = 'GET_RENAME_FILE_NAME' +export const SHOW_MAIN_PAGE_QRCODE = 'SHOW_MAIN_PAGE_QRCODE' +// rpc +export const RPC_ACTIONS = 'RPC_ACTIONS' +export const RPC_ACTIONS_INVOKE = 'RPC_ACTIONS_INVOKE' diff --git a/src/renderer/utils/dataSender.ts b/src/renderer/utils/dataSender.ts index 70ed5258..6a670576 100644 --- a/src/renderer/utils/dataSender.ts +++ b/src/renderer/utils/dataSender.ts @@ -1,9 +1,10 @@ -import { IRPCActionType } from '#/types/enum' -import { IObj } from '#/types/types' +import { getRawData } from '@/utils/common' +import { IRPCActionType } from '@/utils/enum' +import type { IObj } from '#/types/types' export function saveConfig (config: IObj | string, value?: any) { const configObject = typeof config === 'string' ? { [config]: value } : config - window.electron.sendRPC(IRPCActionType.PICLIST_SAVE_CONFIG, configObject) + window.electron.sendRPC(IRPCActionType.PICLIST_SAVE_CONFIG, getRawData(configObject)) } export async function getConfig (key?: string): Promise { diff --git a/src/renderer/utils/db.ts b/src/renderer/utils/db.ts index a12303e4..d8908e1f 100644 --- a/src/renderer/utils/db.ts +++ b/src/renderer/utils/db.ts @@ -1,5 +1,5 @@ -import { IRPCActionType } from '#/types/enum' -import { IGalleryDB } from '#/types/extra-vue' +import { IRPCActionType } from '@/utils/enum' +import type { IGalleryDB } from '#/types/extra-vue' interface IFilter { orderBy?: 'asc' | 'desc' @@ -23,7 +23,7 @@ interface IObject { } export class GalleryDB implements IGalleryDB { - async #actionHandler(method: IRPCActionType, ...args: any[]): Promise { + async #actionHandler(method: string, ...args: any[]): Promise { return await window.electron.triggerRPC(method, ...args) } diff --git a/src/renderer/utils/enum.ts b/src/renderer/utils/enum.ts new file mode 100644 index 00000000..1d03e05d --- /dev/null +++ b/src/renderer/utils/enum.ts @@ -0,0 +1,163 @@ +export const IPasteStyle = { + MARKDOWN: 'markdown', + HTML: 'HTML', + URL: 'URL', + UBB: 'UBB', + CUSTOM: 'Custom' +} + +export const IWindowList = { + SETTING_WINDOW: 'SETTING_WINDOW', + TRAY_WINDOW: 'TRAY_WINDOW', + MINI_WINDOW: 'MINI_WINDOW', + RENAME_WINDOW: 'RENAME_WINDOW', + TOOLBOX_WINDOW: 'TOOLBOX_WINDOW' +} + +export const IRPCActionType = { + // system rpc + RELOAD_APP: 'RELOAD_APP', + OPEN_URL: 'OPEN_URL', + OPEN_FILE: 'OPEN_FILE', + HIDE_DOCK: 'HIDE_DOCK', + SET_CURRENT_LANGUAGE: 'SET_CURRENT_LANGUAGE', + OPEN_WINDOW: 'OPEN_WINDOW', + OPEN_MINI_WINDOW: 'OPEN_MINI_WINDOW', + CLOSE_WINDOW: 'CLOSE_WINDOW', + MINIMIZE_WINDOW: 'MINIMIZE_WINDOW', + SHOW_MINI_PAGE_MENU: 'SHOW_MINI_PAGE_MENU', + SHOW_MAIN_PAGE_MENU: 'SHOW_MAIN_PAGE_MENU', + SHOW_UPLOAD_PAGE_MENU: 'SHOW_UPLOAD_PAGE_MENU', + SHOW_SECOND_UPLOADER_MENU: 'SHOW_SECOND_UPLOADER_MENU', + SHOW_PLUGIN_PAGE_MENU: 'SHOW_PLUGIN_PAGE_MENU', + SET_MINI_WINDOW_POS: 'SET_MINI_WINDOW_POS', + MINI_WINDOW_ON_TOP: 'MINI_WINDOW_ON_TOP', + MAIN_WINDOW_ON_TOP: 'MAIN_WINDOW_ON_TOP', + UPDATE_MINI_WINDOW_ICON: 'UPDATE_MINI_WINDOW_ICON', + REFRESH_SETTING_WINDOW: 'REFRESH_SETTING_WINDOW', + // picbed RPC + PICBED_GET_PICBED_CONFIG: 'PICBED_GET_PICBED_CONFIG', + PICBED_GET_CONFIG_LIST: 'PICBED_GET_CONFIG_LIST', + PICBED_DELETE_CONFIG: 'PICBED_DELETE_CONFIG', + UPLOADER_CHANGE_CURRENT: 'UPLOADER_CHANGE_CURRENT', + UPLOADER_SELECT: 'UPLOADER_SELECT', + UPLOADER_UPDATE_CONFIG: 'UPLOADER_UPDATE_CONFIG', + UPLOADER_RESET_CONFIG: 'UPLOADER_RESET_CONFIG', + DELETE_ALL_API: 'DELETE_ALL_API', + + // toolbox rpc + TOOLBOX_CHECK: 'TOOLBOX_CHECK', + TOOLBOX_CHECK_RES: 'TOOLBOX_CHECK_RES', + TOOLBOX_CHECK_FIX: 'TOOLBOX_CHECK_FIX', + + // main app setting rpc + PICLIST_GET_CONFIG: 'PICLIST_GET_CONFIG', + PICLIST_GET_CONFIG_SYNC: 'PICLIST_GET_CONFIG_SYNC', + PICLIST_SAVE_CONFIG: 'PICLIST_SAVE_CONFIG', + PICLIST_OPEN_FILE: 'PICLIST_OPEN_FILE', + PICLIST_OPEN_DIRECTORY: 'PICLIST_OPEN_DIRECTORY', + PICLIST_AUTO_START: 'PICLIST_AUTO_START', + + // shortkey setting rpc + SHORTKEY_UPDATE: 'SHORTKEY_UPDATE', + SHORTKEY_BIND_OR_UNBIND: 'SHORTKEY_BIND_OR_UNBIND', + SHORTKEY_TOGGLE_SHORTKEY_MODIFIED_MODE: 'SHORTKEY_TOGGLE_SHORTKEY_MODIFIED_MODE', + + // configuration setting rpc + CONFIGURE_MIGRATE_FROM_PICGO: 'CONFIGURE_MIGRATE_FROM_PICGO', + CONFIGURE_UPLOAD_COMMON_CONFIG: 'CONFIGURE_UPLOAD_COMMON_CONFIG', + CONFIGURE_UPLOAD_MANAGE_CONFIG: 'CONFIGURE_UPLOAD_MANAGE_CONFIG', + CONFIGURE_UPLOAD_ALL_CONFIG: 'CONFIGURE_UPLOAD_ALL_CONFIG', + CONFIGURE_DOWNLOAD_COMMON_CONFIG: 'CONFIGURE_DOWNLOAD_COMMON_CONFIG', + CONFIGURE_DOWNLOAD_MANAGE_CONFIG: 'CONFIGURE_DOWNLOAD_MANAGE_CONFIG', + CONFIGURE_DOWNLOAD_ALL_CONFIG: 'CONFIGURE_DOWNLOAD_ALL_CONFIG', + + // advanced setting rpc + ADVANCED_UPDATE_SERVER: 'ADVANCED_UPDATE_SERVER', + ADVANCED_STOP_WEB_SERVER: 'ADVANCED_STOP_WEB_SERVER', + ADVANCED_RESTART_WEB_SERVER: 'ADVANCED_RESTART_WEB_SERVER', + + // upload and main page rpc + MAIN_GET_PICBED: 'MAIN_GET_PICBED', + UPLOAD_CLIPBOARD_FILES_FROM_UPLOAD_PAGE: 'UPLOAD_CLIPBOARD_FILES_FROM_UPLOAD_PAGE', + UPLOAD_CHOOSED_FILES: 'UPLOAD_CHOOSED_FILES', + + // gallery rpc + GALLERY_PASTE_TEXT: 'GALLERY_PASTE_TEXT', + GALLERY_REMOVE_FILES: 'GALLERY_REMOVE_FILES', + GALLERY_GET_DB: 'GALLERY_GET_DB', + GALLERY_GET_BY_ID_DB: 'GALLERY_GET_BY_ID_DB', + GALLERY_UPDATE_BY_ID_DB: 'GALLERY_UPDATE_BY_ID_DB', + GALLERY_REMOVE_BY_ID_DB: 'GALLERY_REMOVE_BY_ID_DB', + GALLERY_INSERT_DB: 'GALLERY_INSERT_DB', + GALLERY_INSERT_DB_BATCH: 'GALLERY_INSERT_DB_BATCH', + // plugin rpc + PLUGIN_GET_LIST: 'PLUGIN_GET_LIST', + PLUGIN_INSTALL: 'PLUGIN_INSTALL', + PLUGIN_IMPORT_LOCAL: 'PLUGIN_IMPORT_LOCAL', + PLUGIN_UPDATE_ALL: 'PLUGIN_UPDATE_ALL', + + // tray rpc + TRAY_SET_TOOL_TIP: 'TRAY_SET_TOOL_TIP', + TRAY_GET_SHORT_URL: 'TRAY_GET_SHORT_URL', + TRAY_UPLOAD_CLIPBOARD_FILES: 'TRAY_UPLOAD_CLIPBOARD_FILES', + + // manage rpc + MANAGE_GET_CONFIG: 'MANAGE_GET_CONFIG', + MANAGE_SAVE_CONFIG: 'MANAGE_SAVE_CONFIG', + MANAGE_REMOVE_CONFIG: 'MANAGE_REMOVE_CONFIG', + MANAGE_GET_BUCKET_LIST: 'MANAGE_GET_BUCKET_LIST', + MANAGE_GET_BUCKET_LIST_BACKSTAGE: 'MANAGE_GET_BUCKET_LIST_BACKSTAGE', + MANAGE_GET_BUCKET_LIST_RECURSIVELY: 'MANAGE_GET_BUCKET_LIST_RECURSIVELY', + MANAGE_CREATE_BUCKET: 'MANAGE_CREATE_BUCKET', + MANAGE_GET_BUCKET_FILE_LIST: 'MANAGE_GET_BUCKET_FILE_LIST', + MANAGE_GET_BUCKET_DOMAIN: 'MANAGE_GET_BUCKET_DOMAIN', + MANAGE_SET_BUCKET_ACL_POLICY: 'MANAGE_SET_BUCKET_ACL_POLICY', + MANAGE_RENAME_BUCKET_FILE: 'MANAGE_RENAME_BUCKET_FILE', + MANAGE_DELETE_BUCKET_FILE: 'MANAGE_DELETE_BUCKET_FILE', + MANAGE_DELETE_BUCKET_FOLDER: 'MANAGE_DELETE_BUCKET_FOLDER', + MANAGE_GET_PRE_SIGNED_URL: 'MANAGE_GET_PRE_SIGNED_URL', + MANAGE_UPLOAD_BUCKET_FILE: 'MANAGE_UPLOAD_BUCKET_FILE', + MANAGE_DOWNLOAD_BUCKET_FILE: 'MANAGE_DOWNLOAD_BUCKET_FILE', + MANAGE_CREATE_BUCKET_FOLDER: 'MANAGE_CREATE_BUCKET_FOLDER', + MANAGE_OPEN_FILE_SELECT_DIALOG: 'MANAGE_OPEN_FILE_SELECT_DIALOG', + MANAGE_GET_UPLOAD_TASK_LIST: 'MANAGE_GET_UPLOAD_TASK_LIST', + MANAGE_GET_DOWNLOAD_TASK_LIST: 'MANAGE_GET_DOWNLOAD_TASK_LIST', + MANAGE_DELETE_UPLOADED_TASK: 'MANAGE_DELETE_UPLOADED_TASK', + MANAGE_DELETE_ALL_UPLOADED_TASK: 'MANAGE_DELETE_ALL_UPLOADED_TASK', + MANAGE_DELETE_DOWNLOADED_TASK: 'MANAGE_DELETE_DOWNLOADED_TASK', + MANAGE_DELETE_ALL_DOWNLOADED_TASK: 'MANAGE_DELETE_ALL_DOWNLOADED_TASK', + MANAGE_SELECT_DOWNLOAD_FOLDER: 'MANAGE_SELECT_DOWNLOAD_FOLDER', + MANAGE_GET_DEFAULT_DOWNLOAD_FOLDER: 'MANAGE_GET_DEFAULT_DOWNLOAD_FOLDER', + MANAGE_OPEN_DOWNLOADED_FOLDER: 'MANAGE_OPEN_DOWNLOADED_FOLDER', + MANAGE_OPEN_LOCAL_FILE: 'MANAGE_OPEN_LOCAL_FILE', + MANAGE_DOWNLOAD_FILE_FROM_URL: 'MANAGE_DOWNLOAD_FILE_FROM_URL', + MANAGE_CONVERT_PATH_TO_BASE64: 'MANAGE_CONVERT_PATH_TO_BASE64' +} + +export const IToolboxItemType = { + IS_CONFIG_FILE_BROKEN: 'IS_CONFIG_FILE_BROKEN', + IS_GALLERY_FILE_BROKEN: 'IS_GALLERY_FILE_BROKEN', + HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD: 'HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD', + HAS_PROBLEM_WITH_PROXY: 'HAS_PROBLEM_WITH_PROXY' +} + +export const IToolboxItemCheckStatus = { + INIT: 'init', + LOADING: 'loading', + SUCCESS: 'success', + ERROR: 'error' +} + +export const ISartMode = { + QUIET: 'quiet', + MINI: 'mini', + MAIN: 'main', + NO_TRAY: 'no-tray' +} + +export const II18nLanguage = { + ZH_CN: 'zh-CN', + ZH_TW: 'zh-TW', + EN: 'en' +} diff --git a/src/renderer/utils/getLatestVersion.ts b/src/renderer/utils/getLatestVersion.ts index 35ed01d2..f1b34c23 100644 --- a/src/renderer/utils/getLatestVersion.ts +++ b/src/renderer/utils/getLatestVersion.ts @@ -1,5 +1,5 @@ -import { IStringKeyMap } from '#/types/types' -import { RELEASE_URL, RELEASE_URL_BACKUP } from '#/utils/static' +import { RELEASE_URL, RELEASE_URL_BACKUP } from '@/utils/static' +import type { IStringKeyMap } from '#/types/types' export const getLatestVersion = async (): Promise => { try { diff --git a/src/renderer/utils/global.ts b/src/renderer/utils/global.ts index 5d47ec5e..aa542c8e 100644 --- a/src/renderer/utils/global.ts +++ b/src/renderer/utils/global.ts @@ -1,7 +1,7 @@ import { ref } from 'vue' -import { IRPCActionType } from '#/types/enum' -import { IPicBedType } from '#/types/types' +import { IRPCActionType } from '@/utils/enum' +import type { IPicBedType } from '#/types/types' console.log('global.ts loaded', window.electron.platform) const osGlobal = ref(window.electron.platform) diff --git a/src/universal/utils/static.ts b/src/renderer/utils/static.ts similarity index 92% rename from src/universal/utils/static.ts rename to src/renderer/utils/static.ts index 099738c9..fbef1b7c 100644 --- a/src/universal/utils/static.ts +++ b/src/renderer/utils/static.ts @@ -1,75 +1,71 @@ -import { IStringKeyMap } from '../types/types' - -export const CLIPBOARD_IMAGE_FOLDER = 'piclist-clipboard-images' -export const RELEASE_URL = 'https://api.github.com/repos/Kuingsmile/PicList/releases' -export const RELEASE_URL_BACKUP = 'https://release.piclist.cn' -export const STABLE_RELEASE_URL = 'https://github.com/Kuingsmile/PicList/releases/latest' - -export const DEFAULT_AES_PASSWORD = 'aesPassword' - -export const cancelDownloadLoadingFileList = 'cancelDownloadLoadingFileList' -export const refreshDownloadFileTransferList = 'refreshDownloadFileTransferList' - -export const picBedsCanbeDeleted = [ - 'aliyun', - 'alist', - 'alistplist', - 'aws-s3', - 'aws-s3-plist', - 'dogecloud', - 'github', - 'huaweicloud-uploader', - 'imgur', - 'local', - 'lskyplist', - 'piclist', - 'qiniu', - 'sftpplist', - 'smms', - 'tcyun', - 'upyun', - 'webdavplist' -] - -export const picBedManualUrlList: IStringKeyMap = { - zh_cn: { - advancedpiclist: 'https://piclist.cn/configure.html#%E9%AB%98%E7%BA%A7%E8%87%AA%E5%AE%9A%E4%B9%89', - aliyun: 'https://piclist.cn/configure.html#%E9%98%BF%E9%87%8C%E4%BA%91oss', - alistplist: 'https://piclist.cn/configure.html#alist', - 'aws-s3': 'https://piclist.cn/configure.html#%E5%86%85%E7%BD%AEaws-s3', - 'aws-s3-plist': 'https://piclist.cn/configure.html#%E5%86%85%E7%BD%AEaws-s3', - github: 'https://piclist.cn/configure.html#github%E5%9B%BE%E5%BA%8A', - githubPlus: 'https://piclist.cn/configure.html#github%E5%9B%BE%E5%BA%8A', - imgur: 'https://piclist.cn/configure.html#imgur', - lankong: 'https://github.com/hellodk34/picgo-plugin-lankong', - local: 'https://piclist.cn/configure.html#%E6%9C%AC%E5%9C%B0%E5%9B%BE%E5%BA%8A', - lskyplist: 'https://piclist.cn/configure.html#%E5%85%B0%E7%A9%BA%E5%9B%BE%E5%BA%8A', - tcyun: 'https://piclist.cn/configure.html#%E8%85%BE%E8%AE%AF%E4%BA%91cos', - piclist: 'https://piclist.cn/configure.html#piclist', - qiniu: 'https://piclist.cn/configure.html#%E4%B8%83%E7%89%9B%E4%BA%91', - sftpplist: 'https://piclist.cn/configure.html#%E5%86%85%E7%BD%AEsftp', - smms: 'https://piclist.cn/configure.html#sm-ms', - upyun: 'https://piclist.cn/configure.html#%E5%8F%88%E6%8B%8D%E4%BA%91', - webdavplist: 'https://piclist.cn/configure.html#webdav' - }, - en: { - advancedpiclist: 'https://piclist.cn/en/configure.html#advanced', - aliyun: 'https://piclist.cn/en/configure.html#alibaba-cloud', - alistplist: 'https://piclist.cn/en/configure.html#alist', - 'aws-s3': 'https://piclist.cn/en/configure.html#built-in-aws-s3', - 'aws-s3-plist': 'https://piclist.cn/en/configure.html#built-in-aws-s3', - github: 'https://piclist.cn/en/configure.html#github', - githubPlus: 'https://piclist.cn/en/configure.html#github', - imgur: 'https://piclist.cn/en/configure.html#imgur', - lankong: 'https://github.com/hellodk34/picgo-plugin-lankong', - local: 'https://piclist.cn/en/configure.html#local-image-hosting', - lskyplist: 'https://piclist.cn/en/configure.html#lsky-pro', - tcyun: 'https://piclist.cn/en/configure.html#tencent-cloud-cos', - piclist: 'https://piclist.cn/en/configure.html#piclist', - qiniu: 'https://piclist.cn/en/configure.html#qiniu-cloud', - sftpplist: 'https://piclist.cn/en/configure.html#built-in-sftp', - smms: 'https://piclist.cn/en/configure.html#sm-ms', - upyun: 'https://piclist.cn/en/configure.html#upyun', - webdavplist: 'https://piclist.cn/en/configure.html#webdav' - } -} +import { IStringKeyMap } from 'root/src/universal/types/types' + +export const RELEASE_URL = 'https://api.github.com/repos/Kuingsmile/PicList/releases' +export const RELEASE_URL_BACKUP = 'https://release.piclist.cn' + +export const cancelDownloadLoadingFileList = 'cancelDownloadLoadingFileList' +export const refreshDownloadFileTransferList = 'refreshDownloadFileTransferList' + +export const picBedsCanbeDeleted = [ + 'aliyun', + 'alist', + 'alistplist', + 'aws-s3', + 'aws-s3-plist', + 'dogecloud', + 'github', + 'huaweicloud-uploader', + 'imgur', + 'local', + 'lskyplist', + 'piclist', + 'qiniu', + 'sftpplist', + 'smms', + 'tcyun', + 'upyun', + 'webdavplist' +] + +export const picBedManualUrlList: IStringKeyMap = { + zh_cn: { + advancedpiclist: 'https://piclist.cn/configure.html#%E9%AB%98%E7%BA%A7%E8%87%AA%E5%AE%9A%E4%B9%89', + aliyun: 'https://piclist.cn/configure.html#%E9%98%BF%E9%87%8C%E4%BA%91oss', + alistplist: 'https://piclist.cn/configure.html#alist', + 'aws-s3': 'https://piclist.cn/configure.html#%E5%86%85%E7%BD%AEaws-s3', + 'aws-s3-plist': 'https://piclist.cn/configure.html#%E5%86%85%E7%BD%AEaws-s3', + github: 'https://piclist.cn/configure.html#github%E5%9B%BE%E5%BA%8A', + githubPlus: 'https://piclist.cn/configure.html#github%E5%9B%BE%E5%BA%8A', + imgur: 'https://piclist.cn/configure.html#imgur', + lankong: 'https://github.com/hellodk34/picgo-plugin-lankong', + local: 'https://piclist.cn/configure.html#%E6%9C%AC%E5%9C%B0%E5%9B%BE%E5%BA%8A', + lskyplist: 'https://piclist.cn/configure.html#%E5%85%B0%E7%A9%BA%E5%9B%BE%E5%BA%8A', + tcyun: 'https://piclist.cn/configure.html#%E8%85%BE%E8%AE%AF%E4%BA%91cos', + piclist: 'https://piclist.cn/configure.html#piclist', + qiniu: 'https://piclist.cn/configure.html#%E4%B8%83%E7%89%9B%E4%BA%91', + sftpplist: 'https://piclist.cn/configure.html#%E5%86%85%E7%BD%AEsftp', + smms: 'https://piclist.cn/configure.html#sm-ms', + upyun: 'https://piclist.cn/configure.html#%E5%8F%88%E6%8B%8D%E4%BA%91', + webdavplist: 'https://piclist.cn/configure.html#webdav' + }, + en: { + advancedpiclist: 'https://piclist.cn/en/configure.html#advanced', + aliyun: 'https://piclist.cn/en/configure.html#alibaba-cloud', + alistplist: 'https://piclist.cn/en/configure.html#alist', + 'aws-s3': 'https://piclist.cn/en/configure.html#built-in-aws-s3', + 'aws-s3-plist': 'https://piclist.cn/en/configure.html#built-in-aws-s3', + github: 'https://piclist.cn/en/configure.html#github', + githubPlus: 'https://piclist.cn/en/configure.html#github', + imgur: 'https://piclist.cn/en/configure.html#imgur', + lankong: 'https://github.com/hellodk34/picgo-plugin-lankong', + local: 'https://piclist.cn/en/configure.html#local-image-hosting', + lskyplist: 'https://piclist.cn/en/configure.html#lsky-pro', + tcyun: 'https://piclist.cn/en/configure.html#tencent-cloud-cos', + piclist: 'https://piclist.cn/en/configure.html#piclist', + qiniu: 'https://piclist.cn/en/configure.html#qiniu-cloud', + sftpplist: 'https://piclist.cn/en/configure.html#built-in-sftp', + smms: 'https://piclist.cn/en/configure.html#sm-ms', + upyun: 'https://piclist.cn/en/configure.html#upyun', + webdavplist: 'https://piclist.cn/en/configure.html#webdav' + } +} diff --git a/src/universal/i18n/index.ts b/src/universal/i18n/index.ts deleted file mode 100644 index d5d2eaad..00000000 --- a/src/universal/i18n/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { II18nItem } from '../types/types' - -export const builtinI18nList: II18nItem[] = [ - { - label: '简体中文', - value: 'zh-CN' - }, - { - label: '繁體中文', - value: 'zh-TW' - }, - { - label: 'English', - value: 'en' - } -] diff --git a/src/universal/types/electron.ts b/src/universal/types/electron.ts index 324a0106..a1d26659 100644 --- a/src/universal/types/electron.ts +++ b/src/universal/types/electron.ts @@ -1,8 +1,7 @@ // https://stackoverflow.com/questions/45420448/how-to-import-external-type-into-global-d-ts-file import type { BrowserWindow, IpcRendererEvent } from 'electron' -import { IWindowList } from './enum' -import type { IBrowserWindowOptions } from './types' +import type { IBrowserWindowOptions } from '#/types/types' export interface IWindowListItem { isValid: boolean @@ -12,9 +11,9 @@ export interface IWindowListItem { } export interface IWindowManager { - create: (name: IWindowList) => BrowserWindow | null - get: (name: IWindowList) => BrowserWindow | null - has: (name: IWindowList) => boolean + create: (name: string) => BrowserWindow | null + get: (name: string) => BrowserWindow | null + has: (name: string) => boolean // delete: (name: IWindowList) => void deleteById: (id: number) => void getAvailableWindow: (isSkipMiniWindow?: boolean) => BrowserWindow diff --git a/src/universal/types/enum.ts b/src/universal/types/enum.ts deleted file mode 100644 index b636c256..00000000 --- a/src/universal/types/enum.ts +++ /dev/null @@ -1,249 +0,0 @@ -/* eslint-disable no-unused-vars */ -export enum ILogType { - success = 'success', - info = 'info', - warn = 'warn', - error = 'error' -} - -export enum ICOREBuildInEvent { - UPLOAD_PROGRESS = 'uploadProgress', - FAILED = 'failed', - BEFORE_TRANSFORM = 'beforeTransform', - BEFORE_UPLOAD = 'beforeUpload', - AFTER_UPLOAD = 'afterUpload', - FINISHED = 'finished', - INSTALL = 'install', - UNINSTALL = 'uninstall', - UPDATE = 'update', - NOTIFICATION = 'notification', - REMOVE = 'remove' -} - -export enum IPicGoHelperType { - afterUploadPlugins = 'afterUploadPlugins', - beforeTransformPlugins = 'beforeTransformPlugins', - beforeUploadPlugins = 'beforeUploadPlugins', - uploader = 'uploader', - transformer = 'transformer' -} - -export enum IPasteStyle { - MARKDOWN = 'markdown', - HTML = 'HTML', - URL = 'URL', - UBB = 'UBB', - CUSTOM = 'Custom' -} - -export enum IWindowList { - SETTING_WINDOW = 'SETTING_WINDOW', - TRAY_WINDOW = 'TRAY_WINDOW', - MINI_WINDOW = 'MINI_WINDOW', - RENAME_WINDOW = 'RENAME_WINDOW', - TOOLBOX_WINDOW = 'TOOLBOX_WINDOW' -} - -export enum IRemoteNoticeActionType { - OPEN_URL = 'OPEN_URL', - SHOW_NOTICE = 'SHOW_NOTICE', // notification - SHOW_DIALOG = 'SHOW_DIALOG', // dialog notice - COMMON = 'COMMON', - VOID = 'VOID', // do nothing - SHOW_MESSAGE_BOX = 'SHOW_MESSAGE_BOX' -} - -export enum IRemoteNoticeTriggerHook { - APP_START = 'APP_START', - SETTING_WINDOW_OPEN = 'SETTING_WINDOW_OPEN' -} - -export enum IRemoteNoticeTriggerCount { - ONCE = 'ONCE', // default - ALWAYS = 'ALWAYS' -} - -/** - * renderer trigger action from main - */ - -export enum IRPCType { - INVOKE = 'INVOKE', - SEND = 'SEND' -} - -export enum IRPCActionType { - // system rpc - RELOAD_APP = 'RELOAD_APP', - OPEN_URL = 'OPEN_URL', - OPEN_FILE = 'OPEN_FILE', - HIDE_DOCK = 'HIDE_DOCK', - SET_CURRENT_LANGUAGE = 'SET_CURRENT_LANGUAGE', - OPEN_WINDOW = 'OPEN_WINDOW', - OPEN_MINI_WINDOW = 'OPEN_MINI_WINDOW', - CLOSE_WINDOW = 'CLOSE_WINDOW', - MINIMIZE_WINDOW = 'MINIMIZE_WINDOW', - SHOW_MINI_PAGE_MENU = 'SHOW_MINI_PAGE_MENU', - SHOW_MAIN_PAGE_MENU = 'SHOW_MAIN_PAGE_MENU', - SHOW_UPLOAD_PAGE_MENU = 'SHOW_UPLOAD_PAGE_MENU', - SHOW_SECOND_UPLOADER_MENU = 'SHOW_SECOND_UPLOADER_MENU', - SHOW_PLUGIN_PAGE_MENU = 'SHOW_PLUGIN_PAGE_MENU', - SET_MINI_WINDOW_POS = 'SET_MINI_WINDOW_POS', - MINI_WINDOW_ON_TOP = 'MINI_WINDOW_ON_TOP', - MAIN_WINDOW_ON_TOP = 'MAIN_WINDOW_ON_TOP', - UPDATE_MINI_WINDOW_ICON = 'UPDATE_MINI_WINDOW_ICON', - REFRESH_SETTING_WINDOW = 'REFRESH_SETTING_WINDOW', - // picbed RPC - PICBED_GET_PICBED_CONFIG = 'PICBED_GET_PICBED_CONFIG', - PICBED_GET_CONFIG_LIST = 'PICBED_GET_CONFIG_LIST', - PICBED_DELETE_CONFIG = 'PICBED_DELETE_CONFIG', - UPLOADER_CHANGE_CURRENT = 'UPLOADER_CHANGE_CURRENT', - UPLOADER_SELECT = 'UPLOADER_SELECT', - UPLOADER_UPDATE_CONFIG = 'UPLOADER_UPDATE_CONFIG', - UPLOADER_RESET_CONFIG = 'UPLOADER_RESET_CONFIG', - DELETE_ALL_API = 'DELETE_ALL_API', - - // toolbox rpc - TOOLBOX_CHECK = 'TOOLBOX_CHECK', - TOOLBOX_CHECK_RES = 'TOOLBOX_CHECK_RES', - TOOLBOX_CHECK_FIX = 'TOOLBOX_CHECK_FIX', - - // main app setting rpc - PICLIST_GET_CONFIG = 'PICLIST_GET_CONFIG', - PICLIST_GET_CONFIG_SYNC = 'PICLIST_GET_CONFIG_SYNC', - PICLIST_SAVE_CONFIG = 'PICLIST_SAVE_CONFIG', - PICLIST_OPEN_FILE = 'PICLIST_OPEN_FILE', - PICLIST_OPEN_DIRECTORY = 'PICLIST_OPEN_DIRECTORY', - PICLIST_AUTO_START = 'PICLIST_AUTO_START', - - // shortkey setting rpc - SHORTKEY_UPDATE = 'SHORTKEY_UPDATE', - SHORTKEY_BIND_OR_UNBIND = 'SHORTKEY_BIND_OR_UNBIND', - SHORTKEY_TOGGLE_SHORTKEY_MODIFIED_MODE = 'SHORTKEY_TOGGLE_SHORTKEY_MODIFIED_MODE', - - // configuration setting rpc - CONFIGURE_MIGRATE_FROM_PICGO = 'CONFIGURE_MIGRATE_FROM_PICGO', - CONFIGURE_UPLOAD_COMMON_CONFIG = 'CONFIGURE_UPLOAD_COMMON_CONFIG', - CONFIGURE_UPLOAD_MANAGE_CONFIG = 'CONFIGURE_UPLOAD_MANAGE_CONFIG', - CONFIGURE_UPLOAD_ALL_CONFIG = 'CONFIGURE_UPLOAD_ALL_CONFIG', - CONFIGURE_DOWNLOAD_COMMON_CONFIG = 'CONFIGURE_DOWNLOAD_COMMON_CONFIG', - CONFIGURE_DOWNLOAD_MANAGE_CONFIG = 'CONFIGURE_DOWNLOAD_MANAGE_CONFIG', - CONFIGURE_DOWNLOAD_ALL_CONFIG = 'CONFIGURE_DOWNLOAD_ALL_CONFIG', - - // advanced setting rpc - ADVANCED_UPDATE_SERVER = 'ADVANCED_UPDATE_SERVER', - ADVANCED_STOP_WEB_SERVER = 'ADVANCED_STOP_WEB_SERVER', - ADVANCED_RESTART_WEB_SERVER = 'ADVANCED_RESTART_WEB_SERVER', - - // upload and main page rpc - MAIN_GET_PICBED = 'MAIN_GET_PICBED', - UPLOAD_CLIPBOARD_FILES_FROM_UPLOAD_PAGE = 'UPLOAD_CLIPBOARD_FILES_FROM_UPLOAD_PAGE', - UPLOAD_CHOOSED_FILES = 'UPLOAD_CHOOSED_FILES', - - // gallery rpc - GALLERY_PASTE_TEXT = 'GALLERY_PASTE_TEXT', - GALLERY_REMOVE_FILES = 'GALLERY_REMOVE_FILES', - GALLERY_GET_DB = 'GALLERY_GET_DB', - GALLERY_GET_BY_ID_DB = 'GALLERY_GET_BY_ID_DB', - GALLERY_UPDATE_BY_ID_DB = 'GALLERY_UPDATE_BY_ID_DB', - GALLERY_REMOVE_BY_ID_DB = 'GALLERY_REMOVE_BY_ID_DB', - GALLERY_INSERT_DB = 'GALLERY_INSERT_DB', - GALLERY_INSERT_DB_BATCH = 'GALLERY_INSERT_DB_BATCH', - // plugin rpc - PLUGIN_GET_LIST = 'PLUGIN_GET_LIST', - PLUGIN_INSTALL = 'PLUGIN_INSTALL', - PLUGIN_IMPORT_LOCAL = 'PLUGIN_IMPORT_LOCAL', - PLUGIN_UPDATE_ALL = 'PLUGIN_UPDATE_ALL', - - // tray rpc - TRAY_SET_TOOL_TIP = 'TRAY_SET_TOOL_TIP', - TRAY_GET_SHORT_URL = 'TRAY_GET_SHORT_URL', - TRAY_UPLOAD_CLIPBOARD_FILES = 'TRAY_UPLOAD_CLIPBOARD_FILES', - - // manage rpc - MANAGE_GET_CONFIG = 'MANAGE_GET_CONFIG', - MANAGE_SAVE_CONFIG = 'MANAGE_SAVE_CONFIG', - MANAGE_REMOVE_CONFIG = 'MANAGE_REMOVE_CONFIG', - MANAGE_GET_BUCKET_LIST = 'MANAGE_GET_BUCKET_LIST', - MANAGE_GET_BUCKET_LIST_BACKSTAGE = 'MANAGE_GET_BUCKET_LIST_BACKSTAGE', - MANAGE_GET_BUCKET_LIST_RECURSIVELY = 'MANAGE_GET_BUCKET_LIST_RECURSIVELY', - MANAGE_CREATE_BUCKET = 'MANAGE_CREATE_BUCKET', - MANAGE_GET_BUCKET_FILE_LIST = 'MANAGE_GET_BUCKET_FILE_LIST', - MANAGE_GET_BUCKET_DOMAIN = 'MANAGE_GET_BUCKET_DOMAIN', - MANAGE_SET_BUCKET_ACL_POLICY = 'MANAGE_SET_BUCKET_ACL_POLICY', - MANAGE_RENAME_BUCKET_FILE = 'MANAGE_RENAME_BUCKET_FILE', - MANAGE_DELETE_BUCKET_FILE = 'MANAGE_DELETE_BUCKET_FILE', - MANAGE_DELETE_BUCKET_FOLDER = 'MANAGE_DELETE_BUCKET_FOLDER', - MANAGE_GET_PRE_SIGNED_URL = 'MANAGE_GET_PRE_SIGNED_URL', - MANAGE_UPLOAD_BUCKET_FILE = 'MANAGE_UPLOAD_BUCKET_FILE', - MANAGE_DOWNLOAD_BUCKET_FILE = 'MANAGE_DOWNLOAD_BUCKET_FILE', - MANAGE_CREATE_BUCKET_FOLDER = 'MANAGE_CREATE_BUCKET_FOLDER', - MANAGE_OPEN_FILE_SELECT_DIALOG = 'MANAGE_OPEN_FILE_SELECT_DIALOG', - MANAGE_GET_UPLOAD_TASK_LIST = 'MANAGE_GET_UPLOAD_TASK_LIST', - MANAGE_GET_DOWNLOAD_TASK_LIST = 'MANAGE_GET_DOWNLOAD_TASK_LIST', - MANAGE_DELETE_UPLOADED_TASK = 'MANAGE_DELETE_UPLOADED_TASK', - MANAGE_DELETE_ALL_UPLOADED_TASK = 'MANAGE_DELETE_ALL_UPLOADED_TASK', - MANAGE_DELETE_DOWNLOADED_TASK = 'MANAGE_DELETE_DOWNLOADED_TASK', - MANAGE_DELETE_ALL_DOWNLOADED_TASK = 'MANAGE_DELETE_ALL_DOWNLOADED_TASK', - MANAGE_SELECT_DOWNLOAD_FOLDER = 'MANAGE_SELECT_DOWNLOAD_FOLDER', - MANAGE_GET_DEFAULT_DOWNLOAD_FOLDER = 'MANAGE_GET_DEFAULT_DOWNLOAD_FOLDER', - MANAGE_OPEN_DOWNLOADED_FOLDER = 'MANAGE_OPEN_DOWNLOADED_FOLDER', - MANAGE_OPEN_LOCAL_FILE = 'MANAGE_OPEN_LOCAL_FILE', - MANAGE_DOWNLOAD_FILE_FROM_URL = 'MANAGE_DOWNLOAD_FILE_FROM_URL', - MANAGE_CONVERT_PATH_TO_BASE64 = 'MANAGE_CONVERT_PATH_TO_BASE64' -} - -export enum IToolboxItemType { - IS_CONFIG_FILE_BROKEN = 'IS_CONFIG_FILE_BROKEN', - IS_GALLERY_FILE_BROKEN = 'IS_GALLERY_FILE_BROKEN', - HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD = 'HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD', - HAS_PROBLEM_WITH_PROXY = 'HAS_PROBLEM_WITH_PROXY' -} - -export enum IToolboxItemCheckStatus { - INIT = 'init', - LOADING = 'loading', - SUCCESS = 'success', - ERROR = 'error' -} - -// piclist setting - -export enum ISartMode { - QUIET = 'quiet', - MINI = 'mini', - MAIN = 'main', - NO_TRAY = 'no-tray' -} - -export enum II18nLanguage { - ZH_CN = 'zh-CN', - ZH_TW = 'zh-TW', - EN = 'en' -} - -export enum IShortUrlServer { - C1N = 'c1n', - YOURLS = 'yourls', - CFWORKER = 'cf_worker', - SINK = 'sink' -} - -export enum commonTaskStatus { - queuing = 'queuing', - failed = 'failed', - canceled = 'canceled', - paused = 'paused' -} - -// manage task status - -export enum uploadTaskSpecialStatus { - uploading = 'uploading', - uploaded = 'uploaded' -} - -export enum downloadTaskSpecialStatus { - downloading = 'downloading', - downloaded = 'downloaded' -} diff --git a/src/universal/types/i18n.d.ts b/src/universal/types/i18n.d.ts new file mode 100644 index 00000000..761c24fa --- /dev/null +++ b/src/universal/types/i18n.d.ts @@ -0,0 +1,8 @@ +import 'vue-i18n' + +import zhCN from '../../renderer/i18n/locales/zh-CN.json' + +type MessageSchema = typeof zhCN +declare module 'vue-i18n' { + export interface DefineLocaleMessage extends MessageSchema {} +} diff --git a/src/universal/types/i18n.ts b/src/universal/types/i18n.ts index b78ab0ee..c9338089 100644 --- a/src/universal/types/i18n.ts +++ b/src/universal/types/i18n.ts @@ -66,5 +66,7 @@ export interface ILocales { UPDATE_DOWNLOADED: string TIPS_UPDATE_DOWNLOADED: string QUIT: string + OPERATION_SUCCEED: string + OPERATION_FAILED: string } export type ILocalesKey = keyof ILocales diff --git a/src/universal/types/manage.ts b/src/universal/types/manage.ts index 82b036c8..a05baca6 100644 --- a/src/universal/types/manage.ts +++ b/src/universal/types/manage.ts @@ -1,7 +1,6 @@ import { ILogger } from 'piclist/dist/types' -import { commonTaskStatus, downloadTaskSpecialStatus, uploadTaskSpecialStatus } from './enum' -import { IStringKeyMap } from './types' +import { IStringKeyMap } from '#/types/types' // common type export type Undefinable = T | undefined @@ -152,14 +151,10 @@ export interface IManageConfigType { } [others: string]: any } - -type uploadTaskStatus = commonTaskStatus | uploadTaskSpecialStatus -type downloadTaskStatus = commonTaskStatus | downloadTaskSpecialStatus - export interface IUploadTask { id: string progress: number - status: uploadTaskStatus + status: any sourceFilePath: string sourceFileName: string targetFilePath: string @@ -174,7 +169,7 @@ export interface IUploadTask { export interface IDownloadTask { id: string progress: number - status: downloadTaskStatus + status: any sourceFileUrl?: string sourceFileName?: string sourceConfig?: IStringKeyMap diff --git a/src/universal/types/rpc.ts b/src/universal/types/rpc.ts index 97069aba..1646ce28 100644 --- a/src/universal/types/rpc.ts +++ b/src/universal/types/rpc.ts @@ -1,8 +1,7 @@ import type { IpcMainEvent, IpcMainInvokeEvent } from 'electron' -import { IRPCActionType, IRPCType, IToolboxItemCheckStatus, IToolboxItemType } from '#/types/enum' export type IGetLatestVersionArgs = [isCheckBetaVersion: boolean] -export type IToolboxCheckArgs = [type: IToolboxItemType] +export type IToolboxCheckArgs = [type: string] export type IShowDockIconArgs = [visible: boolean] export interface IRPCServer { @@ -12,10 +11,10 @@ export interface IRPCServer { } export type IRPCRoutes = Map< - IRPCActionType, + string, { handler: IRPCHandler - type: IRPCType + type: string } > @@ -24,21 +23,21 @@ export type IIPCEvent = IpcMainEvent | IpcMainInvokeEvent export type IRPCHandler = (event: IIPCEvent, args: any) => Promise export interface IRPCRouter { - add(action: IRPCActionType, handler: IRPCHandler, type: IRPCType): IRPCRouter + add(action: string, handler: IRPCHandler, type: string): IRPCRouter routes: () => IRPCRoutes } export type IToolboxChecker = (event: IpcMainEvent) => Promise -export type IToolboxCheckerMap = +export type IToolboxCheckerMap = Record -export type IToolboxFixMap = +export type IToolboxFixMap = Record> export interface IToolboxCheckRes { - type: IToolboxItemType - status: IToolboxItemCheckStatus + type: string + status: string msg?: string value?: any } diff --git a/src/universal/types/shims-tsx.d.ts b/src/universal/types/shims-tsx.d.ts index 525da07e..d33173a9 100644 --- a/src/universal/types/shims-tsx.d.ts +++ b/src/universal/types/shims-tsx.d.ts @@ -1,3 +1,5 @@ +// src/global.d.ts + import crypto from 'node:crypto' import path from 'node:path' @@ -8,7 +10,6 @@ import mime from 'mime-types' import { VNode } from 'vue' import { IpcRendererListener } from '#/types/electron' -import { IRPCActionType } from '#/types/enum' import { ILocales, ILocalesKey } from '#/types/i18n' import { IStringKeyMap } from '#/types/types' @@ -24,10 +25,10 @@ declare global { electron: { platform: string setVisualZoomLevelLimits: (min: number, max: number) => void - sendRpcSync: (action: IRPCActionType, ...args: any[]) => any - triggerRPC: (action: IRPCActionType, ...args: any[]) => Promise + sendRpcSync: (action: string, ...args: any[]) => any + triggerRPC: (action: string, ...args: any[]) => Promise sendToMain: (channel: string, ...args: any[]) => void - sendRPC: (action: IRPCActionType, ...args: any[]) => void + sendRPC: (action: string, ...args: any[]) => void ipcRendererOn: (channel: string, listener: IpcRendererListener) => void ipcRendererRemoveListener: (channel: string, listener: IpcRendererListener) => void clipboard: { diff --git a/src/universal/types/types.ts b/src/universal/types/types.ts index c5fe5b94..618b3a18 100644 --- a/src/universal/types/types.ts +++ b/src/universal/types/types.ts @@ -1,8 +1,7 @@ -import { ServerResponse } from 'node:http' +import type { ServerResponse } from 'node:http' import type { PicGo } from 'piclist' -import { IRemoteNoticeActionType, IRemoteNoticeTriggerCount, IRemoteNoticeTriggerHook } from '#/types/enum' export interface IObj { [propName: string]: any } @@ -483,12 +482,12 @@ export interface IRemoteNotice { } export interface IRemoteNoticeAction { - type: IRemoteNoticeActionType + type: string // trigger time - hooks: IRemoteNoticeTriggerHook[] + hooks: string[] id: string // trigger count: always or once; default: once - triggerCount: IRemoteNoticeTriggerCount + triggerCount: string data?: { title?: string diff --git a/src/universal/types/view.ts b/src/universal/types/view.ts index e7ea4093..5befb6ed 100644 --- a/src/universal/types/view.ts +++ b/src/universal/types/view.ts @@ -1,5 +1,3 @@ -import { IToolboxItemCheckStatus, IToolboxItemType } from '#/types/enum' - export interface ISettingForm { showUpdateTip: boolean autoStart: boolean @@ -46,7 +44,7 @@ export interface ISettingForm { export interface IToolboxItem { title: string - status: IToolboxItemCheckStatus + status: string msg?: string value?: any // for handler hasNoFixMethod?: boolean @@ -54,4 +52,4 @@ export interface IToolboxItem { handlerText?: string } -export type IToolboxMap = Record +export type IToolboxMap = Record diff --git a/src/universal/utils/common.ts b/src/universal/utils/common.ts deleted file mode 100644 index 4dcb1c05..00000000 --- a/src/universal/utils/common.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { IHTTPProxy, IStringKeyMap } from '#/types/types' - -export const isUrl = (url: string): boolean => { - try { - return Boolean(new URL(url)) - } catch { - return false - } -} - -export const isUrlEncode = (url: string): boolean => { - url = url || '' - try { - return url !== decodeURI(url) - } catch { - return false - } -} - -export const handleUrlEncode = (url: string): string => (isUrlEncode(url) ? url : encodeURI(url)) - -/** - * streamline the full plugin name to a simple one - * for example: - * 1. picgo-plugin-xxx -> xxx - * 2. @xxx/picgo-plugin-yyy -> yyy - * @param name pluginFullName - */ -export const handleStreamlinePluginName = (name: string) => name.replace(/(@[^/]+\/)?picgo-plugin-/, '') - -export const simpleClone = (obj: any) => JSON.parse(JSON.stringify(obj)) - -export const enforceNumber = (num: number | string) => (isNaN(+num) ? 0 : +num) - -export const trimValues = ( - obj: T -): { [K in keyof T]: T[K] extends string ? string : T[K] } => { - return Object.fromEntries( - Object.entries(obj).map(([key, value]) => [key, typeof value === 'string' ? value.trim() : value]) - ) as { [K in keyof T]: T[K] extends string ? string : T[K] } -} - -export function isNeedToShorten (alias: string, cutOff = 20) { - return [...alias].reduce((len, char) => len + (char.charCodeAt(0) > 255 ? 2 : 1), 0) > cutOff -} - -export function safeSliceF (str: string, total: number) { - let result = '' - let totalLen = 0 - for (const s of str) { - if (totalLen >= total) { - break - } - result += s - totalLen += s.charCodeAt(0) > 255 ? 2 : 1 - } - return result -} - -export function encodeFilePath (filePath: string) { - return filePath.replace(/\\/g, '/').split('/').map(encodeURIComponent).join('/') -} - -export const formatEndpoint = (endpoint: string, sslEnabled: boolean): string => { - const hasProtocol = /^https?:\/\//.test(endpoint) - if (!hasProtocol) { - return `${sslEnabled ? 'https' : 'http'}://${endpoint}` - } - return sslEnabled ? endpoint.replace(/^http:\/\//, 'https://') : endpoint.replace(/^https:\/\//, 'http://') -} - -export const trimPath = (path: string) => path.replace(/^\/+|\/+$/g, '').replace(/\/+/g, '/') - -export const formatHttpProxy = ( - proxy: string | undefined, - type: 'object' | 'string' -): IHTTPProxy | undefined | string => { - if (!proxy) return undefined - if (/^https?:\/\//.test(proxy)) { - const { protocol, hostname, port } = new URL(proxy) - return type === 'string' - ? `${protocol}//${hostname}:${port}` - : { - host: hostname, - port: Number(port), - protocol: protocol.slice(0, -1) - } - } - const [host, port] = proxy.split(':') - return type === 'string' - ? `http://${host}:${port}` - : { - host, - port: port ? Number(port) : 80, - protocol: 'http' - } -} diff --git a/src/universal/utils/notification.ts b/src/universal/utils/notification.ts deleted file mode 100644 index 5ed2cc2e..00000000 --- a/src/universal/utils/notification.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { IAppNotification } from '#/types/types' - -export const notificationList: IAppNotification[] = [] diff --git a/tsconfig.json b/tsconfig.json index d3324fba..17364ccb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,6 +17,7 @@ ], "typeRoots": [ "./node_modules/@types", + "./src/universal/types/" ], "paths": { "@/*": [ @@ -49,6 +50,7 @@ "src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", + "src/**/*.d.ts", "tests/**/*.ts", "tests/**/*.tsx", "electron.vite.config.*"