Skip to content

Commit 233a9dc

Browse files
committed
fix: collection edit selected book
1 parent 9a1a777 commit 233a9dc

File tree

2 files changed

+25
-34
lines changed

2 files changed

+25
-34
lines changed

components/books/book-select-card.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ import clsx from 'clsx'
1414

1515
export const SelectedBook = memo<{
1616
book: Book
17-
onDeselect?: (bookID: string) => void
17+
onDeselect?: (book: Book) => void
1818
disabled?: boolean
1919
}>(({ book, onDeselect, disabled }) => {
2020
return (
2121
<div
22-
onClick={() => (disabled ? null : onDeselect?.(book.id))}
22+
onClick={() => (disabled ? null : onDeselect?.(book))}
2323
className={clsx(
2424
'shrink-0 relative left-0 transition-all not-first-of-type:-ml-12',
2525
'hover:transition-all hover:-translate-y-4 hover:transform-none',
@@ -55,7 +55,7 @@ SelectedBook.displayName = 'SelectedBook'
5555
// Memoize the card component to prevent unnecessary re-renders
5656
export const UnselectedBook = memo<{
5757
book: Book
58-
onSelect?: (bookID: string) => void
58+
onSelect?: (book: Book) => void
5959
disabled?: boolean
6060
}>(({ book, onSelect, disabled }) => {
6161
return (
@@ -65,9 +65,9 @@ export const UnselectedBook = memo<{
6565
'cursor-pointer transition-all duration-200 hover:shadow-md',
6666
disabled && 'opacity-50 cursor-not-allowed'
6767
)}
68-
onClick={disabled ? undefined : () => onSelect?.(book.id)}
68+
onClick={disabled ? undefined : () => onSelect?.(book)}
6969
>
70-
<CardHeader className="pb-3 text-center">
70+
<CardHeader className="text-center">
7171
<ViewTransition name={book.id}>
7272
<Image
7373
src={book.cover ?? '/book-placeholder.svg'}

components/collections/FormManageCollectionBooks.tsx

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,44 +13,35 @@ export const FormManageCollectionBooks: React.FC<{
1313
onSubmitAction: (v: string[]) => Promise<string>
1414
books: Book[]
1515
}> = ({ initialBooks, initialBookIDs, onSubmitAction, books }) => {
16-
const [selectedBookIDs, setSelectedBookIDs] = useState<Set<string>>(
17-
new Set(initialBookIDs)
16+
const [selectedBooks, setSelectedBooks] = useState<Map<string, Book>>(
17+
new Map(initialBooks.map((book) => [book.id, book]))
1818
)
1919

20-
// Combine initial books with fetched books, avoiding duplicates
21-
const allBooks = useMemo(() => {
22-
const initialBookIds = new Set(initialBooks.map((b) => b.id))
23-
const uniqueFetchedBooks = books.filter(
24-
(book) => !initialBookIds.has(book.id)
25-
)
26-
return initialBooks.concat(uniqueFetchedBooks)
27-
}, [initialBooks, books])
28-
29-
const selectedBooks = useMemo(
30-
() => allBooks.filter((book) => selectedBookIDs.has(book.id)),
31-
[allBooks, selectedBookIDs]
20+
const selectedBooksArray = useMemo(
21+
() => Array.from(selectedBooks.values()),
22+
[selectedBooks]
3223
)
3324

3425
const unselectedBooks = useMemo(
35-
() => allBooks.filter((book) => !selectedBookIDs.has(book.id)),
36-
[allBooks, selectedBookIDs]
26+
() => books.filter((book) => !selectedBooks.has(book.id)),
27+
[books, selectedBooks]
3728
)
3829

39-
const toggleBookSelection = (bookId: string) => {
30+
const toggleBookSelection = (book: Book) => {
4031
startTransition(() =>
41-
setSelectedBookIDs((prev) => {
42-
const next = new Set(prev)
43-
if (next.has(bookId)) {
44-
next.delete(bookId)
32+
setSelectedBooks((prev) => {
33+
const next = new Map(prev)
34+
if (next.has(book.id)) {
35+
next.delete(book.id)
4536
} else {
46-
next.add(bookId)
37+
next.set(book.id, book)
4738
}
4839
return next
4940
})
5041
)
5142
}
5243

53-
const selectedBookIDsArray = Array.from(selectedBookIDs)
44+
const selectedBookIDsArray = selectedBooksArray.map((book) => book.id)
5445
const hasSameNumber = initialBookIDs.length === selectedBookIDsArray.length
5546
const hasEveryBook = initialBookIDs.every((id) =>
5647
selectedBookIDsArray.includes(id)
@@ -63,7 +54,7 @@ export const FormManageCollectionBooks: React.FC<{
6354
}
6455

6556
const deselectAll = () => {
66-
setSelectedBookIDs(new Set())
57+
setSelectedBooks(new Map())
6758
}
6859

6960
return (
@@ -72,21 +63,21 @@ export const FormManageCollectionBooks: React.FC<{
7263
<Button
7364
variant="outline"
7465
onClick={deselectAll}
75-
disabled={selectedBookIDs.size === 0}
66+
disabled={selectedBooks.size === 0}
7667
className="h-full"
7768
>
7869
<X className="mr-2 h-4 w-4" />
79-
Deselect All ({selectedBookIDs.size})
70+
Deselect All ({selectedBooks.size})
8071
</Button>
8172
<Button onClick={onSubmit} className="h-full" disabled={isNoChange}>
8273
<Plus className="mr-2 h-4 w-4" />
83-
Save Selection ({selectedBookIDs.size})
74+
Save Selection ({selectedBooks.size})
8475
</Button>
8576
</div>
8677

87-
{selectedBooks.length > 0 && (
78+
{selectedBooksArray.length > 0 && (
8879
<div className="flex items-end overflow-x-scroll p-6 isolate">
89-
{selectedBooks.map((b) => (
80+
{selectedBooksArray.map((b) => (
9081
<SelectedBook
9182
key={b.id}
9283
book={b}

0 commit comments

Comments
 (0)