some changes

This commit is contained in:
MohammadTaha Basiri 2023-10-11 04:24:10 +03:30
parent b5ee5887c6
commit 058ffbef0d
12 changed files with 227 additions and 221 deletions

View File

@ -15,6 +15,7 @@ class OverviewData {
final bool forManagers; final bool forManagers;
final String createdAt; final String createdAt;
final String type; final String type;
int typeInteger;
int comments; int comments;
bool marked; bool marked;
final List<CategoryData>? categories; final List<CategoryData>? categories;
@ -35,17 +36,41 @@ class OverviewData {
this.timeToRead, this.timeToRead,
this.reference, this.reference,
this.categories, this.categories,
}); this.typeInteger = 0,
}) {
switch (type) {
case 'radar':
typeInteger = 1;
break;
case 'news':
typeInteger = 2;
break;
case 'video':
typeInteger = 3;
break;
case 'podcast':
typeInteger = 4;
break;
case 'saha':
typeInteger = 6;
break;
default:
typeInteger = 5;
}
typeInteger = 2;
}
factory OverviewData.fromJson(Map<String, dynamic> json) { factory OverviewData.fromJson(Map<String, dynamic> json) {
final document = parse(json['description']); String? description;
final String parsedString = if (json['description'] != null) {
parse(document.body!.text).documentElement!.text; final document = parse(json['description']);
description = parse(document.body!.text).documentElement!.text;
}
return OverviewData( return OverviewData(
id: json['id'], id: json['id'],
title: json['title'], title: json['title'],
image: json['image'], image: json['image'] ?? 'https://wallpapercave.com/fwp/wp12977378.jpg',
description: parsedString, description: description ?? '',
timeToRead: json['timeToRead'], timeToRead: json['timeToRead'],
reference: json['reference'], reference: json['reference'],
forManagers: json['forManagers'] ?? false, forManagers: json['forManagers'] ?? false,

View File

@ -25,9 +25,9 @@ class UserProvider extends CoreProvier {
int get unreadMessageCount => _unreadMessageCount; int get unreadMessageCount => _unreadMessageCount;
static final List<MapEntry> _radarMarkQueue = []; // static final List<MapEntry> _radarMarkQueue = [];
static final List<MapEntry> _newsMarkQueue = []; // static final List<MapEntry> _newsMarkQueue = [];
static final List<MapEntry> _studioMarkQueue = []; // static final List<MapEntry> _studioMarkQueue = [];
static final List<MapEntry> _statisticMarkQueue = []; static final List<MapEntry> _statisticMarkQueue = [];
static final List<Map> _itemMarkQueue = []; static final List<Map> _itemMarkQueue = [];
@ -188,53 +188,53 @@ class UserProvider extends CoreProvier {
}); });
} }
static Future<void> changeRadarMark(int id, bool value) async { // static Future<void> changeRadarMark(int id, bool value) async {
_radarMarkQueue.add(MapEntry(id, value)); // _radarMarkQueue.add(MapEntry(id, value));
Future.delayed(const Duration(milliseconds: 500), () async { // Future.delayed(const Duration(milliseconds: 500), () async {
final MapEntry? lastChange = // final MapEntry? lastChange =
_radarMarkQueue.lastWhereOrNull((item) => item.key == id); // _radarMarkQueue.lastWhereOrNull((item) => item.key == id);
if (lastChange == null) return; // if (lastChange == null) return;
final service = RequestService(RequestHelper.mark(id, 'radar')); // final service = RequestService(RequestHelper.mark(id, 'radar'));
if (lastChange.value) { // if (lastChange.value) {
await service.post(); // await service.post();
} else { // } else {
await service.delete(); // await service.delete();
} // }
_radarMarkQueue.removeWhere((element) => element.key == id); // _radarMarkQueue.removeWhere((element) => element.key == id);
}); // });
} // }
static Future<void> changeStudioMark(int id, bool value) async { // static Future<void> changeStudioMark(int id, bool value) async {
_studioMarkQueue.add(MapEntry(id, value)); // _studioMarkQueue.add(MapEntry(id, value));
Future.delayed(const Duration(milliseconds: 500), () async { // Future.delayed(const Duration(milliseconds: 500), () async {
final MapEntry? lastChange = // final MapEntry? lastChange =
_studioMarkQueue.lastWhereOrNull((item) => item.key == id); // _studioMarkQueue.lastWhereOrNull((item) => item.key == id);
if (lastChange == null) return; // if (lastChange == null) return;
final service = RequestService(RequestHelper.mark(id, 'studio')); // final service = RequestService(RequestHelper.mark(id, 'studio'));
if (lastChange.value) { // if (lastChange.value) {
await service.post(); // await service.post();
} else { // } else {
await service.delete(); // await service.delete();
} // }
_studioMarkQueue.removeWhere((element) => element.key == id); // _studioMarkQueue.removeWhere((element) => element.key == id);
}); // });
} // }
static Future<void> changeNewsMark(int id, bool value) async { // static Future<void> changeNewsMark(int id, bool value) async {
_newsMarkQueue.add(MapEntry(id, value)); // _newsMarkQueue.add(MapEntry(id, value));
Future.delayed(const Duration(milliseconds: 500), () async { // Future.delayed(const Duration(milliseconds: 500), () async {
final MapEntry? lastChange = // final MapEntry? lastChange =
_newsMarkQueue.lastWhereOrNull((item) => item.key == id); // _newsMarkQueue.lastWhereOrNull((item) => item.key == id);
if (lastChange == null) return; // if (lastChange == null) return;
final service = RequestService(RequestHelper.mark(id, 'news')); // final service = RequestService(RequestHelper.mark(id, 'news'));
if (lastChange.value) { // if (lastChange.value) {
await service.post(); // await service.post();
} else { // } else {
await service.delete(); // await service.delete();
} // }
_newsMarkQueue.removeWhere((element) => element.key == id); // _newsMarkQueue.removeWhere((element) => element.key == id);
}); // });
} // }
static Future<void> changeStatisticMark(int id, bool value) async { static Future<void> changeStatisticMark(int id, bool value) async {
_statisticMarkQueue.add(MapEntry(id, value)); _statisticMarkQueue.add(MapEntry(id, value));
@ -252,11 +252,11 @@ class UserProvider extends CoreProvier {
}); });
} }
Future<void> getUnreadMessageCount() async { // Future<void> getUnreadMessageCount() async {
final RequestService service = RequestService(RequestHelper.directs); // final RequestService service = RequestService(RequestHelper.directs);
await service.httpGet(); // await service.httpGet();
if (service.isSuccess) { // if (service.isSuccess) {
_unreadMessageCount = service.result['unread'] ?? 0; // _unreadMessageCount = service.result['unread'] ?? 0;
} // }
} // }
} }

