D1APP-104 hashtags beta

This commit is contained in:
MohammadTaha Basiri 2022-03-02 13:52:49 +03:30
parent 911d992dee
commit 8fee5e2ca7
7 changed files with 100 additions and 27 deletions

View File

@ -1,9 +1,12 @@
import 'package:didvan/models/tag.dart';
import 'package:didvan/views/authentication/authentication.dart';
import 'package:didvan/views/authentication/authentication_state.dart';
import 'package:didvan/views/home/comments/comments.dart';
import 'package:didvan/views/home/comments/comments_state.dart';
import 'package:didvan/views/home/direct/direct.dart';
import 'package:didvan/views/home/direct/direct_state.dart';
import 'package:didvan/views/home/hashtag/hashtag.dart';
import 'package:didvan/views/home/hashtag/hashtag_state.dart';
import 'package:didvan/views/home/home.dart';
import 'package:didvan/views/home/home_state.dart';
import 'package:didvan/views/home/news/news_details/news_details.dart';
@ -121,6 +124,14 @@ class RouteGenerator {
child: const Bookmarks(),
),
);
case Routes.hashtag:
return _createRoute(
ChangeNotifierProvider<HashtagState>(
create: (context) => HashtagState(),
child: Hashtag(tag: settings.arguments as Tag),
),
);
case Routes.filteredBookmarks:
return _createRoute(
ChangeNotifierProvider<FilteredBookmarksState>(

View File

@ -14,4 +14,5 @@ class Routes {
static const String bookmarks = '/bookmarks';
static const String filteredBookmarks = '/filtered-bookmarks';
static const String imageCropper = '/image-cropper';
static const String hashtag = '/hashtag';
}

View File

@ -2,7 +2,7 @@ import 'package:didvan/models/requests/news.dart';
import 'package:didvan/models/requests/radar.dart';
class RequestHelper {
static const String baseUrl = 'https://test.api.didvan.app';
static const String baseUrl = 'https://api.didvan.app';
static const String _baseUserUrl = baseUrl + '/user';
static const String _baseRadarUrl = baseUrl + '/radar';
static const String _baseNewsUrl = baseUrl + '/news';

View File

@ -1,7 +1,12 @@
import 'package:didvan/models/tag.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/views/home/hashtag/hashtag_state.dart';
import 'package:didvan/views/home/widgets/news_overview.dart';
import 'package:didvan/views/home/widgets/radar_overview.dart';
import 'package:didvan/views/widgets/didvan/scaffold.dart';
import 'package:didvan/views/widgets/state_handlers/sliver_state_handler.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Hashtag extends StatefulWidget {
final Tag tag;
@ -12,10 +17,44 @@ class Hashtag extends StatefulWidget {
}
class _HashtagState extends State<Hashtag> {
@override
void initState() {
final state = context.read<HashtagState>();
state.id = widget.tag.id;
Future.delayed(Duration.zero, () => state.getTagItems(page: 1));
super.initState();
}
@override
Widget build(BuildContext context) {
return DidvanScaffold(
appBarData: AppBarData(title: widget.tag.label, hasBack: true),
slivers: [
Consumer<HashtagState>(
builder: (context, state, child) => SliverStateHandler<HashtagState>(
state: state,
builder: (context, state, index) {
final item = state.items[index];
final type = item.type;
if (type == 'radar') {
return RadarOverview(
radar: item,
onCommentsChanged: (id, count) => item.comments = count,
onMarkChanged: (id, value) => item.marked = value,
);
} else if (type == 'news') {
return NewsOverview(
news: item,
onMarkChanged: (id, value) => item.marked = value,
);
}
return Container();
},
childCount: state.items.length,
onRetry: () {},
),
)
],
);
}
}

View File

@ -1,20 +1,34 @@
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/overview_data.dart';
import 'package:didvan/providers/core_provider.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
class HashtagState extends CoreProvier {
final List<OverviewData> items = [];
late final int id;
int page = 1;
Future<void> getTagItems({required int page}) async {
appState = AppState.busy;
this.page = page;
if (this.page == 1) {
appState = AppState.busy;
}
final service = RequestService(RequestHelper.tag(
ids: [id],
limit: 15,
page: page,
));
await service.httpGet();
if (service.isSuccess) {}
if (service.isSuccess) {
final contents = service.result['contents'];
for (var i = 0; i < contents.length; i++) {
items.add(OverviewData.fromJson(contents[i]));
}
appState = AppState.idle;
return;
}
appState = AppState.failed;
}
}

View File

@ -1,43 +1,51 @@
import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/tag.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/ink_wrapper.dart';
import 'package:flutter/material.dart';
class TagItem extends StatelessWidget {
final String label;
final Tag tag;
const TagItem({
Key? key,
required this.label,
required this.tag,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(
vertical: 4,
horizontal: 8,
),
decoration: BoxDecoration(
borderRadius: DesignConfig.lowBorderRadius,
border: Border.all(
color: Theme.of(context).colorScheme.focusedBorder,
return InkWrapper(
borderRadius: DesignConfig.lowBorderRadius,
onPressed: () =>
Navigator.of(context).pushNamed(Routes.hashtag, arguments: tag),
child: Container(
padding: const EdgeInsets.symmetric(
vertical: 4,
horizontal: 8,
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
DidvanIcons.hashtag_regular,
decoration: BoxDecoration(
borderRadius: DesignConfig.lowBorderRadius,
border: Border.all(
color: Theme.of(context).colorScheme.focusedBorder,
),
DidvanText(
label,
color: Theme.of(context).colorScheme.focusedBorder,
style: Theme.of(context).textTheme.bodyText1,
),
],
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
DidvanIcons.hashtag_regular,
color: Theme.of(context).colorScheme.focusedBorder,
),
DidvanText(
tag.label,
color: Theme.of(context).colorScheme.focusedBorder,
style: Theme.of(context).textTheme.bodyText1,
),
],
),
),
);
}

View File

@ -119,7 +119,7 @@ class _DidvanPageViewState extends State<DidvanPageView> {
runSpacing: 8,
children: [
for (var i = 0; i < item.tags.length; i++)
TagItem(label: item.tags[i].label),
TagItem(tag: item.tags[i]),
],
),
),