Feature(custom): rewrite setting page, WIP

This commit is contained in:
Kuingsmile
2025-08-06 11:19:19 +08:00
parent 32c3eaba12
commit 4b8bfded1d
182 changed files with 5536 additions and 3322 deletions

View File

@@ -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"
}

0
UI_COMPONENTS_README.md Normal file
View File

View File

@@ -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",

View File

@@ -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"

View File

@@ -65,3 +65,5 @@ TIPS_FIND_NEW_VERSION: 发现新版本${v},更新了很多功能,是否后
UPDATE_DOWNLOADED: 更新已下载
TIPS_UPDATE_DOWNLOADED: 更新已下载,将在下次启动时安装,是否现在重启?
QUIT: 退出
OPERATION_SUCCEED: "操作成功"
OPERATION_FAILED: "操作失败"

View File

@@ -65,3 +65,5 @@ TIPS_FIND_NEW_VERSION: 發現新版本${v},更新了很多功能,是否後
UPDATE_DOWNLOADED: 更新已下載
TIPS_UPDATE_DOWNLOADED: 更新已下載,将在下次啟動時安裝,是否立即重啟?
QUIT: 退出
OPERATION_SUCCEED: "操作成功"
OPERATION_FAILED: "操作失敗"

View File

@@ -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
}

View File

@@ -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

View File

@@ -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<string, IShortKeyHandler> = new Map()

View File

@@ -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'

View File

@@ -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'

View File

