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/extensions/context_ext.dart' ;
5+ import 'package:flutter_pecha/features/practice/data/datasource/bookmark_remote_datasource.dart' ;
6+ import 'package:flutter_pecha/features/practice/presentation/controllers/bookmark_controller.dart' ;
7+ import 'package:flutter_pecha/features/practice/presentation/providers/bookmark_providers.dart' ;
8+ import 'package:flutter_riverpod/flutter_riverpod.dart' ;
49
510/// Bottom sheet opened from the three-dot (⋮) button on the series detail
611/// screen.
712///
813/// Contains:
914/// • "+ Add to my practices" action
10- /// • Bookmark action
11- ///
12- /// Both callbacks fire after the sheet is dismissed so any feedback
13- /// (snackbar / login drawer) is shown on the underlying screen rather than
14- /// behind the closing modal.
15- class SeriesMoreBottomSheet extends StatelessWidget {
15+ /// • Bookmark toggle action
16+ class SeriesMoreBottomSheet extends ConsumerStatefulWidget {
1617 const SeriesMoreBottomSheet ({
1718 super .key,
19+ required this .seriesId,
20+ required this .seriesName,
1821 this .onAddToPractices,
19- this .onBookmark,
2022 });
2123
24+ final String seriesId;
25+ final String seriesName;
2226 final VoidCallback ? onAddToPractices;
23- final VoidCallback ? onBookmark;
27+
28+ @override
29+ ConsumerState <SeriesMoreBottomSheet > createState () =>
30+ _SeriesMoreBottomSheetState ();
31+ }
32+
33+ class _SeriesMoreBottomSheetState extends ConsumerState <SeriesMoreBottomSheet > {
34+ bool _isBookmarking = false ;
35+
36+ BookmarkTarget get _bookmarkTarget => BookmarkTarget (
37+ type: BookmarkType .series,
38+ sourceId: widget.seriesId,
39+ );
40+
41+ Future <void > _toggleBookmark () async {
42+ if (_isBookmarking) return ;
43+ setState (() => _isBookmarking = true );
44+ try {
45+ final nav = Navigator .of (context);
46+ final didToggle = await BookmarkController (
47+ ref: ref,
48+ context: context,
49+ ).toggleSeries (widget.seriesId, name: widget.seriesName);
50+ if (mounted && didToggle) nav.pop ();
51+ } finally {
52+ if (mounted) setState (() => _isBookmarking = false );
53+ }
54+ }
2455
2556 @override
2657 Widget build (BuildContext context) {
2758 final theme = Theme .of (context);
59+ final l10n = context.l10n;
60+ final isBookmarked = ref.watch (isBookmarkedProvider (_bookmarkTarget));
2861
2962 return SafeArea (
3063 top: false ,
@@ -55,22 +88,33 @@ class SeriesMoreBottomSheet extends StatelessWidget {
5588 onTap: () {
5689 HapticFeedback .lightImpact ();
5790 Navigator .of (context).pop ();
58- onAddToPractices? .call ();
91+ widget. onAddToPractices? .call ();
5992 },
6093 ),
6194
6295 // ── Bookmark ───────────────────────────────────────────────────
6396 _SectionDivider (theme: theme),
6497 ListTile (
65- leading: Icon (
66- AppAssets .bookmarkSimple,
67- color: theme.colorScheme.onSurface,
68- ),
69- title: Text ('Bookmark' , style: theme.textTheme.bodyLarge),
98+ leading:
99+ _isBookmarking
100+ ? SizedBox (
101+ width: 22 ,
102+ height: 22 ,
103+ child: CircularProgressIndicator (
104+ strokeWidth: 2 ,
105+ color: theme.colorScheme.onSurface,
106+ ),
107+ )
108+ : Icon (
109+ isBookmarked
110+ ? AppAssets .bookmarkSimpleFill
111+ : AppAssets .bookmarkSimple,
112+ color: theme.colorScheme.onSurface,
113+ ),
114+ title: Text (l10n.bookmark, style: theme.textTheme.bodyLarge),
70115 onTap: () {
71116 HapticFeedback .lightImpact ();
72- Navigator .of (context).pop ();
73- onBookmark? .call ();
117+ _toggleBookmark ();
74118 },
75119 ),
76120
@@ -93,8 +137,9 @@ class _SectionDivider extends StatelessWidget {
93137/// Shows the series "more" bottom sheet.
94138void showSeriesMoreBottomSheet (
95139 BuildContext context, {
140+ required String seriesId,
141+ required String seriesName,
96142 VoidCallback ? onAddToPractices,
97- VoidCallback ? onBookmark,
98143}) {
99144 showModalBottomSheet (
100145 context: context,
@@ -105,8 +150,9 @@ void showSeriesMoreBottomSheet(
105150 useRootNavigator: true ,
106151 builder:
107152 (_) => SeriesMoreBottomSheet (
153+ seriesId: seriesId,
154+ seriesName: seriesName,
108155 onAddToPractices: onAddToPractices,
109- onBookmark: onBookmark,
110156 ),
111157 );
112158}
0 commit comments