diff --git a/src/main/code-launchpad/project-git.ts b/src/main/code-launchpad/project-git.ts new file mode 100644 index 0000000..89806d2 --- /dev/null +++ b/src/main/code-launchpad/project-git.ts @@ -0,0 +1,29 @@ +import { ProjectGitDto } from '@my-type/ide-projects' +import simpleGit from 'simple-git' + +/** + * 获取指定项目的 git 数据(如有) + * @param path 项目路径,应该是 {@link IdeProjectDto.path} + */ +export async function getProjectGitInfo(path: string): Promise { + try { + const git = simpleGit(path) + if (!(await git.checkIsRepo())) { + console.log(`路径 ${path} 的项目不存在 git 仓库。`) + return null + } + const status = await git.status() + return { + current: status.current, + tracking: status.tracking, + created: status.created.length, + deleted: status.deleted.length, + modified: status.modified.length, + renamed: status.renamed.length, + staged: status.staged.length + } + } catch (error) { + console.error(error) + return null + } +} diff --git a/src/main/index.ts b/src/main/index.ts index 2b57c4c..bc33d4f 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -13,6 +13,7 @@ import { getJetBrainsProjects, getVscodeProjects, openProject } from './code-lau import { createCodeLaunchpadTray, createCodeLaunchpadWindow } from './code-launchpad/code-launchpad' import type { IDECode } from '@my-type/settings' import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer' +import { getProjectGitInfo } from './code-launchpad/project-git' let mainWindow: BrowserWindow | null = null // @ts-ignore 保存引用,禁用报错 @@ -161,6 +162,9 @@ app.whenReady().then(async () => { ipcMain.handle('codeLaunchpad:openProject', (_, ide: IDECode, path: string) => { return openProject(ide, path) }) + ipcMain.handle('codeLaunchpad:getProjectGitInfo', (_, path: string) => { + return getProjectGitInfo(path) + }) await checkIDEs() await checkIDEsVersion() diff --git a/src/my-type/ide-projects.d.ts b/src/my-type/ide-projects.d.ts index f7485a7..8c68058 100644 --- a/src/my-type/ide-projects.d.ts +++ b/src/my-type/ide-projects.d.ts @@ -10,3 +10,13 @@ export interface IdeProjectDto { } export type IdeProjectsDto = IdeProjectDto[] + +export interface ProjectGitDto { + current: string | null + tracking: string | null + created: number + deleted: number + modified: number + renamed: number + staged: number +} diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts index 1664dab..8b40427 100644 --- a/src/preload/index.d.ts +++ b/src/preload/index.d.ts @@ -1,13 +1,13 @@ -import { ElectronAPI } from '@electron-toolkit/preload' -import { settingsDto, checkIDEsResultDto } from '@my-type/settings' +import { ElectronAPI } from "@electron-toolkit/preload"; +import { settingsDto, checkIDEsResultDto } from "@my-type/settings"; import { checkIDEsVersionDto } from "../my-type/settings"; -import { IdeProjectsDto } from "../my-type/ide-projects"; +import { GitProjectDto, IdeProjectsDto } from "../my-type/ide-projects"; // 此处只有签名 declare global { interface Window { - electron: ElectronAPI + electron: ElectronAPI; api: { _saveSettings: (settings: settingsDto) => Promise _updateSettings: () => Promise @@ -17,7 +17,7 @@ declare global { _maximize: () => Promise _closeWindow: () => Promise _exit: () => Promise - } + }; codeLaunchpad: { _getIDEs: () => Promise _checkIDEs: () => Promise @@ -26,6 +26,7 @@ declare global { _getVSCodeProjects: () => Promise _getJetBrainsProjects: () => Promise _openProject: (ide: string, path: string) => Promise - } + _getProjectGitInfo: (path: string) => Promise + }; } } diff --git a/src/preload/index.ts b/src/preload/index.ts index 5d2895b..90918a1 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -25,7 +25,8 @@ const codeLaunchpadApi = { _getVSCodeProjects: () => ipcRenderer.invoke('codeLaunchpad:getVSCodeProjects'), _getJetBrainsProjects: () => ipcRenderer.invoke('codeLaunchpad:getJetBrainsProjects'), _openProject: (ide: string, path: string) => - ipcRenderer.invoke('codeLaunchpad:openProject', ide, path) + ipcRenderer.invoke('codeLaunchpad:openProject', ide, path), + _getProjectGitInfo: (path: string) => ipcRenderer.invoke('codeLaunchpad:getProjectGitInfo', path) } // Use `contextBridge` APIs to expose Electron APIs to diff --git a/src/renderer/components.d.ts b/src/renderer/components.d.ts index a53c676..4a1a2cb 100644 --- a/src/renderer/components.d.ts +++ b/src/renderer/components.d.ts @@ -33,6 +33,7 @@ declare module 'vue' { NH2: typeof import('naive-ui')['NH2'] NH3: typeof import('naive-ui')['NH3'] NH4: typeof import('naive-ui')['NH4'] + NH5: typeof import('naive-ui')['NH5'] NIcon: typeof import('naive-ui')['NIcon'] NInput: typeof import('naive-ui')['NInput'] NInputNumber: typeof import('naive-ui')['NInputNumber'] diff --git a/src/renderer/src/components-code-launchpad/ProjectCard.vue b/src/renderer/src/components-code-launchpad/ProjectCard.vue index d33292f..3768b11 100644 --- a/src/renderer/src/components-code-launchpad/ProjectCard.vue +++ b/src/renderer/src/components-code-launchpad/ProjectCard.vue @@ -5,6 +5,7 @@ import type { IdeProjectDto } from '@my-type/ide-projects' import { toProductDisplayName } from '@my-type/jetbrains-state-tools' import { useMessage } from 'naive-ui' import { formatTimestamp } from '@my-type/dataFormatter' +import ProjectGit from '@renderer/components-code-launchpad/ProjectGit.vue' const message = useMessage() @@ -85,6 +86,7 @@ async function openWithIDE(ide: string): Promise { 上次打开于 {{ formatTimestamp(project.timestamp) }} + +import { onMounted, ref } from 'vue' +import { CreateOutline as CreatedIcon } from '@vicons/ionicons5' +import { + ChangeHistoryOutlined as ModifiedIcon, + DeleteOutlined as DeletedIcon, + DriveFileRenameOutlineSharp as RenamedIcon +} from '@vicons/material' +import { ProjectGitDto } from '@my-type/ide-projects' +import ProjectGitIconWidget from '@renderer/components-code-launchpad/ProjectGitIconWidget.vue' + +const info = ref(null) +const loading = ref(true) + +const props = defineProps<{ path: string }>() + +onMounted(async () => { + info.value = await window.codeLaunchpad._getProjectGitInfo(props.path) + loading.value = false +}) + + + + + diff --git a/src/renderer/src/components-code-launchpad/ProjectGitIconWidget.vue b/src/renderer/src/components-code-launchpad/ProjectGitIconWidget.vue new file mode 100644 index 0000000..d750907 --- /dev/null +++ b/src/renderer/src/components-code-launchpad/ProjectGitIconWidget.vue @@ -0,0 +1,39 @@ + + + + +