Cleanup - unused files / unused exports / duplicate exports
[ProtonMail-WebClient.git] / packages / shared / lib / mail / transformLinkify.ts
blob4b38b3d7de1bb0fdd1e98df83fdcf69176ae4501
1 import LinkifyIt from 'linkify-it';
3 import { getUTMTrackersFromURL } from '@proton/shared/lib/mail/trackers';
4 import type { MessageUTMTracker } from '@proton/shared/lib/models/mailUtmTrackers';
6 const linkifyInstance = new LinkifyIt();
8 const htmlEntities = (str = '') => {
9     return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
12 /**
13  * Convert plain text content with links to content with html links
14  * Input : `hello http://www.protonmail.com`
15  * Output : `hello <a target="_blank" rel="noreferrer nofollow noopener" href="http://protonmail.com">http://protonmail.com</a>`
16  */
17 export const transformLinkify = ({
18     content = '',
19     target = '_blank',
20     rel = 'noreferrer nofollow noopener',
21     canCleanUTMTrackers = false,
22     onCleanUTMTrackers,
23 }: {
24     content?: string;
25     target?: string;
26     rel?: string;
27     canCleanUTMTrackers?: boolean;
28     onCleanUTMTrackers?: (utmTrackers: MessageUTMTracker[]) => void;
29 }) => {
30     const matches = linkifyInstance.match(content);
32     if (!matches) {
33         return htmlEntities(content);
34     }
36     const utmTrackers: MessageUTMTracker[] = [];
37     let last = 0;
38     const result = matches.reduce<string[]>((result, match) => {
39         if (last < match.index) {
40             result.push(htmlEntities(content.slice(last, match.index)));
41         }
42         result.push(`<a target="${target}" rel="${rel}" href="`);
44         const UTMTrackersResult = canCleanUTMTrackers ? getUTMTrackersFromURL(match.url) : undefined;
45         // Clean trackers in plaintext messages
46         if (UTMTrackersResult) {
47             result.push(UTMTrackersResult.url);
48             if (UTMTrackersResult.utmTracker) {
49                 utmTrackers.push(UTMTrackersResult.utmTracker);
50             }
51         } else {
52             result.push(match.url);
53         }
55         result.push('">');
56         result.push(match.text);
57         result.push('</a>');
59         last = match.lastIndex;
61         return result;
62     }, []);
64     // Push all trackers found to mail redux store
65     if (utmTrackers.length > 0) {
66         onCleanUTMTrackers?.(utmTrackers);
67     }
69     if (last < content.length) {
70         result.push(htmlEntities(content.slice(last)));
71     }
73     return result.join('');