diff --git a/src/helper/base.ts b/src/helper/base.ts index d29374d..d8c79d0 100644 --- a/src/helper/base.ts +++ b/src/helper/base.ts @@ -138,6 +138,11 @@ export async function doSetLabels(labels: string[]) { core.info(`[doSetLabels] [${labels}] success!`); } +export async function doToggleLabels(labels: string[]) { + await ICE.toggleLabels(labels); + core.info(`[doToggleLabels] [${labels}] success!`); +} + export async function doUnlockIssue() { await ICE.unlockIssue(); core.info(`[doUnlockIssue] success!`); diff --git a/src/helper/helper.ts b/src/helper/helper.ts index 0dc3177..ef5cbc5 100644 --- a/src/helper/helper.ts +++ b/src/helper/helper.ts @@ -31,6 +31,7 @@ import { doRemoveAssignees, doRemoveLabels, doSetLabels, + doToggleLabels, doUnlockIssue, doUpdateComment, doUpdateIssue, @@ -208,6 +209,14 @@ export class IssueHelperEngine implements IIssueHelperEngine { await doUpdateIssue(0, state, title, body, updateMode, labels, assignees); break; } + case 'toggle-labels': { + if (labels && labels.length) { + await doToggleLabels(labels); + } else { + core.warning(`[doToggleLabels] labels is empty!`); + } + break; + } // ---[ Base End ]--->>> // ^_^ ============= ^_^ // -[ Advanced Begin ]-> diff --git a/src/issue/issue.ts b/src/issue/issue.ts index 8630285..28cf179 100644 --- a/src/issue/issue.ts +++ b/src/issue/issue.ts @@ -273,6 +273,30 @@ export class IssueCoreEngine implements IIssueCoreEngine { } } + public async toggleLabels(labels: string[]) { + const issue = await this.getIssue(); + const baseLabels: string[] = issue.labels.map(({ name }: any) => name); + + let addLabels = []; + let removeLabels = []; + + for (const label of labels) { + if (baseLabels.includes(label)) { + removeLabels.push(label); + } else { + addLabels.push(label); + } + } + + if (removeLabels.length) { + await this.removeLabels(removeLabels); + } + + if (addLabels.length) { + await this.addLabels(addLabels); + } + } + public async unlockIssue() { const { owner, repo, octokit, issueNumber } = this; await octokit.issues.unlock({ diff --git a/src/issue/types.ts b/src/issue/types.ts index 5368130..7c097c5 100644 --- a/src/issue/types.ts +++ b/src/issue/types.ts @@ -102,6 +102,7 @@ export interface IIssueCoreEngine { removeLabels: (labels: string[]) => Promise; setLabels: (labels: string[]) => Promise; + toggleLabels: (labels: string[]) => Promise; unlockIssue: () => Promise; diff --git a/src/types.ts b/src/types.ts index 27f29c2..d41cfb9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -44,6 +44,7 @@ export type TAction = | 'unlock-issue' | 'update-comment' | 'update-issue' + | 'toggle-labels' // [ Base End ] // ^_^ ========== ^_^ // [ Advanced Begin ]