This commit is contained in:
MohammadTaha Basiri 2023-10-08 12:43:43 +03:30
parent 19c2b54f19
commit e18138aa8d
11 changed files with 203 additions and 117 deletions

View File

@ -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.dart';
import 'package:didvan/views/radar/radar_details/radar_details_state.dart'; import 'package:didvan/views/radar/radar_details/radar_details_state.dart';
import 'package:didvan/views/radar/radar_state.dart'; import 'package:didvan/views/radar/radar_state.dart';
import 'package:didvan/views/profile/bookmarks/bookmarks.dart'; import 'package:didvan/views/home/bookmarks/bookmarks.dart';
import 'package:didvan/views/profile/bookmarks/bookmark_state.dart'; import 'package:didvan/views/home/bookmarks/bookmark_state.dart';
import 'package:didvan/views/profile/bookmarks/filtered_bookmark/filtered_bookmark.dart'; import 'package:didvan/views/home/bookmarks/filtered_bookmark/filtered_bookmark.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/profile/direct_list/direct_list.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/direct_list/direct_list_state.dart';
import 'package:didvan/views/profile/general_settings/settings.dart'; import 'package:didvan/views/profile/general_settings/settings.dart';
@ -71,6 +71,9 @@ class RouteGenerator {
ChangeNotifierProvider<PodcastsState>( ChangeNotifierProvider<PodcastsState>(
create: (context) => PodcastsState(), create: (context) => PodcastsState(),
), ),
ChangeNotifierProvider<BookmarksState>(
create: (context) => BookmarksState(),
),
], ],
child: const Home(), child: const Home(),
), ),

View File

