diff --git a/mnemo_cards_admin/src/components/BulkCardEditor.tsx b/mnemo_cards_admin/src/components/BulkCardEditor.tsx index b1bdf5e..eb6bf5e 100644 --- a/mnemo_cards_admin/src/components/BulkCardEditor.tsx +++ b/mnemo_cards_admin/src/components/BulkCardEditor.tsx @@ -52,8 +52,20 @@ export function BulkCardEditor({ images, onComplete, onCancel }: BulkCardEditorP packsApi .getPacks({ page: 1, limit: 100, search: '' }) .then((response) => { - if (response && response.items) { - setPacksData(response.items.map((pack) => ({ id: pack.id, title: pack.title }))) + try { + if (response && response.items && Array.isArray(response.items)) { + const packs = response.items.map((pack: any) => ({ + id: String(pack.id || ''), + title: String(pack.title || pack.id || '') + })) + setPacksData(packs) + } else { + console.warn('Unexpected packs response format:', response) + setPacksData([]) + } + } catch (error) { + console.error('Error processing packs response:', error) + setPacksData([]) } }) .catch((error) => { @@ -66,44 +78,48 @@ export function BulkCardEditor({ images, onComplete, onCancel }: BulkCardEditorP // Initialize cards data useEffect(() => { - const initialData = new Map() - images.forEach((image) => { - initialData.set(image.id, { - imageId: image.id, - packId: '', - original: '', - translation: '', - mnemo: '', - transcription: '', - transcriptionMnemo: '', - back: '', - imageBack: undefined, - isSaved: false, + if (images.length > 0) { + const initialData = new Map() + images.forEach((image) => { + initialData.set(image.id, { + imageId: image.id, + packId: '', + original: '', + translation: '', + mnemo: '', + transcription: '', + transcriptionMnemo: '', + back: '', + imageBack: undefined, + isSaved: false, + }) }) - }) - setCardsData(initialData) + setCardsData(initialData) + } }, [images]) const currentImage = images[currentIndex] - const currentCard = cardsData.get(currentImage?.id || '') + const currentCard = currentImage ? cardsData.get(currentImage.id) : undefined const updateMutation = useMutation({ mutationFn: (card: GameCardDto) => cardsApi.upsertCard(card), onSuccess: (response) => { queryClient.invalidateQueries({ queryKey: ['cards'] }) - const imageId = currentImage.id - setCardsData((prev) => { - const newData = new Map(prev) - const cardData = newData.get(imageId) - if (cardData && response.card) { - newData.set(imageId, { - ...cardData, - isSaved: true, - cardId: response.card.id, - }) - } - return newData - }) + if (currentImage) { + const imageId = currentImage.id + setCardsData((prev) => { + const newData = new Map(prev) + const cardData = newData.get(imageId) + if (cardData && response.card) { + newData.set(imageId, { + ...cardData, + isSaved: true, + cardId: response.card.id, + }) + } + return newData + }) + } toast.success('Card saved successfully') }, onError: (error: unknown) => { @@ -113,7 +129,7 @@ export function BulkCardEditor({ images, onComplete, onCancel }: BulkCardEditorP }) const handleFieldChange = (field: keyof CardData, value: string) => { - if (!currentCard) return + if (!currentCard || !currentImage) return setCardsData((prev) => { const newData = new Map(prev) @@ -170,8 +186,21 @@ export function BulkCardEditor({ images, onComplete, onCancel }: BulkCardEditorP const savedCount = Array.from(cardsData.values()).filter((card) => card.isSaved).length const totalCount = images.length + // Wait for images and cards data to be initialized + if (images.length === 0) { + return ( +
+

No images uploaded

+
+ ) + } + if (!currentImage || !currentCard) { - return
Loading...
+ return ( +
+

Initializing card data...

+
+ ) } return ( @@ -199,15 +228,25 @@ export function BulkCardEditor({ images, onComplete, onCancel }: BulkCardEditorP Image Preview - {currentImage.file.name} + {currentImage.file?.name || 'Unknown'}
- {currentImage.file.name} + {currentImage.preview ? ( + {currentImage.file?.name { + console.error('Failed to load image:', currentImage.preview) + e.currentTarget.style.display = 'none' + }} + /> + ) : ( +
+ Image preview not available +
+ )}
@@ -222,19 +261,21 @@ export function BulkCardEditor({ images, onComplete, onCancel }: BulkCardEditorP
diff --git a/mnemo_cards_admin/src/pages/CardsPage.tsx b/mnemo_cards_admin/src/pages/CardsPage.tsx index 9fdd38b..9dcb7a9 100644 --- a/mnemo_cards_admin/src/pages/CardsPage.tsx +++ b/mnemo_cards_admin/src/pages/CardsPage.tsx @@ -366,19 +366,21 @@ export default function CardsPage() {
diff --git a/mnemo_cards_admin/src/pages/UsersPage.tsx b/mnemo_cards_admin/src/pages/UsersPage.tsx index 25feeb9..cc49d6b 100644 --- a/mnemo_cards_admin/src/pages/UsersPage.tsx +++ b/mnemo_cards_admin/src/pages/UsersPage.tsx @@ -387,10 +387,10 @@ export default function UsersPage() {
- {packsData?.items.length === 0 ? ( + {!packsData?.items || packsData.items.length === 0 ? (
No packs available
) : ( - packsData?.items.map((pack) => ( + packsData.items.map((pack) => (