D1APP-68 related contents
This commit is contained in:
parent
04184c3b5a
commit
32f61f01db
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:didvan/models/content.dart';
|
||||
import 'package:didvan/models/item_overview.dart';
|
||||
import 'package:didvan/models/tag.dart';
|
||||
|
||||
class NewsDetailsData {
|
||||
|
|
@ -12,6 +13,7 @@ class NewsDetailsData {
|
|||
final int order;
|
||||
final List<Tag> tags;
|
||||
final List<Content> contents;
|
||||
final List<OverviewData> relatedContents = [];
|
||||
|
||||
NewsDetailsData({
|
||||
required this.id,
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:didvan/models/category.dart';
|
||||
import 'package:didvan/models/item_overview.dart';
|
||||
|
||||
import 'content.dart';
|
||||
import 'tag.dart';
|
||||
|
|
@ -17,6 +18,7 @@ class RadarDetailsData {
|
|||
final List<Content> contents;
|
||||
final List<Category> categories;
|
||||
final int order;
|
||||
final List<OverviewData> relatedContents = [];
|
||||
|
||||
RadarDetailsData({
|
||||
required this.id,
|
||||
|
|
|
|||
|
|
@ -20,6 +20,13 @@ class _NewsDetailsState extends State<NewsDetails> {
|
|||
@override
|
||||
void initState() {
|
||||
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);
|
||||
Future.delayed(Duration.zero, () {
|
||||
state.getNewsDetails(widget.pageData['id']);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import 'dart:async';
|
|||
import 'dart:math';
|
||||
|
||||
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/requests/news.dart';
|
||||
import 'package:didvan/providers/core_provider.dart';
|
||||
|
|
@ -14,6 +15,7 @@ class NewsDetailsState extends CoreProvier {
|
|||
late final NewsRequestArgs args;
|
||||
late Timer _trackingTimer;
|
||||
int _trackingTimerCounter = 0;
|
||||
final List<int> relatedQueue = [];
|
||||
|
||||
int _currentIndex = 0;
|
||||
int get currentIndex => _currentIndex;
|
||||
|
|
@ -92,6 +94,25 @@ class NewsDetailsState extends CoreProvier {
|
|||
_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
|
||||
void dispose() {
|
||||
_trackingTimer.cancel();
|
||||
|
|
|
|||
|
|
@ -20,6 +20,13 @@ class _RadarDetailsState extends State<RadarDetails> {
|
|||
@override
|
||||
void initState() {
|
||||
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);
|
||||
Future.delayed(Duration.zero, () {
|
||||
state.getRadarDetails(widget.pageData['id']);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import 'dart:async';
|
|||
import 'dart:math';
|
||||
|
||||
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/requests/radar.dart';
|
||||
import 'package:didvan/providers/core_provider.dart';
|
||||
|
|
@ -14,6 +15,7 @@ class RadarDetailsState extends CoreProvier {
|
|||
int _trackingTimerCounter = 0;
|
||||
late final int initialIndex;
|
||||
late final RadarRequestArgs args;
|
||||
final List<int> relatedQueue = [];
|
||||
|
||||
int _currentIndex = 0;
|
||||
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) =>
|
||||
radars.any((r) => radar != null && r != null && r.id == radar.id);
|
||||
|
||||
|
|
|
|||
|
|
@ -72,6 +72,8 @@ class MultitypeOverview extends StatelessWidget {
|
|||
DidvanText(
|
||||
item.title,
|
||||
style: Theme.of(context).textTheme.bodyText1,
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
|
|
|
|||
|
|
@ -19,6 +19,13 @@ class RequestHelper {
|
|||
|
||||
static const String directTypes = baseUrl + '/direct/types';
|
||||
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 radarComments(int id) => _baseRadarUrl + '/$id/comments';
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
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/widgets/didvan/card.dart';
|
||||
import 'package:didvan/widgets/didvan/divider.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/pages/home/widgets/tag_item.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
|
@ -109,9 +111,40 @@ class _DidvanPageViewState extends State<DidvanPageView> {
|
|||
),
|
||||
),
|
||||
const Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 16),
|
||||
child: DidvanDivider(),
|
||||
padding: EdgeInsets.only(
|
||||
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),
|
||||
],
|
||||
);
|
||||
},
|
||||
|
|
|
|||
Loading…
Reference in New Issue