This commit is contained in:
MohammadTaha Basiri 2023-10-06 03:22:50 +03:30
parent c94f043f3f
commit 4e036ad2c5
50 changed files with 745 additions and 400 deletions

View File

@ -10,30 +10,30 @@ PODS:
- HLSCachingReverseProxyServer
- PINCache
- Cache (6.0.0)
- Firebase/CoreOnly (10.12.0):
- FirebaseCore (= 10.12.0)
- Firebase/Messaging (10.12.0):
- Firebase/CoreOnly (10.15.0):
- FirebaseCore (= 10.15.0)
- Firebase/Messaging (10.15.0):
- Firebase/CoreOnly
- FirebaseMessaging (~> 10.12.0)
- firebase_core (2.15.1):
- Firebase/CoreOnly (= 10.12.0)
- FirebaseMessaging (~> 10.15.0)
- firebase_core (2.17.0):
- Firebase/CoreOnly (= 10.15.0)
- Flutter
- firebase_messaging (14.6.7):
- Firebase/Messaging (= 10.12.0)
- firebase_messaging (14.6.9):
- Firebase/Messaging (= 10.15.0)
- firebase_core
- Flutter
- FirebaseCore (10.12.0):
- FirebaseCore (10.15.0):
- FirebaseCoreInternal (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/Logger (~> 7.8)
- FirebaseCoreInternal (10.14.0):
- FirebaseCoreInternal (10.16.0):
- "GoogleUtilities/NSData+zlib (~> 7.8)"
- FirebaseInstallations (10.14.0):
- FirebaseInstallations (10.16.0):
- FirebaseCore (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- PromisesObjC (~> 2.1)
- FirebaseMessaging (10.12.0):
- FirebaseMessaging (10.15.0):
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleDataTransport (~> 9.2)
@ -198,13 +198,13 @@ SPEC CHECKSUMS:
assets_audio_player_web: 19826380c44375761aa0b9053665c1e3fbc3b86b
better_player: 2406bfe8175203c7a46fa15f9d778d73b12e1646
Cache: 4ca7e00363fca5455f26534e5607634c820ffc2d
Firebase: 07150e75d142fb9399f6777fa56a187b17f833a0
firebase_core: 4a3246a02f828a01c74a2c26427037786d90f17f
firebase_messaging: 0b4f7997f491343b90d9300af54fe55c72135833
FirebaseCore: f86a1394906b97ac445ae49c92552a9425831bed
FirebaseCoreInternal: d558159ee6cc4b823c2296ecc193de9f6d9a5bb3
FirebaseInstallations: f672b1eda64e6381c21d424a2f680a943fd83f3b
FirebaseMessaging: bb2c4f6422a753038fe137d90ae7c1af57251316
Firebase: 66043bd4579e5b73811f96829c694c7af8d67435
firebase_core: 28e84c2a4fcf6a50ef83f47b145ded8c1fa331e4
firebase_messaging: 91ec967913a5d144f951b3c3ac17a57796d38735
FirebaseCore: 2cec518b43635f96afe7ac3a9c513e47558abd2e
FirebaseCoreInternal: 26233f705cc4531236818a07ac84d20c333e505a
FirebaseInstallations: b822f91a61f7d1ba763e5ccc9d4f2e6f2ed3b3ee
FirebaseMessaging: 0c0ae1eb722ef0c07f7801e5ded8dccd1357d6d4
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
flutter_vibrate: 9f4c2ab57008965f78969472367c329dd77eb801
@ -222,7 +222,7 @@ SPEC CHECKSUMS:
PINOperation: daa34d4aa1d8449089be7d405b9d974abc4724c6
PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4
record: cae05d8dd3cdb1dea3511b20e5a5811a1ae00d0d
rive_common: 60ae7896ab40f9513974f36f015de33f70d2c5c5
rive_common: 8a159d68033a8b073e5853acc50f03aa486a2888
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863
url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
@ -231,4 +231,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 2a309ea1fa3eb1d2ce822efc9e742b46b0932a95
COCOAPODS: 1.11.3
COCOAPODS: 1.13.0

View File

@ -8,6 +8,7 @@ class LightThemeConfig {
static const Color _background = Color(0xFFF8F8FA);
static ThemeData get themeData => ThemeData(
useMaterial3: true,
scaffoldBackgroundColor: _background,
textTheme: _TextThemeData.data,
cardColor: _colorScheme.surface,
@ -19,7 +20,8 @@ class LightThemeConfig {
),
iconTheme: IconThemeData(
color: _colorScheme.text,
), colorScheme: _colorScheme.copyWith(background: _background),
),
colorScheme: _colorScheme.copyWith(background: _background),
);
static const ColorScheme _colorScheme = ColorScheme(
@ -57,7 +59,8 @@ class DarkThemeConfig {
borderRadius: BorderRadius.circular(4),
),
),
cardColor: _colorScheme.surface, colorScheme: _colorScheme.copyWith(background: _background),
cardColor: _colorScheme.surface,
colorScheme: _colorScheme.copyWith(background: _background),
);
static const ColorScheme _colorScheme = ColorScheme(

View File

@ -7,7 +7,7 @@ import 'package:didvan/providers/theme.dart';
import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/route_generator.dart';
import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart';
@ -71,7 +71,10 @@ class Didvan extends StatelessWidget {
),
],
child: Consumer<ThemeProvider>(
builder: (context, themeProvider, child) => MaterialApp(
builder: (context, themeProvider, child) => Container(
color: Theme.of(context).colorScheme.surface,
child: SafeArea(
child: MaterialApp(
navigatorKey: navigatorKey,
debugShowCheckedModeBanner: false,
title: 'Didvan',
@ -85,7 +88,8 @@ class Didvan extends StatelessWidget {
)),
color: LightThemeConfig.themeData.primaryColor,
themeMode: themeProvider.themeMode,
onGenerateRoute: (settings) => RouteGenerator.generateRoute(settings),
onGenerateRoute: (settings) =>
RouteGenerator.generateRoute(settings),
builder: BotToastInit(), //1. call BotToastInit
navigatorObservers: [BotToastNavigatorObserver()],
initialRoute: '/',
@ -100,6 +104,8 @@ class Didvan extends StatelessWidget {
locale: const Locale("fa", "IR"),
),
),
),
),
);
}
}

View File

@ -0,0 +1,26 @@
class Content {
final int? id;
final String title;
final String image;
final String link;
final bool marked;
final List<String> subtitles;
const Content({
required this.id,
required this.title,
required this.image,
required this.link,
required this.marked,
required this.subtitles,
});
factory Content.fromJson(Map<String, dynamic> json) => Content(
id: json['id'],
title: json['title'],
image: json['image'],
link: json['link'],
marked: json['marked'],
subtitles: List<String>.from(json['subtitles']),
);
}

View File

@ -0,0 +1,22 @@
import 'home_page_list.dart';
class HomePageContent {
final List<dynamic> banners;
final List<HomePageList> lists;
final int unread;
const HomePageContent(
{required this.banners, required this.lists, required this.unread});
factory HomePageContent.fromJson(Map<String, dynamic> json) {
return HomePageContent(
banners: json['banners'],
lists: List<HomePageList>.from(
json['lists'].map(
(x) => HomePageList.fromJson(x),
),
),
unread: json['unread'],
);
}
}

View File

@ -0,0 +1,26 @@
import 'content.dart';
class HomePageList {
final String type;
final String header;
final String more;
final String link;
final List<Content> contents;
const HomePageList({
required this.type,
required this.header,
required this.more,
required this.link,
required this.contents,
});
factory HomePageList.fromJson(Map<String, dynamic> json) => HomePageList(
type: json['type'],
header: json['header'],
more: json['more'],
link: json['link'],
contents: List<Content>.from(json['contents'].map(
(x) => Content.fromJson(x),
)));
}

View File

@ -7,29 +7,34 @@ 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/home_page_state.dart';
import 'package:didvan/views/home/home_state.dart';
import 'package:didvan/views/home/news/news.dart';
import 'package:didvan/views/home/news/news_details/news_details.dart';
import 'package:didvan/views/home/news/news_details/news_details_state.dart';
import 'package:didvan/views/home/news/news_state.dart';
import 'package:didvan/views/home/radar/radar_details/radar_details.dart';
import 'package:didvan/views/home/radar/radar_details/radar_details_state.dart';
import 'package:didvan/views/home/radar/radar_state.dart';
import 'package:didvan/views/home/settings/bookmarks/bookmarks.dart';
import 'package:didvan/views/home/settings/bookmarks/bookmark_state.dart';
import 'package:didvan/views/home/settings/bookmarks/filtered_bookmark/filtered_bookmark.dart';
import 'package:didvan/views/home/settings/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart';
import 'package:didvan/views/home/settings/direct_list/direct_list.dart';
import 'package:didvan/views/home/settings/direct_list/direct_list_state.dart';
import 'package:didvan/views/home/settings/general_settings/settings.dart';
import 'package:didvan/views/home/settings/general_settings/settings_state.dart';
import 'package:didvan/views/home/settings/profile/profile.dart';
import 'package:didvan/views/podcasts/podcasts.dart';
import 'package:didvan/views/profile/profile.dart';
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/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';
import 'package:didvan/views/profile/general_settings/settings_state.dart';
import 'package:didvan/views/profile/edit_profile/edit_profile.dart';
import 'package:didvan/views/home/statistic/statistic_details/statistic_details.dart';
import 'package:didvan/views/home/statistic/statistic_details/statistic_details_state.dart';
import 'package:didvan/views/home/statistic/statistic_state.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details.mobile.dart'
if (dart.library.io) 'package:didvan/views/home/studio/studio_details/studio_details.mobile.dart'
if (dart.library.html) 'package:didvan/views/home/studio/studio_details/studio_details.web.dart';
import 'package:didvan/views/home/studio/studio_state.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details.mobile.dart'
if (dart.library.io) 'package:didvan/views/podcasts/studio_details/studio_details.mobile.dart'
if (dart.library.html) 'package:didvan/views/podcasts/studio_details/studio_details.web.dart';
import 'package:didvan/views/podcasts/podcasts_state.dart';
import 'package:didvan/views/splash/splash.dart';
import 'package:didvan/routes/routes.dart';
import 'package:flutter/foundation.dart';
@ -57,14 +62,8 @@ class RouteGenerator {
ChangeNotifierProvider<HomeState>(
create: (context) => HomeState(),
),
ChangeNotifierProvider<RadarState>(
create: (context) => RadarState(),
),
ChangeNotifierProvider<NewsState>(
create: (context) => NewsState(),
),
ChangeNotifierProvider<StudioState>(
create: (context) => StudioState(),
ChangeNotifierProvider<HomePageState>(
create: (context) => HomePageState(),
),
ChangeNotifierProvider<StatisticState>(
create: (context) => StatisticState(),
@ -73,9 +72,13 @@ class RouteGenerator {
child: const Home(),
),
);
case Routes.editProfile:
return _createRoute(
const EditProfile(),
);
case Routes.profile:
return _createRoute(
const Profile(),
const ProfilePage(),
);
case Routes.generalSettings:
return _createRoute(
@ -84,6 +87,27 @@ class RouteGenerator {
child: const GeneralSettings(),
),
);
case Routes.podcasts:
return _createRoute(
ChangeNotifierProvider<PodcastsState>(
create: (context) => PodcastsState(),
child: const Podcasts(),
),
);
case Routes.radars:
return _createRoute(
ChangeNotifierProvider<RadarState>(
create: (context) => RadarState(),
child: const Radar(),
),
);
case Routes.news:
return _createRoute(
ChangeNotifierProvider<NewsState>(
create: (context) => NewsState(),
child: const News(),
),
);
case Routes.radarDetails:
return _createRoute(
ChangeNotifierProvider<RadarDetailsState>(

View File

@ -1,14 +1,18 @@
class Routes {
static const String splash = '/';
static const String home = '/home';
static const String radars = '/radars';
static const String news = '/news';
static const String podcasts = '/podcasts';
static const String aboutUs = '/about-us';
static const String authenticaion = '/authentication';
static const String profile = '/profile';
static const String editProfile = '/edit-profile';
static const String settings = '/settings';
static const String generalSettings = '/general-settings';
static const String radarDetails = '/radar-details';
static const String newsDetails = '/news-details';
static const String studioDetails = '/studio-details';
static const String studioDetails = '/podcast-details';
static const String statisticDetails = '/statistic-details';
static const String directList = '/direct-list';
static const String direct = '/direct';

View File

@ -7,7 +7,7 @@ import 'package:didvan/routes/routes.dart';
import 'package:didvan/services/media/media.dart';
import 'package:didvan/services/storage/storage.dart';
import 'package:didvan/views/home/home_state.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart';

View File

@ -11,6 +11,8 @@ class RequestHelper {
static const String _baseStatisticUrl = '$baseUrl/statistic';
static const String _baseDirectUrl = '$_baseUserUrl/direct';
static const String mainPageContent = '$baseUrl/home';
static const String confirmUsername = '$_baseUserUrl/confirmUsername';
static const String changePassword = '$_baseUserUrl/changePassword';
static const String login = '$_baseUserUrl/login';

View File

@ -49,9 +49,8 @@ class DateTimeUtils {
lastDate: lastDate,
builder: (context, child) => Theme(
data: Theme.of(context).copyWith(
textTheme: Theme.of(context)
.textTheme
.copyWith(headlineMedium: Theme.of(context).textTheme.displaySmall)),
textTheme: Theme.of(context).textTheme.copyWith(
headlineMedium: Theme.of(context).textTheme.displaySmall)),
child: child!,
),
);

View File

@ -1,11 +1,9 @@
import 'package:didvan/config/design_config.dart';
import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/views/home/home/home_page.dart';
import 'package:didvan/views/home/home_state.dart';
import 'package:didvan/views/home/news/news.dart';
import 'package:didvan/views/home/radar/radar.dart';
import 'package:didvan/views/home/settings/settings.dart';
import 'package:didvan/views/home/widgets/logo_app_bar.dart';
import 'package:didvan/views/home/statistic/statistic.dart';
import 'package:didvan/views/home/studio/studio.dart';
import 'package:didvan/views/widgets/didvan/bnb.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -24,7 +22,7 @@ class _HomeState extends State<Home> with SingleTickerProviderStateMixin {
void initState() {
final state = context.read<HomeState>();
DesignConfig.updateSystemUiOverlayStyle();
_tabController = TabController(length: 5, vsync: this, initialIndex: 2);
_tabController = TabController(length: 4, vsync: this, initialIndex: 0);
_tabController.addListener(() {
state.currentPageIndex = _tabController.index;
});
@ -37,15 +35,15 @@ class _HomeState extends State<Home> with SingleTickerProviderStateMixin {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: const LogoAppBar(),
body: TabBarView(
physics: const NeverScrollableScrollPhysics(),
controller: _tabController,
children: const [
News(),
HomePage(),
Statistic(),
Radar(),
Studio(),
Settings(),
SizedBox(),
SizedBox(),
],
),
bottomNavigationBar: Consumer<HomeState>(

View File

@ -0,0 +1,170 @@
import 'package:carousel_slider/carousel_slider.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/home_page_content/home_page_list.dart';
import 'package:didvan/views/home/home/home_page_state.dart';
import 'package:didvan/views/widgets/didvan/card.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/skeleton_image.dart';
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
void initState() {
Future.delayed(
Duration.zero,
context.read<HomePageState>().getMainPageContent,
);
super.initState();
}
@override
Widget build(BuildContext context) {
return StateHandler<HomePageState>(
onRetry: () {},
state: context.watch<HomePageState>(),
builder: (context, state) =>
ListView.builder(itemBuilder: (context, index) {
if (index == 0) {
return CarouselSlider(
items: state.content.banners
.map((e) => SkeletonImage(
imageUrl: e.imageUrl,
))
.toList(),
options: CarouselOptions(
viewportFraction: 1.0,
),
);
}
return const SizedBox();
// state.content.banners.map((e) => const SizedBox()).toList(),
// for (int i = 0; i < state.content.lists.length; i += 2)
// ...state.content.lists
// .sublist(i, i + 2)
// .map((e) => _HomePageItem(list: e))
// .toList(),
}),
);
}
}
class _HomePageItem extends StatelessWidget {
final HomePageList list;
const _HomePageItem({required this.list});
void moreHandler(BuildContext context) {
if (list.link.startsWith('http')) {
launchUrl(Uri.parse(list.link));
return;
}
Navigator.of(context).pushNamed(list.link);
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Padding(
padding: const EdgeInsets.only(
left: 16,
right: 16,
bottom: 16,
top: 28,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
DidvanText(
list.header,
style: Theme.of(context).textTheme.titleMedium,
color: Theme.of(context).colorScheme.title,
),
GestureDetector(
onTap: () => moreHandler(context),
child: Row(
children: [
DidvanText(
list.more,
color: Theme.of(context).colorScheme.primary,
),
Icon(
DidvanIcons.angle_left_light,
color: Theme.of(context).colorScheme.primary,
)
],
),
)
],
),
),
CarouselSlider.builder(
itemCount: list.contents.length,
itemBuilder: (context, index, realIndex) => DidvanCard(
margin: const EdgeInsets.only(left: 8),
padding: EdgeInsets.zero,
child: Column(
children: [
SkeletonImage(
imageUrl: list.contents[index].image,
height: MediaQuery.of(context).size.height / 6,
width: double.infinity,
),
Container(
width: double.infinity,
padding:
const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
DidvanText(
list.contents[index].title,
style: Theme.of(context).textTheme.bodyLarge,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
Row(
children: [
const Icon(
DidvanIcons.puzzle_light,
size: 16,
),
...list.contents[index].subtitles.map(
(e) => Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
child: DidvanText(
e,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.bodySmall,
),
),
),
],
)
],
),
),
],
),
),
options: CarouselOptions(
autoPlay: true,
padEnds: false,
viewportFraction: 0.7,
),
),
],
);
}
}

View File

@ -0,0 +1,19 @@
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/home_page_content/home_page_content.dart';
import 'package:didvan/providers/core.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
class HomePageState extends CoreProvier {
late final HomePageContent content;
Future<void> getMainPageContent() async {
final service = RequestService(RequestHelper.mainPageContent);
await service.httpGet();
if (service.isSuccess) {
content = HomePageContent.fromJson(service.result);
appState = AppState.idle;
return;
}
appState = AppState.failed;
}
}

View File

@ -1,139 +0,0 @@
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/providers/theme.dart';
import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/services/storage/storage.dart';
import 'package:didvan/views/home/widgets/logo_app_bar.dart';
import 'package:didvan/views/home/widgets/menu_item.dart';
import 'package:didvan/views/widgets/didvan/badge.dart';
import 'package:didvan/views/widgets/didvan/card.dart';
import 'package:didvan/views/widgets/didvan/divider.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/item_title.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class Settings extends StatelessWidget {
const Settings({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Consumer<ThemeProvider>(
builder: (context, themeProvider, child) => LogoAppBar(
key: UniqueKey(),
),
),
const SizedBox(height: 16),
DidvanCard(
child: Column(
children: [
Consumer<UserProvider>(
child: Icon(
DidvanIcons.angle_left_regular,
size: 18,
color: Theme.of(context).colorScheme.title,
),
builder: (context, state, child) => MenuOption(
title: 'پیام‌ها',
icon: DidvanIcons.message_regular,
onTap: () =>
Navigator.of(context).pushNamed(Routes.directList),
trailing: Row(
children: [
if (state.unreadMessageCount != 0)
DidvanBadge(
text: state.unreadMessageCount.toString(),
),
child!,
],
),
),
),
const DidvanDivider(),
MenuOption(
title: 'ویرایش پروفایل',
icon: DidvanIcons.user_edit_regular,
suffix: context.watch<UserProvider>().user.fullName,
onTap: () => Navigator.of(context).pushNamed(Routes.profile),
),
const DidvanDivider(),
MenuOption(
title: 'تنظیمات',
icon: DidvanIcons.setting_regular,
onTap: () =>
Navigator.of(context).pushNamed(Routes.generalSettings),
),
const DidvanDivider(),
MenuOption(
title: 'نشان شده‌ها',
icon: DidvanIcons.bookmark_regular,
onTap: () =>
Navigator.of(context).pushNamed(Routes.bookmarks),
),
const DidvanDivider(),
MenuOption(
title: 'خروج از حساب کاربری',
icon: DidvanIcons.sign_out_regular,
color: Theme.of(context).colorScheme.secondary,
onTap: () async {
StorageService.delete(key: 'token');
Navigator.of(context).pushNamedAndRemoveUntil(
Routes.splash,
(_) => false,
);
},
),
],
),
),
const ItemTitle(
title: 'درباره ما',
),
DidvanCard(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
MenuOption(
icon: DidvanIcons.info_circle_regular,
title: 'معرفی دیدوان',
onTap: () => launchUrl(Uri.parse('https://didvan.app/#info')),
),
const DidvanDivider(),
MenuOption(
icon: DidvanIcons.support_regular,
title: 'پیام به پشتیبانی',
onTap: () {
Navigator.of(context).pushNamed(
Routes.direct,
arguments: {'type': 'پشتیبانی اپلیکیشن'},
);
},
),
const DidvanDivider(),
MenuOption(
icon: DidvanIcons.alert_regular,
title: 'حریم خصوصی',
onTap: () => launchUrl(
Uri.parse('https://didvan.app/termsOfUse.html#privacy'),
),
),
],
),
),
const SizedBox(height: 16),
DidvanText(
'نسخه نرم‌افزار: 2.2.5',
style: Theme.of(context).textTheme.bodySmall,
),
],
),
);
}
}

View File

@ -10,8 +10,8 @@ import 'package:didvan/models/studio_details_data.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/services/media/media.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/home/studio/studio_state.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/podcasts_state.dart';
import 'package:didvan/views/home/widgets/audio/audio_slider.dart';
import 'package:didvan/views/home/widgets/bookmark_button.dart';
import 'package:didvan/views/widgets/didvan/button.dart';
@ -184,7 +184,7 @@ class AudioPlayerWidget extends StatelessWidget {
color: Theme.of(context).colorScheme.title,
value: podcast.marked,
onMarkChanged: (value) => context
.read<StudioState>()
.read<PodcastsState>()
.changeMark(podcast.id, value, true),
),
),

View File

@ -1,7 +1,10 @@
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/constants/assets.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/views/home/widgets/search_field.dart';
import 'package:didvan/views/widgets/didvan/icon_button.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/logos/didvan_vertical_logo.dart';
@ -9,28 +12,70 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:url_launcher/url_launcher_string.dart';
class LogoAppBar extends StatelessWidget {
final String? type;
const LogoAppBar({Key? key, this.type}) : super(key: key);
class LogoAppBar extends StatelessWidget implements PreferredSizeWidget {
const LogoAppBar({Key? key}) : super(key: key);
@override
Size get preferredSize => const Size(double.infinity, 144);
@override
Widget build(BuildContext context) {
final MediaQueryData d = MediaQuery.of(context);
return Container(
height: 144,
decoration: BoxDecoration(
borderRadius: const BorderRadius.only(bottomLeft: Radius.circular(20)),
color: Theme.of(context).colorScheme.surface,
boxShadow: [
BoxShadow(
color: const Color(0XFF1B3C59).withOpacity(0.15),
blurRadius: 8,
spreadRadius: 0,
offset: const Offset(0, 8),
)
],
),
margin: EdgeInsets.only(top: d.padding.top),
padding: const EdgeInsets.all(16),
alignment: Alignment.centerRight,
child: Row(
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
DidvanHorizontalLogo(type: type),
const DidvanHorizontalLogo(),
Row(
children: [
DidvanIconButton(
icon: Icons.menu,
icon: DidvanIcons.profile_light,
size: 32,
onPressed: () =>
Navigator.of(context).pushNamed(Routes.profile),
),
Container(
height: 32,
width: 1,
color: Theme.of(context).colorScheme.border,
),
DidvanIconButton(
icon: DidvanIcons.notification_light,
size: 32,
onPressed: () => _handleMenuOpen(context),
),
],
),
],
),
const SizedBox(height: 16),
SearchField(
title: 'دیدوان',
onChanged: (_) {},
focusNode: FocusNode(),
onFilterButtonPressed: () => _handleMenuOpen(context),
isFiltered: false,
),
],
),
);
}
@ -122,10 +167,12 @@ class _BottomSheetItem extends StatelessWidget {
children: [
SvgPicture.asset(
icon,
color: enabled
theme: SvgTheme(
currentColor: enabled
? Theme.of(context).colorScheme.title
: Theme.of(context).colorScheme.disabledText,
),
),
const SizedBox(width: 8),
DidvanText(
title,

View File

@ -6,7 +6,7 @@ import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/utils/date_time.dart';
import 'package:didvan/views/home/studio/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/text.dart';
import 'package:didvan/views/widgets/shimmer_placeholder.dart';

View File

@ -5,7 +5,7 @@ import 'package:didvan/models/overview_data.dart';
import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/providers/media.dart';
import 'package:didvan/utils/date_time.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/home/widgets/bookmark_button.dart';
import 'package:didvan/views/home/widgets/duration_widget.dart';
import 'package:didvan/views/widgets/didvan/card.dart';

View File

@ -51,6 +51,54 @@ class _SearchFieldState extends State<SearchField> {
keyboardType: TextInputType.text,
textInputAction: TextInputAction.search,
decoration: InputDecoration(
suffixIcon: widget.onFilterButtonPressed != null
? SizedBox(
width: 48,
child: Align(
alignment: Alignment.centerLeft,
child: Padding(
padding: const EdgeInsets.only(left: 8),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Container(
margin: const EdgeInsets.only(left: 4),
height: 24,
width: 1,
color: Theme.of(context).colorScheme.border,
),
Stack(
children: [
DidvanIconButton(
onPressed:
widget.onFilterButtonPressed!,
icon: widget.isFiltered!
? DidvanIcons.filter_solid
: DidvanIcons.filter_regular,
size: 24,
gestureSize: 24,
),
if (widget.isFiltered!)
Positioned(
child: Container(
width: 10,
height: 10,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Theme.of(context)
.colorScheme
.secondary,
),
),
),
],
),
],
),
),
),
)
: null,
focusedBorder: OutlineInputBorder(
borderRadius: const BorderRadius.all(
Radius.circular(4),
@ -86,31 +134,6 @@ class _SearchFieldState extends State<SearchField> {
),
),
),
if (widget.onFilterButtonPressed != null) const SizedBox(width: 8),
if (widget.onFilterButtonPressed != null)
Stack(
children: [
DidvanIconButton(
onPressed: widget.onFilterButtonPressed!,
icon: widget.isFiltered!
? DidvanIcons.filter_solid
: DidvanIcons.filter_regular,
size: 32,
gestureSize: 32,
),
if (widget.isFiltered!)
Positioned(
child: Container(
width: 10,
height: 10,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Theme.of(context).colorScheme.secondary,
),
),
),
],
),
],
),
);

