import { useState } from 'react'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Plus } from 'lucide-react'; import { toast } from 'sonner'; import { addCustomFont, generateFontId, parseFontFamilyFromImport, isValidGoogleFontsUrl, type CustomFont, } from '@/lib/customFonts'; interface AddCustomFontDialogProps { onFontAdded?: (font: CustomFont) => void; } export function AddCustomFontDialog({ onFontAdded }: AddCustomFontDialogProps) { const [open, setOpen] = useState(false); const [importUrl, setImportUrl] = useState(''); const [fontName, setFontName] = useState(''); const [loading, setLoading] = useState(false); const handleImportUrlChange = (url: string) => { setImportUrl(url); // Auto-extract font name if valid Google Fonts URL if (isValidGoogleFontsUrl(url)) { const extracted = parseFontFamilyFromImport(url); if (extracted && !fontName) { setFontName(extracted); } } }; const handleAdd = async () => { // Validate inputs if (!importUrl.trim()) { toast.error('Please enter a Google Fonts import URL'); return; } if (!isValidGoogleFontsUrl(importUrl)) { toast.error('Please enter a valid Google Fonts URL'); return; } if (!fontName.trim()) { toast.error('Please enter a font name'); return; } setLoading(true); try { // Extract font family from URL const fontFamily = parseFontFamilyFromImport(importUrl); if (!fontFamily) { toast.error('Could not extract font family from URL'); setLoading(false); return; } // Create custom font object const newFont: CustomFont = { id: generateFontId(fontName), name: fontName.trim(), fontFamily: fontFamily, importUrl: importUrl.trim(), }; // Add font (this will load and verify it) - throws if it fails await addCustomFont(newFont); // Notify parent if (onFontAdded) { onFontAdded(newFont); } toast.success(`Font "${fontName}" added successfully`); // Reset and close setImportUrl(''); setFontName(''); setOpen(false); } catch (error) { console.error('Failed to add custom font:', error); const errorMessage = error instanceof Error ? error.message : 'Failed to load font'; toast.error('Failed to add font', { description: errorMessage.includes('timeout') ? 'Font took too long to load. Please check the URL and try again.' : 'The font could not be loaded. Please verify the Google Fonts URL is correct.', }); } finally { setLoading(false); } }; return ( Add Google Font Add a custom font from Google Fonts to use in your annotations.
handleImportUrlChange(e.target.value)} className="bg-white/5 border-white/10 text-slate-200" />

Get this from Google Fonts: Select a font → Click "Get font" → Copy the @import URL

setFontName(e.target.value)} className="bg-white/5 border-white/10 text-slate-200" />

This is how the font will appear in the font selector

); }