昨天我們把想要的文字初步組合出來,為了達到能更快速複製文字的目標,今天我們就把按鈕直接加到 Merge Request 頁面中吧!
Content Script 可以:
我們可以在 Merge Request 頁面上注入按鈕,並綁定事件,觸發我們寫好的 generateReviewContent()。
我們新增一個新增 button 的 function
<h1>
之下,也可以放在自己喜歡的地方)。async function addCopyBtn() {
const header = document.querySelector('h1');
const currentCopyBtn = document.getElementById('mrCopyBtn');
// 有 Header 且未建立按鈕才要建立
if (header && !currentCopyBtn) {
// 建立按鈕
const btn = document.createElement('button');
btn.id = 'mrCopyBtn';
btn.textContent = '📋 複製 MR 訊息';
btn.style.padding = '4px 0 0';
btn.style.color = '#172B4D';
btn.style.backgroundColor = 'transparent';
btn.style.border = 'none';
// 監聽按鈕點擊事件
btn.addEventListener('click', async () => {
// 取得 MR 資料
const titleEl = document.querySelector(".title")
|| document.querySelector("[data-testid='title-content']")
|| document.querySelector("h1");
const reviewerEl = document.querySelector("[data-testid='reviewer'] div");
const title = titleEl.innerText.trim()
const reviewer = reviewerEl.innerText.trim()
const message = await generateReviewContent(title, reviewer);
console.log(message);
// 複製文字到剪貼簿
navigator.clipboard.writeText(message).then(() => {
alert('MR 通知文字已複製!');
});
});
// 將按鈕加到標題下方
header.parentElement.insertAdjacentElement('afterend', btn);
}
}
將 MutationObserver 改寫成注入按鈕
const targetNode = document.body;
const config = { childList: true, subtree: true };
const callback = (mutations) => {
const isChildListChanged = mutations.some((mutation) =>
mutation.type === 'childList' && mutation.addedNodes.length > 0
);
if (isChildListChanged) {
observer.disconnect(); // 抓到就停止監聽,避免浪費效能
addCopyBtn();
observer.observe(targetNode, config);
}
}
(3. 如果昨天跟我一樣 return
要記得,才能抓到文字複製到剪貼簿)
```
const observer = new MutationObserver(callback);
observer.observe(targetNode, config);
async function generateReviewContent(title, reviewer) {
const {
reviewTemplate
} = await chrome.storage.sync.get(['reviewTemplate']);
const reviewerNameSymbol = "{REVIEWER_NAME}";
const mrLinkSymbol = "{MR_LINK}";
const textContent = reviewTemplate
.replace(reviewerNameSymbol, reviewer)
.replace(mrLinkSymbol, title)
return textContent //新增
}
```