You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
9.8 KiB
241 lines
9.8 KiB
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:flutter_svg/flutter_svg.dart';
|
|
import 'package:sonnat/core/extensions/context_extension.dart';
|
|
import 'package:sonnat/core/extensions/string_extension.dart';
|
|
import 'package:sonnat/core/html/html_viewer.dart';
|
|
import 'package:sonnat/core/utils/app_constants.dart';
|
|
import 'package:sonnat/core/utils/base_cubit_type.dart';
|
|
import 'package:sonnat/features/single_post/cubit/single_post_cubit.dart';
|
|
import 'package:sonnat/features/single_post/widget/add_comment_widget.dart';
|
|
import 'package:sonnat/features/single_post/widget/author_comment_widget.dart';
|
|
import 'package:sonnat/features/single_post/widget/post_comment_widget.dart';
|
|
|
|
class SinglePostScreen extends StatefulWidget {
|
|
final int postId;
|
|
|
|
const SinglePostScreen({super.key, required this.postId});
|
|
|
|
@override
|
|
State<SinglePostScreen> createState() => _SinglePostScreenState();
|
|
}
|
|
|
|
class _SinglePostScreenState extends State<SinglePostScreen> {
|
|
late final SinglePostCubit _cubit;
|
|
final TextEditingController _fullNameController = TextEditingController();
|
|
bool _loading = true;
|
|
|
|
@override
|
|
void initState() {
|
|
_cubit = BlocProvider.of<SinglePostCubit>(context);
|
|
_cubit.getSinglePostData(postId: widget.postId);
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
body: SafeArea(
|
|
child: BlocBuilder<SinglePostCubit, BaseCubitType<SinglePostState>>(
|
|
builder: (context, state) {
|
|
switch (state.eventName!) {
|
|
case SinglePostState.empty:
|
|
break;
|
|
case SinglePostState.data:
|
|
_loading = false;
|
|
_fullNameController.text = '';
|
|
_cubit.empty();
|
|
break;
|
|
case SinglePostState.loading:
|
|
_loading = true;
|
|
break;
|
|
case SinglePostState.error:
|
|
_loading = false;
|
|
break;
|
|
}
|
|
if (_loading) {
|
|
return const Center(child: CircularProgressIndicator());
|
|
}
|
|
if (_cubit.model == null) {
|
|
return const Center(child: Text('خطا در دریافت اطلاعات'));
|
|
}
|
|
String? thumbnail = _cubit.model!.thumbnail;
|
|
return SingleChildScrollView(
|
|
child: Column(
|
|
children: [
|
|
SizedBox(
|
|
height: 304,
|
|
child: Stack(
|
|
fit: StackFit.expand,
|
|
children: [
|
|
thumbnail == null
|
|
? Center(
|
|
child: Icon(
|
|
Icons.image_search,
|
|
color: Colors.grey.withOpacity(0.5),
|
|
size: 150,
|
|
),
|
|
)
|
|
: Image.network(
|
|
thumbnail,
|
|
fit: BoxFit.cover,
|
|
errorBuilder: (context, error, stackTrace) {
|
|
return Center(
|
|
child: Icon(
|
|
Icons.image_search,
|
|
color: Colors.grey.withOpacity(0.5),
|
|
size: 150,
|
|
),
|
|
);
|
|
},
|
|
),
|
|
PositionedDirectional(
|
|
end: 16,
|
|
top: 16,
|
|
child: GestureDetector(
|
|
onTap: () {
|
|
Navigator.pop(context);
|
|
},
|
|
child: const Icon(
|
|
Icons.arrow_forward_rounded,
|
|
color: Colors.white,
|
|
),
|
|
),
|
|
),
|
|
Positioned(
|
|
bottom: 0,
|
|
left: 0,
|
|
right: 0,
|
|
child: Container(
|
|
height: 150,
|
|
width: 1,
|
|
decoration: BoxDecoration(
|
|
gradient: LinearGradient(
|
|
begin: Alignment.bottomCenter,
|
|
end: Alignment.topCenter,
|
|
colors: [
|
|
Colors.black.withOpacity(0.7),
|
|
Colors.black.withOpacity(0),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: EdgeInsetsDirectional.only(
|
|
start: context.width * 26 / AppConstants.instance.appWidth,
|
|
end: context.width * 37 / AppConstants.instance.appWidth,
|
|
bottom: 18,
|
|
),
|
|
child: Align(
|
|
alignment: Alignment.bottomCenter,
|
|
child: Row(
|
|
children: [
|
|
Padding(
|
|
padding: const EdgeInsets.all(8),
|
|
child: SvgPicture.asset('ic_share'.svgPath),
|
|
),
|
|
const Spacer(),
|
|
Text(
|
|
_cubit.model!.commentCount.toString(),
|
|
style: const TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 17,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8),
|
|
child: SvgPicture.asset('ic_comment'.svgPath),
|
|
),
|
|
const SizedBox(width: 21),
|
|
Text(
|
|
_cubit.model!.viewCount.toString(),
|
|
style: const TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 17,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8),
|
|
child: SvgPicture.asset('ic_view'.svgPath),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
const Padding(
|
|
padding: EdgeInsets.all(8),
|
|
child: Align(
|
|
alignment: Alignment.bottomCenter,
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
children: [],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
Padding(
|
|
padding: EdgeInsetsDirectional.only(
|
|
start: context.width * 26 / AppConstants.instance.appWidth,
|
|
end: context.width * 37 / AppConstants.instance.appWidth,
|
|
top: 16,
|
|
),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
_cubit.model!.title,
|
|
style: const TextStyle(
|
|
fontWeight: FontWeight.bold,
|
|
fontSize: 16,
|
|
),
|
|
),
|
|
Text(
|
|
_cubit.model!.publishDate,
|
|
style: const TextStyle(fontSize: 11),
|
|
),
|
|
HTMLViewer(
|
|
htmlContent: _cubit.model!.content,
|
|
fontSizeFactor: 1,
|
|
),
|
|
const SizedBox(height: 30),
|
|
Container(
|
|
width: context.width,
|
|
height: 1,
|
|
color: const Color(0xffD3D8E9),
|
|
),
|
|
const SizedBox(height: 30),
|
|
AuthorCommentWidget(controller: _fullNameController),
|
|
const SizedBox(height: 30),
|
|
AddCommentWidget(sendComment: _sendComment),
|
|
if (_cubit.commentList.isEmpty) const SizedBox(height: 30),
|
|
const SizedBox(height: 8),
|
|
ListView.builder(
|
|
shrinkWrap: true,
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
itemBuilder: (context, index) {
|
|
return PostCommentWidget(comment: _cubit.commentList[index]);
|
|
},
|
|
itemCount: _cubit.commentList.length,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
void _sendComment(String comment) {
|
|
if (_fullNameController.text.trim().isEmpty) {
|
|
return;
|
|
}
|
|
_cubit.addComment(comment, _fullNameController.text.trim());
|
|
}
|
|
}
|