Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions src/content/approveHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { ShowSettings } from './showSettings';
import { isPullRequestPage } from './pageUtils';

export interface ApprovalSuccessOptions {
showSettings: ShowSettings;
onApproved: () => void;
}

export interface ApprovalButtonOptions {
showSettings: ShowSettings;
}

export const checkForPRApprovalSuccess = (options: ApprovalSuccessOptions): void => {
if (!isPullRequestPage()) return;

chrome.storage.local.get(['prApprovalTriggered', 'prApprovalTime'], (result) => {
if (result.prApprovalTriggered && result.prApprovalTime) {
const timeDiff = Date.now() - result.prApprovalTime;
if (timeDiff < 30000 && options.showSettings.isEnabled('approved')) {
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: Magic Number - Extract Timeout Constant

The 30000ms timeout is hardcoded and appears in multiple handlers. Extract to a shared constant:

// In constants.ts
export const PR_ACTION_TIMEOUT_MS = 30000;

// Then use:
if (timeDiff < PR_ACTION_TIMEOUT_MS && ...)

Same issue in:

  • createHandler.ts:18
  • approveHandler.ts:23

console.log('βœ… PR approval detected via storage flag, showing banner');
options.onApproved();
chrome.storage.local.remove(['prApprovalTriggered', 'prApprovalTime']);
} else if (timeDiff < 30000 && !options.showSettings.isEnabled('approved')) {
console.log('🚫 PR approval detected but disabled in settings');
chrome.storage.local.remove(['prApprovalTriggered', 'prApprovalTime']);
}
}
});
};

export const detectPRApprovalButtons = (options: ApprovalButtonOptions): void => {
if (!isPullRequestPage()) {
return;
}

const dialogElement = document.querySelector('div[role="dialog"]');
if (dialogElement) {
const buttons = Array.from(dialogElement.querySelectorAll('button'));
const submitButton = buttons.find((button) =>
button.textContent?.toLowerCase().includes('submit review'),
);

if (submitButton && !submitButton.hasAttribute('data-elden-ring-approval-listener')) {
submitButton.addEventListener('click', () => {
const approveRadio = dialogElement.querySelector(
'input[name="reviewEvent"][value="approve"]',
) as HTMLInputElement;

if (approveRadio && approveRadio.checked) {
if (options.showSettings.isEnabled('approved')) {
console.log('🎯 Submit review with approval selected');
chrome.storage.local.set({
prApprovalTriggered: true,
prApprovalTime: Date.now(),
});
} else {
console.log('🚫 PR approval banner disabled in settings');
}
}
});
submitButton.setAttribute('data-elden-ring-approval-listener', 'true');
}
}

const approveRadios = document.querySelectorAll('input[name="reviewEvent"][value="approve"]');
approveRadios.forEach((radio) => {
if (!radio.hasAttribute('data-elden-ring-approval-listener')) {
radio.addEventListener('change', () => {
if ((radio as HTMLInputElement).checked) {
console.log('🎯 Approve option selected');
}
});
radio.setAttribute('data-elden-ring-approval-listener', 'true');
}
});
};
34 changes: 34 additions & 0 deletions src/content/closeHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { ShowSettings } from './showSettings';
import { isPullRequestPage } from './pageUtils';
import { waitForCloseComplete } from './closeWatcher';

export interface CloseHandlerOptions {
showSettings: ShowSettings;
onClosed: () => void;
}

export const detectCloseButtons = (options: CloseHandlerOptions): void => {
if (!isPullRequestPage() || !options.showSettings.isEnabled('closed')) {
return;
}

const closeButtonContainer = document.querySelector('#partial-new-comment-form-actions');
if (!closeButtonContainer) {
return;
}

const closeButtons = closeButtonContainer.querySelectorAll('button');
closeButtons.forEach((button) => {
const buttonText = button.textContent?.toLowerCase().trim() || '';
if (
buttonText.includes('close pull request') &&
!button.hasAttribute('data-elden-ring-close-listener')
) {
button.addEventListener('click', () => {
console.log('πŸ›‘ Close pull request button clicked');
waitForCloseComplete(() => options.onClosed());
});
button.setAttribute('data-elden-ring-close-listener', 'true');
}
});
};
2 changes: 1 addition & 1 deletion src/content/content.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ afterEach(() => {
document.body.innerHTML = '';
});

describe('EldenRingMerger', () => {
describe('EldenRingOrchestrator', () => {
it('should call storage API for loading settings', () => {
// Simulate the loadSettings method behavior
chrome.storage.sync.get(['soundEnabled', 'showOnPRMerged', 'showOnPRCreate'], () => {});
Expand Down
Loading