D1APP-68 related contents

This commit is contained in:
MohammadTaha Basiri 2022-02-05 17:57:05 +03:30
parent 04184c3b5a
commit 32f61f01db
9 changed files with 104 additions and 2 deletions

View File

@ -1,4 +1,5 @@
import 'package:didvan/models/content.dart'; import 'package:didvan/models/content.dart';
import 'package:didvan/models/item_overview.dart';
import 'package:didvan/models/tag.dart'; import 'package:didvan/models/tag.dart';
class NewsDetailsData { class NewsDetailsData {
@ -12,6 +13,7 @@ class NewsDetailsData {
final int order; final int order;
final List<Tag> tags; final List<Tag> tags;
final List<Content> contents; final List<Content> contents;
final List<OverviewData> relatedContents = [];
NewsDetailsData({ NewsDetailsData({
required this.id, required this.id,

View File

@ -1,4 +1,5 @@
import 'package:didvan/models/category.dart'; import 'package:didvan/models/category.dart';
import 'package:didvan/models/item_overview.dart';
import 'content.dart'; import 'content.dart';
import 'tag.dart'; import 'tag.dart';
@ -17,6 +18,7 @@ class RadarDetailsData {
final List<Content> contents; final List<Content> contents;
final List<Category> categories; final List<Category> categories;
final int order; final int order;
final List<OverviewData> relatedContents = [];
RadarDetailsData({ RadarDetailsData({
required this.id, required this.id,

View File

@ -20,6 +20,13 @@ class _NewsDetailsState extends State<NewsDetails> {
@override @override
void initState() { void initState() {
final state = context.read<NewsDetailsState>(); final state = context.read<NewsDetailsState>();
_scrollController.addListener(() {
if (_scrollController.position.pixels >
_scrollController.position.maxScrollExtent - 200 &&
!state.relatedQueue.contains(state.currentNews.id)) {
state.getRelatedContents();
}
});
state.args = widget.pageData['args'] ?? const NewsRequestArgs(page: 0); state.args = widget.pageData['args'] ?? const NewsRequestArgs(page: 0);
Future.delayed(Duration.zero, () { Future.delayed(Duration.zero, () {
state.getNewsDetails(widget.pageData['id']); state.getNewsDetails(widget.pageData['id']);

View File

@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:math'; import 'dart:math';
import 'package:didvan/models/enums.dart'; import 'package:didvan/models/enums.dart';
import 'package:didvan/models/item_overview.dart';
import 'package:didvan/models/news_details_data.dart'; import 'package:didvan/models/news_details_data.dart';
import 'package:didvan/models/requests/news.dart'; import 'package:didvan/models/requests/news.dart';
import 'package:didvan/providers/core_provider.dart'; import 'package:didvan/providers/core_provider.dart';
@ -14,6 +15,7 @@ class NewsDetailsState extends CoreProvier {
late final NewsRequestArgs args; late final NewsRequestArgs args;
late Timer _trackingTimer; late Timer _trackingTimer;
int _trackingTimerCounter = 0; int _trackingTimerCounter = 0;
final List<int> relatedQueue = [];
int _currentIndex = 0; int _currentIndex = 0;
int get currentIndex => _currentIndex; int get currentIndex => _currentIndex;
@ -92,6 +94,25 @@ class NewsDetailsState extends CoreProvier {
_trackingTimerCounter = 0; _trackingTimerCounter = 0;
} }
Future<void> getRelatedContents() async {
if (currentNews.relatedContents.isNotEmpty) return;
relatedQueue.add(currentNews.id);
final service = RequestService(
RequestHelper.tag(currentNews.tags.map((tag) => tag.id).toList()));
await service.httpGet();
if (service.isSuccess) {
final relateds = service.result['contents'];
for (var i = 0; i < relateds.length; i++) {
news
.where((element) => element != null)
.firstWhere((element) => element!.id == currentNews.id)!
.relatedContents
.add(OverviewData.fromJson(relateds[i]));
}
notifyListeners();
}
}
@override @override
void dispose() { void dispose() {
_trackingTimer.cancel(); _trackingTimer.cancel();

View File

@ -20,6 +20,13 @@ class _RadarDetailsState extends State<RadarDetails> {
@override @override
void initState() { void initState() {
final state = context.read<RadarDetailsState>(); final state = context.read<RadarDetailsState>();
_scrollController.addListener(() {
if (_scrollController.position.pixels >
_scrollController.position.maxScrollExtent - 200 &&
!state.relatedQueue.contains(state.currentRadar.id)) {
state.getRelatedContents();
}
});
state.args = widget.pageData['args'] ?? const RadarRequestArgs(page: 0); state.args = widget.pageData['args'] ?? const RadarRequestArgs(page: 0);
Future.delayed(Duration.zero, () { Future.delayed(Duration.zero, () {
state.getRadarDetails(widget.pageData['id']); state.getRadarDetails(widget.pageData['id']);

View File

@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:math'; import 'dart:math';
import 'package:didvan/models/enums.dart'; import 'package:didvan/models/enums.dart';
import 'package:didvan/models/item_overview.dart';
import 'package:didvan/models/radar_details_data.dart'; import 'package:didvan/models/radar_details_data.dart';
import 'package:didvan/models/requests/radar.dart'; import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/providers/core_provider.dart'; import 'package:didvan/providers/core_provider.dart';
@ -14,6 +15,7 @@ class RadarDetailsState extends CoreProvier {
int _trackingTimerCounter = 0; int _trackingTimerCounter = 0;
late final int initialIndex; late final int initialIndex;
late final RadarRequestArgs args; late final RadarRequestArgs args;
final List<int> relatedQueue = [];
int _currentIndex = 0; int _currentIndex = 0;
int get currentIndex => _currentIndex; int get currentIndex => _currentIndex;
@ -83,6 +85,25 @@ class RadarDetailsState extends CoreProvier {
} }
} }
Future<void> getRelatedContents() async {
if (currentRadar.relatedContents.isNotEmpty) return;
relatedQueue.add(currentRadar.id);
final service = RequestService(
RequestHelper.tag(currentRadar.tags.map((tag) => tag.id).toList()));
await service.httpGet();
if (service.isSuccess) {
final relateds = service.result['contents'];
for (var i = 0; i < relateds.length; i++) {
radars
.where((element) => element != null)
.firstWhere((element) => element!.id == currentRadar.id)!
.relatedContents
.add(OverviewData.fromJson(relateds[i]));
}
notifyListeners();
}
}
bool exists(RadarDetailsData? radar) => bool exists(RadarDetailsData? radar) =>
radars.any((r) => radar != null && r != null && r.id == radar.id); radars.any((r) => radar != null && r != null && r.id == radar.id);

View File

@ -72,6 +72,8 @@ class MultitypeOverview extends StatelessWidget {
DidvanText( DidvanText(
item.title, item.title,
style: Theme.of(context).textTheme.bodyText1, style: Theme.of(context).textTheme.bodyText1,
maxLines: 2,
overflow: TextOverflow.ellipsis,
), ),
Row( Row(
children: [ children: [

View File

@ -19,6 +19,13 @@ class RequestHelper {
static const String directTypes = baseUrl + '/direct/types'; static const String directTypes = baseUrl + '/direct/types';
static String direct(int id) => _baseUserUrl + '/direct/$id'; static String direct(int id) => _baseUserUrl + '/direct/$id';
static String tag(List<int> ids) =>
baseUrl +
'/tag' +
_urlConcatGenerator([
const MapEntry('limit', '3'),
MapEntry('tags', _urlListConcatGenerator(ids))
]);
static String markRadar(int id) => _baseRadarUrl + '/$id/mark'; static String markRadar(int id) => _baseRadarUrl + '/$id/mark';
static String radarComments(int id) => _baseRadarUrl + '/$id/comments'; static String radarComments(int id) => _baseRadarUrl + '/$id/comments';

View File

@ -1,8 +1,10 @@
import 'package:carousel_slider/carousel_slider.dart'; import 'package:carousel_slider/carousel_slider.dart';
import 'package:didvan/pages/home/widgets/multitype_overview.dart';
import 'package:didvan/utils/date_time.dart'; import 'package:didvan/utils/date_time.dart';
import 'package:didvan/widgets/didvan/card.dart'; import 'package:didvan/widgets/didvan/card.dart';
import 'package:didvan/widgets/didvan/divider.dart'; import 'package:didvan/widgets/didvan/divider.dart';
import 'package:didvan/widgets/didvan/text.dart'; import 'package:didvan/widgets/didvan/text.dart';
import 'package:didvan/widgets/item_title.dart';
import 'package:didvan/widgets/skeleton_image.dart'; import 'package:didvan/widgets/skeleton_image.dart';
import 'package:didvan/pages/home/widgets/tag_item.dart'; import 'package:didvan/pages/home/widgets/tag_item.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -109,9 +111,40 @@ class _DidvanPageViewState extends State<DidvanPageView> {
), ),
), ),
const Padding( const Padding(
padding: EdgeInsets.symmetric(horizontal: 16), padding: EdgeInsets.only(
child: DidvanDivider(), left: 16,
right: 16,
top: 16,
),
child: DidvanDivider(verticalPadding: 0),
), ),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: ItemTitle(title: 'مطالب مشابه'),
),
if (item.relatedContents.isEmpty)
for (var i = 0; i < 3; i++)
Padding(
padding: const EdgeInsets.only(
bottom: 8,
left: 16,
right: 16,
),
child: MultitypeOverview.placeholder,
),
for (var i = 0; i < item.relatedContents.length; i++)
Padding(
padding: const EdgeInsets.only(
bottom: 8,
left: 16,
right: 16,
),
child: MultitypeOverview(
item: item.relatedContents[i],
onMarkChanged: (id, value) {},
),
),
const SizedBox(height: 8),
], ],
); );
}, },