Spaces:
Configuration error
Configuration error
| import { useState, useEffect } from 'react'; | |
| export function useStaticFontData() { | |
| const [fonts, setFonts] = useState([]); | |
| const [glyphPaths, setGlyphPaths] = useState({}); // Map id -> path d | |
| const [loading, setLoading] = useState(true); | |
| const [error, setError] = useState(null); | |
| useEffect(() => { | |
| const loadData = async () => { | |
| try { | |
| console.log('📦 Loading static font map data...'); | |
| // 1. Charger le sprite SVG et extraire les chemins | |
| const paths = {}; | |
| try { | |
| let spriteContent = ''; | |
| // Essayer d'abord dans /data/ | |
| const spriteResponse = await fetch('/data/font-sprite.svg'); | |
| if (!spriteResponse.ok) { | |
| console.warn('⚠️ Sprite not found at /data/font-sprite.svg, trying root...'); | |
| const rootSpriteResponse = await fetch('/font-sprite.svg'); | |
| if (rootSpriteResponse.ok) { | |
| spriteContent = await rootSpriteResponse.text(); | |
| } | |
| } else { | |
| spriteContent = await spriteResponse.text(); | |
| } | |
| if (spriteContent) { | |
| // Parser le SVG pour extraire les chemins | |
| const parser = new DOMParser(); | |
| const doc = parser.parseFromString(spriteContent, 'image/svg+xml'); | |
| const symbols = doc.querySelectorAll('symbol'); | |
| symbols.forEach(symbol => { | |
| const id = symbol.id; | |
| const path = symbol.querySelector('path'); | |
| if (id && path) { | |
| paths[id] = path.getAttribute('d'); | |
| } | |
| }); | |
| console.log(`🎨 Extracted ${Object.keys(paths).length} glyph paths`); | |
| setGlyphPaths(paths); | |
| } | |
| } catch (e) { | |
| console.warn('⚠️ Error loading/parsing sprite:', e); | |
| } | |
| // 2. Charger les données JSON (font-map.json ou fallback typography_data.json) | |
| let data; | |
| const mapResponse = await fetch('/data/font-map.json'); | |
| const mapContentType = mapResponse.headers.get('content-type'); | |
| if (mapResponse.ok && mapContentType && mapContentType.includes('application/json')) { | |
| data = await mapResponse.json(); | |
| console.log('📍 Loaded from font-map.json'); | |
| } else { | |
| console.warn('⚠️ font-map.json not available, falling back to typography_data.json'); | |
| const fallbackResponse = await fetch('/data/typography_data.json'); | |
| if (!fallbackResponse.ok) { | |
| throw new Error('No font data found. Neither font-map.json nor typography_data.json available.'); | |
| } | |
| data = await fallbackResponse.json(); | |
| console.log('📍 Loaded from typography_data.json (fallback)'); | |
| } | |
| if (!data.fonts || !Array.isArray(data.fonts)) { | |
| throw new Error('Invalid data format: missing fonts array'); | |
| } | |
| console.log(`✅ Loaded ${data.fonts.length} fonts from static map`); | |
| setFonts(data.fonts); | |
| setLoading(false); | |
| } catch (err) { | |
| console.error('❌ Error loading static font data:', err); | |
| setError(err.message); | |
| setLoading(false); | |
| } | |
| }; | |
| loadData(); | |
| }, []); | |
| return { | |
| fonts, | |
| glyphPaths, | |
| loading, | |
| error | |
| }; | |
| } | |