// eslint-disable-next-line import React, { useEffect, useMemo, useState } from 'react'; import { NavLink, generatePath } from 'react-router-dom'; import { RouteEnum, URL_REGEX, MESSAGE_SENDER_REGEX, MENTION_REGEX, CARD_CALLOUT_REGEX, CALLOUT_BOUNDARY_REGEX, } from 'types'; import CardCallout from './CardCallout'; import './Message.css'; const Message = ({ message: { message, messageType, timeOf, timeReceived } }) => (
); const ParsedMessage = ({ message }) => { const [messageChunks, setMessageChunks] = useState(null); const [name, setName] = useState(null); useMemo(() => { const name = message.match(MESSAGE_SENDER_REGEX); if (name) { setName(name[1]); } setMessageChunks(parseMessage(message)); }, [message]); return (
{ name && (:) } { messageChunks }
); }; const PlayerLink = ({ name, label = name }) => ( {label} ); function parseMessage(message) { return message.replace(MESSAGE_SENDER_REGEX, '') .split(CARD_CALLOUT_REGEX) .filter(chunk => !!chunk) .map(parseChunks); } function parseChunks(chunk, index) { if (chunk.match(CARD_CALLOUT_REGEX)) { const name = chunk.replace(CALLOUT_BOUNDARY_REGEX, '').trim(); return (); } if (chunk.match(URL_REGEX)) { return parseUrlChunk(chunk); } if (chunk.match(MENTION_REGEX)) { return parseMentionChunk(chunk); } return chunk; } function parseUrlChunk(chunk) { return chunk.split(URL_REGEX) .filter(urlChunk => !!urlChunk) .map((urlChunk, index) => { if (urlChunk.match(URL_REGEX)) { return ({urlChunk}); } return urlChunk; }); } function parseMentionChunk(chunk) { return chunk.split(MENTION_REGEX) .filter(mentionChunk => !!mentionChunk) .map((mentionChunk, index) => { const mention = mentionChunk.match(MENTION_REGEX); if (mention) { const name = mention[0].substr(1); return (); } return mentionChunk; }); } export default Message;