import { Box, VStack, HStack, SpanBox } from '../../elements/LayoutPrimitives' import { LabelChip } from '../../elements/LabelChip' import type { LinkedItemCardProps } from './CardTypes' import { CoverImage } from '../../elements/CoverImage' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' import { useCallback, useState } from 'react' import Link from 'next/link' import { AuthorInfoStyle, CardCheckbox, DescriptionStyle, LibraryItemMetadata, MetaStyle, siteName, TitleStyle, } from './LibraryCardStyles' import { sortedLabels } from '../../../lib/labelsSort' import { LibraryHoverActions } from './LibraryHoverActions' import { useHover, useFloating, useInteractions, size, offset, autoUpdate, } from '@floating-ui/react' dayjs.extend(relativeTime) type ProgressBarProps = { fillPercentage: number fillColor: string backgroundColor: string borderRadius: string } export function ProgressBar(props: ProgressBarProps): JSX.Element { return ( ) } export function LibraryGridCard(props: LinkedItemCardProps): JSX.Element { const [isHovered, setIsHovered] = useState(false) const [isOpen, setIsOpen] = useState(false) const { refs, floatingStyles, context } = useFloating({ open: isOpen, onOpenChange: setIsOpen, middleware: [ offset({ mainAxis: -25, }), size(), ], placement: 'top-end', whileElementsMounted: autoUpdate, }) const hover = useHover(context) const { getReferenceProps, getFloatingProps } = useInteractions([hover]) return ( { setIsHovered(true) }} onMouseLeave={() => { setIsHovered(false) }} > {props.inMultiSelect ? ( ) : ( <> )} ) } const LibraryGridCardContent = (props: LinkedItemCardProps): JSX.Element => { const { isChecked, setIsChecked, item } = props const originText = siteName(props.item.originalArticleUrl, props.item.url) const handleCheckChanged = useCallback(() => { setIsChecked(item.id, !isChecked) }, [setIsChecked, isChecked]) return ( <> {props.inMultiSelect && ( )} {props.item.title} {props.item.description} {props.item.author} {props.item.author && originText && ' | '} {originText} {sortedLabels(props.item.labels).map(({ name, color }, index) => ( ))} {props.item.image && ( { ;(e.target as HTMLElement).style.display = 'none' }} /> )} ) }