|
|
|
@@ -54,8 +54,11 @@ export default (() => { |
|
|
|
if (activeIndex < 0) |
|
|
|
break |
|
|
|
ev.preventDefault () |
|
|
|
const selected = suggestions[activeIndex] |
|
|
|
selected && handleTagSelect (selected) |
|
|
|
{ |
|
|
|
const selected = suggestions[activeIndex] |
|
|
|
if (selected) |
|
|
|
handleTagSelect (selected) |
|
|
|
} |
|
|
|
break |
|
|
|
|
|
|
|
case 'Escape': |
|
|
|
@@ -65,14 +68,25 @@ export default (() => { |
|
|
|
} |
|
|
|
if (ev.key === 'Enter' && (!(suggestionsVsbl) || activeIndex < 0)) |
|
|
|
{ |
|
|
|
navigate (`/posts?${ (new URLSearchParams ({ tags: search })).toString () }`) |
|
|
|
const parts = search.split (' ') |
|
|
|
const match = parts.map (t => t.toLowerCase ()).includes ('type:or') ? 'any' : 'all' |
|
|
|
navigate (`/posts?${ |
|
|
|
(new URLSearchParams ({ |
|
|
|
tags: parts.map (t => t.toLowerCase ()) |
|
|
|
.filter (t => t !== 'type:or') |
|
|
|
.join (' '), |
|
|
|
match })) |
|
|
|
.toString () }`) |
|
|
|
setSuggestionsVsbl (false) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
const handleTagSelect = (tag: Tag) => { |
|
|
|
const parts = search.split (' ') |
|
|
|
parts[parts.length - 1] = tag.name |
|
|
|
parts[parts.length - 1] = ( |
|
|
|
(parts[parts.length - 1].slice(0, 4).toLowerCase () === 'not:') |
|
|
|
? ('not:' + tag.name) |
|
|
|
: tag.name) |
|
|
|
setSearch (parts.join (' ') + ' ') |
|
|
|
setSuggestions ([]) |
|
|
|
setActiveIndex (-1) |
|
|
|
@@ -80,7 +94,8 @@ export default (() => { |
|
|
|
|
|
|
|
useEffect (() => { |
|
|
|
const query = new URLSearchParams (location.search) |
|
|
|
const tagsQuery = query.get ('tags') ?? '' |
|
|
|
const anyFlg = query.get ('match') === 'any' |
|
|
|
const tagsQuery = `${ query.get ('tags') ?? '' }${ anyFlg ? ' type:or' : '' }` |
|
|
|
setSearch (tagsQuery) |
|
|
|
}, [location.search]) |
|
|
|
|
|
|
|
|