From 61785139caacabf50a9cdaad354ede7ba49a8243 Mon Sep 17 00:00:00 2001 From: adityaalifn Date: Thu, 25 Jun 2026 15:23:47 +0300 Subject: [PATCH] fix(renderText): recognize uppercase URL schemes in message links --- .../Message/renderText/__tests__/renderText.test.tsx | 8 ++++++++ .../Message/renderText/componentRenderers/Anchor.tsx | 2 +- src/components/Message/renderText/regex.ts | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/Message/renderText/__tests__/renderText.test.tsx b/src/components/Message/renderText/__tests__/renderText.test.tsx index af8264abfe..e2f5d833ff 100644 --- a/src/components/Message/renderText/__tests__/renderText.test.tsx +++ b/src/components/Message/renderText/__tests__/renderText.test.tsx @@ -28,6 +28,14 @@ describe(`renderText`, () => { expect(container).toMatchSnapshot(); }); + it('linkifies a URL with an uppercase scheme like a lowercase one', () => { + const Markdown = renderText('see HTTPS://en.wikipedia.org/wiki/Apple'); + render(Markdown); + const link = screen.getByRole('link', { name: 'en.wikipedia.org/wiki/Apple' }); + expect(link).toHaveClass('str-chat__message-url-link'); + expect(link).toHaveAttribute('href', 'HTTPS://en.wikipedia.org/wiki/Apple'); + }); + it('handles the special case where user name matches to an e-mail pattern - 1', () => { const Markdown = renderText( 'Hello @username@email.com, is username@email.com your @primary e-mail?', diff --git a/src/components/Message/renderText/componentRenderers/Anchor.tsx b/src/components/Message/renderText/componentRenderers/Anchor.tsx index 2eee610721..0e5a8ca214 100644 --- a/src/components/Message/renderText/componentRenderers/Anchor.tsx +++ b/src/components/Message/renderText/componentRenderers/Anchor.tsx @@ -4,7 +4,7 @@ import React from 'react'; export const Anchor = ({ children, href }: ComponentProps<'a'>) => { const isEmail = href?.startsWith('mailto:'); - const isUrl = href?.startsWith('http'); + const isUrl = href?.toLowerCase().startsWith('http'); if (!href || (!isEmail && !isUrl)) return <>{children}; diff --git a/src/components/Message/renderText/regex.ts b/src/components/Message/renderText/regex.ts index cf26f27317..1d2a89d791 100644 --- a/src/components/Message/renderText/regex.ts +++ b/src/components/Message/renderText/regex.ts @@ -2,7 +2,7 @@ export function escapeRegExp(text: string) { return text.replace(/[-[\]{}()*+?.,/\\^$|#]/g, '\\$&'); } -export const detectHttp = /(http(s?):\/\/)?(www\.)?/; +export const detectHttp = /(http(s?):\/\/)?(www\.)?/i; // Regexes are hoisted to module scope so they are compiled once rather than on // every call. `codeRegex`/`regexMdLinks` are only used with `String#match`