View File

@ -6,9 +6,9 @@ import 'package:didvan/models/enums.dart';
import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/views/home/studio/studio_state.dart';
import 'package:didvan/views/home/studio/widgets/slider.dart';
import 'package:didvan/views/home/studio/widgets/tab_bar.dart';
import 'package:didvan/views/podcasts/podcasts_state.dart';
import 'package:didvan/views/podcasts/widgets/slider.dart';
import 'package:didvan/views/podcasts/widgets/tab_bar.dart';
import 'package:didvan/views/home/widgets/date_picker_button.dart';
import 'package:didvan/views/home/widgets/logo_app_bar.dart';
import 'package:didvan/views/home/widgets/overview/podcast.dart';
@ -24,26 +24,26 @@ import 'package:didvan/views/widgets/state_handlers/sliver_state_handler.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Studio extends StatefulWidget {
const Studio({Key? key}) : super(key: key);
class Podcasts extends StatefulWidget {
const Podcasts({Key? key}) : super(key: key);
@override
State<Studio> createState() => _StudioState();
State<Podcasts> createState() => _PodcastsState();
}
class _StudioState extends State<Studio> {
class _PodcastsState extends State<Podcasts> {
final _focusNode = FocusNode();
Timer? _timer;
@override
void initState() {
context.read<StudioState>().init();
context.read<PodcastsState>().init();
super.initState();
}
@override
Widget build(BuildContext context) {
return Consumer<StudioState>(
return Consumer<PodcastsState>(
builder: (context, state, child) => CustomScrollView(
slivers: [
const SliverToBoxAdapter(child: LogoAppBar()),
@ -101,7 +101,7 @@ class _StudioState extends State<Studio> {
),
),
),
SliverStateHandler<StudioState>(
SliverStateHandler<PodcastsState>(
state: state,
itemPadding: const EdgeInsets.only(
bottom: 8,
@ -149,7 +149,7 @@ class _StudioState extends State<Studio> {
}
void _onChanged(String value) {
final state = context.read<StudioState>();
final state = context.read<PodcastsState>();
if (value.length < 3 && value.isNotEmpty || state.lastSearch == value) {
return;
}
@ -161,7 +161,7 @@ class _StudioState extends State<Studio> {
}
void _showSortDialog() {
final state = context.read<StudioState>();
final state = context.read<PodcastsState>();
ActionSheetUtils.showBottomSheet(
data: ActionSheetData(
content: StatefulBuilder(
@ -211,7 +211,7 @@ class _StudioState extends State<Studio> {
}
Future<void> _showFilterBottomSheet() async {
final state = context.read<StudioState>();
final state = context.read<PodcastsState>();
await ActionSheetUtils.showBottomSheet(
data: ActionSheetData(
title: 'فیلتر جستجو',

View File

@ -9,7 +9,7 @@ import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
class StudioState extends CoreProvier {
class PodcastsState extends CoreProvier {
final List<OverviewData> studios = [];
final List<SliderData> sliders = [];

View File

@ -3,8 +3,8 @@
import 'package:better_player/better_player.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/services/media/media.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/home/studio/studio_details/widgets/studio_details_widget.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/studio_details/widgets/studio_details_widget.dart';
import 'package:didvan/views/home/widgets/bookmark_button.dart';
import 'package:didvan/views/widgets/didvan/app_bar.dart';
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';

View File

@ -2,8 +2,8 @@ import 'dart:ui' as ui;
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/services/media/media.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/home/studio/studio_details/widgets/studio_details_widget.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/studio_details/widgets/studio_details_widget.dart';
import 'package:didvan/views/home/widgets/bookmark_button.dart';
import 'package:didvan/views/widgets/didvan/app_bar.dart';
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';

View File

@ -1,7 +1,7 @@
import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

View File

@ -6,8 +6,8 @@ import 'package:didvan/models/enums.dart';
import 'package:didvan/models/studio_details_data.dart';
import 'package:didvan/views/home/comments/comments.dart';
import 'package:didvan/views/home/comments/comments_state.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/home/studio/studio_details/widgets/details_tab_bar.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/studio_details/widgets/details_tab_bar.dart';
import 'package:didvan/views/home/widgets/overview/multitype.dart';
import 'package:didvan/views/home/widgets/tag_item.dart';
import 'package:didvan/views/widgets/didvan/text.dart';

View File

@ -5,8 +5,8 @@ import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/home/studio/studio_state.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/podcasts_state.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/shimmer_placeholder.dart';
import 'package:didvan/views/widgets/skeleton_image.dart';
@ -25,7 +25,7 @@ class _StudioSliderState extends State<StudioSlider> {
@override
Widget build(BuildContext context) {
final state = context.watch<StudioState>();
final state = context.watch<PodcastsState>();
return Column(
children: [
CarouselSlider(

View File

@ -1,7 +1,7 @@
import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/views/home/studio/studio_state.dart';
import 'package:didvan/views/podcasts/podcasts_state.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -13,7 +13,7 @@ class StudioTabBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final state = context.watch<StudioState>();
final state = context.watch<PodcastsState>();
return AnimatedContainer(
duration: DesignConfig.lowAnimationDuration,
margin: const EdgeInsets.symmetric(horizontal: 16),

View File

@ -4,7 +4,7 @@ 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/home/settings/bookmarks/bookmark_state.dart';
import 'package:didvan/views/profile/bookmarks/bookmark_state.dart';
import 'package:didvan/views/home/widgets/menu_item.dart';
import 'package:didvan/views/home/widgets/overview/multitype.dart';
import 'package:didvan/views/home/widgets/search_field.dart';

View File

@ -1,6 +1,6 @@
import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/views/home/settings/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart';
import 'package:didvan/views/profile/bookmarks/filtered_bookmark/filtered_bookmarks_state.dart';
import 'package:didvan/views/home/widgets/overview/news.dart';
import 'package:didvan/views/home/widgets/overview/podcast.dart';
import 'package:didvan/views/home/widgets/overview/radar.dart';

View File

@ -1,7 +1,7 @@
import 'package:didvan/constants/assets.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/views/home/settings/direct_list/direct_list_state.dart';
import 'package:didvan/views/home/settings/direct_list/widgets/direct_item.dart';
import 'package:didvan/views/profile/direct_list/direct_list_state.dart';
import 'package:didvan/views/profile/direct_list/widgets/direct_item.dart';
import 'package:didvan/views/widgets/didvan/badge.dart';
import 'package:didvan/views/widgets/didvan/divider.dart';
import 'package:didvan/views/widgets/didvan/scaffold.dart';

View File

@ -4,7 +4,7 @@ import 'package:didvan/models/chat_room/chat_room.dart';
import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/utils/date_time.dart';
import 'package:didvan/views/home/settings/direct_list/direct_list_state.dart';
import 'package:didvan/views/profile/direct_list/direct_list_state.dart';
import 'package:didvan/views/widgets/didvan/badge.dart';
import 'package:didvan/views/widgets/didvan/divider.dart';
import 'package:didvan/views/widgets/didvan/text.dart';

View File

@ -4,7 +4,7 @@ import 'package:didvan/config/design_config.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/views/home/settings/profile/widgets/profile_photo.dart';
import 'package:didvan/views/profile/edit_profile/widgets/profile_photo.dart';
import 'package:didvan/views/home/widgets/menu_item.dart';
import 'package:didvan/views/widgets/animated_visibility.dart';
import 'package:didvan/views/widgets/didvan/button.dart';
@ -16,14 +16,14 @@ import 'package:didvan/views/widgets/didvan/text_field.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Profile extends StatefulWidget {
const Profile({Key? key}) : super(key: key);
class EditProfile extends StatefulWidget {
const EditProfile({Key? key}) : super(key: key);
@override
State<Profile> createState() => _ProfileState();
State<EditProfile> createState() => _EditProfileState();
}
class _ProfileState extends State<Profile> {
class _EditProfileState extends State<EditProfile> {
Timer? _timer;
late String fullName;

View File

@ -1,4 +1,3 @@
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/enums.dart';

View File

@ -10,7 +10,7 @@ import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/providers/theme.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/utils/date_time.dart';
import 'package:didvan/views/home/settings/general_settings/settings_state.dart';
import 'package:didvan/views/profile/general_settings/settings_state.dart';
import 'package:didvan/views/home/widgets/menu_item.dart';
import 'package:didvan/views/widgets/didvan/card.dart';
import 'package:didvan/views/widgets/didvan/divider.dart';

View File

@ -0,0 +1,131 @@
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/services/storage/storage.dart';
import 'package:didvan/views/home/widgets/menu_item.dart';
import 'package:didvan/views/widgets/didvan/badge.dart';
import 'package:didvan/views/widgets/didvan/card.dart';
import 'package:didvan/views/widgets/didvan/divider.dart';
import 'package:didvan/views/widgets/didvan/scaffold.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/item_title.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class ProfilePage extends StatelessWidget {
const ProfilePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return DidvanScaffold(
appBarData: AppBarData(
title: 'تنظیمات',
),
children: [
DidvanCard(
child: Column(
children: [
Consumer<UserProvider>(
child: Icon(
DidvanIcons.angle_left_regular,
size: 18,
color: Theme.of(context).colorScheme.title,
),
builder: (context, state, child) => MenuOption(
title: 'پیام‌ها',
icon: DidvanIcons.message_regular,
onTap: () =>
Navigator.of(context).pushNamed(Routes.directList),
trailing: Row(
children: [
if (state.unreadMessageCount != 0)
DidvanBadge(
text: state.unreadMessageCount.toString(),
),
child!,
],
),
),
),
const DidvanDivider(),
MenuOption(
title: 'ویرایش پروفایل',
icon: DidvanIcons.user_edit_regular,
suffix: context.watch<UserProvider>().user.fullName,
onTap: () => Navigator.of(context).pushNamed(Routes.profile),
),
const DidvanDivider(),
MenuOption(
title: 'تنظیمات',
icon: DidvanIcons.setting_regular,
onTap: () =>
Navigator.of(context).pushNamed(Routes.generalSettings),
),
const DidvanDivider(),
MenuOption(
title: 'نشان شده‌ها',
icon: DidvanIcons.bookmark_regular,
onTap: () => Navigator.of(context).pushNamed(Routes.bookmarks),
),
const DidvanDivider(),
MenuOption(
title: 'خروج از حساب کاربری',
icon: DidvanIcons.sign_out_regular,
color: Theme.of(context).colorScheme.secondary,
onTap: () async {
StorageService.delete(key: 'token');
Navigator.of(context).pushNamedAndRemoveUntil(
Routes.splash,
(_) => false,
);
},
),
],
),
),
const ItemTitle(
title: 'درباره ما',
),
DidvanCard(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
MenuOption(
icon: DidvanIcons.info_circle_regular,
title: 'معرفی دیدوان',
onTap: () => launchUrl(Uri.parse('https://didvan.app/#info')),
),
const DidvanDivider(),
MenuOption(
icon: DidvanIcons.support_regular,
title: 'پیام به پشتیبانی',
onTap: () {
Navigator.of(context).pushNamed(
Routes.direct,
arguments: {'type': 'پشتیبانی اپلیکیشن'},
);
},
),
const DidvanDivider(),
MenuOption(
icon: DidvanIcons.alert_regular,
title: 'حریم خصوصی',
onTap: () => launchUrl(
Uri.parse('https://didvan.app/termsOfUse.html#privacy'),
),
),
],
),
),
const SizedBox(height: 16),
DidvanText(
'نسخه نرم‌افزار: 2.2.5',
style: Theme.of(context).textTheme.bodySmall,
),
],
);
}
}

View File

@ -8,7 +8,7 @@ import 'package:didvan/models/category.dart';
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/views/home/radar/radar_state.dart';
import 'package:didvan/views/radar/radar_state.dart';
import 'package:didvan/views/home/widgets/categories_gird.dart';
import 'package:didvan/views/home/widgets/categories_list.dart';
import 'package:didvan/views/home/widgets/date_picker_button.dart';

View File

@ -1,5 +1,5 @@
import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/views/home/radar/radar_details/radar_details_state.dart';
import 'package:didvan/views/radar/radar_details/radar_details_state.dart';
import 'package:didvan/views/home/widgets/floating_navigation_bar.dart';
import 'package:didvan/views/widgets/didvan/page_view.dart';
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';

View File

@ -4,7 +4,7 @@ import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:flutter/material.dart';
class DidvanAppBar extends StatelessWidget {
class DidvanAppBar extends StatelessWidget implements PreferredSizeWidget {
final AppBarData appBarData;
final bool hasBorder;
final Color? backgroundColor;
@ -15,6 +15,9 @@ class DidvanAppBar extends StatelessWidget {
this.backgroundColor = Colors.transparent,
}) : super(key: key);
@override
Size get preferredSize => const Size(double.infinity, kToolbarHeight);
@override
Widget build(BuildContext context) {
return Container(

View File

@ -4,13 +4,12 @@ import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/services/media/media.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/home/studio/studio_details/widgets/studio_details_widget.dart';
import 'package:didvan/views/home/studio/studio_state.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/studio_details/widgets/studio_details_widget.dart';
import 'package:didvan/views/podcasts/podcasts_state.dart';
import 'package:didvan/views/home/widgets/audio/audio_player_widget.dart';
import 'package:didvan/views/home/widgets/audio/audio_slider.dart';
import 'package:didvan/views/widgets/didvan/icon_button.dart';
@ -58,41 +57,32 @@ class DidvanBNB extends StatelessWidget {
children: [
_NavBarItem(
isSelected: currentTabIndex == 0,
title: 'اخبار',
selectedIcon: DidvanIcons.news_solid,
unselectedIcon: DidvanIcons.news_light,
title: 'خانه',
selectedIcon: Icons.home,
unselectedIcon: Icons.home_outlined,
onTap: () => onTabChanged(0),
),
_NavBarItem(
isSelected: currentTabIndex == 1,
title: 'آمار',
selectedIcon: DidvanIcons.chart_solid,
unselectedIcon: DidvanIcons.chart_light,
title: 'آمار و اطلاعات',
selectedIcon: DidvanIcons.news_solid,
unselectedIcon: DidvanIcons.news_light,
onTap: () => onTabChanged(1),
),
_NavBarItem(
isSelected: currentTabIndex == 2,
title: 'رادار',
selectedIcon: DidvanIcons.radar_solid,
unselectedIcon: DidvanIcons.radar_light,
title: 'دسته‌بندی',
selectedIcon: Icons.window,
unselectedIcon: Icons.window_outlined,
onTap: () => onTabChanged(2),
),
_NavBarItem(
isSelected: currentTabIndex == 3,
title: 'استودیو',
selectedIcon: DidvanIcons.play_circle_solid,
unselectedIcon: DidvanIcons.play_circle_light,
title: 'رصدهای من',
selectedIcon: DidvanIcons.radar_solid,
unselectedIcon: DidvanIcons.radar_light,
onTap: () => onTabChanged(3),
),
_NavBarItem(
hasBadge:
context.watch<UserProvider>().unreadMessageCount != 0,
isSelected: currentTabIndex == 4,
title: 'تنظیمات',
selectedIcon: DidvanIcons.setting_solid,
unselectedIcon: DidvanIcons.setting_light,
onTap: () => onTabChanged(4),
),
],
),
),
@ -292,7 +282,7 @@ class _PlayerNavBar extends StatelessWidget {
fetchOnly: true,
);
}
final state = context.read<StudioState>();
final state = context.read<PodcastsState>();
showModalBottomSheet(
constraints: BoxConstraints(
maxWidth: ActionSheetUtils.mediaQueryData.size.width,
@ -300,7 +290,7 @@ class _PlayerNavBar extends StatelessWidget {
backgroundColor: Colors.transparent,
context: context,
isScrollControlled: true,
builder: (context) => ChangeNotifierProvider<StudioState>.value(
builder: (context) => ChangeNotifierProvider<PodcastsState>.value(
value: state,
child: Consumer<StudioDetailsState>(
builder: (context, state, child) => MediaQuery(
@ -361,7 +351,7 @@ class _PlayerNavBar extends StatelessWidget {
)
: StudioDetailsWidget(
onMarkChanged: (id, value) => context
.read<StudioState>()
.read<PodcastsState>()
.changeMark(id, value, true),
),
),

View File

@ -12,7 +12,7 @@ class DidvanHorizontalLogo extends StatelessWidget {
padding: EdgeInsets.only(bottom: type == 'studio' ? 0 : 4),
child: SvgPicture.asset(
_asset,
height: 76,
height: 48,
),
);
}

View File

@ -5,10 +5,10 @@ packages:
dependency: transitive
description:
name: _flutterfire_internals
sha256: "1a5e13736d59235ce0139621b4bbe29bc89839e202409081bc667eb3cd20674c"
sha256: d84d98f1992976775f83083523a34c5d22fea191eec3abb2bd09537fb623c2e0
url: "https://pub.dev"
source: hosted
version: "1.3.5"
version: "1.3.7"
args:
dependency: transitive
description:
@ -70,34 +70,34 @@ packages:
dependency: "direct main"
description:
name: bot_toast
sha256: db6950851aab00ef04b386eb3c76c83739eaffcb6b80d0dc42a675ef7584623b
sha256: "6b93030a99a98335b8827ecd83021e92e885ffc61d261d3825ffdecdd17f3bdf"
url: "https://pub.dev"
source: hosted
version: "4.0.4"
version: "4.1.3"
cached_network_image:
dependency: "direct main"
description:
name: cached_network_image
sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15
sha256: f98972704692ba679db144261172a8e20feb145636c617af0eb4022132a6797f
url: "https://pub.dev"
source: hosted
version: "3.2.3"
version: "3.3.0"
cached_network_image_platform_interface:
dependency: transitive
description:
name: cached_network_image_platform_interface
sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7
sha256: "56aa42a7a01e3c9db8456d9f3f999931f1e05535b5a424271e9a38cabf066613"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
version: "3.0.0"
cached_network_image_web:
dependency: transitive
description:
name: cached_network_image_web
sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0
sha256: "759b9a9f8f6ccbb66c185df805fac107f05730b1dab9c64626d1008cca532257"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
version: "1.1.0"
carousel_slider:
dependency: "direct main"
description:
@ -230,10 +230,10 @@ packages:
dependency: transitive
description:
name: file_selector_macos
sha256: "182c3f8350cee659f7b115e956047ee3dc672a96665883a545e81581b9a82c72"
sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6
url: "https://pub.dev"
source: hosted
version: "0.9.3+2"
version: "0.9.3+3"
file_selector_platform_interface:
dependency: transitive
description:
@ -254,10 +254,10 @@ packages:
dependency: "direct main"
description:
name: firebase_core
sha256: c78132175edda4bc532a71e01a32964e4b4fcf53de7853a422d96dac3725f389
sha256: "95580fa07c8ca3072a2bb1fecd792616a33f8683477d25b7d29d3a6a399e6ece"
url: "https://pub.dev"
source: hosted
version: "2.15.1"
version: "2.17.0"
firebase_core_platform_interface:
dependency: transitive
description:
@ -270,34 +270,34 @@ packages:
dependency: transitive
description:
name: firebase_core_web
sha256: "4cf4d2161530332ddc3c562f19823fb897ff37a9a774090d28df99f47370e973"
sha256: e8c408923cd3a25bd342c576a114f2126769cd1a57106a4edeaa67ea4a84e962
url: "https://pub.dev"
source: hosted
version: "2.7.0"
version: "2.8.0"
firebase_messaging:
dependency: "direct main"
description:
name: firebase_messaging
sha256: "6c1a2a047d6f165b7c5f947467ac5138731a2af82c7af1c12d691dbb834f6b73"
sha256: "67f9d7c87457e71ad78ee81e332f232b8a24f7d5e338f8c958fa7d6e9e0e3636"
url: "https://pub.dev"
source: hosted
version: "14.6.7"
version: "14.6.9"
firebase_messaging_platform_interface:
dependency: transitive
description:
name: firebase_messaging_platform_interface
sha256: bcba58d28f8cda607a323240c6d314c2c62b62ebfbb0f2d704ebefef07b52b5f
sha256: "8c7ced3201886ad7ba37f344c1468ccfc08abb3023922e0e5a016eaf38abb96c"
url: "https://pub.dev"
source: hosted
version: "4.5.6"
version: "4.5.8"
firebase_messaging_web:
dependency: transitive
description:
name: firebase_messaging_web
sha256: "962d09ec9dfa486cbbc218258ad41e8ec7997a2eba46919049496e1cafd960c5"
sha256: b601322bdb44e2fefe4cc7b85ef0dbb7a2479d4a7653a51340821cf8d60696b5
url: "https://pub.dev"
source: hosted
version: "3.5.6"
version: "3.5.8"
fl_chart:
dependency: "direct main"
description:
@ -311,14 +311,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_blurhash:
dependency: transitive
description:
name: flutter_blurhash
sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6"
url: "https://pub.dev"
source: hosted
version: "0.7.0"
flutter_cache_manager:
dependency: transitive
description:
@ -522,18 +514,18 @@ packages:
dependency: transitive
description:
name: image_picker_android
sha256: d32a997bcc4ee135aebca8e272b7c517927aa65a74b9c60a81a2764ef1a0462d
sha256: "0c7b83bbe2980c8a8e36e974f055e11e51675784e13a4762889feed0f3937ff2"
url: "https://pub.dev"
source: hosted
version: "0.8.7+5"
version: "0.8.8+1"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
sha256: "869fe8a64771b7afbc99fc433a5f7be2fea4d1cb3d7c11a48b6b579eb9c797f0"
sha256: "50bc9ae6a77eea3a8b11af5eb6c661eeb858fdd2f734c2a4fd17086922347ef7"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
version: "3.0.1"
image_picker_ios:
dependency: transitive
description:
@ -658,10 +650,10 @@ packages:
dependency: transitive
description:
name: octo_image
sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143"
sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
version: "2.0.0"
path:
dependency: transitive
description:
@ -730,18 +722,18 @@ packages:
dependency: "direct main"
description:
name: permission_handler
sha256: "63e5216aae014a72fe9579ccd027323395ce7a98271d9defa9d57320d001af81"
sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8"
url: "https://pub.dev"
source: hosted
version: "10.4.3"
version: "11.0.1"
permission_handler_android:
dependency: transitive
description:
name: permission_handler_android
sha256: d74e77a5ecd38649905db0a7d05ef16bed42ff263b9efb73ed794317c5764ec3
sha256: ace7d15a3d1a4a0b91c041d01e5405df221edb9de9116525efc773c74e6fc790
url: "https://pub.dev"
source: hosted
version: "10.3.4"
version: "11.0.5"
permission_handler_apple:
dependency: transitive
description:
@ -754,10 +746,10 @@ packages:
dependency: transitive
description:
name: permission_handler_platform_interface
sha256: "7c6b1500385dd1d2ca61bb89e2488ca178e274a69144d26bbd65e33eae7c02a9"
sha256: f2343e9fa9c22ae4fd92d4732755bfe452214e7189afcc097380950cf567b4b2
url: "https://pub.dev"
source: hosted
version: "3.11.3"
version: "3.11.5"
permission_handler_windows:
dependency: transitive
description:
@ -874,18 +866,18 @@ packages:
dependency: "direct main"
description:
name: rive
sha256: b7780ebdc56320da1f02a39a18f050a6079cad60c0cb92003c0801cc4eec6673
sha256: f2117a96a189758bc79bf7933865625c7a44a420ae537d2a8f6c492900136a71
url: "https://pub.dev"
source: hosted
version: "0.11.14"
version: "0.11.17"
rive_common:
dependency: transitive
description:
name: rive_common
sha256: "1431b99c9f361234cc6fa9aee7987b20030622df25ff64343a4010f9446b275e"
sha256: e41f12917cb58e0c9376836490ebaa431e12744da0c67e19dad8d4bee9fedd46
url: "https://pub.dev"
source: hosted
version: "0.2.6"
version: "0.2.7"
rxdart:
dependency: transitive
description:
@ -991,10 +983,10 @@ packages:
dependency: "direct main"
description:
name: universal_html
sha256: a5cc5a84188e5d3e58f3ed77fe3dd4575dc1f68aa7c89e51b5b4105b9aab3b9d
sha256: "56536254004e24d9d8cfdb7dbbf09b74cf8df96729f38a2f5c238163e3d58971"
url: "https://pub.dev"
source: hosted
version: "2.2.3"
version: "2.2.4"
universal_io:
dependency: transitive
description:
@ -1167,34 +1159,34 @@ packages:
dependency: "direct main"
description:
name: webview_flutter
sha256: "82f6787d5df55907aa01e49bd9644f4ed1cc82af7a8257dd9947815959d2e755"
sha256: c1ab9b81090705c6069197d9fdc1625e587b52b8d70cdde2339d177ad0dbb98e
url: "https://pub.dev"
source: hosted
version: "4.2.4"
version: "4.4.1"
webview_flutter_android:
dependency: transitive
description:
name: webview_flutter_android
sha256: "0d8f5ac96a155e672129bf94c7abf625de01241d44d269dbaff083f1b4deb1aa"
sha256: b0cd33dd7d3dd8e5f664e11a19e17ba12c352647269921a3b568406b001f1dff
url: "https://pub.dev"
source: hosted
version: "3.9.5"
version: "3.12.0"
webview_flutter_platform_interface:
dependency: transitive
description:
name: webview_flutter_platform_interface
sha256: "9d32a63a5ee111b37482cb3eac3379b9f0992afd27a52ee30279dbf06f41918b"
sha256: "6d9213c65f1060116757a7c473247c60f3f7f332cac33dc417c9e362a9a13e4f"
url: "https://pub.dev"
source: hosted
version: "2.5.1"
version: "2.6.0"
webview_flutter_wkwebview:
dependency: transitive
description:
name: webview_flutter_wkwebview
sha256: d2f7241849582da80b79acb03bb936422412ce5c0c79fb5f6a1de5421a5aecc4
sha256: "30b9af6bdd457b44c08748b9190d23208b5165357cc2eb57914fee1366c42974"
url: "https://pub.dev"
source: hosted
version: "3.7.4"
version: "3.9.1"
win32:
dependency: transitive
description:

View File

@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 2.6.2+2024
version: 3.0.0+3000
environment:
sdk: ">=2.17.0 <3.0.0"
@ -62,7 +62,7 @@ dependencies:
firebase_core: ^2.3.0
webview_flutter: ^4.2.0
expandable_bottom_sheet: ^1.1.1+1
permission_handler: ^10.2.0
permission_handler: ^11.0.0
better_player:
git:
url: https://github.com/tintran-dev/betterplayer.git