@@ -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<string | null> => {
return new Promise(resolve => {

View File

@@ -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<IWindowList, IWindowListItem>()
const windowList = new Map<string, IWindowListItem>()
const getDefaultWindowSizes = (): { width: number; height: number } => {
const [mainWindowWidth, mainWindowHeight] = db.get([

View File

@@ -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<IWindowList | string, BrowserWindow> = new Map()
#windowIdMap: Map<number, IWindowList | string> = new Map()
#windowMap: Map< string, BrowserWindow> = new Map()
#windowIdMap: Map<number, string> = 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)
}

View File

@@ -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

View File

@@ -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')

View File

@@ -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
}

View File

@@ -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()

View File

@@ -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

View File

@@ -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 {

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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 {

View File

@@ -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'

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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

View File

@@ -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'

View File

@@ -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 {

View File

@@ -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

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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

View File

@@ -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 = {

View File

@@ -13,5 +13,3 @@ 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'

View File

@@ -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'

View File

@@ -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)

View File

@@ -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<any>
type?: IRPCType
type?: string
}
export class RPCRouter implements IRPCRouter {
private routeMap: IRPCRoutes = new Map()
add = <T>(action: IRPCActionType, handler: IRPCHandler<T>, type: IRPCType = IRPCType.SEND): this => {
add = <T>(action: string, handler: IRPCHandler<T>, type: string = IRPCType.SEND): this => {
this.routeMap.set(action, { handler, type })
return this
}

View File

@@ -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<IPasteStyle>(configPaths.settings.pasteStyle) || IPasteStyle.MARKDOWN
const pasteStyle = picgo.getConfig<string>(configPaths.settings.pasteStyle) || IPasteStyle.MARKDOWN
const customLink = picgo.getConfig<string>(configPaths.settings.customLink)
const [txt, shortUrl] = await pasteTemplate(pasteStyle, item, customLink)
if (copy) {

View File

@@ -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 [
{

View File

@@ -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()

View File

@@ -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 [
{

View File

@@ -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 [
{

View File

@@ -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,

View File

@@ -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()

View File

@@ -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<IPicGoPlugin[]> => {
},
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]}`),

View File

@@ -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 [
{

View File

@@ -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')

View File

@@ -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()

View File

@@ -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({

View File

@@ -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 [
{

View File

@@ -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()

View File

@@ -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<IToolboxItemType.HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD> = {
export const checkClipboardUploadMap: IToolboxCheckerMap<string> = {
[IToolboxItemType.HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD]: async event => {
sendToolboxRes(event, {
status: IToolboxItemCheckStatus.LOADING
@@ -51,7 +51,7 @@ export const checkClipboardUploadMap: IToolboxCheckerMap<IToolboxItemType.HAS_PR
}
}
export const fixClipboardUploadMap: IToolboxFixMap<IToolboxItemType.HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD> = {
export const fixClipboardUploadMap: IToolboxFixMap<string> = {
[IToolboxItemType.HAS_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD]: async () => {
const configFilePath = dbPathChecker()
const dirPath = path.dirname(configFilePath)

View File

@@ -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 {

View File

@@ -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<IToolboxItemType.HAS_PROBLEM_WITH_PROXY> = {
export const checkProxyMap: IToolboxCheckerMap<string> = {
[IToolboxItemType.HAS_PROBLEM_WITH_PROXY]: async event => {
sendToolboxRes(event, {
status: IToolboxItemCheckStatus.LOADING

View File

@@ -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<IToolboxCheckerMap<IToolboxItemType>> = {
const toolboxCheckMap: Partial<IToolboxCheckerMap<string>> = {
...checkFileMap,
...checkClipboardUploadMap,
...checkProxyMap
}
const toolboxFixMap: Partial<IToolboxFixMap<IToolboxItemType>> = {
const toolboxFixMap: Partial<IToolboxFixMap<string>> = {
...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)
}

View File

@@ -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<IToolboxCheckRes, 'type'>) => {
return event.sender.send(IRPCActionType.TOOLBOX_CHECK_RES, {
...res,

View File

@@ -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()

View File

@@ -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()

View File

@@ -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')

View File

@@ -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) {

View File

@@ -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 {

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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'

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
}

View File

@@ -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')

View File

@@ -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

View File

@@ -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<IManageConfigType>

View File

@@ -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<IStringKeyMap> => {
try {

View File

@@ -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

View File

@@ -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)

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import { routeHandler } from '#/types/types'
import type { routeHandler } from '#/types/types'
type HttpMethod = 'GET' | 'POST'

View File

@@ -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')

View File

@@ -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,

View File

@@ -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' : '/'

View File

@@ -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<string>(configPaths.settings.aesPassword) || DEFAULT_AES_PASSWORD,
picgo.getConfig<string>(configPaths.settings.aesPassword) || 'aesPassword',
Buffer.from('a8b3c4d2e4f5098712345678feedc0de', 'hex'),
100000,
32,

View File

@@ -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()

View File

@@ -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<string, any>
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 = <T extends IStringKeyMap>(
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, '/')

View File

@@ -1,13 +1,7 @@
import type { IBuildInCompressOptions, IBuildInWaterMarkOptions } from 'piclist'
import { II18nLanguage, IPasteStyle, ISartMode, IShortUrlServer } from '#/types/enum'
import type { IAliYunConfig, IAwsS3PListUserConfig, IGitHubConfig, IImgurConfig, ILocalConfig, ILskyConfig, IPicBedType, IQiniuConfig, IServerConfig, ISftpPlistConfig, IShortKeyConfig, ISMMSConfig, ISyncConfig, ITcYunConfig, IUploaderConfig, IUpYunConfig, IWebdavPlistConfig } from '#/types/types'
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 {
@@ -54,22 +48,22 @@ export interface IConfigStruct {
autoCloseMainWindow: boolean
isCustomMiniIcon: boolean
customMiniIcon: string
startMode: ISartModeValues
startMode: string
autoRename: boolean
deleteCloudFile: boolean
server: IServerConfig
serverKey: string
pasteStyle: IPasteStyleValues
pasteStyle: string
aesPassword: string
rename: boolean
sync: ISyncConfig
tempDirPath: string
language: II18nLanguageValues
language: string
customLink: string
manualPageOpen: manualPageOpenType
encodeOutputURL: boolean
useShortUrl: boolean
shortUrlServer: IShortUrlServerValues
shortUrlServer: string
c1nToken: string
cfWorkerHost: string
yourlsDomain: string

View File

@@ -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'

View File

@@ -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'

242
src/main/utils/enum.ts Normal file
View File

@@ -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'
}

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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) {

View File

@@ -0,0 +1,3 @@
import type { IAppNotification } from '#/types/types'
export const notificationList: IAppNotification[] = []

View File

@@ -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<string, string> = {
markdown: `![](${url})`,
HTML: `<img src="${url}"/>`,
URL: url,

25
src/main/utils/static.ts Normal file
View File

@@ -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'
]

Some files were not shown because too many files have changed in this diff Show More