import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { ImageUpload } from '@/components/ui/image-upload' import { AudioUpload } from '@/components/ui/audio-upload' import { CardVoicesManager } from '@/components/CardVoicesManager' interface CardEditorPreviewProps { formData: { packId: string original: string translation: string mnemo: string transcription: string transcriptionMnemo: string back: string image: string | undefined imageBack: string | undefined voice: string | undefined voiceLanguage: string } onFormDataChange: (updates: Partial) => void cardId?: string disabled?: boolean packColor?: string } // Helper to get image source // Note: For UUID (objectId), returns undefined - ImageUpload component will handle fetching presigned URL function getImageSrc(image?: string): string | undefined { if (!image) return undefined // If it's already a data URL or http/https URL, return as is if (image.startsWith('data:') || image.startsWith('http://') || image.startsWith('https://')) { return image } // If it's a relative API path, prepend the base URL if (image.startsWith('/api/')) { const baseUrl = import.meta.env.VITE_API_BASE_URL || 'https://api.mnemo-cards.online' return `${baseUrl}${image}` } // If it's a UUID (objectId), return undefined - ImageUpload will fetch presigned URL const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(image) if (isUuid) { return undefined // Will be handled by ImageUpload component's useEffect } // Otherwise, assume it's base64 and add the data URL prefix return `data:image/png;base64,${image}` } export function CardEditorPreview({ formData, onFormDataChange, cardId, disabled = false, packColor = '#6b7280', // Default gray border color }: CardEditorPreviewProps) { return (
{/* Cards Preview - Front and Back side by side */}
{/* Front side */}
Front Side
{/* Top section: Original, Translation */}
{/* Original - large, bold */}
onFormDataChange({ original: e.target.value }) } placeholder="Original text" className="text-center border-none shadow-none focus-visible:ring-2 focus-visible:ring-primary/20 p-0 h-auto bg-transparent" disabled={disabled} style={{ fontSize: '32px', fontWeight: 700, }} />
{/* Translation - smaller, gray */}
onFormDataChange({ translation: e.target.value }) } placeholder="Translation" className="text-center border-none shadow-none focus-visible:ring-2 focus-visible:ring-primary/20 p-0 h-auto bg-transparent" disabled={disabled} style={{ fontSize: '22px', fontWeight: 400, color: formData.translation ? 'rgba(0, 0, 0, 0.5)' : 'rgba(0, 0, 0, 0.3)', }} />
{/* Image in the middle */}
{getImageSrc(formData.image) ? ( Card { const target = e.target as HTMLImageElement target.style.display = 'none' }} /> ) : (
)}
{/* Mnemo phrase at the bottom */}
onFormDataChange({ mnemo: e.target.value })} placeholder="Mnemo phrase" className="text-center border-none shadow-none focus-visible:ring-2 focus-visible:ring-primary/20 p-0 h-auto bg-transparent w-full" disabled={disabled} style={{ fontSize: '24px', fontWeight: 600, }} />
{/* Back side */}
{formData.imageBack ? ( <>
Back { const target = e.target as HTMLImageElement target.style.display = 'none' }} />