setting to show link open prompt

This commit is contained in:
Fabian Freund
2025-09-11 10:16:34 +02:00
parent 77cda075ca
commit 0b34383510
16 changed files with 312 additions and 86 deletions
@@ -0,0 +1,99 @@
import 'package:drift/drift.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:weblibre/features/geckoview/domain/repositories/tab.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/container_chips.dart';
import 'package:weblibre/utils/form_validators.dart';
class OpenSharedContent extends HookConsumerWidget {
final Uri sharedUrl;
const OpenSharedContent({required this.sharedUrl});
@override
Widget build(BuildContext context, WidgetRef ref) {
final formKey = useMemoized(() => GlobalKey<FormState>());
final textController = useTextEditingController(text: sharedUrl.toString());
final selectedContainer = useState<ContainerData?>(null);
Future<void> openTab(bool isPrivate) async {
if (formKey.currentState?.validate() == true) {
await ref
.read(tabRepositoryProvider.notifier)
.addTab(
url: Uri.parse(textController.text),
private: isPrivate,
container: Value(selectedContainer.value),
launchedFromIntent: true,
);
}
}
return Form(
key: formKey,
child: SimpleDialog(
title: const Text('Open URL'),
children: [
Padding(
padding: const EdgeInsetsDirectional.symmetric(horizontal: 16.0),
child: SizedBox(
height: 48,
width: double.maxFinite,
child: ContainerChips(
displayMenu: false,
selectedContainer: selectedContainer.value,
onSelected: (container) {
selectedContainer.value = container;
},
onDeleted: (container) {
selectedContainer.value = null;
},
),
),
),
Padding(
padding: const EdgeInsetsDirectional.symmetric(horizontal: 16.0),
child: TextFormField(
controller: textController,
keyboardType: TextInputType.url,
minLines: 1,
maxLines: 10,
validator: (value) {
return validateUrl(
value,
onlyHttpProtocol: true,
eagerParsing: false,
);
},
),
),
ListTile(
title: const Text('Open Regular Tab'),
leading: const Icon(MdiIcons.tab),
onTap: () async {
await openTab(false);
if (context.mounted) {
context.pop();
}
},
),
ListTile(
title: const Text('Open Private Tab'),
leading: const Icon(MdiIcons.tabUnselected),
onTap: () async {
await openTab(true);
if (context.mounted) {
context.pop();
}
},
),
],
),
);
}
}
@@ -17,6 +17,7 @@
* 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:drift/drift.dart' show Value;
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
@@ -242,6 +243,7 @@ class BrowserBottomAppBar extends HookConsumerWidget {
.addTab(
url: ref.read(docsUriProvider),
private: isPrivate,
container: const Value(null),
);
},
leadingIcon: const Icon(Icons.help),
@@ -301,6 +303,7 @@ class BrowserBottomAppBar extends HookConsumerWidget {
.addTab(
url: Uri.parse('https://addons.mozilla.org'),
private: isPrivate,
container: const Value(null),
);
},
leadingIcon: const Icon(MdiIcons.puzzlePlus),
@@ -44,8 +44,13 @@ import 'package:weblibre/utils/uri_parser.dart' as uri_parser;
class SearchScreen extends HookConsumerWidget {
final String? initialSearchText;
final TabType tabType;
final bool launchedFromIntent;
const SearchScreen({required this.initialSearchText, required this.tabType});
const SearchScreen({
required this.initialSearchText,
required this.tabType,
this.launchedFromIntent = false,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
@@ -109,6 +114,7 @@ class SearchScreen extends HookConsumerWidget {
parentId: (selectedTabType.value == TabType.child)
? ref.read(selectedTabProvider)
: null,
launchedFromIntent: launchedFromIntent,
);
if (context.mounted) {
@@ -212,6 +218,7 @@ class SearchScreen extends HookConsumerWidget {
(selectedTabType.value == TabType.child)
? ref.read(selectedTabProvider)
: null,
launchedFromIntent: launchedFromIntent,
);
if (context.mounted) {