bug fixes

This commit is contained in:
MohammadTaha Basiri 2022-04-17 13:37:57 +04:30
parent 27e44fb764
commit e865f15f70
6 changed files with 121 additions and 83 deletions

View File

@ -9,12 +9,18 @@ class ServerDataProvider {
await _getDirectTypes(); await _getDirectTypes();
} }
static int labelToTypeId(String label) => label.contains('پشتیبانی') static int labelToTypeId(String label) {
? 7 if (label.contains('پشتیبانی اپلیکیشن')) {
: directTypes return 8;
} else if (label.contains('پشتیبانی')) {
return 7;
} else {
return directTypes
.firstWhereOrNull((element) => element.value.contains(label)) .firstWhereOrNull((element) => element.value.contains(label))
?.key ?? ?.key ??
7; 7;
}
}
static Future<void> _getDirectTypes() async { static Future<void> _getDirectTypes() async {
final service = RequestService(RequestHelper.directTypes); final service = RequestService(RequestHelper.directTypes);

View File

@ -14,7 +14,8 @@ class MediaService {
static StudioDetailsData? currentPodcast; static StudioDetailsData? currentPodcast;
static StudioRequestArgs? podcastPlaylistArgs; static StudioRequestArgs? podcastPlaylistArgs;
static Duration? get duration => audioPlayer.current.value?.audio.duration; static Duration? get duration =>
audioPlayer.current.valueOrNull?.audio.duration;
static Future<void> handleAudioPlayback({ static Future<void> handleAudioPlayback({
required dynamic audioSource, required dynamic audioSource,

View File

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/requests/news.dart'; import 'package:didvan/models/requests/news.dart';
import 'package:didvan/models/view/action_sheet_data.dart'; import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/utils/action_sheet.dart'; import 'package:didvan/utils/action_sheet.dart';
@ -10,7 +11,8 @@ import 'package:didvan/views/home/widgets/logo_app_bar.dart';
import 'package:didvan/views/home/widgets/overview/news.dart'; import 'package:didvan/views/home/widgets/overview/news.dart';
import 'package:didvan/views/home/widgets/search_field.dart'; import 'package:didvan/views/home/widgets/search_field.dart';
import 'package:didvan/views/widgets/item_title.dart'; import 'package:didvan/views/widgets/item_title.dart';
import 'package:didvan/views/widgets/state_handlers/state_handler.dart'; import 'package:didvan/views/widgets/state_handlers/empty_result.dart';
import 'package:didvan/views/widgets/state_handlers/sliver_state_handler.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -32,62 +34,58 @@ class _NewsState extends State<News> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<NewsState>( final state = context.watch<NewsState>();
builder: (context, state, child) => StateHandler<NewsState>( return CustomScrollView(
slivers: [
const SliverToBoxAdapter(child: LogoAppBar()),
if (state.appState != AppState.failed)
SliverPadding(
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
sliver: SliverToBoxAdapter(
child: SearchField(
focusNode: _focusNode,
title: 'اخبار',
onChanged: _onChanged,
onFilterButtonPressed: _showFilterBottomSheet,
isFiltered: state.isFiltering,
),
),
),
SliverStateHandler<NewsState>(
centerEmptyState: false,
onRetry: () => state.getNews(page: state.page), onRetry: () => state.getNews(page: state.page),
state: state, state: state,
builder: (context, state) => ListView.builder( builder: (context, state, index) {
cacheExtent: 1500, index += 2;
itemBuilder: (context, index) { if (index % 15 == 0 && state.lastPage != state.page) {
if (index == 0) { state.getNews(page: state.page + 1);
return const LogoAppBar(); }
} index -= 2;
if (index == 1) { if (index >= state.news.length) {
return Padding( return NewsOverview.placeholder;
padding: const EdgeInsets.only( }
left: 16, final news = state.news[index];
right: 16, return NewsOverview(
bottom: 16, news: news,
), onMarkChanged: state.onMarkChanged,
child: SearchField( newsRequestArgs: NewsRequestArgs(
focusNode: _focusNode, page: state.page,
title: 'اخبار', endDate: state.endDate,
onChanged: _onChanged, startDate: state.startDate,
onFilterButtonPressed: _showFilterBottomSheet, search: state.search,
isFiltered: state.isFiltering, ),
), );
); },
} enableEmptyState: state.news.isEmpty,
index -= 2; emptyState: EmptyResult(
index += 2; onNewSearch: () => _focusNode.requestFocus(),
if (index % 15 == 0 && state.lastPage != state.page) { ),
state.getNews(page: state.page + 1); childCount:
} state.news.length + (state.lastPage == state.page ? 0 : 3),
index -= 2; itemPadding: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
if (index >= state.news.length) { placeholder: NewsOverview.placeholder,
return NewsOverview.placeholder; ),
} ],
final news = state.news[index];
return Padding(
padding: const EdgeInsets.only(
left: 16,
right: 16,
bottom: 16,
),
child: NewsOverview(
news: news,
onMarkChanged: state.onMarkChanged,
newsRequestArgs: NewsRequestArgs(
page: state.page,
endDate: state.endDate,
startDate: state.startDate,
search: state.search,
),
),
);
},
itemCount: state.news.length + 2,
)),
); );
} }

View File

@ -94,7 +94,10 @@ class Settings extends StatelessWidget {
icon: DidvanIcons.support_regular, icon: DidvanIcons.support_regular,
title: 'پیام به پشتیبانی', title: 'پیام به پشتیبانی',
onTap: () { onTap: () {
launch('mailto:info@didvan.app'); Navigator.of(context).pushNamed(
Routes.direct,
arguments: {'type': 'پشتیبانی اپلیکیشن'},
);
}, },
), ),
const DidvanDivider(), const DidvanDivider(),

View File

@ -108,28 +108,57 @@ class StatisticOverview extends StatelessWidget {
); );
} }
static Widget get placeHolder => DidvanCard( static Widget get placeHolder => Column(
child: Column( children: [
children: [ DidvanCard(
const SizedBox(height: 4), child: Column(
Row( children: [
children: const [ const SizedBox(height: 4),
ShimmerPlaceholder(width: 80, height: 16), Row(
Spacer(), children: const [
ShimmerPlaceholder(width: 50, height: 14), ShimmerPlaceholder(width: 80, height: 16),
SizedBox(width: 8), Spacer(),
ShimmerPlaceholder(width: 50, height: 16), ShimmerPlaceholder(width: 50, height: 14),
SizedBox(width: 8),
ShimmerPlaceholder(width: 50, height: 16),
],
),
const SizedBox(height: 16),
Row(
children: const [
ShimmerPlaceholder(width: 150, height: 12),
Spacer(),
ShimmerPlaceholder(width: 80, height: 12),
],
),
], ],
), ),
const SizedBox(height: 16), ),
Row( const SizedBox(height: 20),
children: const [ DidvanCard(
ShimmerPlaceholder(width: 150, height: 12), child: Column(
Spacer(), children: [
ShimmerPlaceholder(width: 80, height: 12), const SizedBox(height: 4),
Row(
children: const [
ShimmerPlaceholder(width: 80, height: 16),
Spacer(),
ShimmerPlaceholder(width: 50, height: 14),
SizedBox(width: 8),
ShimmerPlaceholder(width: 50, height: 16),
],
),
const SizedBox(height: 16),
Row(
children: const [
ShimmerPlaceholder(width: 150, height: 12),
Spacer(),
ShimmerPlaceholder(width: 80, height: 12),
],
),
], ],
), ),
], ),
), ],
); );
} }

