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/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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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']);
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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']);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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: [
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue