fix(flutter): 评论输入增加登录闸
This commit is contained in:
1 parent
1eea9fafe7
commit
d0c1a5f499
9 files changed
+177
-41
No files matched your search
@@ -202,6 +202,7 @@
|
||||
"share": "Share",
|
||||
"noComments": "No comments yet.",
|
||||
"writeComment": "Write a comment",
|
||||
"commentLoginHint": "Sign in to comment",
|
||||
"postComment": "Post",
|
||||
"loadMore": "Load more",
|
||||
"commentsLoadFailed": "Comments could not be loaded.",
|
||||
|
||||
@@ -176,6 +176,7 @@
|
||||
"share": "Bagikan",
|
||||
"noComments": "Belum ada komentar.",
|
||||
"writeComment": "Tulis komentar",
|
||||
"commentLoginHint": "Masuk untuk berkomentar",
|
||||
"postComment": "Kirim",
|
||||
"loadMore": "Muat lebih banyak",
|
||||
"commentsLoadFailed": "Komentar tidak dapat dimuat.",
|
||||
|
||||
@@ -922,6 +922,12 @@ abstract class AppLocalizations {
|
||||
/// **'Write a comment'**
|
||||
String get writeComment;
|
||||
|
||||
/// No description provided for @commentLoginHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign in to comment'**
|
||||
String get commentLoginHint;
|
||||
|
||||
/// No description provided for @postComment.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
||||
@@ -448,6 +448,9 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||
@override
|
||||
String get writeComment => 'Write a comment';
|
||||
|
||||
@override
|
||||
String get commentLoginHint => 'Sign in to comment';
|
||||
|
||||
@override
|
||||
String get postComment => 'Post';
|
||||
|
||||
|
||||
@@ -449,6 +449,9 @@ class AppLocalizationsId extends AppLocalizations {
|
||||
@override
|
||||
String get writeComment => 'Tulis komentar';
|
||||
|
||||
@override
|
||||
String get commentLoginHint => 'Masuk untuk berkomentar';
|
||||
|
||||
@override
|
||||
String get postComment => 'Kirim';
|
||||
|
||||
|
||||
@@ -443,6 +443,9 @@ class AppLocalizationsZh extends AppLocalizations {
|
||||
@override
|
||||
String get writeComment => '写评论';
|
||||
|
||||
@override
|
||||
String get commentLoginHint => '登录后参与评论';
|
||||
|
||||
@override
|
||||
String get postComment => '发布';
|
||||
|
||||
|
||||
@@ -176,6 +176,7 @@
|
||||
"share": "分享",
|
||||
"noComments": "还没有评论。",
|
||||
"writeComment": "写评论",
|
||||
"commentLoginHint": "登录后参与评论",
|
||||
"postComment": "发布",
|
||||
"loadMore": "加载更多",
|
||||
"commentsLoadFailed": "评论加载失败,请重试。",
|
||||
|
||||
@@ -10,6 +10,7 @@ import '../../../core/data/models/drama.dart';
|
||||
import '../../../core/data/repositories/comment_repository.dart';
|
||||
import '../../../core/data/repositories/interaction_repository.dart';
|
||||
import '../../../core/data/services/comment_controller.dart';
|
||||
import '../../../core/data/services/auth_controller.dart';
|
||||
import '../../../core/formatting/error_text.dart';
|
||||
import '../../../core/platform/haptics.dart';
|
||||
import '../../../core/theme/app_colors.dart';
|
||||
@@ -64,8 +65,8 @@ class _DramaCommentsSheetState extends State<DramaCommentsSheet> {
|
||||
|
||||
Future<void> _post() async {
|
||||
if (_controller.submitting) return;
|
||||
if (_input.text.trim().isEmpty) return;
|
||||
if (!await ensureSignedIn(context) || !mounted) return;
|
||||
if (_input.text.trim().isEmpty) return;
|
||||
unawaited(context.read<Haptics>().lightImpact());
|
||||
final result = await _controller.publish(_input.text, replyTo: _replyTo);
|
||||
if (!mounted) return;
|
||||
@@ -90,6 +91,13 @@ class _DramaCommentsSheetState extends State<DramaCommentsSheet> {
|
||||
setState(() => _replyTo = null);
|
||||
}
|
||||
|
||||
Future<void> _authenticateForComment() async {
|
||||
_inputFocus.unfocus();
|
||||
await ensureSignedIn(context);
|
||||
if (!mounted || !context.read<AuthController>().isSignedIn) return;
|
||||
_inputFocus.requestFocus();
|
||||
}
|
||||
|
||||
Future<void> _like(DramaComment comment) async {
|
||||
if (!await ensureSignedIn(context) || !mounted) return;
|
||||
unawaited(context.read<Haptics>().lightImpact());
|
||||
@@ -351,44 +359,52 @@ class _DramaCommentsSheetState extends State<DramaCommentsSheet> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _composer(AppLocalizations l10n) => Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: _composerHeight,
|
||||
child: TextField(
|
||||
key: const Key('comment-input'),
|
||||
controller: _input,
|
||||
focusNode: _inputFocus,
|
||||
maxLength: _maxCommentLength,
|
||||
maxLines: 1,
|
||||
textAlignVertical: TextAlignVertical.center,
|
||||
style: const TextStyle(color: AppColors.cream, fontSize: 14),
|
||||
cursorColor: AppColors.blue,
|
||||
decoration: _composerDecoration(l10n.writeComment),
|
||||
onSubmitted: (_) => _post(),
|
||||
Widget _composer(AppLocalizations l10n) {
|
||||
final signedIn = context.watch<AuthController>().isSignedIn;
|
||||
return Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: _composerHeight,
|
||||
child: TextField(
|
||||
key: const Key('comment-input'),
|
||||
controller: _input,
|
||||
focusNode: _inputFocus,
|
||||
readOnly: !signedIn,
|
||||
canRequestFocus: signedIn,
|
||||
maxLength: _maxCommentLength,
|
||||
maxLines: 1,
|
||||
textAlignVertical: TextAlignVertical.center,
|
||||
style: const TextStyle(color: AppColors.cream, fontSize: 14),
|
||||
cursorColor: AppColors.blue,
|
||||
decoration: _composerDecoration(
|
||||
signedIn ? l10n.writeComment : l10n.commentLoginHint,
|
||||
),
|
||||
onTap: signedIn ? null : _authenticateForComment,
|
||||
onSubmitted: (_) => _post(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
SizedBox.square(
|
||||
dimension: _sendButtonSize,
|
||||
child: IconButton.filled(
|
||||
key: const Key('comment-post'),
|
||||
tooltip: l10n.postComment,
|
||||
padding: EdgeInsets.zero,
|
||||
iconSize: 18,
|
||||
onPressed: _controller.submitting ? null : _post,
|
||||
icon: _controller.submitting
|
||||
? const SizedBox.square(
|
||||
dimension: 16,
|
||||
child: CircularProgressIndicator(strokeWidth: 2),
|
||||
)
|
||||
: const Icon(Icons.send_rounded),
|
||||
const SizedBox(width: 8),
|
||||
SizedBox.square(
|
||||
dimension: _sendButtonSize,
|
||||
child: IconButton.filled(
|
||||
key: const Key('comment-post'),
|
||||
tooltip: l10n.postComment,
|
||||
padding: EdgeInsets.zero,
|
||||
iconSize: 18,
|
||||
onPressed: _controller.submitting ? null : _post,
|
||||
icon: _controller.submitting
|
||||
? const SizedBox.square(
|
||||
dimension: 16,
|
||||
child: CircularProgressIndicator(strokeWidth: 2),
|
||||
)
|
||||
: const Icon(Icons.send_rounded),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _CommentThread extends StatelessWidget {
|
||||
|
||||
Reference in new issue
Block a user