Skip to content

Commit a39d3f9

Browse files
committed
Move interfaces around.
1 parent dcfa6fa commit a39d3f9

File tree

3 files changed

+51
-31
lines changed

3 files changed

+51
-31
lines changed

browser-extension/src/entrypoints/background.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { CommentEvent, CommentSpot } from '@/lib/enhancer'
2+
import type { DraftStats } from '@/lib/enhancers/draftStats'
23
import type { GetOpenSpotsResponse, ToBackgroundMessage } from '@/lib/messages'
34
import {
45
CLOSE_MESSAGE_PORT,
@@ -17,6 +18,18 @@ export interface CommentState {
1718
spot: CommentSpot
1819
drafts: [number, string][]
1920
}
21+
interface Draft {
22+
content: string
23+
time: number
24+
stats: DraftStats
25+
}
26+
export interface CommentTableRow {
27+
spot: CommentSpot,
28+
latestDraft: Draft
29+
isOpenTab: boolean
30+
isSent: boolean
31+
isTrashed: boolean
32+
}
2033

2134
export const openSpots = new Map<string, CommentState>()
2235

@@ -52,6 +65,7 @@ export function handlePopupMessage(
5265
): typeof CLOSE_MESSAGE_PORT | typeof KEEP_PORT_OPEN {
5366
if (isGetOpenSpotsMessage(message)) {
5467
const spots: CommentState[] = Array.from(openSpots.values())
68+
5569
const response: GetOpenSpotsResponse = { spots }
5670
sendResponse(response)
5771
return KEEP_PORT_OPEN

browser-extension/tests/playground/claude.tsx

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ import {
1818
import { useMemo, useState } from 'react'
1919
import { twMerge } from 'tailwind-merge'
2020
import {
21-
type CommentTableRow,
2221
generateMockDrafts,
23-
isGitHubDraft,
24-
isRedditDraft,
22+
RedditSpot
2523
} from './replicaData'
24+
import type { CommentTableRow } from '@/entrypoints/background'
25+
import { CommentSpot } from '@/lib/enhancer'
26+
import { GitHubIssueAddCommentSpot } from '@/lib/enhancers/github/githubIssueAddComment'
2627

2728
interface FilterState {
2829
sentFilter: 'both' | 'sent' | 'unsent'
@@ -151,7 +152,7 @@ const MultiSegment = <T,>({ segments, value, onValueChange }: MultiSegmentProps<
151152
}
152153

153154
// Helper function for relative time
154-
const timeAgo = (date: Date | number) => {
155+
function timeAgo(date: Date | number): string {
155156
const timestamp = typeof date === 'number' ? date : date.getTime()
156157
const seconds = Math.floor((Date.now() - timestamp) / 1000)
157158
const intervals = [
@@ -170,6 +171,26 @@ const timeAgo = (date: Date | number) => {
170171
return 'just now'
171172
}
172173

174+
/** Returns all leaf values of an arbitrary object as strings. */
175+
function* allLeafValues(obj: any, visited = new Set()): Generator<string> {
176+
if (visited.has(obj) || obj == null) return
177+
if (typeof obj === 'string') yield obj
178+
else if (typeof obj === 'number') yield String(obj)
179+
else if (typeof obj === 'object') {
180+
visited.add(obj)
181+
for (const key in obj) {
182+
yield* allLeafValues(obj[key], visited)
183+
}
184+
}
185+
}
186+
187+
function isGitHubDraft(spot: CommentSpot): spot is GitHubIssueAddCommentSpot {
188+
return spot.type === 'GH_PR_ADD_COMMENT' || spot.type === 'GH_ISSUE_ADD_COMMENT'
189+
}
190+
function isRedditDraft(spot: CommentSpot): spot is RedditSpot {
191+
return spot.type === 'REDDIT'
192+
}
193+
173194
export const ClaudePrototype = () => {
174195
const [drafts] = useState(generateMockDrafts())
175196
const [selectedIds, setSelectedIds] = useState(new Set())
@@ -193,11 +214,14 @@ export const ClaudePrototype = () => {
193214
}
194215
if (filters.searchQuery) {
195216
const query = filters.searchQuery.toLowerCase()
196-
filtered = filtered.filter((d) =>
197-
[d.spot.title, d.latestDraft.content, (d.spot as any).slug, (d.spot as any).subreddit].some(
198-
(value) => value && String(value).toLowerCase().includes(query),
199-
),
200-
)
217+
filtered = filtered.filter((d) => {
218+
for (const value of allLeafValues(d)) {
219+
if (value.toLowerCase().includes(query)) {
220+
return true // Early exit on first match
221+
}
222+
}
223+
return false
224+
})
201225
}
202226
// sort by newest
203227
filtered.sort((a, b) => b.latestDraft.time - a.latestDraft.time)
@@ -442,7 +466,7 @@ function commentRow(
442466
{/* Title */}
443467
<div className='flex items-center gap-1'>
444468
<a href='TODO' className='text-sm font-medium hover:underline truncate'>
445-
{row.spot.title}
469+
TODO_title
446470
</a>
447471
<Badge type={row.isSent ? 'sent' : 'unsent'} />
448472
{row.isTrashed && <Badge type='trashed' />}

browser-extension/tests/playground/replicaData.tsx

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,14 @@
11
import type { CommentSpot } from '@/lib/enhancer'
2-
import type { DraftStats } from '@/lib/enhancers/draftStats'
2+
import type { CommentTableRow } from '@/entrypoints/background'
33
import type { GitHubIssueAddCommentSpot } from '@/lib/enhancers/github/githubIssueAddComment'
44
import type { GitHubPRAddCommentSpot } from '@/lib/enhancers/github/githubPRAddComment'
55

6-
interface RedditSpot extends CommentSpot {
6+
export interface RedditSpot extends CommentSpot {
77
title: string
88
subreddit: string
99
type: 'REDDIT'
1010
}
11-
interface Draft {
12-
content: string
13-
time: number
14-
stats: DraftStats
15-
}
16-
export interface CommentTableRow {
17-
spot: GitHubOrReddit
18-
latestDraft: Draft
19-
isOpenTab: boolean
20-
isSent: boolean
21-
isTrashed: boolean
22-
}
23-
type GitHubOrReddit = GitHubIssueAddCommentSpot | GitHubPRAddCommentSpot | RedditSpot
24-
export const isGitHubDraft = (spot: GitHubOrReddit): spot is GitHubIssueAddCommentSpot => {
25-
return spot.type === 'GH_PR_ADD_COMMENT' || spot.type === 'GH_ISSUE_ADD_COMMENT'
26-
}
27-
export const isRedditDraft = (spot: GitHubOrReddit): spot is RedditSpot => {
28-
return spot.type === 'REDDIT'
29-
}
11+
3012
export const generateMockDrafts = (): CommentTableRow[] => [
3113
{
3214
isOpenTab: true,

0 commit comments

Comments
 (0)