diff --git a/lib/pages/player/comments_auth.dart b/lib/pages/player/comments_auth.dart new file mode 100644 index 0000000..c1178bc --- /dev/null +++ b/lib/pages/player/comments_auth.dart @@ -0,0 +1,24 @@ +// Author: fruit.com.cn + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../core/data/models/drama.dart'; +import '../../core/data/services/auth_controller.dart'; +import '../../core/widgets/auth_gate.dart'; + +/// 评论入口统一登录闸:登录成功且页面仍存在时再打开评论面板。 +Future openCommentsWithAuth( + BuildContext context, + Drama drama, { + required Future Function(BuildContext context, Drama drama) show, +}) async { + final auth = context.read(); + if (auth.isSignedIn) { + await show(context, drama); + return; + } + await ensureSignedIn(context); + if (!context.mounted || !auth.isSignedIn) return; + await show(context, drama); +} diff --git a/lib/pages/player/player_view.dart b/lib/pages/player/player_view.dart index c08ab0a..b03546d 100644 --- a/lib/pages/player/player_view.dart +++ b/lib/pages/player/player_view.dart @@ -22,6 +22,7 @@ import '../../core/widgets/auth_gate.dart'; import '../../core/widgets/download_action.dart'; import '../../core/widgets/remote_image.dart'; import '../../l10n/app_localizations.dart'; +import 'comments_auth.dart'; import 'player_binding.dart'; import 'player_logic.dart'; import 'widgets/home_feed_header.dart'; @@ -454,7 +455,9 @@ class _PlayerPageState extends State with WidgetsBindingObserver { ); } }, - onComments: () => logic.showComments(context, drama), + onComments: () => unawaited( + openCommentsWithAuth(context, drama, show: logic.showComments), + ), onShare: () => logic.shareDrama(context, drama), onDetail: () => unawaited(logic.openDetail(context)), onOpenFullPlayer: () async { @@ -498,7 +501,9 @@ class _PlayerPageState extends State with WidgetsBindingObserver { onDetail: () => unawaited(logic.openDetail(context)), onSpeed: () => unawaited(_openSpeedSheet(context)), onEpisodes: () => logic.showEpisodes(context), - onComments: () => logic.showComments(context, drama), + onComments: () => unawaited( + openCommentsWithAuth(context, drama, show: logic.showComments), + ), onLike: () => unawaited(_toggleLike(context, interactions, drama)), onSave: () => unawaited(_toggleSave(context, drama)), diff --git a/test/player/player_fullscreen_test.dart b/test/player/player_fullscreen_test.dart index 92896d9..2e17534 100644 --- a/test/player/player_fullscreen_test.dart +++ b/test/player/player_fullscreen_test.dart @@ -69,6 +69,34 @@ void main() { ); }); + testWidgets('should_gate_comments_before_opening_sheet_when_signed_out', ( + tester, + ) async { + await _pumpApp(tester); + await _openSeriesPlayer(tester); + + await tester.tap(find.byKey(const Key('player-rail-comments'))); + await tester.pumpAndSettle(); + + expect(find.text('Sign in to continue'), findsOneWidget); + expect(find.byKey(const Key('player-comments-sheet')), findsNothing); + }); + + testWidgets('should_open_feed_comments_when_signed_in', (tester) async { + SharedPreferencesAsyncPlatform.instance = + InMemorySharedPreferencesAsync.withData({ + 'auth.accessToken': 'access', + 'auth.refreshToken': 'refresh', + 'auth.user': '{"uid":"9","nickname":"Viewer","avatarUrl":""}', + }); + await _pumpApp(tester); + + await tester.tap(find.byKey(const Key('rail-comments'))); + await tester.pumpAndSettle(); + + expect(find.byKey(const Key('player-comments-sheet')), findsOneWidget); + }); + testWidgets('should_show_center_toggle_only_when_paused', (tester) async { await _pumpApp(tester); await _openSeriesPlayer(tester);