2023-04-22 18:32:34 +03:00
import emojis from '../../../assets/emoji.json' ;
2024-10-29 12:20:49 +03:00
import type { Issue } from '../features/issue.ts' ;
import { GET } from '../modules/fetch.ts' ;
2023-04-22 18:32:34 +03:00
const maxMatches = 6 ;
2024-10-29 12:20:49 +03:00
function sortAndReduce < T > ( map : Map < T , number > ) : T [ ] {
2023-05-18 04:14:31 +03:00
const sortedMap = new Map ( Array . from ( map . entries ( ) ) . sort ( ( a , b ) = > a [ 1 ] - b [ 1 ] ) ) ;
2023-04-22 18:32:34 +03:00
return Array . from ( sortedMap . keys ( ) ) . slice ( 0 , maxMatches ) ;
}
2024-08-28 19:32:38 +03:00
export function matchEmoji ( queryText : string ) : string [ ] {
2023-04-22 18:32:34 +03:00
const query = queryText . toLowerCase ( ) . replaceAll ( '_' , ' ' ) ;
if ( ! query ) return emojis . slice ( 0 , maxMatches ) . map ( ( e ) = > e . aliases [ 0 ] ) ;
// results is a map of weights, lower is better
2024-08-28 19:32:38 +03:00
const results = new Map < string , number > ( ) ;
2023-04-22 18:32:34 +03:00
for ( const { aliases } of emojis ) {
const mainAlias = aliases [ 0 ] ;
for ( const [ aliasIndex , alias ] of aliases . entries ( ) ) {
const index = alias . replaceAll ( '_' , ' ' ) . indexOf ( query ) ;
if ( index === - 1 ) continue ;
const existing = results . get ( mainAlias ) ;
const rankedIndex = index + aliasIndex ;
results . set ( mainAlias , existing ? existing - rankedIndex : rankedIndex ) ;
}
}
return sortAndReduce ( results ) ;
}
2024-10-29 12:20:49 +03:00
type MentionSuggestion = { value : string ; name : string ; fullname : string ; avatar : string } ;
export function matchMention ( queryText : string ) : MentionSuggestion [ ] {
2023-04-22 18:32:34 +03:00
const query = queryText . toLowerCase ( ) ;
// results is a map of weights, lower is better
2024-10-29 12:20:49 +03:00
const results = new Map < MentionSuggestion , number > ( ) ;
2023-08-12 11:36:23 +03:00
for ( const obj of window . config . mentionValues ? ? [ ] ) {
2023-04-22 18:32:34 +03:00
const index = obj . key . toLowerCase ( ) . indexOf ( query ) ;
if ( index === - 1 ) continue ;
const existing = results . get ( obj ) ;
results . set ( obj , existing ? existing - index : index ) ;
}
return sortAndReduce ( results ) ;
}
2024-10-29 12:20:49 +03:00
export async function matchIssue ( owner : string , repo : string , issueIndexStr : string , query : string ) : Promise < Issue [ ] > {
const res = await GET ( ` ${ window . config . appSubUrl } / ${ owner } / ${ repo } /issues/suggestions?q= ${ encodeURIComponent ( query ) } ` ) ;
const issues : Issue [ ] = await res . json ( ) ;
const issueIndex = parseInt ( issueIndexStr ) ;
// filter out issue with same id
return issues . filter ( ( i ) = > i . id !== issueIndex ) ;
}