import { type FC } from "hono/jsx"; import type { Book } from "../../types"; import { BOOK_STATUS } from "../../constants"; import { Card, CardBody, CardActions } from "./cards"; import { BookCard, normalizeBookData } from "./BookCard"; const toDateValue = (date: string | null | undefined) => date ? new Date(date).toISOString().slice(0, 10) : ""; const DateInputForm: FC<{ book: Book; field: "startedAt" | "finishedAt"; redirectUrl?: string; }> = ({ book, field, redirectUrl }) => { return (
{book.cover && } {book.status && } {book.owned ? : null} {book.stars && } {book.review && } {field === "startedAt" && book.finishedAt && ( )} {field === "finishedAt" && book.startedAt && ( )}
); }; const RatingSelect: FC<{ book: Book; redirectUrl?: string; }> = ({ book, redirectUrl }) => { return (
{book.cover && } {book.status && } {book.owned ? : null} {book.review && } {book.startedAt && } {book.finishedAt && }
); }; const StatusSelect: FC<{ book: Book; redirectUrl?: string; }> = ({ book, redirectUrl }) => { const statuses = [ { value: BOOK_STATUS.FINISHED, label: "Read" }, { value: BOOK_STATUS.READING, label: "Reading" }, { value: BOOK_STATUS.WANTTOREAD, label: "Want to Read" }, { value: BOOK_STATUS.ABANDONED, label: "Abandoned" }, ]; return (
{book.cover && } {book.stars && } {book.owned ? : null} {book.review && } {book.startedAt && } {book.finishedAt && }
); }; export const EditableLibraryTable: FC<{ books: Book[]; redirectUrl?: string; }> = ({ books, redirectUrl }) => { if (!books.length) { return (

No books in your library yet. Start adding books to see them here!

); } // Sort books: finished books by finishedAt DESC, others by createdAt DESC const sortedBooks = [...books].sort((a, b) => { const aIsFinished = a.status === BOOK_STATUS.FINISHED; const bIsFinished = b.status === BOOK_STATUS.FINISHED; // If both are finished, sort by finishedAt (most recent first) if (aIsFinished && bIsFinished) { if (!a.finishedAt && !b.finishedAt) return 0; if (!a.finishedAt) return 1; if (!b.finishedAt) return -1; return new Date(b.finishedAt).getTime() - new Date(a.finishedAt).getTime(); } // If only one is finished, prioritize based on general creation date // This keeps the overall list in a sensible order return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(); }); return ( <> {/* Desktop: table view */} {/* Mobile: card view */}
{sortedBooks.map((book) => (
))}
); };