about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPaul Frazee <pfrazee@gmail.com>2024-01-23 15:52:34 -0800
committerPaul Frazee <pfrazee@gmail.com>2024-01-23 15:52:34 -0800
commit68a439d5705f6e1bf7ae89377347d6b6db05d6e8 (patch)
tree624306bb3f69ca22c6207a1af8e48db501a83737 /src
parent6076b8f73056a7cc04904bd0aa4571b17fd4978d (diff)
parent7f4d3dc999b130cd8552ed97c0c90cf83cbdd13c (diff)
downloadvoidsky-68a439d5705f6e1bf7ae89377347d6b6db05d6e8.tar.zst
Merge branch 'feat/search-from-me' of https://github.com/mary-ext/fork-bsky-app into mary-ext-feat/search-from-me
Diffstat (limited to 'src')
-rw-r--r--src/lib/strings/helpers.ts24
-rw-r--r--src/view/screens/Search/Search.tsx9
2 files changed, 31 insertions, 2 deletions
diff --git a/src/lib/strings/helpers.ts b/src/lib/strings/helpers.ts
index 381ae32f3..e2abe9019 100644
--- a/src/lib/strings/helpers.ts
+++ b/src/lib/strings/helpers.ts
@@ -37,3 +37,27 @@ export function countLines(str: string | undefined): number {
   if (!str) return 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('')
+}
diff --git a/src/view/screens/Search/Search.tsx b/src/view/screens/Search/Search.tsx
index 80b514e20..df64cc5aa 100644
--- a/src/view/screens/Search/Search.tsx
+++ b/src/view/screens/Search/Search.tsx
@@ -52,6 +52,7 @@ import {isNative, isWeb} from '#/platform/detection'
 import {listenSoftReset} from '#/state/events'
 import {s} from '#/lib/styles'
 import AsyncStorage from '@react-native-async-storage/async-storage'
+import {augmentSearchQuery} from '#/lib/strings/helpers'
 
 function Loader() {
   const pal = usePalette('default')
@@ -318,9 +319,13 @@ export function SearchScreenInner({
   const pal = usePalette('default')
   const setMinimalShellMode = useSetMinimalShellMode()
   const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled()
-  const {hasSession} = useSession()
+  const {hasSession, currentAccount} = useSession()
   const {isDesktop} = useWebMediaQueries()
 
+  const augmentedQuery = React.useMemo(() => {
+    return augmentSearchQuery(query || '', {did: currentAccount?.did})
+  }, [query, currentAccount])
+
   const onPageSelected = React.useCallback(
     (index: number) => {
       setMinimalShellMode(false)
@@ -343,7 +348,7 @@ export function SearchScreenInner({
         )}
         initialPage={0}>
         <View>
-          <SearchScreenPostResults query={query} />
+          <SearchScreenPostResults query={augmentedQuery} />
         </View>
         <View>
           <SearchScreenUserResults query={query} />