'use client';
import type { UrlCard } from '@/api-client';
import { Stack } from '@mantine/core';
import { notifications } from '@mantine/notifications';
import { useState } from 'react';
import CollectionSelectorError from '@/features/collections/components/collectionSelector/Error.CollectionSelector';
import CardToBeAddedPreview from '@/features/cards/components/cardToBeAddedPreview/CardToBeAddedPreview';
import CollectionSelector from '@/features/collections/components/collectionSelector/CollectionSelector';
import useGetCardFromMyLibrary from '@/features/cards/lib/queries/useGetCardFromMyLibrary';
import useMyCollections from '@/features/collections/lib/queries/useMyCollections';
import useUpdateCardAssociations from '@/features/cards/lib/mutations/useUpdateCardAssociations';
import useAddCard from '@/features/cards/lib/mutations/useAddCard';
import useUrlMetadata from '../../lib/queries/useUrlMetadata';
interface SelectableCollectionItem {
id: string;
name: string;
cardCount: number;
}
interface Props {
onClose: () => void;
url: string;
cardId?: string;
note?: string;
}
export default function AddCardToModalContent(props: Props) {
const {
data: { metadata },
} = useUrlMetadata({ url: props.url });
const cardStatus = useGetCardFromMyLibrary({ url: props.url });
const isMyCard = props?.cardId === cardStatus.data.card?.id;
const [note, setNote] = useState(isMyCard ? props.note : '');
const { data, error } = useMyCollections();
const addCard = useAddCard();
const updateCardAssociations = useUpdateCardAssociations();
if (error) {
return ;
}
const allCollections =
data?.pages.flatMap((page) => page.collections ?? []) ?? [];
const collectionsWithCard = allCollections.filter((c) =>
cardStatus.data.collections?.some((col) => col.id === c.id),
);
const [selectedCollections, setSelectedCollections] =
useState(collectionsWithCard);
const isSaving = addCard.isPending || updateCardAssociations.isPending;
const handleUpdateCard = (e: React.FormEvent) => {
e.preventDefault();
const trimmedNote = note?.trimEnd() === '' ? undefined : note;
const addedCollections = selectedCollections.filter(
(c) => !collectionsWithCard.some((original) => original.id === c.id),
);
const removedCollections = collectionsWithCard.filter(
(c) => !selectedCollections.some((selected) => selected.id === c.id),
);
const hasNoteChanged = trimmedNote !== props.note;
const hasAdded = addedCollections.length > 0;
const hasRemoved = removedCollections.length > 0;
// no change, close modal
if (cardStatus.data.card && !hasNoteChanged && !hasAdded && !hasRemoved) {
props.onClose();
return;
}
// card not yet in library, add it
if (!cardStatus.data.card) {
addCard.mutate(
{
url: props.url,
note: trimmedNote,
collectionIds: selectedCollections.map((c) => c.id),
},
{
onError: () => {
notifications.show({ message: 'Could not add card.' });
},
onSettled: () => {
props.onClose();
},
},
);
return;
}
// card already in library, update associations instead
const updatedCardPayload: {
cardId: string;
note?: string;
addToCollectionIds?: string[];
removeFromCollectionIds?: string[];
} = { cardId: cardStatus.data.card.id };
if (hasNoteChanged) updatedCardPayload.note = trimmedNote;
if (hasAdded)
updatedCardPayload.addToCollectionIds = addedCollections.map((c) => c.id);
if (hasRemoved)
updatedCardPayload.removeFromCollectionIds = removedCollections.map(
(c) => c.id,
);
updateCardAssociations.mutate(updatedCardPayload, {
onError: () => {
notifications.show({ message: 'Could not update card.' });
},
onSettled: () => {
props.onClose();
},
});
};
return (
{
props.onClose();
setSelectedCollections(collectionsWithCard);
}}
onSave={handleUpdateCard}
isSaving={isSaving}
selectedCollections={selectedCollections}
onSelectedCollectionsChange={setSelectedCollections}
/>
);
}