dialog replace or merge imported bookmarks
This commit is contained in:
+49
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2024-2025 Fabian Freund.
|
||||||
|
*
|
||||||
|
* This file is part of WebLibre
|
||||||
|
* (see https://weblibre.eu).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
Future<bool?> showImportBookmarksDialog(BuildContext context) {
|
||||||
|
return showDialog<bool?>(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return AlertDialog(
|
||||||
|
title: const Text('Import Bookmarks'),
|
||||||
|
content: const Text(
|
||||||
|
'Do you want to erase all existing bookmarks before importing?\n\n'
|
||||||
|
'Choose "Replace" to delete existing bookmarks, or "Merge" to keep them.',
|
||||||
|
),
|
||||||
|
actions: <Widget>[
|
||||||
|
TextButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pop(context, false);
|
||||||
|
},
|
||||||
|
child: const Text('Merge'),
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pop(context, true);
|
||||||
|
},
|
||||||
|
child: const Text('Replace'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
+9
-2
@@ -33,6 +33,7 @@ import 'package:weblibre/core/routing/routes.dart';
|
|||||||
import 'package:weblibre/features/geckoview/features/bookmarks/domain/entities/bookmark_item.dart';
|
import 'package:weblibre/features/geckoview/features/bookmarks/domain/entities/bookmark_item.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/bookmarks/domain/providers/bookmarks.dart';
|
import 'package:weblibre/features/geckoview/features/bookmarks/domain/providers/bookmarks.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/bookmarks/domain/repositories/bookmarks.dart';
|
import 'package:weblibre/features/geckoview/features/bookmarks/domain/repositories/bookmarks.dart';
|
||||||
|
import 'package:weblibre/features/geckoview/features/bookmarks/presentation/dialogs/import_bookmarks_dialog.dart';
|
||||||
import 'package:weblibre/presentation/hooks/listenable_callback.dart';
|
import 'package:weblibre/presentation/hooks/listenable_callback.dart';
|
||||||
import 'package:weblibre/presentation/hooks/menu_controller.dart';
|
import 'package:weblibre/presentation/hooks/menu_controller.dart';
|
||||||
import 'package:weblibre/presentation/widgets/failure_widget.dart';
|
import 'package:weblibre/presentation/widgets/failure_widget.dart';
|
||||||
@@ -359,12 +360,18 @@ class BookmarkListScreen extends HookConsumerWidget {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!context.mounted) return;
|
||||||
|
|
||||||
|
// Ask user if they want to erase existing bookmarks
|
||||||
|
final shouldReplace = await showImportBookmarksDialog(context);
|
||||||
|
if (shouldReplace == null) return; // User cancelled dialog
|
||||||
|
|
||||||
final content = await File(file.path!).readAsString();
|
final content = await File(file.path!).readAsString();
|
||||||
final repository = ref.read(bookmarksRepositoryProvider.notifier);
|
final repository = ref.read(bookmarksRepositoryProvider.notifier);
|
||||||
|
|
||||||
final count = format == 'json'
|
final count = format == 'json'
|
||||||
? await repository.importFromJSON(content)
|
? await repository.importFromJSON(content, replace: shouldReplace)
|
||||||
: await repository.importFromHTML(content);
|
: await repository.importFromHTML(content, replace: shouldReplace);
|
||||||
|
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
showInfoMessage(context, 'Imported $count bookmarks successfully');
|
showInfoMessage(context, 'Imported $count bookmarks successfully');
|
||||||
|
|||||||
@@ -387,7 +387,12 @@ class _BookmarkImporter {
|
|||||||
|
|
||||||
Future<int> _importBookmarks() async {
|
Future<int> _importBookmarks() async {
|
||||||
if (_isImportDefaults) {
|
if (_isImportDefaults) {
|
||||||
await _service.eraseEverything(BookmarkRoot.root);
|
// Delete bookmarks from each root folder (except root itself to avoid errors)
|
||||||
|
for (final root in BookmarkRoot.values) {
|
||||||
|
if (root != BookmarkRoot.root) {
|
||||||
|
await _service.eraseEverything(root);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final bookmarkTrees = _getBookmarkTrees();
|
final bookmarkTrees = _getBookmarkTrees();
|
||||||
|
|||||||
@@ -64,7 +64,12 @@ class BookmarkJSONUtils {
|
|||||||
|
|
||||||
// If replacing, erase existing bookmarks first
|
// If replacing, erase existing bookmarks first
|
||||||
if (replace) {
|
if (replace) {
|
||||||
await _service.eraseEverything(BookmarkRoot.root);
|
// Delete bookmarks from each root folder (except root itself to avoid errors)
|
||||||
|
for (final root in BookmarkRoot.values) {
|
||||||
|
if (root != BookmarkRoot.root) {
|
||||||
|
await _service.eraseEverything(root);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final folderIdToGuidMap = <String, String>{};
|
final folderIdToGuidMap = <String, String>{};
|
||||||
|
|||||||
Reference in New Issue
Block a user