| 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<MindMapData> => { | |
| 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' | |
| ); | |
| }; |