diff --git a/.changeset/soft-flowers-teach.md b/.changeset/soft-flowers-teach.md new file mode 100644 index 000000000..62aafe8a5 --- /dev/null +++ b/.changeset/soft-flowers-teach.md @@ -0,0 +1,5 @@ +--- +"nostrudel": patch +--- + +small fix for hashtags diff --git a/src/helpers/regexp.ts b/src/helpers/regexp.ts index b8bdd98a4..3ad504635 100644 --- a/src/helpers/regexp.ts +++ b/src/helpers/regexp.ts @@ -3,4 +3,4 @@ export const matchImageUrls = /https?:\/\/([\dA-z\.-]+\.[A-z\.]{2,12})((?:\/[\+~%\/\.\w\-_]*)?\.(?:svg|gif|png|jpg|jpeg|webp|avif))(\??(?:[\?#\-\+=&;%@\.\w_]*)#?(?:[\-\.\!\/\\\w]*))?/i; export const matchNostrLink = /(nostr:|@)?((npub|note|nprofile|nevent)1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58,})/i; -export const matchHashtag = /(^|\s)#([^\s#]+)/i; +export const matchHashtag = /(^|[^\p{L}])#(\p{L}+)/iu; diff --git a/src/views/search/index.tsx b/src/views/search/index.tsx index 0ef06deb6..f24f5fcae 100644 --- a/src/views/search/index.tsx +++ b/src/views/search/index.tsx @@ -23,6 +23,7 @@ import { truncatedId } from "../../helpers/nostr-event"; import QrScannerModal from "../../components/qr-scanner-modal"; import { safeDecode } from "../../helpers/nip19"; import { useInvoiceModalContext } from "../../providers/invoice-modal"; +import { matchHashtag } from "../../helpers/regexp"; type relay = string; type NostrBandSearchResults = { @@ -91,13 +92,20 @@ export default function SearchView() { }, [searchParams]); const handleSearchText = (text: string) => { - if (text.startsWith("nostr:") || text.startsWith("web+nostr:") || safeDecode(search)) { + const cleanText = text.trim(); + + if (cleanText.startsWith("nostr:") || cleanText.startsWith("web+nostr:") || safeDecode(search)) { navigate({ pathname: "/l/" + encodeURIComponent(text) }, { replace: true }); - } else if (text.trim().match(/^#(\w+)/i)) { - navigate({ pathname: "/t/" + text.toLowerCase().trim().replace(/^#/, "") }); - } else { - setSearchParams({ q: text }, { replace: true }); + return; } + + const hashTagMatch = cleanText.match(matchHashtag); + if (hashTagMatch) { + navigate({ pathname: "/t/" + hashTagMatch[2].toLocaleLowerCase() }); + return; + } + + setSearchParams({ q: cleanText }, { replace: true }); }; const readClipboard = useCallback(async () => { diff --git a/src/views/user/followers.tsx b/src/views/user/followers.tsx index fbb0c2144..6a45150c8 100644 --- a/src/views/user/followers.tsx +++ b/src/views/user/followers.tsx @@ -18,14 +18,14 @@ function FollowerItem({ index, style, data: followers }: ListChildComponentProps ); } -const UserFollowersTab = () => { +export default function UserFollowersTab() { const { pubkey } = useOutletContext() as { pubkey: string }; const relays = useReadRelayUrls(useAdditionalRelayContext()); const followers = useUserFollowers(pubkey, relays, true); return ( - + {followers ? ( @@ -49,6 +49,4 @@ const UserFollowersTab = () => { )} ); -}; - -export default UserFollowersTab; +} diff --git a/src/views/user/following.tsx b/src/views/user/following.tsx index 3884bf753..4b04e9eea 100644 --- a/src/views/user/following.tsx +++ b/src/views/user/following.tsx @@ -24,7 +24,7 @@ export default function UserFollowingTab() { const contacts = useUserContacts(pubkey, contextRelays, true); return ( - + {contacts ? ( diff --git a/src/views/user/index.tsx b/src/views/user/index.tsx index d3c2438c9..db804b2c8 100644 --- a/src/views/user/index.tsx +++ b/src/views/user/index.tsx @@ -109,7 +109,7 @@ const UserView = () => { flexGrow="1" isLazy index={activeTab} - onChange={(v) => navigate(tabs[v].path)} + onChange={(v) => navigate(tabs[v].path, { replace: true })} colorScheme="brand" >