11import  emojis  from  '../../../assets/emoji.json' ; 
2+ import  {  request  }  from  '../modules/fetch.ts' ; 
23
34const  maxMatches  =  6 ; 
45
5- function  sortAndReduce ( map : Map < string ,  number > )  { 
6+ function  sortAndReduce < T > ( map : Map < T ,  number > ) :  T [ ]  { 
67  const  sortedMap  =  new  Map ( Array . from ( map . entries ( ) ) . sort ( ( a ,  b )  =>  a [ 1 ]  -  b [ 1 ] ) ) ; 
78  return  Array . from ( sortedMap . keys ( ) ) . slice ( 0 ,  maxMatches ) ; 
89} 
@@ -27,11 +28,12 @@ export function matchEmoji(queryText: string): string[] {
2728  return  sortAndReduce ( results ) ; 
2829} 
2930
30- export  function  matchMention ( queryText : string ) : string [ ]  { 
31+ type  Mention  =  { value : string ;  name : string ;  fullname : string ;  avatar : string } ; 
32+ export  function  matchMention ( queryText : string ) : Mention [ ]  { 
3133  const  query  =  queryText . toLowerCase ( ) ; 
3234
3335  // results is a map of weights, lower is better 
34-   const  results  =  new  Map ( ) ; 
36+   const  results  =  new  Map < Mention ,   number > ( ) ; 
3537  for  ( const  obj  of  window . config . mentionValues  ??  [ ] )  { 
3638    const  index  =  obj . key . toLowerCase ( ) . indexOf ( query ) ; 
3739    if  ( index  ===  - 1 )  continue ; 
@@ -41,3 +43,75 @@ export function matchMention(queryText: string): string[] {
4143
4244  return  sortAndReduce ( results ) ; 
4345} 
46+ 
47+ type  IssueOrPullRequest  =  { value : string ;  name : string ;  type : 'issue'  |  'pull-request' } ; 
48+ export  async  function  matchIssueOrPullRequest ( url : string ,  queryText : string ) : IssueOrPullRequest [ ]  { 
49+   const  query  =  queryText . toLowerCase ( ) ; 
50+ 
51+   const  repository  =  url . split ( '/' ) . slice ( - 2 ) . join ( '/' ) ; 
52+   const  issuePullRequestId  =  url . split ( '/' ) . slice ( - 1 ) [ 0 ] ; 
53+ 
54+   console . log ( 'suggestions for' ,  { 
55+     repository, 
56+     query, 
57+   } ) ; 
58+ 
59+   // TODO: fetch data from api 
60+   // const res = await request('/-/suggestions', { 
61+   //   method: 'GET', 
62+   //   data: { 
63+   //     repository, 
64+   //     query, 
65+   //   }, 
66+   // }); 
67+   // console.log(await res.json()); 
68+ 
69+   // results is a map of weights, lower is better 
70+   const  results  =  new  Map < IssueOrPullRequest ,  number > ( ) ; 
71+   // for (const obj of window.config.mentionValues ?? []) { 
72+   //   const index = obj.key.toLowerCase().indexOf(query); 
73+   //   if (index === -1) continue; 
74+   //   const existing = results.get(obj); 
75+   //   results.set(obj, existing ? existing - index : index); 
76+   // } 
77+ 
78+   results . set ( { 
79+     value : '28958' , 
80+     name : 'Live removal of issue comments using htmx websocket' , 
81+     type : 'pull-request' , 
82+   } ,  0 ) ; 
83+ 
84+   results . set ( { 
85+     value : '32234' , 
86+     name : 'Calculate `PublicOnly` for org membership only once' , 
87+     type : 'pull-request' , 
88+   } ,  1 ) ; 
89+ 
90+   results . set ( { 
91+     value : '32280' , 
92+     name : 'Optimize branch protection rule loading' , 
93+     type : 'pull-request' , 
94+   } ,  2 ) ; 
95+ 
96+   results . set ( { 
97+     value : '32326' , 
98+     name : 'Shallow Mirroring' , 
99+     type : 'issue' , 
100+   } ,  3 ) ; 
101+ 
102+   results . set ( { 
103+     value : '32248' , 
104+     name : 'Make admins adhere to branch protection rules' , 
105+     type : 'pull-request' , 
106+   } ,  4 ) ; 
107+ 
108+   // filter out current issue/pull request 
109+   for  ( const  [ key ]  of  results . entries ( ) )  { 
110+     if  ( key . value  ===  issuePullRequestId )  { 
111+       results . delete ( key ) ; 
112+       break ; 
113+     } 
114+   } 
115+ 
116+   return  sortAndReduce ( results ) ; 
117+ } 
0 commit comments