diff --git a/src/view/screens/Search/Search.tsx b/src/view/screens/Search/Search.tsx
index f2b6742457..94aab2d961 100644
--- a/src/view/screens/Search/Search.tsx
+++ b/src/view/screens/Search/Search.tsx
@@ -42,9 +42,13 @@ import {useSetDrawerOpen} from '#/state/shell'
import {useAnalytics} from '#/lib/analytics/analytics'
import {MagnifyingGlassIcon} from '#/lib/icons'
import {useModerationOpts} from '#/state/queries/preferences'
-import {SearchResultCard} from '#/view/shell/desktop/Search'
+import {
+ MATCH_HANDLE,
+ SearchLinkCard,
+ SearchProfileCard,
+} from '#/view/shell/desktop/Search'
import {useSetMinimalShellMode, useSetDrawerSwipeDisabled} from '#/state/shell'
-import {isWeb} from '#/platform/detection'
+import {isNative, isWeb} from '#/platform/detection'
import {listenSoftReset} from '#/state/events'
import {s} from '#/lib/styles'
@@ -509,6 +513,11 @@ export function SearchScreen(
onPressCancelSearch()
}, [onPressCancelSearch])
+ const queryMaybeHandle = React.useMemo(() => {
+ const match = MATCH_HANDLE.exec(query)
+ return match && match[1]
+ }, [query])
+
useFocusEffect(
React.useCallback(() => {
setMinimalShellMode(false)
@@ -615,18 +624,31 @@ export function SearchScreen(
dataSet={{stableGutters: '1'}}
keyboardShouldPersistTaps="handled"
keyboardDismissMode="on-drag">
- {searchResults.length ? (
- searchResults.map((item, i) => (
-
- ))
- ) : (
-
- )}
+
+
+ {queryMaybeHandle ? (
+
+ ) : null}
+
+ {searchResults.map(item => (
+
+ ))}
diff --git a/src/view/shell/desktop/Search.tsx b/src/view/shell/desktop/Search.tsx
index df49da55b0..4a94837338 100644
--- a/src/view/shell/desktop/Search.tsx
+++ b/src/view/shell/desktop/Search.tsx
@@ -29,13 +29,63 @@ import {UserAvatar} from '#/view/com/util/UserAvatar'
import {useActorAutocompleteFn} from '#/state/queries/actor-autocomplete'
import {useModerationOpts} from '#/state/queries/preferences'
-export function SearchResultCard({
- profile,
+export const MATCH_HANDLE =
+ /@?([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))/
+
+export function SearchLinkCard({
+ label,
+ to,
+ onPress,
style,
+}: {
+ label: string
+ to?: string
+ onPress?: () => void
+ style?: ViewStyle
+}) {
+ const pal = usePalette('default')
+
+ const inner = (
+
+
+ {label}
+
+
+ )
+
+ if (onPress) {
+ return (
+
+ {inner}
+
+ )
+ }
+
+ return (
+
+
+
+ {label}
+
+
+
+ )
+}
+
+export function SearchProfileCard({
+ profile,
moderation,
}: {
profile: AppBskyActorDefs.ProfileViewBasic
- style: ViewStyle
moderation: ProfileModeration
}) {
const pal = usePalette('default')
@@ -50,9 +100,7 @@ export function SearchResultCard({
{
+ const match = MATCH_HANDLE.exec(query)
+ return match && match[1]
+ }, [query])
+
return (
) : (
<>
- {searchResults.length ? (
- searchResults.map((item, i) => (
-
- ))
- ) : (
-
-
- No results found for {query}
-
-
- )}
+
+
+ {queryMaybeHandle ? (
+
+ ) : null}
+
+ {searchResults.map(item => (
+
+ ))}
>
)}