View File

@ -13,6 +13,7 @@ class SliverStateHandler<T extends CoreProvier> extends SliverList {
final Widget? placeholder; final Widget? placeholder;
final EdgeInsets? itemPadding; final EdgeInsets? itemPadding;
final bool centerEmptyState; final bool centerEmptyState;
final bool hasConstraints;
SliverStateHandler({ SliverStateHandler({
Key? key, Key? key,
required this.state, required this.state,
@ -24,14 +25,16 @@ class SliverStateHandler<T extends CoreProvier> extends SliverList {
this.emptyState, this.emptyState,
this.enableEmptyState = false, this.enableEmptyState = false,
this.centerEmptyState = true, this.centerEmptyState = true,
this.hasConstraints = false,
}) : super( }) : super(
key: key, key: key,
delegate: SliverChildBuilderDelegate( delegate: SliverChildBuilderDelegate(
(context, index) { (context, index) {
final deviceHight = MediaQuery.of(context).size.height;
if (state.appState == AppState.failed) { if (state.appState == AppState.failed) {
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: centerEmptyState ? 120 : 20, top: centerEmptyState ? deviceHight / 4 : deviceHight / 8,
bottom: 20, bottom: 20,
), ),
child: EmptyConnection(onRetry: onRetry), child: EmptyConnection(onRetry: onRetry),
@ -40,9 +43,7 @@ class SliverStateHandler<T extends CoreProvier> extends SliverList {
if (enableEmptyState && state.appState == AppState.idle) { if (enableEmptyState && state.appState == AppState.idle) {
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: centerEmptyState top: centerEmptyState ? deviceHight / 4 : deviceHight / 8,
? MediaQuery.of(context).size.height / 4
: 20,
bottom: 20, bottom: 20,
), ),
child: emptyState, child: emptyState,