@@ -18,11 +18,12 @@ import {
1818import { useMemo , useState } from 'react'
1919import { twMerge } from 'tailwind-merge'
2020import {
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
2728interface 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+
173194export 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' /> }
0 commit comments