|
import React from "react"; |
|
import { ColorSwatch } from "@mantine/core"; |
|
import styled from "styled-components"; |
|
import * as Styled from "./styles"; |
|
|
|
const StyledRow = styled.span` |
|
display: inline-flex; |
|
align-items: center; |
|
overflow: hidden; |
|
gap: 4px; |
|
vertical-align: middle; |
|
`; |
|
|
|
function isColorFormat(colorString: string) { |
|
const hexCodeRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/; |
|
const rgbRegex = /^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/; |
|
const rgbaRegex = /^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(0|1|0\.\d+)\s*\)$/; |
|
|
|
return ( |
|
hexCodeRegex.test(colorString) || rgbRegex.test(colorString) || rgbaRegex.test(colorString) |
|
); |
|
} |
|
|
|
const isURL = |
|
/(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/gi; |
|
|
|
export const TextRenderer: React.FC<{ children: string }> = ({ children }) => { |
|
if (isURL.test(children?.replaceAll('"', ""))) { |
|
return <Styled.StyledLinkItUrl>{children}</Styled.StyledLinkItUrl>; |
|
} |
|
|
|
if (isColorFormat(children?.replaceAll('"', ""))) { |
|
return ( |
|
<StyledRow> |
|
<ColorSwatch size={12} radius={4} mr={4} color={children?.replaceAll('"', "")} /> |
|
{children?.replaceAll('"', "")} |
|
</StyledRow> |
|
); |
|
} |
|
return <>{children}</>; |
|
}; |
|
|