diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index 28142d44..baf1242f 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -203,4 +203,10 @@ class CollectionStateNotifier extends StateNotifier?> { await hiveHandler.removeUnused(); ref.read(saveDataStateProvider.notifier).update((state) => false); } + + Map exportData() { + return { + "data": state!.map((e) => e.toJson(includeResponse: false)).toList() + }; + } } diff --git a/lib/screens/settings_page.dart b/lib/screens/settings_page.dart index bc4e22f8..c71de31f 100644 --- a/lib/screens/settings_page.dart +++ b/lib/screens/settings_page.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:apidash/providers/providers.dart'; -import 'package:apidash/widgets/widgets.dart'; +import '../providers/providers.dart'; +import '../widgets/widgets.dart'; +import '../utils/utils.dart'; import 'package:apidash/consts.dart'; class SettingsPage extends ConsumerStatefulWidget { @@ -73,6 +74,24 @@ class _SettingsPageState extends ConsumerState { .update(saveResponses: value); }, ), + ListTile( + contentPadding: EdgeInsets.zero, + hoverColor: kColorTransparent, + title: const Text('Export Collection'), + subtitle: const Text('Export your collection to a JSON file'), + trailing: FilledButton( + onPressed: () async { + var data = ref + .read(collectionStateNotifierProvider.notifier) + .exportData(); + var pth = await getFileDownloadpath(null, "json"); + if (pth != null) { + await saveFile(pth, jsonMapToBytes(data)); + } + }, + child: const Text("Export Data"), + ), + ), ListTile( contentPadding: EdgeInsets.zero, hoverColor: kColorTransparent, diff --git a/lib/utils/convert_utils.dart b/lib/utils/convert_utils.dart index 379fff41..e12f2dcc 100644 --- a/lib/utils/convert_utils.dart +++ b/lib/utils/convert_utils.dart @@ -98,3 +98,14 @@ Uint8List? stringToBytes(String? text) { return bytes; } } + +Uint8List jsonMapToBytes(Map? map) { + if (map == null) { + return Uint8List.fromList([]); + } else { + String text = kEncoder.convert(map); + var l = utf8.encode(text); + var bytes = Uint8List.fromList(l); + return bytes; + } +}