Skip to content

Commit 5f0eac8

Browse files
committed
first cut at popup implementation
1 parent 8befd38 commit 5f0eac8

File tree

3 files changed

+126
-1
lines changed

3 files changed

+126
-1
lines changed

browser-extension/src/entrypoints/background.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,24 @@ export function handleCommentEvent(message: CommentEvent, sender: any): void {
4646
}
4747
}
4848

49+
export function handlePopupMessage(message: any, sender: any, sendResponse: (response: any) => void): void {
50+
if (message.type === 'GET_OPEN_SPOTS') {
51+
const spots: CommentState[] = []
52+
for (const [, commentState] of openSpots) {
53+
spots.push(commentState)
54+
}
55+
sendResponse({ spots })
56+
}
57+
}
58+
4959
export default defineBackground(() => {
50-
browser.runtime.onMessage.addListener(handleCommentEvent)
60+
browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
61+
if (message.type === 'GET_OPEN_SPOTS') {
62+
handlePopupMessage(message, sender, sendResponse)
63+
return true
64+
} else {
65+
handleCommentEvent(message, sender)
66+
return false
67+
}
68+
})
5169
})
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,63 @@
11
import './style.css'
2+
import type { CommentState } from '../background'
3+
import { EnhancerRegistry } from '../../lib/registries'
4+
5+
const enhancers = new EnhancerRegistry()
6+
7+
async function getOpenSpots(): Promise<CommentState[]> {
8+
return new Promise((resolve) => {
9+
browser.runtime.sendMessage({ type: 'GET_OPEN_SPOTS' }, (response) => {
10+
resolve(response.spots || [])
11+
})
12+
})
13+
}
14+
15+
async function switchToTab(tabId: number, windowId: number): Promise<void> {
16+
await browser.windows.update(windowId, { focused: true })
17+
await browser.tabs.update(tabId, { active: true })
18+
window.close()
19+
}
20+
21+
function createSpotElement(commentState: CommentState): HTMLElement {
22+
const item = document.createElement('div')
23+
item.className = 'spot-item'
24+
25+
const title = document.createElement('div')
26+
title.className = 'spot-title'
27+
28+
const enhancer = enhancers.enhancerFor(commentState.spot)
29+
title.textContent = enhancer.tableTitle(commentState.spot)
30+
31+
item.appendChild(title)
32+
33+
item.addEventListener('click', () => {
34+
switchToTab(commentState.tab.tabId, commentState.tab.windowId)
35+
})
36+
37+
return item
38+
}
39+
40+
async function renderOpenSpots(): Promise<void> {
41+
const app = document.getElementById('app')!
42+
const spots = await getOpenSpots()
43+
44+
if (spots.length === 0) {
45+
app.innerHTML = '<div class="no-spots">No open comment spots</div>'
46+
return
47+
}
48+
49+
const header = document.createElement('h2')
50+
header.textContent = 'Open Comment Spots'
51+
app.appendChild(header)
52+
53+
const list = document.createElement('div')
54+
list.className = 'spots-list'
55+
56+
spots.forEach(spot => {
57+
list.appendChild(createSpotElement(spot))
58+
})
59+
60+
app.appendChild(list)
61+
}
62+
63+
renderOpenSpots()

browser-extension/src/entrypoints/popup/style.css

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,48 @@ body {
66
line-height: 1.4;
77
margin: 0;
88
}
9+
10+
h2 {
11+
margin: 0 0 15px 0;
12+
font-size: 16px;
13+
font-weight: 600;
14+
color: #333;
15+
}
16+
17+
.spots-list {
18+
display: flex;
19+
flex-direction: column;
20+
gap: 8px;
21+
}
22+
23+
.spot-item {
24+
padding: 10px;
25+
border: 1px solid #e0e0e0;
26+
border-radius: 6px;
27+
cursor: pointer;
28+
transition: all 0.2s ease;
29+
background: white;
30+
}
31+
32+
.spot-item:hover {
33+
background: #f5f5f5;
34+
border-color: #d0d0d0;
35+
transform: translateY(-1px);
36+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
37+
}
38+
39+
.spot-title {
40+
font-weight: 500;
41+
color: #333;
42+
margin-bottom: 4px;
43+
overflow: hidden;
44+
text-overflow: ellipsis;
45+
white-space: nowrap;
46+
}
47+
48+
.no-spots {
49+
text-align: center;
50+
color: #666;
51+
padding: 40px 20px;
52+
font-style: italic;
53+
}

0 commit comments

Comments
 (0)