import 'dart:convert'; import 'dart:io'; import 'package:file_selector/file_selector.dart'; import 'package:flutter/services.dart'; import '../model/bookmark.dart'; import '../model/collection.dart'; import '../assets/constants.dart' as constants; class JsonFileService { static Future exportToJson({ required List collections, required List bookmarks, }) async { try { final dir = await _directoryPath; if (dir.isEmpty) return false; final data = { 'collections': collections.map((c) => c.toJson()).toList(), 'bookmarks': bookmarks.map((b) => b.toJson()).toList(), }; final json = jsonEncode(data).codeUnits; final file = XFile.fromData( Uint8List.fromList(json), mimeType: 'application/json', name: constants.jsonFileName, ); file.saveTo('$dir/${constants.jsonFileName}'); } catch (e) { return false; } return true; } static Future<({List collections, List bookmarks})> importFromJson() async { try { const typeGroup = XTypeGroup(label: 'json', extensions: ['json']); final XFile? file = await openFile( acceptedTypeGroups: [typeGroup], ); if (file == null) { return (collections: [], bookmarks: []); } final jsonString = await file.readAsString(); final data = jsonDecode(jsonString) as Map; final collections = (data['collections'] as List? ?? []) .map((json) => Collection.fromJson(json as Map)) .toList(); final bookmarks = (data['bookmarks'] as List? ?? []) .map((json) => Bookmark.fromJson(json as Map)) .toList(); return (collections: collections, bookmarks: bookmarks); } catch (e) { return (collections: [], bookmarks: []); } } static Future get _directoryPath async { if (Platform.isAndroid) { return await getDirectoryPath( initialDirectory: constants.defaultAndroidExportDirectory, ) ?? ''; } return await getDirectoryPath() ?? ''; } }