diff --git a/packages/web/components/patterns/LibraryCards/LibraryCardStyles.tsx b/packages/web/components/patterns/LibraryCards/LibraryCardStyles.tsx
index 23a13dfc0..629ae613c 100644
--- a/packages/web/components/patterns/LibraryCards/LibraryCardStyles.tsx
+++ b/packages/web/components/patterns/LibraryCards/LibraryCardStyles.tsx
@@ -1,5 +1,8 @@
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
+import { useMemo } from 'react'
+import { LibraryItem } from '../../../lib/networking/queries/useGetLibraryItemsQuery'
+import { Box, HStack, SpanBox } from '../../elements/LayoutPrimitives'
dayjs.extend(relativeTime)
@@ -105,3 +108,40 @@ export const siteName = (
} catch {}
return ''
}
+
+type LibraryItemMetadataProps = {
+ item: LibraryItemNode
+ showProgress?: boolean
+}
+
+export function LibraryItemMetadata(
+ props: LibraryItemMetadataProps
+): JSX.Element {
+ const highlightCount = useMemo(() => {
+ return props.item.highlights?.length ?? 0
+ }, [props.item.highlights])
+
+ return (
+
+ {timeAgo(props.item.savedAt)}
+ {` `}
+ {props.item.wordsCount ?? 0 > 0
+ ? ` • ${Math.max(
+ 1,
+ Math.round((props.item.wordsCount ?? 0) / 235)
+ )} min read`
+ : null}
+ {(props.showProgress && props.item.readingProgressPercent) ?? 0 > 0 ? (
+ <>
+ {` • `}
+
+ {`${Math.round(props.item.readingProgressPercent)}%`}
+
+ >
+ ) : null}
+ {highlightCount > 0
+ ? ` • ${highlightCount} highlight${highlightCount > 1 ? 's' : ''}`
+ : null}
+
+ )
+}
diff --git a/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx b/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx
index ebeb189e8..c57d89cec 100644
--- a/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx
+++ b/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx
@@ -4,13 +4,14 @@ import type { LinkedItemCardProps } from './CardTypes'
import { CoverImage } from '../../elements/CoverImage'
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
-import { useState } from 'react'
+import { useMemo, useState } from 'react'
import { DotsThreeVertical } from 'phosphor-react'
import Link from 'next/link'
import { CardMenu } from '../CardMenu'
import {
AuthorInfoStyle,
DescriptionStyle,
+ LibraryItemMetadata,
MenuStyle,
MetaStyle,
siteName,
@@ -102,19 +103,7 @@ export function LibraryGridCard(props: LinkedItemCardProps): JSX.Element {
}}
distribution="start"
>
-
- {timeAgo(props.item.savedAt)}
- {` `}
- {props.item.wordsCount ?? 0 > 0
- ? ` • ${Math.max(
- 1,
- Math.round((props.item.wordsCount ?? 0) / 235)
- )} min read`
- : null}
- {props.item.highlights?.length ?? 0 > 0
- ? ` • ${props.item.highlights?.length} highlights`
- : null}
-
+
{
+ return props.item.highlights?.length ?? 0
+ }, [props.item.highlights])
+
return (
-
- {timeAgo(props.item.savedAt)}
- {` `}
- {props.item.wordsCount ?? 0 > 0
- ? ` • ${Math.max(
- 1,
- Math.round((props.item.wordsCount ?? 0) / 235)
- )} min read`
- : null}
- {props.item.readingProgressPercent ?? 0 > 0 ? (
- <>
- {` • `}
-
- {`${Math.round(props.item.readingProgressPercent)}%`}
-
- >
- ) : null}
- {props.item.highlights?.length ?? 0 > 0
- ? ` • ${props.item.highlights?.length} highlights`
- : null}
-
+