didvan-app/lib/views/mentions/widgets/mention.dart

135 lines
4.4 KiB
Dart

import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/mention/mention.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/providers/user.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/utils/date_time.dart';
import 'package:didvan/views/mentions/mentions_state.dart';
import 'package:didvan/views/widgets/menu_item.dart';
import 'package:didvan/views/widgets/didvan/icon_button.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/skeleton_image.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Mention extends StatefulWidget {
final FocusNode focusNode;
final MentionData comment;
const Mention({
Key? key,
required this.focusNode,
required this.comment,
}) : super(key: key);
@override
State<Mention> createState() => MentionState();
}
class MentionState extends State<Mention> {
late final MentionsState state;
MentionData get _comment => widget.comment;
@override
void initState() {
state = context.read<MentionsState>();
super.initState();
}
@override
Widget build(BuildContext context) {
return Column(
children: [_commentBuilder(comment: _comment)],
);
}
Widget _commentBuilder({required comment, bool isReply = false}) => Container(
decoration: BoxDecoration(
border: Border(
right: isReply
? BorderSide(color: Theme.of(context).colorScheme.caption)
: BorderSide.none,
),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (isReply) const SizedBox(width: 12),
if (comment.user.photo == null)
const Icon(DidvanIcons.avatar_light),
if (comment.user.photo != null)
SkeletonImage(
imageUrl: comment.user.photo,
height: 24,
width: 24,
borderRadius: DesignConfig.highBorderRadius,
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
DidvanText(
comment.user.fullName,
style: Theme.of(context).textTheme.bodyLarge,
),
const Spacer(),
DidvanText(
DateTimeUtils.momentGenerator(comment.createdAt),
style: Theme.of(context).textTheme.bodySmall,
color: Theme.of(context).colorScheme.caption,
),
const SizedBox(width: 4),
if (comment.user.id ==
context.read<UserProvider>().user.id)
DidvanIconButton(
size: 18,
gestureSize: 24,
icon: DidvanIcons.menu_light,
onPressed: () => _showCommentActions(comment),
),
],
),
DidvanText(
"اشاره به ${comment.mentions.join("، ").toString()}",
color: Theme.of(context).colorScheme.primary,
style: Theme.of(context).textTheme.titleSmall,
),
DidvanText(comment.text),
],
),
),
],
),
);
Future<void> _showCommentActions(comment) async {
ActionSheetUtils.showBottomSheet(
data: ActionSheetData(
title: 'گزینه‌های نظر',
content: Column(
children: [
if (comment.user.id == context.read<UserProvider>().user.id)
MenuOption(
title: 'حذف فراخوانی',
color: Theme.of(context).colorScheme.secondary,
onTap: () {
state.deleteMention(comment.id);
ActionSheetUtils.pop();
},
icon: DidvanIcons.trash_solid,
),
],
),
hasConfirmButton: false,
hasDismissButton: false,
),
);
}
}