Skip to content

Commit 159839f

Browse files
committed
Resolved the comments raised by Copilot
1 parent a52bc47 commit 159839f

8 files changed

Lines changed: 218 additions & 222 deletions

File tree

src/data/content_scripts/content.ts

Lines changed: 43 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,71 @@
1+
// src/data/content_scripts/content.ts
12
import { BrowserEmailService } from "../services/browser_email_service";
23
import { PageInteractionService } from "../services/page_interaction_service";
34

5+
let currentAbortController: AbortController | null = null;
6+
47
// Establish connection with the side panel
58
chrome.runtime.onConnect.addListener(function (port) {
69
console.assert(port.name === "gmail-port");
710
port.postMessage({ message: "Content script connected" });
811

9-
let currentAbortController: AbortController | null = null;
10-
1112
port.onMessage.addListener(function (msg) {
1213
console.log("sidepanel said: ", msg);
1314

1415
if (msg.action === "FETCH_SENDERS") {
15-
currentAbortController = fetchSenders(port);
16-
} else if (msg.action === "CANCEL_FETCH") {
17-
currentAbortController?.abort();
16+
fetchSenders(port);
1817
} else if (msg.action === "DELETE_SENDERS") {
1918
deleteSenders(port, msg.emails);
2019
} else if (msg.action === "UNSUBSCRIBE_SENDERS") {
2120
unsubscribeSenders(port, msg.emails);
2221
} else if (msg.action === "BLOCK_SENDER") {
2322
blockSender(port, msg.email);
23+
} else if (msg.action === "CANCEL_FETCH") {
24+
if (currentAbortController) {
25+
currentAbortController.abort();
26+
console.log("Fetch cancelled by user");
27+
}
2428
}
2529
});
2630
});
2731

28-
function fetchSenders(port: chrome.runtime.Port): AbortController {
29-
const abortController = new AbortController();
30-
31-
(async () => {
32-
try {
33-
const senders = await BrowserEmailService.fetchSendersFromBrowser({
34-
onProgress: (progress) => {
35-
// Send progress updates to the side panel
36-
port.postMessage({
37-
action: "FETCH_PROGRESS",
38-
progress,
39-
});
40-
},
41-
batchSize: 10,
42-
maxPages: undefined, // Process all pages by default
43-
signal: abortController.signal,
44-
});
45-
46-
if (abortController.signal.aborted) {
47-
console.log("Fetch was cancelled, not sending final response.");
48-
return;
49-
}
32+
async function fetchSenders(port: chrome.runtime.Port) {
33+
try {
34+
// Create new abort controller for this fetch
35+
currentAbortController = new AbortController();
5036

51-
const serialized = senders.map((sender) => ({
52-
email: sender.email,
53-
names: Array.from(sender.names), // convert Set -> array
54-
emailCount: sender.emailCount,
55-
}));
56-
port.postMessage({
57-
action: "FETCH_SENDERS_RESPONSE",
58-
success: true,
59-
data: serialized,
60-
});
61-
} catch (error) {
62-
if (!abortController.signal.aborted) {
37+
const senders = await BrowserEmailService.fetchSendersFromBrowser({
38+
onProgress: (progress) => {
39+
// Send progress updates to the side panel
6340
port.postMessage({
64-
action: "FETCH_SENDERS_RESPONSE",
65-
success: false,
66-
error: (error as Error).message,
41+
action: "FETCH_PROGRESS",
42+
progress
6743
});
68-
}
69-
}
70-
})();
44+
},
45+
batchSize: 10,
46+
signal: currentAbortController.signal
47+
});
7148

72-
return abortController;
49+
const serialized = senders.map((sender) => ({
50+
email: sender.email,
51+
names: Array.from(sender.names), // convert Set -> array
52+
emailCount: sender.emailCount,
53+
}));
54+
55+
port.postMessage({
56+
action: "FETCH_SENDERS_RESPONSE",
57+
success: true,
58+
data: serialized,
59+
});
60+
} catch (error) {
61+
port.postMessage({
62+
action: "FETCH_SENDERS_RESPONSE",
63+
success: false,
64+
error: (error as Error).message,
65+
});
66+
} finally {
67+
currentAbortController = null;
68+
}
7369
}
7470

7571
async function deleteSenders(port: chrome.runtime.Port, emails: string[]) {
@@ -149,4 +145,4 @@ chrome.runtime.onMessage.addListener((message) => {
149145
if (message.action === "CLOSE_TUTORIAL") {
150146
PageInteractionService.closeTutorial();
151147
}
152-
});
148+
});

src/data/repositories/browser_email_repo.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
import { Sender } from "../../domain/entities/sender";
22
import { EmailRepo } from "../../domain/repositories/email_repo";
3+
import { FetchProgress } from "../../domain/types/progress";
34
import { PortManager } from "../ports/port_manager";
4-
import { FetchProgress } from "../services/browser_email_service";
55

