import { InfoCardProps } from '@junwon/centum/types' import { useRouter } from 'solito/router' import { Paragraph, YStack, XStack, isWeb, Anchor } from 'tamagui' function CardTitle({ title }: { title: string }) { const cardTitleStyle = isWeb ? { fontFamily: 'Spline+Sans', fontWeight: 500, } : { fontFamily: 'SplineSansMedium' } return ( {title} ) } function CardBody({ body, onLinkPress, }: { body: string[] onLinkPress?: (topic: string) => void }) { const router = useRouter() const cardContentStyle = isWeb ? { fontFamily: 'Spline+Sans', fontWeight: 300, } : { fontFamily: 'SplineSansLight' } const renderLinks = (content_parts: (string | JSX.Element)[]): (string | JSX.Element)[] => { return content_parts .map((content) => { if (typeof content !== 'string') return content const linkColor = '#06CAEB' const internalLinkRegex = /(\{(.*?)\}\[(.*?)\])/g const externalLinkRegex = /(\{(.*?)\}\((.*?)\))/g const parts: (string | JSX.Element)[] = [] let lastIndex = 0 // Process external links content.replace(externalLinkRegex, (match, _, display_text, external_link, index) => { if (index > lastIndex) { parts.push(content.slice(lastIndex, index)) } lastIndex = index + match.length parts.push( {display_text} ) return match }) // Process internal links content.replace( internalLinkRegex, (match, fullMatch, display_text, internal_link, index) => { if (index > lastIndex) { parts.push(content.slice(lastIndex, index)) } lastIndex = index + match.length parts.push( router.push(`/${internal_link}`)} > {display_text} ) return match } ) parts.push(content.slice(lastIndex)) return parts }) .flat() } const renderOldLinks = (content: string): (string | JSX.Element)[] => { const linkColor = '#06CAEB' const regex = /(\{\{(.*?)\|(.*?)\}\}|\[\[(.*?)\|(.*?)\]\])/g const parts: (string | JSX.Element)[] = [] let lastIndex = 0 content.replace( regex, ( match, _, display_text_ext, destination_link, display_text_int, destination_topic, index ) => { parts.push(content.slice(lastIndex, index)) lastIndex = index + match.length if (match.startsWith('{{')) { parts.push( {display_text_ext} ) } else if (match.startsWith('[[')) { parts.push( onLinkPress && onLinkPress(destination_topic)} > {display_text_int} ) } return match } ) parts.push(content.slice(lastIndex)) return parts } return ( {body.map((content, index) => ( {renderLinks(renderOldLinks(content))} ))} ) } export const InfoCard = (props: InfoCardProps) => { return ( ) }