stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
48 lines (39 loc) • 1.39 kB
text/typescript
import { find } from 'linkifyjs';
interface LinkInfo {
raw: string;
url: string;
}
/**
* This is done to remove all markdown formatted links.
* eg: [google.com](https://www.google.com), [Google](https://www.google.com), [https://www.google.com](https://www.google.com)
* */
const removeMarkdownLinksFromText = (input: string) => input.replace(/\[.*\]\(.*\)/g, '');
/**
* This is done to avoid parsing usernames with dot as well as an email address in it.
*/
const removeUserNamesWithEmailFromText = (input: string) =>
input.replace(/@(\w+(\.\w+)?)(@\w+\.\w+)/g, '');
export const parseLinksFromText = (input?: string): LinkInfo[] => {
if (!input) {
return [];
}
const strippedInput = [removeMarkdownLinksFromText, removeUserNamesWithEmailFromText].reduce(
(acc, fn) => fn(acc),
input,
);
const links = find(strippedInput, 'url');
const emails = find(strippedInput, 'email');
const result: LinkInfo[] = [...links, ...emails].map(({ href, value }) => {
let hrefWithProtocol = href;
// Matching these: https://reactnative.dev/docs/0.73/linking?syntax=ios#built-in-url-schemes
const pattern = new RegExp(/^(mailto:|tel:|sms:|\S+:\/\/)/);
if (!pattern.test(hrefWithProtocol)) {
hrefWithProtocol = 'http://' + hrefWithProtocol;
}
return {
raw: value,
url: hrefWithProtocol,
};
});
return result;
};