diff --git a/lib/routes/route_generator.dart b/lib/routes/route_generator.dart index e5306a1..b1c8743 100644 --- a/lib/routes/route_generator.dart +++ b/lib/routes/route_generator.dart @@ -19,10 +19,10 @@ import 'package:didvan/views/radar/radar.dart'; import 'package:didvan/views/radar/radar_details/radar_details.dart'; import 'package:didvan/views/radar/radar_details/radar_details_state.dart'; import 'package:didvan/views/radar/radar_state.dart'; -import 'package:didvan/views/profile/bookmarks/bookmarks.dart'; -import 'package:didvan/views/profile/bookmarks/bookmark_state.dart'; -import 'package:didvan/views/profile/bookmarks/filtered_bookmark/filtered_bookmark.dart'; -import 'package:didvan/views/profile/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart'; +import 'package:didvan/views/home/bookmarks/bookmarks.dart'; +import 'package:didvan/views/home/bookmarks/bookmark_state.dart'; +import 'package:didvan/views/home/bookmarks/filtered_bookmark/filtered_bookmark.dart'; +import 'package:didvan/views/home/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart'; import 'package:didvan/views/profile/direct_list/direct_list.dart'; import 'package:didvan/views/profile/direct_list/direct_list_state.dart'; import 'package:didvan/views/profile/general_settings/settings.dart'; @@ -71,6 +71,9 @@ class RouteGenerator { ChangeNotifierProvider( create: (context) => PodcastsState(), ), + ChangeNotifierProvider( + create: (context) => BookmarksState(), + ), ], child: const Home(), ), diff --git a/lib/views/profile/bookmarks/bookmark_state.dart b/lib/views/home/bookmarks/bookmark_state.dart similarity index 100% rename from lib/views/profile/bookmarks/bookmark_state.dart rename to lib/views/home/bookmarks/bookmark_state.dart diff --git a/lib/views/profile/bookmarks/bookmarks.dart b/lib/views/home/bookmarks/bookmarks.dart similarity index 75% rename from lib/views/profile/bookmarks/bookmarks.dart rename to lib/views/home/bookmarks/bookmarks.dart index 188550a..1b7b61d 100644 --- a/lib/views/profile/bookmarks/bookmarks.dart +++ b/lib/views/home/bookmarks/bookmarks.dart @@ -2,12 +2,11 @@ import 'dart:async'; import 'package:didvan/config/design_config.dart'; import 'package:didvan/constants/app_icons.dart'; -import 'package:didvan/models/view/app_bar_data.dart'; import 'package:didvan/routes/routes.dart'; -import 'package:didvan/views/profile/bookmarks/bookmark_state.dart'; +import 'package:didvan/views/home/bookmarks/bookmark_state.dart'; import 'package:didvan/views/widgets/menu_item.dart'; import 'package:didvan/views/widgets/overview/multitype.dart'; -import 'package:didvan/views/widgets/search_field.dart'; +// import 'package:didvan/views/widgets/search_field.dart'; import 'package:didvan/views/widgets/animated_visibility.dart'; import 'package:didvan/views/widgets/didvan/card.dart'; import 'package:didvan/views/widgets/didvan/divider.dart'; @@ -28,7 +27,7 @@ class Bookmarks extends StatefulWidget { class _BookmarksState extends State { final _focuseNode = FocusNode(); - Timer? _timer; + // Timer? _timer; @override void initState() { @@ -42,10 +41,11 @@ class _BookmarksState extends State { Widget build(BuildContext context) { final state = context.watch(); return DidvanScaffold( - appBarData: AppBarData( - title: 'نشان شده‌ها', - hasBack: true, - ), + appBarData: null, + // appBarData: AppBarData( + // title: 'نشان شده‌ها', + // hasBack: true, + // ), slivers: [ SliverStateHandler( state: state, @@ -60,6 +60,7 @@ class _BookmarksState extends State { item: state.bookmarks[index], onMarkChanged: state.onMarkChanged, hasUnmarkConfirmation: true, + enableCaption: true, ); }, placeholder: MultitypeOverview.placeholder, @@ -74,11 +75,11 @@ class _BookmarksState extends State { ), ], children: [ - SearchField( - title: 'نشان شده‌ها', - onChanged: _onChanged, - focusNode: _focuseNode, - ), + // SearchField( + // title: 'نشان شده‌ها', + // onChanged: _onChanged, + // focusNode: _focuseNode, + // ), const SizedBox(height: 16), AnimatedVisibility( duration: DesignConfig.lowAnimationDuration, @@ -89,28 +90,35 @@ class _BookmarksState extends State { MenuOption( onTap: () => _onCategorySelected('radar'), title: 'تحلیل‌های رادار', - icon: DidvanIcons.radar_regular, + icon: DidvanIcons.radar_solid, iconSize: 24, ), const DidvanDivider(), MenuOption( onTap: () => _onCategorySelected('news'), - title: 'اخبار', - icon: DidvanIcons.news_regular, + title: 'دنیای فولاد', + icon: DidvanIcons.news_solid, + iconSize: 24, + ), + const DidvanDivider(), + MenuOption( + onTap: () => _onCategorySelected('radar'), + title: 'پویش افق', + icon: DidvanIcons.radar_solid, iconSize: 24, ), const DidvanDivider(), MenuOption( onTap: () => _onCategorySelected('video'), - title: 'ویدئو‌ها', - icon: DidvanIcons.video_regular, + title: 'ویدئو‌کست', + icon: DidvanIcons.video_solid, iconSize: 24, ), const DidvanDivider(), MenuOption( onTap: () => _onCategorySelected('podcast'), title: 'پادکست‌ها', - icon: DidvanIcons.podcast_regular, + icon: DidvanIcons.podcast_solid, iconSize: 24, ), ], @@ -142,15 +150,15 @@ class _BookmarksState extends State { }); } - void _onChanged(String value) { - final state = context.read(); - if (value.length < 3 && value.isNotEmpty || state.lastSearch == value) { - return; - } - _timer?.cancel(); - _timer = Timer(const Duration(seconds: 1), () { - state.search = value; - state.getBookmarks(page: 1); - }); - } + // void _onChanged(String value) { + // final state = context.read(); + // if (value.length < 3 && value.isNotEmpty || state.lastSearch == value) { + // return; + // } + // _timer?.cancel(); + // _timer = Timer(const Duration(seconds: 1), () { + // state.search = value; + // state.getBookmarks(page: 1); + // }); + // } } diff --git a/lib/views/profile/bookmarks/filtered_bookmark/filtered_bookmark.dart b/lib/views/home/bookmarks/filtered_bookmark/filtered_bookmark.dart similarity index 97% rename from lib/views/profile/bookmarks/filtered_bookmark/filtered_bookmark.dart rename to lib/views/home/bookmarks/filtered_bookmark/filtered_bookmark.dart index 8eb46ca..2609b28 100644 --- a/lib/views/profile/bookmarks/filtered_bookmark/filtered_bookmark.dart +++ b/lib/views/home/bookmarks/filtered_bookmark/filtered_bookmark.dart @@ -1,6 +1,6 @@ import 'package:didvan/models/requests/studio.dart'; import 'package:didvan/models/view/app_bar_data.dart'; -import 'package:didvan/views/profile/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart'; +import 'package:didvan/views/home/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart'; import 'package:didvan/views/widgets/overview/news.dart'; import 'package:didvan/views/widgets/overview/podcast.dart'; import 'package:didvan/views/widgets/overview/radar.dart'; diff --git a/lib/views/profile/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart b/lib/views/home/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart similarity index 100% rename from lib/views/profile/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart rename to lib/views/home/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart diff --git a/lib/views/home/categories/categories_page.dart b/lib/views/home/categories/categories_page.dart new file mode 100644 index 0000000..9ecd751 --- /dev/null +++ b/lib/views/home/categories/categories_page.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class CategoriesPage extends StatelessWidget { + const CategoriesPage({super.key}); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/views/home/home.dart b/lib/views/home/home.dart index 4ddb854..2563fa8 100644 --- a/lib/views/home/home.dart +++ b/lib/views/home/home.dart @@ -1,5 +1,7 @@ import 'package:didvan/config/design_config.dart'; import 'package:didvan/services/app_initalizer.dart'; +import 'package:didvan/views/home/bookmarks/bookmarks.dart'; +import 'package:didvan/views/home/categories/categories_page.dart'; import 'package:didvan/views/home/main/main_page.dart'; import 'package:didvan/views/home/home_state.dart'; import 'package:didvan/views/widgets/logo_app_bar.dart'; @@ -42,8 +44,8 @@ class _HomeState extends State with SingleTickerProviderStateMixin { children: const [ MainPage(), Statistic(), - SizedBox(), - SizedBox(), + CategoriesPage(), + Bookmarks(), ], ), bottomNavigationBar: Consumer( diff --git a/lib/views/profile/profile.dart b/lib/views/profile/profile.dart index 8c66134..8c012bf 100644 --- a/lib/views/profile/profile.dart +++ b/lib/views/profile/profile.dart @@ -55,7 +55,8 @@ class ProfilePage extends StatelessWidget { title: 'ویرایش پروفایل', icon: DidvanIcons.user_edit_regular, suffix: context.watch().user.fullName, - onTap: () => Navigator.of(context).pushNamed(Routes.profile), + onTap: () => + Navigator.of(context).pushNamed(Routes.editProfile), ), const DidvanDivider(), MenuOption( @@ -122,7 +123,7 @@ class ProfilePage extends StatelessWidget { ), const SizedBox(height: 16), DidvanText( - 'نسخه نرم‌افزار: 2.2.5', + 'نسخه نرم‌افزار: 3.0.0', style: Theme.of(context).textTheme.bodySmall, ), ], diff --git a/lib/views/widgets/didvan/page_view.dart b/lib/views/widgets/didvan/page_view.dart index 5312aaf..500c0cc 100644 --- a/lib/views/widgets/didvan/page_view.dart +++ b/lib/views/widgets/didvan/page_view.dart @@ -146,7 +146,7 @@ class _DidvanPageViewState extends State { title: item.title, image: item.image, description: 'radar', - type: '', + type: 'radar', ), ), ], diff --git a/lib/views/widgets/didvan/text_field.dart b/lib/views/widgets/didvan/text_field.dart index 89d53c2..14acdde 100644 --- a/lib/views/widgets/didvan/text_field.dart +++ b/lib/views/widgets/didvan/text_field.dart @@ -20,6 +20,8 @@ class DidvanTextField extends StatefulWidget { final bool acceptSpace; final String? Function(String value)? validator; final TextInputType? textInputType; + final bool disableBorders; + final bool isSmall; const DidvanTextField({ Key? key, this.onChanged, @@ -34,6 +36,8 @@ class DidvanTextField extends StatefulWidget { this.autoFocus = false, this.onSubmitted, this.acceptSpace = true, + this.disableBorders = false, + this.isSmall = false, }) : super(key: key); @override @@ -79,7 +83,9 @@ class _DidvanTextFieldState extends State { decoration: BoxDecoration( color: _fillColor(), borderRadius: DesignConfig.lowBorderRadius, - border: Border.all(color: _borderColor()), + border: widget.disableBorders + ? null + : Border.all(color: _borderColor()), ), child: TextFormField( inputFormatters: [ @@ -96,9 +102,9 @@ class _DidvanTextFieldState extends State { onChanged: _onChanged, validator: _validator, obscuringCharacter: '*', - style: Theme.of(context) - .textTheme - .bodyMedium! + style: (widget.isSmall + ? Theme.of(context).textTheme.bodySmall! + : Theme.of(context).textTheme.bodyMedium!) .copyWith(fontFamily: DesignConfig.fontFamily.padRight(3)), decoration: InputDecoration( suffixIcon: _suffixBuilder(), @@ -106,28 +112,32 @@ class _DidvanTextFieldState extends State { border: InputBorder.none, hintText: widget.hintText, errorStyle: const TextStyle(height: 0.01), - hintStyle: Theme.of(context) - .textTheme - .bodyMedium! + hintStyle: (widget.isSmall + ? Theme.of(context).textTheme.bodySmall! + : Theme.of(context).textTheme.bodyMedium!) .copyWith(color: Theme.of(context).colorScheme.hint), ), ), ), - const SizedBox(height: 8), AnimatedVisibility( isVisible: _error != null, duration: DesignConfig.lowAnimationDuration, - child: Row( + child: Column( children: [ - Icon( - DidvanIcons.lightbulb_exclamation_regular, - color: Theme.of(context).colorScheme.error, - size: 14, - ), - DidvanText( - _error ?? '', - style: Theme.of(context).textTheme.bodySmall, - color: Theme.of(context).colorScheme.error, + const SizedBox(height: 8), + Row( + children: [ + Icon( + DidvanIcons.lightbulb_exclamation_regular, + color: Theme.of(context).colorScheme.error, + size: 14, + ), + DidvanText( + _error ?? '', + style: Theme.of(context).textTheme.bodySmall, + color: Theme.of(context).colorScheme.error, + ), + ], ), ], ), diff --git a/lib/views/widgets/overview/multitype.dart b/lib/views/widgets/overview/multitype.dart index 453f135..6a0916b 100644 --- a/lib/views/widgets/overview/multitype.dart +++ b/lib/views/widgets/overview/multitype.dart @@ -9,6 +9,7 @@ import 'package:didvan/utils/date_time.dart'; import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart'; import 'package:didvan/views/widgets/didvan/card.dart'; import 'package:didvan/views/widgets/didvan/text.dart'; +import 'package:didvan/views/widgets/didvan/text_field.dart'; import 'package:didvan/views/widgets/shimmer_placeholder.dart'; import 'package:didvan/views/widgets/skeleton_image.dart'; import 'package:flutter/material.dart'; @@ -19,12 +20,14 @@ class MultitypeOverview extends StatelessWidget { final OverviewData item; final bool hasUnmarkConfirmation; final void Function(int id, bool value) onMarkChanged; + final bool enableCaption; const MultitypeOverview({ Key? key, required this.item, required this.onMarkChanged, this.hasUnmarkConfirmation = false, + this.enableCaption = false, }) : super(key: key); get _targetPageArgs { @@ -81,75 +84,124 @@ class MultitypeOverview extends StatelessWidget { }, ); }, - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + child: Column( children: [ - Stack( + Row( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - SkeletonImage(imageUrl: item.image, height: 80, width: 80), - Container( - padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: const BorderRadius.horizontal( - left: Radius.circular(10), + Stack( + children: [ + SkeletonImage(imageUrl: item.image, height: 80, width: 80), + Container( + padding: + const EdgeInsets.symmetric(vertical: 4, horizontal: 8), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.secondary, + borderRadius: const BorderRadius.horizontal( + left: Radius.circular(10), + ), + ), + child: Icon( + _icon, + color: Theme.of(context).colorScheme.white, + size: 18, + ), + ), + ], + ), + const SizedBox(width: 8), + Expanded( + child: SizedBox( + height: 80, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + DidvanText( + item.title, + style: Theme.of(context).textTheme.bodyLarge, + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + Row( + children: [ + const Icon( + DidvanIcons.calendar_day_light, + size: 18, + ), + const SizedBox(width: 4), + DidvanText( + DateTime.parse(item.createdAt).toPersianDateStr(), + style: Theme.of(context).textTheme.labelSmall, + ), + const Spacer(), + if ((item.timeToRead ?? item.duration) != null) ...[ + const Icon( + DidvanIcons.timer_light, + size: 18, + ), + const SizedBox(width: 4), + DidvanText( + item.timeToRead != null + ? 'خواندن در ${item.timeToRead} دقیقه' + : DateTimeUtils.normalizeTimeDuration( + Duration(seconds: item.duration!), + ), + style: Theme.of(context).textTheme.labelSmall, + ), + ] + ], + ), + ], ), - ), - child: Icon( - _icon, - color: Theme.of(context).colorScheme.white, - size: 18, ), ), ], ), - const SizedBox(width: 8), - Expanded( - child: SizedBox( - height: 80, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - DidvanText( - item.title, - style: Theme.of(context).textTheme.bodyLarge, - maxLines: 2, - overflow: TextOverflow.ellipsis, - ), - Row( - children: [ - const Icon( - DidvanIcons.calendar_day_light, - size: 18, + if (enableCaption) + Column( + children: [ + const SizedBox(height: 8), + Row( + children: [ + Icon( + Icons.edit_outlined, + size: 16, + color: Theme.of(context).colorScheme.caption, + ), + const SizedBox(width: 4), + DidvanText( + 'یادداشت‌های من', + style: Theme.of(context).textTheme.labelSmall, + color: Theme.of(context).colorScheme.caption, + ), + ], + ), + Row( + children: [ + Flexible( + child: Container( + height: 1, + color: Theme.of(context).colorScheme.primary, ), - const SizedBox(width: 4), - DidvanText( - DateTime.parse(item.createdAt).toPersianDateStr(), - style: Theme.of(context).textTheme.labelSmall, + ), + Flexible( + flex: 2, + child: Container( + height: 1, + color: Theme.of(context).colorScheme.border, ), - const Spacer(), - if ((item.timeToRead ?? item.duration) != null) ...[ - const Icon( - DidvanIcons.timer_light, - size: 18, - ), - const SizedBox(width: 4), - DidvanText( - item.timeToRead != null - ? 'خواندن در ${item.timeToRead} دقیقه' - : DateTimeUtils.normalizeTimeDuration( - Duration(seconds: item.duration!), - ), - style: Theme.of(context).textTheme.labelSmall, - ), - ] - ], - ), - ], - ), + ) + ], + ), + DidvanTextField( + disableBorders: true, + hintText: 'برای اضافه کردن یادداشت لمس کنید.', + onChanged: (value) {}, + isSmall: true, + ), + ], ), - ), ], ), );