| @@ -54,8 +54,11 @@ export default (() => { | |||||
| if (activeIndex < 0) | if (activeIndex < 0) | ||||
| break | break | ||||
| ev.preventDefault () | ev.preventDefault () | ||||
| const selected = suggestions[activeIndex] | |||||
| selected && handleTagSelect (selected) | |||||
| { | |||||
| const selected = suggestions[activeIndex] | |||||
| if (selected) | |||||
| handleTagSelect (selected) | |||||
| } | |||||
| break | break | ||||
| case 'Escape': | case 'Escape': | ||||
| @@ -65,14 +68,25 @@ export default (() => { | |||||
| } | } | ||||
| if (ev.key === 'Enter' && (!(suggestionsVsbl) || activeIndex < 0)) | 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) | setSuggestionsVsbl (false) | ||||
| } | } | ||||
| } | } | ||||
| const handleTagSelect = (tag: Tag) => { | const handleTagSelect = (tag: Tag) => { | ||||
| const parts = search.split (' ') | 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 (' ') + ' ') | setSearch (parts.join (' ') + ' ') | ||||
| setSuggestions ([]) | setSuggestions ([]) | ||||
| setActiveIndex (-1) | setActiveIndex (-1) | ||||
| @@ -80,7 +94,8 @@ export default (() => { | |||||
| useEffect (() => { | useEffect (() => { | ||||
| const query = new URLSearchParams (location.search) | 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) | setSearch (tagsQuery) | ||||
| }, [location.search]) | }, [location.search]) | ||||