11import 'package:flutter/material.dart' ;
22import 'package:flutter/services.dart' ;
33import 'package:flutter_pecha/core/constants/app_assets.dart' ;
4+ import 'package:flutter_pecha/core/deep_linking/deep_link_url_builder.dart' ;
45import 'package:flutter_pecha/core/extensions/context_ext.dart' ;
56import 'package:flutter_pecha/features/practice/data/datasource/bookmark_remote_datasource.dart' ;
67import 'package:flutter_pecha/features/practice/presentation/controllers/bookmark_controller.dart' ;
78import 'package:flutter_pecha/features/practice/presentation/providers/bookmark_providers.dart' ;
89import 'package:flutter_pecha/features/reader/presentation/widgets/reader_app_bar/reader_font_size_bottom_sheet.dart' ;
910import 'package:flutter_pecha/features/texts/presentation/providers/font_size_notifier.dart' ;
11+ import 'package:flutter_pecha/shared/utils/helper_functions.dart' ;
1012import 'package:flutter_riverpod/flutter_riverpod.dart' ;
13+ import 'package:share_plus/share_plus.dart' ;
1114
1215/// Bottom sheet opened from the reader's three-dot (⋮) button.
1316///
@@ -34,6 +37,7 @@ class ReaderMoreBottomSheet extends ConsumerStatefulWidget {
3437
3538class _ReaderMoreBottomSheetState extends ConsumerState <ReaderMoreBottomSheet > {
3639 bool _isBookmarking = false ;
40+ bool _isSharing = false ;
3741
3842 BookmarkTarget get _bookmarkTarget => BookmarkTarget (
3943 type: BookmarkType .text,
@@ -55,6 +59,23 @@ class _ReaderMoreBottomSheetState extends ConsumerState<ReaderMoreBottomSheet> {
5559 }
5660 }
5761
62+ Future <void > _share () async {
63+ if (_isSharing) return ;
64+ setState (() => _isSharing = true );
65+ try {
66+ final shareUrl =
67+ DeepLinkUrlBuilder .readerLink (textId: widget.textId).toString ();
68+ if (! mounted) return ;
69+ final sharePositionOrigin = getSharePositionOrigin (context: context);
70+ await SharePlus .instance.share (
71+ ShareParams (text: shareUrl, sharePositionOrigin: sharePositionOrigin),
72+ );
73+ if (mounted) Navigator .of (context).pop ();
74+ } finally {
75+ if (mounted) setState (() => _isSharing = false );
76+ }
77+ }
78+
5879 // ── font size helpers ──────────────────────────────────────────────────────
5980
6081 int _stepIndex (double fontSize) {
@@ -196,6 +217,27 @@ class _ReaderMoreBottomSheetState extends ConsumerState<ReaderMoreBottomSheet> {
196217 },
197218 ),
198219
220+ // ── Share ──────────────────────────────────────────────────────
221+ _SectionDivider (theme: theme),
222+ ListTile (
223+ leading:
224+ _isSharing
225+ ? SizedBox (
226+ width: 22 ,
227+ height: 22 ,
228+ child: CircularProgressIndicator (
229+ strokeWidth: 2 ,
230+ color: theme.colorScheme.onSurface,
231+ ),
232+ )
233+ : Icon (Icons .share, color: theme.colorScheme.onSurface),
234+ title: Text (l10n.share, style: theme.textTheme.bodyLarge),
235+ onTap: () {
236+ HapticFeedback .lightImpact ();
237+ _share ();
238+ },
239+ ),
240+
199241 const SizedBox (height: 8 ),
200242 ],
201243 ),
0 commit comments