diff --git a/lib/routes/route_generator.dart b/lib/routes/route_generator.dart index dfb10c8..9bf6300 100644 --- a/lib/routes/route_generator.dart +++ b/lib/routes/route_generator.dart @@ -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( + create: (context) => HashtagState(), + child: Hashtag(tag: settings.arguments as Tag), + ), + ); + case Routes.filteredBookmarks: return _createRoute( ChangeNotifierProvider( diff --git a/lib/routes/routes.dart b/lib/routes/routes.dart index 5bc9c90..7cbab35 100644 --- a/lib/routes/routes.dart +++ b/lib/routes/routes.dart @@ -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'; } diff --git a/lib/services/network/request_helper.dart b/lib/services/network/request_helper.dart index 7e1902e..1eb9a6f 100644 --- a/lib/services/network/request_helper.dart +++ b/lib/services/network/request_helper.dart @@ -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'; diff --git a/lib/views/home/hashtag/hashtag.dart b/lib/views/home/hashtag/hashtag.dart index 91f42af..eb95e99 100644 --- a/lib/views/home/hashtag/hashtag.dart +++ b/lib/views/home/hashtag/hashtag.dart @@ -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 { + @override + void initState() { + final state = context.read(); + 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( + builder: (context, state, child) => SliverStateHandler( + 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: () {}, + ), + ) + ], ); } } diff --git a/lib/views/home/hashtag/hashtag_state.dart b/lib/views/home/hashtag/hashtag_state.dart index 6369e13..3dcb2f3 100644 --- a/lib/views/home/hashtag/hashtag_state.dart +++ b/lib/views/home/hashtag/hashtag_state.dart @@ -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 items = []; + late final int id; int page = 1; Future 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; } } diff --git a/lib/views/home/widgets/tag_item.dart b/lib/views/home/widgets/tag_item.dart index a447dc8..1265361 100644 --- a/lib/views/home/widgets/tag_item.dart +++ b/lib/views/home/widgets/tag_item.dart @@ -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, + ), + ], + ), ), ); } diff --git a/lib/views/widgets/didvan/page_view.dart b/lib/views/widgets/didvan/page_view.dart index 2247d50..e42744c 100644 --- a/lib/views/widgets/didvan/page_view.dart +++ b/lib/views/widgets/didvan/page_view.dart @@ -119,7 +119,7 @@ class _DidvanPageViewState extends State { runSpacing: 8, children: [ for (var i = 0; i < item.tags.length; i++) - TagItem(label: item.tags[i].label), + TagItem(tag: item.tags[i]), ], ), ),