Skip to content

Commit

Permalink
Merge pull request #104 from lidofinance/feature/ethui-584-parsing-li…
Browse files Browse the repository at this point in the history
…nks-in-votes-meta-data

feat: votes metadata links parsed
  • Loading branch information
vtrush88 authored Jul 6, 2023
2 parents 2534a73 + 8eaa93e commit fb684ed
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 21 deletions.
1 change: 0 additions & 1 deletion modules/blockChain/utils/addressRegex.ts

This file was deleted.

1 change: 1 addition & 0 deletions modules/shared/utils/regexEthAddress.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const REGEX_ETH_ADDRESS = /(\b0x[a-fA-F0-9]{40}\b)/g
1 change: 1 addition & 0 deletions modules/shared/utils/regexURL.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const REGEX_URL = /((?:https?:\/\/|www\.)[^\s]+)/g
10 changes: 0 additions & 10 deletions modules/shared/utils/replaceAddressWithBadges.tsx

This file was deleted.

20 changes: 20 additions & 0 deletions modules/shared/utils/replaceLinksWithComponents.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Link } from '@lidofinance/lido-ui'
import { AddressBadge } from '../ui/Common/AddressBadge'

import { REGEX_ETH_ADDRESS } from 'modules/shared/utils/regexEthAddress'
import { REGEX_URL } from 'modules/shared/utils/regexURL'

import { replaceRegexWithJSX } from './replaceRegexWithJSX'

export const replaceJsxElements = (text: string) => {
return replaceRegexWithJSX(text, [
{
regex: REGEX_URL,
replace: link => <Link href={link}>{link}</Link>,
},
{
regex: REGEX_ETH_ADDRESS,
replace: address => <AddressBadge address={address} />,
},
])
}
34 changes: 26 additions & 8 deletions modules/shared/utils/replaceRegexWithJSX.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,31 @@
import { Fragment } from 'react'

export function replaceRegexWithJSX(
text: string,
regex: RegExp,
replace: (substr: string) => JSX.Element,
) {
const textArray = text.split(regex)
return textArray.map((str, i) => {
const children = regex.test(str) ? replace(str) : str
export const REGEX_REPLACER_HINT = /(__\$\d+__)/g
export const REGEX_REPLACER_INDEX = /__\$(\d+)__/g

type ReplaceRule = {
regex: RegExp
replace: (substr: string) => JSX.Element
}

export function replaceRegexWithJSX(text: string, rules: ReplaceRule[]) {
let textBuffer = text
const jsxBuffer: JSX.Element[] = []

rules.forEach(rule => {
textBuffer = textBuffer.replaceAll(rule.regex, match => {
jsxBuffer.push(rule.replace(match))
return `__$${jsxBuffer.length - 1}__`
})
})

const textArray = textBuffer.split(REGEX_REPLACER_HINT)

const result = textArray.map((str, i) => {
const test = REGEX_REPLACER_INDEX.exec(str)
const children = test ? jsxBuffer[Number(test[1])] : str
return <Fragment key={i}>{children}</Fragment>
})

return result
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { replaceAddressWithBadges } from 'modules/shared/utils/replaceAddressWithBadges'
import { DescriptionText } from './VoteMetadataDescriptionStyle'
import { replaceJsxElements } from 'modules/shared/utils/replaceLinksWithComponents'

type Props = {
metadata: string
}

export function VoteMetadataDescription({ metadata }: Props) {
return <DescriptionText>{replaceAddressWithBadges(metadata)}</DescriptionText>
return <DescriptionText>{replaceJsxElements(metadata)}</DescriptionText>
}

0 comments on commit fb684ed

Please sign in to comment.