@ -2,12 +2,11 @@ import 'dart:async';
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/constants/app_icons.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/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/menu_item.dart';
import 'package:didvan/views/widgets/overview/multitype.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/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';
@ -28,7 +27,7 @@ class Bookmarks extends StatefulWidget {
class _BookmarksState extends State<Bookmarks> { class _BookmarksState extends State<Bookmarks> {
final _focuseNode = FocusNode(); final _focuseNode = FocusNode();
Timer? _timer; // Timer? _timer;
@override @override
void initState() { void initState() {
@ -42,10 +41,11 @@ class _BookmarksState extends State<Bookmarks> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final state = context.watch<BookmarksState>(); final state = context.watch<BookmarksState>();
return DidvanScaffold( return DidvanScaffold(
appBarData: AppBarData( appBarData: null,
title: 'نشان شده‌ها', // appBarData: AppBarData(
hasBack: true, // title: 'نشان شده‌ها',
), // hasBack: true,
// ),
slivers: [ slivers: [
SliverStateHandler<BookmarksState>( SliverStateHandler<BookmarksState>(
state: state, state: state,
@ -60,6 +60,7 @@ class _BookmarksState extends State<Bookmarks> {
item: state.bookmarks[index], item: state.bookmarks[index],
onMarkChanged: state.onMarkChanged, onMarkChanged: state.onMarkChanged,
hasUnmarkConfirmation: true, hasUnmarkConfirmation: true,
enableCaption: true,
); );
}, },
placeholder: MultitypeOverview.placeholder, placeholder: MultitypeOverview.placeholder,
@ -74,11 +75,11 @@ class _BookmarksState extends State<Bookmarks> {
), ),
], ],
children: [ children: [
SearchField( // SearchField(
title: 'نشان شده‌ها', // title: 'نشان شده‌ها',
onChanged: _onChanged, // onChanged: _onChanged,
focusNode: _focuseNode, // focusNode: _focuseNode,
), // ),
const SizedBox(height: 16), const SizedBox(height: 16),
AnimatedVisibility( AnimatedVisibility(
duration: DesignConfig.lowAnimationDuration, duration: DesignConfig.lowAnimationDuration,
@ -89,28 +90,35 @@ class _BookmarksState extends State<Bookmarks> {
MenuOption( MenuOption(
onTap: () => _onCategorySelected('radar'), onTap: () => _onCategorySelected('radar'),
title: 'تحلیل‌های رادار', title: 'تحلیل‌های رادار',
icon: DidvanIcons.radar_regular, icon: DidvanIcons.radar_solid,
iconSize: 24, iconSize: 24,
), ),
const DidvanDivider(), const DidvanDivider(),
MenuOption( MenuOption(
onTap: () => _onCategorySelected('news'), onTap: () => _onCategorySelected('news'),
title: 'اخبار', title: 'دنیای فولاد',
icon: DidvanIcons.news_regular, icon: DidvanIcons.news_solid,
iconSize: 24,
),
const DidvanDivider(),
MenuOption(
onTap: () => _onCategorySelected('radar'),
title: 'پویش افق',
icon: DidvanIcons.radar_solid,
iconSize: 24, iconSize: 24,
), ),
const DidvanDivider(), const DidvanDivider(),
MenuOption( MenuOption(
onTap: () => _onCategorySelected('video'), onTap: () => _onCategorySelected('video'),
title: 'ویدئو‌ها', title: 'ویدئو‌کست',
icon: DidvanIcons.video_regular, icon: DidvanIcons.video_solid,
iconSize: 24, iconSize: 24,
), ),
const DidvanDivider(), const DidvanDivider(),
MenuOption( MenuOption(
onTap: () => _onCategorySelected('podcast'), onTap: () => _onCategorySelected('podcast'),
title: 'پادکست‌ها', title: 'پادکست‌ها',
icon: DidvanIcons.podcast_regular, icon: DidvanIcons.podcast_solid,
iconSize: 24, iconSize: 24,
), ),
], ],
@ -142,15 +150,15 @@ class _BookmarksState extends State<Bookmarks> {
}); });
} }
void _onChanged(String value) { // void _onChanged(String value) {
final state = context.read<BookmarksState>(); // final state = context.read<BookmarksState>();
if (value.length < 3 && value.isNotEmpty || state.lastSearch == value) { // if (value.length < 3 && value.isNotEmpty || state.lastSearch == value) {
return; // return;
} // }
_timer?.cancel(); // _timer?.cancel();
_timer = Timer(const Duration(seconds: 1), () { // _timer = Timer(const Duration(seconds: 1), () {
state.search = value; // state.search = value;
state.getBookmarks(page: 1); // state.getBookmarks(page: 1);
}); // });
} // }
} }

View File

@ -1,6 +1,6 @@
import 'package:didvan/models/requests/studio.dart'; import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/models/view/app_bar_data.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/news.dart';
import 'package:didvan/views/widgets/overview/podcast.dart'; import 'package:didvan/views/widgets/overview/podcast.dart';
import 'package:didvan/views/widgets/overview/radar.dart'; import 'package:didvan/views/widgets/overview/radar.dart';

View File

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class CategoriesPage extends StatelessWidget {
const CategoriesPage({super.key});
@override
Widget build(BuildContext context) {
return Container();
}
}

View File

@ -1,5 +1,7 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/services/app_initalizer.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/main/main_page.dart';
import 'package:didvan/views/home/home_state.dart'; import 'package:didvan/views/home/home_state.dart';
import 'package:didvan/views/widgets/logo_app_bar.dart'; import 'package:didvan/views/widgets/logo_app_bar.dart';
@ -42,8 +44,8 @@ class _HomeState extends State<Home> with SingleTickerProviderStateMixin {
children: const [ children: const [
MainPage(), MainPage(),
Statistic(), Statistic(),
SizedBox(), CategoriesPage(),
SizedBox(), Bookmarks(),
], ],
), ),
bottomNavigationBar: Consumer<HomeState>( bottomNavigationBar: Consumer<HomeState>(

View File

@ -55,7 +55,8 @@ class ProfilePage extends StatelessWidget {
title: 'ویرایش پروفایل', title: 'ویرایش پروفایل',
icon: DidvanIcons.user_edit_regular, icon: DidvanIcons.user_edit_regular,
suffix: context.watch<UserProvider>().user.fullName, suffix: context.watch<UserProvider>().user.fullName,
onTap: () => Navigator.of(context).pushNamed(Routes.profile), onTap: () =>
Navigator.of(context).pushNamed(Routes.editProfile),
), ),
const DidvanDivider(), const DidvanDivider(),
MenuOption( MenuOption(
@ -122,7 +123,7 @@ class ProfilePage extends StatelessWidget {
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
DidvanText( DidvanText(
'نسخه نرم‌افزار: 2.2.5', 'نسخه نرم‌افزار: 3.0.0',
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
), ),
], ],

View File

@ -146,7 +146,7 @@ class _DidvanPageViewState extends State<DidvanPageView> {
title: item.title, title: item.title,
image: item.image, image: item.image,
description: 'radar', description: 'radar',
type: '', type: 'radar',
), ),
), ),
], ],

View File

@ -20,6 +20,8 @@ class DidvanTextField extends StatefulWidget {
final bool acceptSpace; final bool acceptSpace;
final String? Function(String value)? validator; final String? Function(String value)? validator;
final TextInputType? textInputType; final TextInputType? textInputType;
final bool disableBorders;
final bool isSmall;
const DidvanTextField({ const DidvanTextField({
Key? key, Key? key,
this.onChanged, this.onChanged,
@ -34,6 +36,8 @@ class DidvanTextField extends StatefulWidget {
this.autoFocus = false, this.autoFocus = false,
this.onSubmitted, this.onSubmitted,
this.acceptSpace = true, this.acceptSpace = true,
this.disableBorders = false,
this.isSmall = false,
}) : super(key: key); }) : super(key: key);
@override @override
@ -79,7 +83,9 @@ class _DidvanTextFieldState extends State<DidvanTextField> {
decoration: BoxDecoration( decoration: BoxDecoration(
color: _fillColor(), color: _fillColor(),
borderRadius: DesignConfig.lowBorderRadius, borderRadius: DesignConfig.lowBorderRadius,
border: Border.all(color: _borderColor()), border: widget.disableBorders
? null
: Border.all(color: _borderColor()),
), ),
child: TextFormField( child: TextFormField(
inputFormatters: <TextInputFormatter>[ inputFormatters: <TextInputFormatter>[
@ -96,9 +102,9 @@ class _DidvanTextFieldState extends State<DidvanTextField> {
onChanged: _onChanged, onChanged: _onChanged,
validator: _validator, validator: _validator,
obscuringCharacter: '*', obscuringCharacter: '*',
style: Theme.of(context) style: (widget.isSmall
.textTheme ? Theme.of(context).textTheme.bodySmall!
.bodyMedium! : Theme.of(context).textTheme.bodyMedium!)
.copyWith(fontFamily: DesignConfig.fontFamily.padRight(3)), .copyWith(fontFamily: DesignConfig.fontFamily.padRight(3)),
decoration: InputDecoration( decoration: InputDecoration(
suffixIcon: _suffixBuilder(), suffixIcon: _suffixBuilder(),
@ -106,18 +112,20 @@ class _DidvanTextFieldState extends State<DidvanTextField> {
border: InputBorder.none, border: InputBorder.none,
hintText: widget.hintText, hintText: widget.hintText,
errorStyle: const TextStyle(height: 0.01), errorStyle: const TextStyle(height: 0.01),
hintStyle: Theme.of(context) hintStyle: (widget.isSmall
.textTheme ? Theme.of(context).textTheme.bodySmall!
.bodyMedium! : Theme.of(context).textTheme.bodyMedium!)
.copyWith(color: Theme.of(context).colorScheme.hint), .copyWith(color: Theme.of(context).colorScheme.hint),
), ),
), ),
), ),
const SizedBox(height: 8),
AnimatedVisibility( AnimatedVisibility(
isVisible: _error != null, isVisible: _error != null,
duration: DesignConfig.lowAnimationDuration, duration: DesignConfig.lowAnimationDuration,
child: Row( child: Column(
children: [
const SizedBox(height: 8),
Row(
children: [ children: [
Icon( Icon(
DidvanIcons.lightbulb_exclamation_regular, DidvanIcons.lightbulb_exclamation_regular,
@ -131,6 +139,8 @@ class _DidvanTextFieldState extends State<DidvanTextField> {
), ),
], ],
), ),
],
),
) )
], ],
); );

View File

@ -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/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/widgets/didvan/card.dart'; import 'package:didvan/views/widgets/didvan/card.dart';
import 'package:didvan/views/widgets/didvan/text.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/shimmer_placeholder.dart';
import 'package:didvan/views/widgets/skeleton_image.dart'; import 'package:didvan/views/widgets/skeleton_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -19,12 +20,14 @@ class MultitypeOverview extends StatelessWidget {
final OverviewData item; final OverviewData item;
final bool hasUnmarkConfirmation; final bool hasUnmarkConfirmation;
final void Function(int id, bool value) onMarkChanged; final void Function(int id, bool value) onMarkChanged;
final bool enableCaption;
const MultitypeOverview({ const MultitypeOverview({
Key? key, Key? key,
required this.item, required this.item,
required this.onMarkChanged, required this.onMarkChanged,
this.hasUnmarkConfirmation = false, this.hasUnmarkConfirmation = false,
this.enableCaption = false,
}) : super(key: key); }) : super(key: key);
get _targetPageArgs { get _targetPageArgs {
@ -81,14 +84,17 @@ class MultitypeOverview extends StatelessWidget {
}, },
); );
}, },
child: Row( child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Stack( Stack(
children: [ children: [
SkeletonImage(imageUrl: item.image, height: 80, width: 80), SkeletonImage(imageUrl: item.image, height: 80, width: 80),
Container( Container(
padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), padding:
const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context).colorScheme.secondary, color: Theme.of(context).colorScheme.secondary,
borderRadius: const BorderRadius.horizontal( borderRadius: const BorderRadius.horizontal(
@ -152,6 +158,52 @@ class MultitypeOverview extends StatelessWidget {
), ),
], ],
), ),
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,
),
),
Flexible(
flex: 2,
child: Container(
height: 1,
color: Theme.of(context).colorScheme.border,
),
)
],
),
DidvanTextField(
disableBorders: true,
hintText: 'برای اضافه کردن یادداشت لمس کنید.',
onChanged: (value) {},
isSmall: true,
),
],
),
],
),
); );
} }