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 (
<>
{!card.is_in_member_collection ? (
}
onPress={() => {
saveCardToMemberCollection(card.id, card.topic_id)
}}
w="100%"
jc="flex-start"
style={cardActionButtonStyle}
>
Save
) : (
)}
>
)
}
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 && (
)}
)
}