feat: from:me search syntax

zio/stable
Mary 2024-01-12 09:56:14 +07:00
parent 17f7c36edf
commit 7f4d3dc999
No known key found for this signature in database
2 changed files with 31 additions and 2 deletions

View File

@ -37,3 +37,27 @@ export function countLines(str: string | undefined): number {
if (!str) return 0 if (!str) return 0
return str.match(/\n/g)?.length ?? 0 return str.match(/\n/g)?.length ?? 0
} }
// Augments search query with additional syntax like `from:me`
export function augmentSearchQuery(query: string, {did}: {did?: string}) {
// Don't do anything if there's no DID
if (!did) {
return query
}
// We don't want to replace substrings that are being "quoted" because those
// are exact string matches, so what we'll do here is to split them apart
// Even-indexed strings are unquoted, odd-indexed strings are quoted
const splits = query.split(/("(?:[^"\\]|\\.)*")/g)
return splits
.map((str, idx) => {
if (idx % 2 === 0) {
return str.replaceAll(/(^|\s)from:me(\s|$)/g, `$1${did}$2`)
}
return str
})
.join('')
}

View File

@ -47,6 +47,7 @@ import {useSetMinimalShellMode, useSetDrawerSwipeDisabled} from '#/state/shell'
import {isWeb} from '#/platform/detection' import {isWeb} from '#/platform/detection'
import {listenSoftReset} from '#/state/events' import {listenSoftReset} from '#/state/events'
import {s} from '#/lib/styles' import {s} from '#/lib/styles'
import {augmentSearchQuery} from '#/lib/strings/helpers'
function Loader() { function Loader() {
const pal = usePalette('default') const pal = usePalette('default')
@ -315,9 +316,13 @@ export function SearchScreenInner({
const pal = usePalette('default') const pal = usePalette('default')
const setMinimalShellMode = useSetMinimalShellMode() const setMinimalShellMode = useSetMinimalShellMode()
const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled() const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled()
const {hasSession} = useSession() const {hasSession, currentAccount} = useSession()
const {isDesktop} = useWebMediaQueries() const {isDesktop} = useWebMediaQueries()
const augmentedQuery = React.useMemo(() => {
return augmentSearchQuery(query || '', {did: currentAccount?.did})
}, [query, currentAccount])
const onPageSelected = React.useCallback( const onPageSelected = React.useCallback(
(index: number) => { (index: number) => {
setMinimalShellMode(false) setMinimalShellMode(false)
@ -338,7 +343,7 @@ export function SearchScreenInner({
)} )}
initialPage={0}> initialPage={0}>
<View> <View>
<SearchScreenPostResults query={query} /> <SearchScreenPostResults query={augmentedQuery} />
</View> </View>
<View> <View>
<SearchScreenUserResults query={query} /> <SearchScreenUserResults query={query} />