"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,
});
}
}