bug fixes
This commit is contained in:
parent
27e44fb764
commit
e865f15f70
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,23 +34,14 @@ 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(
|
||||||
onRetry: () => state.getNews(page: state.page),
|
slivers: [
|
||||||
state: state,
|
const SliverToBoxAdapter(child: LogoAppBar()),
|
||||||
builder: (context, state) => ListView.builder(
|
if (state.appState != AppState.failed)
|
||||||
cacheExtent: 1500,
|
SliverPadding(
|
||||||
itemBuilder: (context, index) {
|
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
|
||||||
if (index == 0) {
|
sliver: SliverToBoxAdapter(
|
||||||
return const LogoAppBar();
|
|
||||||
}
|
|
||||||
if (index == 1) {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.only(
|
|
||||||
left: 16,
|
|
||||||
right: 16,
|
|
||||||
bottom: 16,
|
|
||||||
),
|
|
||||||
child: SearchField(
|
child: SearchField(
|
||||||
focusNode: _focusNode,
|
focusNode: _focusNode,
|
||||||
title: 'اخبار',
|
title: 'اخبار',
|
||||||
|
|
@ -56,9 +49,13 @@ class _NewsState extends State<News> {
|
||||||
onFilterButtonPressed: _showFilterBottomSheet,
|
onFilterButtonPressed: _showFilterBottomSheet,
|
||||||
isFiltered: state.isFiltering,
|
isFiltered: state.isFiltering,
|
||||||
),
|
),
|
||||||
);
|
),
|
||||||
}
|
),
|
||||||
index -= 2;
|
SliverStateHandler<NewsState>(
|
||||||
|
centerEmptyState: false,
|
||||||
|
onRetry: () => state.getNews(page: state.page),
|
||||||
|
state: state,
|
||||||
|
builder: (context, state, index) {
|
||||||
index += 2;
|
index += 2;
|
||||||
if (index % 15 == 0 && state.lastPage != state.page) {
|
if (index % 15 == 0 && state.lastPage != state.page) {
|
||||||
state.getNews(page: state.page + 1);
|
state.getNews(page: state.page + 1);
|
||||||
|
|
@ -68,13 +65,7 @@ class _NewsState extends State<News> {
|
||||||
return NewsOverview.placeholder;
|
return NewsOverview.placeholder;
|
||||||
}
|
}
|
||||||
final news = state.news[index];
|
final news = state.news[index];
|
||||||
return Padding(
|
return NewsOverview(
|
||||||
padding: const EdgeInsets.only(
|
|
||||||
left: 16,
|
|
||||||
right: 16,
|
|
||||||
bottom: 16,
|
|
||||||
),
|
|
||||||
child: NewsOverview(
|
|
||||||
news: news,
|
news: news,
|
||||||
onMarkChanged: state.onMarkChanged,
|
onMarkChanged: state.onMarkChanged,
|
||||||
newsRequestArgs: NewsRequestArgs(
|
newsRequestArgs: NewsRequestArgs(
|
||||||
|
|
@ -83,11 +74,18 @@ class _NewsState extends State<News> {
|
||||||
startDate: state.startDate,
|
startDate: state.startDate,
|
||||||
search: state.search,
|
search: state.search,
|
||||||
),
|
),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
itemCount: state.news.length + 2,
|
enableEmptyState: state.news.isEmpty,
|
||||||
)),
|
emptyState: EmptyResult(
|
||||||
|
onNewSearch: () => _focusNode.requestFocus(),
|
||||||
|
),
|
||||||
|
childCount:
|
||||||
|
state.news.length + (state.lastPage == state.page ? 0 : 3),
|
||||||
|
itemPadding: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
|
||||||
|
placeholder: NewsOverview.placeholder,
|
||||||
|
),
|
||||||
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,9 @@ class StatisticOverview extends StatelessWidget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Widget get placeHolder => DidvanCard(
|
static Widget get placeHolder => Column(
|
||||||
|
children: [
|
||||||
|
DidvanCard(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 4),
|
const SizedBox(height: 4),
|
||||||
|
|
@ -131,5 +133,32 @@ class StatisticOverview extends StatelessWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
DidvanCard(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
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),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue