import { Node, Edge } from 'reactflow'; export interface MindMapConfig { nodeBgColor: string; nodeTextColor: string; } export interface MindMapData { id: string; name: string; updatedAt: string; nodes: Node[]; edges: Edge[]; config: { nodeBgColor: string; nodeTextColor: string; }; } export const saveMindMapToJSON = (data: MindMapData): void => { const jsonString = JSON.stringify(data, null, 2); const blob = new Blob([jsonString], { type: 'application/json' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = `${data.name.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.json`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }; export const loadMindMapFromJSON = async (file: File): Promise => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = (event) => { try { const data = JSON.parse(event.target?.result as string) as MindMapData; if (!data.nodes || !data.edges || !data.config) { throw new Error('Invalid mind map data format'); } resolve(data); } catch (error) { reject(new Error('Failed to parse mind map data')); } }; reader.onerror = () => reject(new Error('Failed to read file')); reader.readAsText(file); }); }; const validateMindMapData = (data: any): data is MindMapData => { return ( typeof data === 'object' && typeof data.id === 'string' && typeof data.name === 'string' && typeof data.updatedAt === 'string' && Array.isArray(data.nodes) && Array.isArray(data.edges) && typeof data.config === 'object' && typeof data.config.nodeBgColor === 'string' && typeof data.config.nodeTextColor === 'string' ); };