1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-01 13:47:27 +02:00

feat: decorate emails in banner view

This commit is contained in:
Gastón Fournier 2025-02-05 15:44:18 +01:00
parent a15d63672f
commit 8e9890465f
No known key found for this signature in database
GPG Key ID: AF45428626E17A8E
3 changed files with 54 additions and 3 deletions

View File

@ -5,6 +5,7 @@ import {
} from 'hooks/api/getters/useLicense/useLicense';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import type { BannerVariant } from 'interfaces/banner';
import { decorateEmailsAsMarkdown } from 'utils/decorateEmailsAsMarkdown';
export const LicenseBanner = () => {
const { isEnterprise } = useUiConfig();
@ -20,9 +21,10 @@ export const LicenseBanner = () => {
) {
if (!licenseInfo.isValid) {
const banner = {
message:
message: decorateEmailsAsMarkdown(
licenseInfo.message ||
'You have an invalid Unleash license.',
'You have an invalid Unleash license.',
),
variant: 'error' as BannerVariant,
sticky: true,
};
@ -31,7 +33,7 @@ export const LicenseBanner = () => {
} else {
if (!license.loading && !license.error && licenseInfo.message) {
const banner = {
message: licenseInfo.message,
message: decorateEmailsAsMarkdown(licenseInfo.message),
variant: mapToVariant(licenseInfo.messageType),
sticky: true,
};

View File

@ -0,0 +1,44 @@
import { decorateEmailsAsMarkdown } from './decorateEmailsAsMarkdown';
describe('decorateEmailsAsMarkdown', () => {
it('decorates a plain email', () => {
const input =
'Please contact your account representative or contact@mydomain.com. Thanks!';
const expected =
'Please contact your account representative or [contact@mydomain.com](contact@mydomain.com). Thanks!';
expect(decorateEmailsAsMarkdown(input)).toBe(expected);
});
it('does not re-decorate an already decorated email', () => {
const input =
'Reach us at [contact@mydomain.com](contact@mydomain.com)';
expect(decorateEmailsAsMarkdown(input)).toBe(input);
});
it('handles multiple emails in a string', () => {
const input = 'Emails: first@example.com, second@example.com';
const expected =
'Emails: [first@example.com](first@example.com), [second@example.com](second@example.com)';
expect(decorateEmailsAsMarkdown(input)).toBe(expected);
});
it('handles multiple emails in a string when some are decorated', () => {
const input =
'Emails: [first@example.com](first@example.com), second@example.com';
const expected =
'Emails: [first@example.com](first@example.com), [second@example.com](second@example.com)';
expect(decorateEmailsAsMarkdown(input)).toBe(expected);
});
it('ignores invalid email patterns', () => {
const input = 'Not an email: test@@example..com';
expect(decorateEmailsAsMarkdown(input)).toBe(input);
});
it('decorates emails adjacent to punctuation', () => {
const input = 'Contact:contact@mydomain.com, for info.';
const expected =
'Contact:[contact@mydomain.com](contact@mydomain.com), for info.';
expect(decorateEmailsAsMarkdown(input)).toBe(expected);
});
});

View File

@ -0,0 +1,5 @@
export function decorateEmailsAsMarkdown(text: string): string {
const emailRegex =
/(?<!\[)(?<!\]\()(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b)(?!\]\()/g;
return text.replace(emailRegex, (email) => `[${email}](${email})`);
}