"use client"; import React from "react"; import Link from "next/link"; import type { KnowledgeBacklink } from "@mosaic/shared"; import { Clock, Link2, FileText } from "lucide-react"; interface BacklinksListProps { /** Array of backlinks to display */ backlinks: KnowledgeBacklink[]; /** Loading state */ isLoading?: boolean; /** Error message if loading failed */ error?: string | null; } /** * BacklinksList - Displays entries that link to the current entry * * Features: * - Shows entry title, summary, and link count * - Click to navigate to linking entry * - Empty state when no backlinks exist * - Loading skeleton */ export function BacklinksList({ backlinks, isLoading = false, error = null, }: BacklinksListProps): React.ReactElement { // Loading state if (isLoading) { return (

Backlinks

{[1, 2, 3].map((i) => (
))}
); } // Error state if (error) { return (

Backlinks

{error}

); } // Empty state if (backlinks.length === 0) { return (

Backlinks

No other entries link to this page yet.

Use [[slug]]{" "} to create links

); } // Backlinks list return (

Backlinks ({backlinks.length})

{backlinks.map((backlink) => (

{backlink.source.title}

{backlink.source.summary && (

{backlink.source.summary}

)} {backlink.context && (
“{backlink.context}”
)}
{formatDate(backlink.createdAt)}
))}
); } /** * Format date for display */ function formatDate(date: Date | string): string { const d = typeof date === "string" ? new Date(date) : date; const now = new Date(); const diffMs = now.getTime() - d.getTime(); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); if (diffDays === 0) { return "Today"; } else if (diffDays === 1) { return "Yesterday"; } else if (diffDays < 7) { return `${diffDays.toString()}d ago`; } else if (diffDays < 30) { return `${Math.floor(diffDays / 7).toString()}w ago`; } else { return d.toLocaleDateString("en-US", { month: "short", day: "numeric", year: d.getFullYear() !== now.getFullYear() ? "numeric" : undefined, }); } }