66
export class BrowserEmailRepo implements EmailRepo {
77
private onProgressCallback?: (progress: FetchProgress) => void;
88

9-
setProgressCallback(callback: (progress: FetchProgress) => void) {
9+
setProgressCallback(callback: (progress: FetchProgress) => void): void {
1010
this.onProgressCallback = callback;
1111
}
1212

13+
async cancelFetch(): Promise<void> {
14+
const port = PortManager.gmailPort;
15+
if (!port) return Promise.reject("Port not connected");
16+
port.postMessage({ action: "CANCEL_FETCH" });
17+
return Promise.resolve();
18+
}
19+
1320
async fetchSenders(): Promise<Sender[]> {
1421
const port = PortManager.gmailPort;
1522
if (!port) return Promise.reject("Port not connected");
@@ -28,6 +35,9 @@ export class BrowserEmailRepo implements EmailRepo {
2835
senders.sort((a, b) => b.emailCount - a.emailCount);
2936
resolve(senders);
3037
} else {
38+
console.error(
39+
`Error fetching senders from content script: ${msg.error}`,
40+
);
3141
reject(new Error(msg.error));
3242
}
3343
}
@@ -36,12 +46,6 @@ export class BrowserEmailRepo implements EmailRepo {
3646
});
3747
}
3848

39-
async cancelFetch(): Promise<void> {
40-
const port = PortManager.gmailPort;
41-
if (!port) return;
42-
port.postMessage({ action: "CANCEL_FETCH" });
43-
}
44-
4549
async deleteSenders(senderEmailAddresses: string[]): Promise<void> {
4650
const port = PortManager.gmailPort;
4751
if (!port) return Promise.reject("Port not connected");

src/data/repositories/mocks/mock_email_repo.ts

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
1+
// src/data/repositories/mocks/mock_email_repo.ts
12
import { Sender } from "../../../domain/entities/sender";
23
import { EmailRepo } from "../../../domain/repositories/email_repo";
3-
4-
export interface FetchProgress {
5-
currentPage: number;
6-
totalPages: number;
7-
processedEmails: number;
8-
totalEmails: number;
9-
percentage: number;
10-
}
4+
import { FetchProgress } from "../../../domain/types/progress";
115

126
export class MockEmailRepo implements EmailRepo {
137
private mockSenders: Sender[] = [
@@ -51,59 +45,61 @@ export class MockEmailRepo implements EmailRepo {
5145
this.failingSenders = senders;
5246
}
5347

54-
setProgressCallback(callback: (progress: FetchProgress) => void) {
48+
setProgressCallback(callback: (progress: FetchProgress) => void): void {
5549
this.progressCallback = callback;
5650
}
5751

5852
setProgressiveLoadEnabled(enabled: boolean) {
5953
this.isProgressiveLoadEnabled = enabled;
6054
}
6155

56+
async cancelFetch(): Promise<void> {
57+
console.log("[MOCK] Cancel fetch requested");
58+
this.abortController?.abort();
59+
}
60+
61+
// - Mock implementations -
62+
6263
async fetchSenders(): Promise<Sender[]> {
6364
console.log("[MOCK] Fetching senders...");
64-
65+
6566
if (this.isProgressiveLoadEnabled && this.progressCallback) {
6667
// Simulate progressive loading
6768
const totalPages = 5;
6869
const emailsPerPage = 4;
6970
const totalEmails = this.mockSenders.length;
70-
71+
7172
this.abortController = new AbortController();
72-
73+
7374
for (let page = 1; page <= totalPages; page++) {
7475
// Check if cancelled
7576
if (this.abortController.signal.aborted) {
7677
console.log("[MOCK] Fetch cancelled");
7778
throw new Error("Fetch cancelled");
7879
}
79-
80+
8081
// Simulate page processing delay
81-
await new Promise((resolve) => setTimeout(resolve, 200));
82-
82+
await new Promise(resolve => setTimeout(resolve, 200));
83+
8384
// Report progress
8485
const progress: FetchProgress = {
8586
currentPage: page,
8687
totalPages: totalPages,
8788
processedEmails: Math.min(page * emailsPerPage, totalEmails),
8889
totalEmails: totalEmails,
89-
percentage: Math.round((page / totalPages) * 100),
90+
percentage: Math.round((page / totalPages) * 100)
9091
};
9192
this.progressCallback(progress);
9293
}
9394
} else {
9495
// Original behavior without progress
95-
await new Promise((resolve) => setTimeout(resolve, 500));
96+
await new Promise(resolve => setTimeout(resolve, 500));
9697
}
97-
98+
9899
this.mockSenders.sort((a, b) => b.emailCount - a.emailCount);
99100
return this.mockSenders;
100101
}
101102

102-
async cancelFetch(): Promise<void> {
103-
console.log("[MOCK] Cancel fetch requested");
104-
this.abortController?.abort();
105-
}
106-
107103
async deleteSenders(senderEmailAddresses: string[]): Promise<void> {
108104
console.log("[MOCK] Deleting senders:", senderEmailAddresses);
109105
this.mockSenders = this.mockSenders.filter(
@@ -127,4 +123,4 @@ export class MockEmailRepo implements EmailRepo {
127123
);
128124
return Promise.resolve();
129125
}
130-
}
126+
}

0 commit comments

Comments
 (0)