diff --git a/app/lib/core/providers/defaults.dart b/app/lib/core/providers/defaults.dart index e2a6dd17..06a035cc 100644 --- a/app/lib/core/providers/defaults.dart +++ b/app/lib/core/providers/defaults.dart @@ -9,3 +9,6 @@ Color lightSeedColorFallback(Ref ref) => const Color(0xFF167C80); @Riverpod(keepAlive: true) Color darkSeedColorFallback(Ref ref) => const Color(0xFF167C80); + +@Riverpod(keepAlive: true) +Uri docsUri(Ref ref) => Uri.parse('https://docs.weblibre.eu/'); diff --git a/app/lib/core/providers/defaults.g.dart b/app/lib/core/providers/defaults.g.dart index 2c2d36dc..b640b896 100644 --- a/app/lib/core/providers/defaults.g.dart +++ b/app/lib/core/providers/defaults.g.dart @@ -42,5 +42,22 @@ final darkSeedColorFallbackProvider = Provider.internal( @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element typedef DarkSeedColorFallbackRef = ProviderRef; +String _$docsUriHash() => r'6456efcf97ddc7ee87a67e2d3380f7241e3d76ea'; + +/// See also [docsUri]. +@ProviderFor(docsUri) +final docsUriProvider = Provider.internal( + docsUri, + name: r'docsUriProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$docsUriHash, + dependencies: null, + allTransitiveDependencies: null, +); + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +typedef DocsUriRef = ProviderRef; // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart index ab3fc847..a034a134 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart @@ -5,6 +5,7 @@ import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:share_plus/share_plus.dart'; +import 'package:weblibre/core/providers/defaults.dart'; import 'package:weblibre/core/routing/routes.dart'; import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.dart'; import 'package:weblibre/features/geckoview/domain/providers.dart'; @@ -177,6 +178,15 @@ class BrowserBottomAppBar extends HookConsumerWidget { leadingIcon: const Icon(Icons.info), child: const Text('About'), ), + MenuItemButton( + onPressed: () async { + await ref + .read(tabRepositoryProvider.notifier) + .addTab(url: ref.read(docsUriProvider)); + }, + leadingIcon: const Icon(Icons.help), + child: const Text('Help and feedback'), + ), const Divider(), MenuItemButton( onPressed: () async { diff --git a/app/lib/features/onboarding/presentation/onboarding.dart b/app/lib/features/onboarding/presentation/onboarding.dart index 4198736f..15a22ed8 100644 --- a/app/lib/features/onboarding/presentation/onboarding.dart +++ b/app/lib/features/onboarding/presentation/onboarding.dart @@ -2,7 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:smooth_page_indicator/smooth_page_indicator.dart'; +import 'package:weblibre/core/providers/defaults.dart'; import 'package:weblibre/core/providers/router.dart'; +import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; import 'package:weblibre/features/onboarding/presentation/pages/abstract/i_form_page.dart'; import 'package:weblibre/features/onboarding/presentation/pages/default_search.dart'; import 'package:weblibre/features/onboarding/presentation/pages/ublock_opt_in.dart'; @@ -112,6 +114,10 @@ class OnboardingScreen extends HookConsumerWidget { .read(onboardingRepositoryProvider.notifier) .pushRevision(targetRevision); + await ref + .read(tabRepositoryProvider.notifier) + .addTab(url: ref.read(docsUriProvider)); + ref.invalidate(routerProvider); }, iconAlignment: IconAlignment.end,