import { Sheet, Button, Paragraph, YStack, XStack, isWeb, useWindowDimensions, Anchor, } from '@my/ui' import { MoreHorizontal, Bookmark, BookmarkX } from '@tamagui/lucide-icons' import { CardProps } from 'app/types' import { getCardsOnTopic } from 'app/utils/catalog/getCardsOnTopic' import { useState } from 'react' const contentOffset = 24 const linkColor = '#06CAEB' function CardActionButton({ card, saveCardToMemberCollection, unsaveCardFromMemberCollection, }: { card: CardProps saveCardToMemberCollection: Function unsaveCardFromMemberCollection: Function }) { const [open, setOpen] = useState(false) const openMenuSheet = () => { setOpen(true) } const cardActionButtonStyle = isWeb ? { fontFamily: 'Spline+Sans', fontWeight: 400, transform: [{ scaleX: 1.03 }, { scaleY: 0.97 }], size: '$5', letterSpacing: 0.3, } : { fontFamily: 'SplineSansLight', fontWeight: 400, transform: [{ scaleX: 1.03 }, { scaleY: 0.97 }], size: '$5', letterSpacing: 0.3, } return ( <> ) : ( )} ) } function CardTitle({ card }: { card: CardProps }) { const cardTitleStyle = isWeb ? { fontFamily: 'Spline+Sans', fontWeight: 500, } : { fontFamily: 'SplineSansMedium' } return ( {card.topic}: {card.title} ) } function CardContent({ card, database, insertDataAfterIndex, indexInList, }: { card: CardProps database: any insertDataAfterIndex: Function indexInList: number }) { const cardContentStyle = isWeb ? { fontFamily: 'Spline+Sans', fontWeight: 300, } : { fontFamily: 'SplineSansLight' } const insertCardsOnTopic = async (topic) => { const cards = await getCardsOnTopic(database, topic) insertDataAfterIndex(cards, indexInList) } const renderLinks = (content) => { 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( insertCardsOnTopic(destination_topic)} > {display_text_int} ) } return match } ) parts.push(content.slice(lastIndex)) return parts } return ( {card.edited_contents.map((content, indexInList) => ( {typeof content === 'string' ? renderLinks(content) : content} ))} {card.showElaborateOption && ( )} ) } function ElaborateOnTopic({ card, database, insertDataAfterIndex, indexInList, insertCardsOnTopic, }: { card: CardProps database: any insertDataAfterIndex: Function indexInList: number insertCardsOnTopic: Function }) { if (!card.showElaborateOption) return null const cardContentStyle = isWeb ? { fontFamily: 'Spline+Sans', fontWeight: 300, } : { fontFamily: 'SplineSansLight' } return ( Elaborate on{' '} insertCardsOnTopic(card.topic)} > {card.topic} . ) } export function Card({ card, database, insertDataAfterIndex, indexInList, saveCardToMemberCollection, unsaveCardFromMemberCollection, }: { card: CardProps database: any insertDataAfterIndex: Function indexInList: number saveCardToMemberCollection: Function unsaveCardFromMemberCollection: Function }) { const dimensions = useWindowDimensions() return ( {!card.hideActionButton && ( )} ) }