1
+ import type { GitPullRequest } from '@gitkraken/provider-apis' ;
1
2
import { GitProviderUtils } from '@gitkraken/provider-apis' ;
2
3
import { useQueryClient } from '@tanstack/react-query' ;
3
4
import React , { useEffect , useMemo , useState } from 'react' ;
@@ -21,6 +22,25 @@ type PullRequestRowProps = {
21
22
draftCount ?: number ;
22
23
} ;
23
24
25
+ const pullRequestFuzzyMatch = ( pullRequest : GitPullRequest , filterString : string ) => {
26
+ if ( pullRequest . number . toString ( ) . includes ( filterString ) ) {
27
+ return true ;
28
+ }
29
+
30
+ // Do a "fuzzy match" on the PR title
31
+ const title = pullRequest . title . toLowerCase ( ) ;
32
+ let filterIndex = 0 ;
33
+ for ( const char of title ) {
34
+ if ( char === filterString [ filterIndex ] ) {
35
+ filterIndex ++ ;
36
+ }
37
+ if ( filterIndex === filterString . length ) {
38
+ return true ;
39
+ }
40
+ }
41
+ return false ;
42
+ } ;
43
+
24
44
const PullRequestRow = ( { userId, pullRequest, provider, draftCount = 0 } : PullRequestRowProps ) => {
25
45
const queryClient = useQueryClient ( ) ;
26
46
const deepLinkUrl = getGitKrakenDeepLinkUrl ( provider , pullRequest . url ) ;
@@ -150,9 +170,7 @@ export const FocusView = ({ userId }: { userId: string }) => {
150
170
? pullRequestBuckets
151
171
?. map ( bucket => ( {
152
172
...bucket ,
153
- pullRequests : bucket . pullRequests . filter ( pr =>
154
- pr . title . toLowerCase ( ) . includes ( lowercaseFilterString ) ,
155
- ) ,
173
+ pullRequests : bucket . pullRequests . filter ( pr => pullRequestFuzzyMatch ( pr , lowercaseFilterString ) ) ,
156
174
} ) )
157
175
. filter ( bucket => bucket . pullRequests . length )
158
176
: pullRequestBuckets ;
0 commit comments