View File

@ -51,17 +51,6 @@ class RequestHelper {
static const String otp = '$_baseUserUrl/otp'; static const String otp = '$_baseUserUrl/otp';
static String editItemBookmark(String type, int id) => static String editItemBookmark(String type, int id) =>
'$_baseHomeUrl/$type/$id/mark'; '$_baseHomeUrl/$type/$id/mark';
static String bookmarks({
required int page,
String? search,
String? type,
String? studioType,
}) =>
'$_baseUserUrl/marked/${type ?? ''}${_urlConcatGenerator([
MapEntry('page', page),
MapEntry('type', studioType),
MapEntry('search', search),
])}';
static const String directTypes = '$baseUrl/direct/types'; static const String directTypes = '$baseUrl/direct/types';
static String direct(int id) => '$_baseDirectUrl/$id'; static String direct(int id) => '$_baseDirectUrl/$id';

View File

@ -22,10 +22,10 @@ class BookmarksState extends CoreProvier {
} }
this.page = page; this.page = page;
appState = AppState.busy; appState = AppState.busy;
final service = final service = RequestService(
RequestService(RequestHelper.bookmarks(page: page, search: search)); RequestHelper.searchMarks(page: page, search: search),
);
await service.httpGet(); await service.httpGet();
if (service.isSuccess) { if (service.isSuccess) {
lastPage = service.result['lastPage']; lastPage = service.result['lastPage'];
final marks = service.result['contents']; final marks = service.result['contents'];

View File

@ -10,7 +10,6 @@ import 'package:didvan/views/widgets/overview/multitype.dart';
import 'package:didvan/views/widgets/animated_visibility.dart'; import 'package:didvan/views/widgets/animated_visibility.dart';
import 'package:didvan/views/widgets/didvan/card.dart'; import 'package:didvan/views/widgets/didvan/card.dart';
import 'package:didvan/views/widgets/didvan/divider.dart'; import 'package:didvan/views/widgets/didvan/divider.dart';
import 'package:didvan/views/widgets/didvan/scaffold.dart';
import 'package:didvan/views/widgets/item_title.dart'; import 'package:didvan/views/widgets/item_title.dart';
import 'package:didvan/views/widgets/state_handlers/empty_list.dart'; import 'package:didvan/views/widgets/state_handlers/empty_list.dart';
import 'package:didvan/views/widgets/state_handlers/empty_result.dart'; import 'package:didvan/views/widgets/state_handlers/empty_result.dart';
@ -40,111 +39,118 @@ class _BookmarksState extends State<Bookmarks> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final state = context.watch<BookmarksState>(); final state = context.watch<BookmarksState>();
return DidvanScaffold( return CustomScrollView(
appBarData: null,
// appBarData: AppBarData(
// title: 'نشان شده‌ها',
// hasBack: true,
// ),
slivers: [ slivers: [
SliverStateHandler<BookmarksState>( SliverPadding(
state: state, padding: const EdgeInsets.symmetric(horizontal: 16),
centerEmptyState: state.searching, sliver: SliverToBoxAdapter(
builder: (context, state, index) {
index++;
if (index % 15 == 0 && state.lastPage != state.page) {
state.getBookmarks(page: state.page + 1);
}
index--;
return MultitypeOverview(
item: state.bookmarks[index],
onMarkChanged: state.onMarkChanged,
hasUnmarkConfirmation: true,
enableCaption: true,
);
},
placeholder: MultitypeOverview.placeholder,
itemPadding: const EdgeInsets.only(bottom: 8),
emptyState: state.searching
? EmptyResult(onNewSearch: _focuseNode.requestFocus)
: const EmptyList(),
enableEmptyState: state.bookmarks.isEmpty,
childCount:
state.bookmarks.length + (state.page != state.lastPage ? 1 : 0),
onRetry: () => state.getBookmarks(page: state.page),
),
],
children: [
// SearchField(
// title: 'نشان شده‌ها',
// onChanged: _onChanged,
// focusNode: _focuseNode,
// ),
const SizedBox(height: 16),
AnimatedVisibility(
duration: DesignConfig.lowAnimationDuration,
isVisible: !state.searching,
child: DidvanCard(
child: Column( child: Column(
children: [ children: [
MenuOption( const SizedBox(height: 16),
onTap: () => _onCategorySelected('radar'), AnimatedVisibility(
title: 'تحلیل‌های رادار', duration: DesignConfig.lowAnimationDuration,
icon: DidvanIcons.radar_solid, isVisible: !state.searching,
iconSize: 24, child: DidvanCard(
child: Column(
children: [
MenuOption(
onTap: () => _onCategorySelected(5),
title: 'تحلیل‌های رادار',
icon: DidvanIcons.radar_solid,
iconSize: 24,
),
const DidvanDivider(),
MenuOption(
onTap: () => _onCategorySelected(2),
title: 'دنیای فولاد',
icon: DidvanIcons.news_solid,
iconSize: 24,
),
const DidvanDivider(),
MenuOption(
onTap: () => _onCategorySelected(1),
title: 'پویش افق',
icon: DidvanIcons.radar_solid,
iconSize: 24,
),
const DidvanDivider(),
MenuOption(
onTap: () => _onCategorySelected(3),
title: 'ویدئو‌کست',
icon: DidvanIcons.video_solid,
iconSize: 24,
),
const DidvanDivider(),
MenuOption(
onTap: () => _onCategorySelected(4),
title: 'پادکست‌ها',
icon: DidvanIcons.podcast_solid,
iconSize: 24,
),
const DidvanDivider(),
MenuOption(
onTap: () => _onCategorySelected(6),
title: 'سها',
icon: DidvanIcons.podcast_solid,
iconSize: 24,
),
],
),
),
), ),
const DidvanDivider(), Align(
MenuOption( alignment: Alignment.centerRight,
onTap: () => _onCategorySelected('news'), child: AnimatedVisibility(
title: 'دنیای فولاد', duration: DesignConfig.lowAnimationDuration,
icon: DidvanIcons.news_solid, isVisible: !state.searching,
iconSize: 24, child: const ItemTitle(title: 'آخرین نشان شده‌ها'),
), ),
const DidvanDivider(),
MenuOption(
onTap: () => _onCategorySelected('radar'),
title: 'پویش افق',
icon: DidvanIcons.radar_solid,
iconSize: 24,
),
const DidvanDivider(),
MenuOption(
onTap: () => _onCategorySelected('video'),
title: 'ویدئو‌کست',
icon: DidvanIcons.video_solid,
iconSize: 24,
),
const DidvanDivider(),
MenuOption(
onTap: () => _onCategorySelected('podcast'),
title: 'پادکست‌ها',
icon: DidvanIcons.podcast_solid,
iconSize: 24,
), ),
], ],
), ),
), ),
), ),
Align( SliverPadding(
alignment: Alignment.centerRight, padding: const EdgeInsets.symmetric(horizontal: 16),
child: AnimatedVisibility( sliver: SliverStateHandler<BookmarksState>(
duration: DesignConfig.lowAnimationDuration, state: state,
isVisible: !state.searching, centerEmptyState: state.searching,
child: const ItemTitle(title: 'آخرین نشان شده‌ها'), builder: (context, state, index) {
index++;
if (index % 15 == 0 && state.lastPage != state.page) {
state.getBookmarks(page: state.page + 1);
}
index--;
return MultitypeOverview(
item: state.bookmarks[index],
onMarkChanged: state.onMarkChanged,
hasUnmarkConfirmation: true,
enableCaption: true,
);
},
placeholder: MultitypeOverview.placeholder,
itemPadding: const EdgeInsets.only(bottom: 8),
emptyState: state.searching
? EmptyResult(onNewSearch: _focuseNode.requestFocus)
: const EmptyList(),
enableEmptyState: state.bookmarks.isEmpty,
childCount:
state.bookmarks.length + (state.page != state.lastPage ? 1 : 0),
onRetry: () => state.getBookmarks(page: state.page),
), ),
), ),
], ],
); );
} }
void _onCategorySelected(String type) { void _onCategorySelected(int type) {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
Navigator.of(context).pushNamed(Routes.filteredBookmarks, arguments: { Navigator.of(context).pushNamed(Routes.filteredBookmarks, arguments: {
'type': type, 'type': type,
'onDeleted': (int id) { 'onDeleted': (int id) {
final state = context.read<BookmarksState>(); final state = context.read<BookmarksState>();
state.bookmarks state.bookmarks.removeWhere(
.removeWhere((element) => element.id == id && element.type == type); (element) => element.id == id && element.typeInteger == type);
state.update(); state.update();
}, },
}); });

View File

@ -28,18 +28,20 @@ class _FilteredBookmarksState extends State<FilteredBookmarks> {
String get _appBarTitle { String get _appBarTitle {
switch (context.read<FilteredBookmarksState>().type) { switch (context.read<FilteredBookmarksState>().type) {
case 'radar': case 1:
return 'پویش افق'; return 'پویش افق';
case 'news': case 2:
return 'دنیای فولاد'; return 'دنیای فولاد';
case 'video': case 3:
return 'ویدئوکست‌ها'; return 'ویدئوکست‌ها';
case 'podcast': case 4:
return 'پادکست‌ها'; return 'پادکست‌ها';
case 'new-radar': case 5:
return 'تحلیل‌های رادار'; return 'تحلیل‌های رادار';
case 6:
return 'سها';
default: default:
return 'پادکست‌ها'; return 'پویش';
} }
} }

View File

@ -6,7 +6,7 @@ import 'package:didvan/services/network/request_helper.dart';
class FilteredBookmarksState extends CoreProvier { class FilteredBookmarksState extends CoreProvier {
final List<OverviewData> bookmarks = []; final List<OverviewData> bookmarks = [];
final String type; final int type;
int page = 1; int page = 1;
int lastPage = 1; int lastPage = 1;
@ -14,26 +14,17 @@ class FilteredBookmarksState extends CoreProvier {
Future<void> getBookmarks({required int page}) async { Future<void> getBookmarks({required int page}) async {
this.page = page; this.page = page;
String typeString = '';
if (type == 'video' || type == 'podcast') {
typeString = 'studios';
} else if (type == 'news') {
typeString = type;
} else {
typeString = '${type}s';
}
final service = RequestService( final service = RequestService(
RequestHelper.bookmarks( RequestHelper.searchMarks(
type: typeString, types: [type],
page: page, page: page,
studioType: type == 'podcast' || type == 'video' ? type : null,
), ),
); );
await service.httpGet(); await service.httpGet();
if (service.isSuccess) { if (service.isSuccess) {
lastPage = service.result['lastPage']; lastPage = service.result['lastPage'];
final marks = service.result[typeString]; final marks = service.result['contents'];
for (var i = 0; i < marks.length; i++) { for (var i = 0; i < marks.length; i++) {
bookmarks.add(OverviewData.fromJson(marks[i])); bookmarks.add(OverviewData.fromJson(marks[i]));
} }

View File

@ -35,6 +35,7 @@ class HomeState extends CoreProvier {
final List<CategoryData> selectedCats = []; final List<CategoryData> selectedCats = [];
final List<OverviewData> results = []; final List<OverviewData> results = [];
late TabController tabController; late TabController tabController;
int unreadCount = 0;
void resetFilters(bool isInit) { void resetFilters(bool isInit) {
startDate = null; startDate = null;
@ -122,6 +123,7 @@ class HomeState extends CoreProvier {
await service.httpGet(); await service.httpGet();
if (service.isSuccess) { if (service.isSuccess) {
lastPage = service.result['lastPage']; lastPage = service.result['lastPage'];
unreadCount = service.result['unread'];
results.addAll( results.addAll(
List<OverviewData>.from( List<OverviewData>.from(
service.result['contents'].map( service.result['contents'].map(

View File

@ -128,7 +128,6 @@ class _SplashState extends State<Splash> {
} }
RequestService.token = token; RequestService.token = token;
final result = await userProvider.getUserInfo(); final result = await userProvider.getUserInfo();
await userProvider.getUnreadMessageCount();
if (!result && mounted) { if (!result && mounted) {
StorageService.delete(key: 'token'); StorageService.delete(key: 'token');
Navigator.of(context).pushNamedAndRemoveUntil( Navigator.of(context).pushNamedAndRemoveUntil(

View File

@ -74,21 +74,7 @@ class _BookmarkButtonState extends State<BookmarkButton> {
_value = !_value; _value = !_value;
}); });
widget.onMarkChanged(_value); widget.onMarkChanged(_value);
switch (widget.type) { UserProvider.changeItemMark(widget.type, widget.itemId, _value);
case 'radar':
UserProvider.changeRadarMark(widget.itemId, _value);
break;
case 'news':
UserProvider.changeNewsMark(widget.itemId, _value);
break;
case 'podcast':
UserProvider.changeStudioMark(widget.itemId, _value);
break;
case 'video':
UserProvider.changeStudioMark(widget.itemId, _value);
break;
default:
}
} }
}, },
); );

View File

@ -368,7 +368,6 @@ class _NavBarItem extends StatelessWidget {
final String title; final String title;
final IconData selectedIcon; final IconData selectedIcon;
final IconData unselectedIcon; final IconData unselectedIcon;
final bool hasBadge;
const _NavBarItem({ const _NavBarItem({
Key? key, Key? key,
required this.isSelected, required this.isSelected,
@ -376,7 +375,6 @@ class _NavBarItem extends StatelessWidget {
required this.selectedIcon, required this.selectedIcon,
required this.unselectedIcon, required this.unselectedIcon,
required this.onTap, required this.onTap,
this.hasBadge = false,
}) : super(key: key); }) : super(key: key);
@override @override
@ -407,25 +405,12 @@ class _NavBarItem extends StatelessWidget {
? Theme.of(context).colorScheme.focused ? Theme.of(context).colorScheme.focused
: Theme.of(context).colorScheme.surface, : Theme.of(context).colorScheme.surface,
), ),
child: Stack( child: Icon(
children: [ isSelected ? selectedIcon : unselectedIcon,
Icon( size: 32,
isSelected ? selectedIcon : unselectedIcon, color: DesignConfig.isDark
size: 32, ? Theme.of(context).colorScheme.text
color: DesignConfig.isDark : Theme.of(context).colorScheme.title,
? Theme.of(context).colorScheme.text
: Theme.of(context).colorScheme.title,
),
if (hasBadge)
Container(
height: 12,
width: 12,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Theme.of(context).colorScheme.secondary,
),
),
],
), ),
), ),
DidvanText( DidvanText(

View File

@ -26,6 +26,7 @@ class LogoAppBar extends StatelessWidget implements PreferredSizeWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final state = context.read<HomeState>();
final MediaQueryData d = MediaQuery.of(context); final MediaQueryData d = MediaQuery.of(context);
return Container( return Container(
height: 144, height: 144,
@ -63,10 +64,30 @@ class LogoAppBar extends StatelessWidget implements PreferredSizeWidget {
width: 1, width: 1,
color: Theme.of(context).colorScheme.border, color: Theme.of(context).colorScheme.border,
), ),
DidvanIconButton( Stack(
icon: DidvanIcons.notification_light, children: [
size: 32, DidvanIconButton(
onPressed: () => {}, icon: state.unreadCount == 0
? DidvanIcons.message_light
: DidvanIcons.message_solid,
size: 32,
onPressed: () =>
Navigator.of(context).pushNamed(Routes.direct),
),
if (state.unreadCount != 0)
Positioned(
top: 8,
right: 4,
child: Container(
height: 12,
width: 12,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Theme.of(context).colorScheme.secondary,
),
),
),
],
), ),
], ],
), ),