didvan-app/lib/views/home/main/main_page.dart

250 lines
7.7 KiB
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/main/main_page_state.dart';
import 'package:didvan/views/home/main/widgets/banner.dart';
import 'package:didvan/views/home/main/widgets/general_item.dart';
import 'package:didvan/views/home/main/widgets/main_content.dart';
import 'package:didvan/views/home/main/widgets/podcast_item.dart';
import 'package:didvan/views/widgets/didvan/slider.dart';
import 'package:didvan/views/widgets/didvan/text.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_string.dart';
import 'package:didvan/services/network/request.dart';
class MainPage extends StatefulWidget {
const MainPage({super.key});
@override
State<MainPage> createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
@override
void initState() {
context.read<MainPageState>().init();
super.initState();
}
@override
Widget build(BuildContext context) {
return StateHandler<MainPageState>(
onRetry: context.read<MainPageState>().init,
state: context.watch<MainPageState>(),
builder: (context, state) => ListView.builder(
padding: const EdgeInsets.symmetric(vertical: 16),
itemBuilder: (context, index) {
if (index == 0) {
return const MainPageMainContent();
}
index--;
if (index == 4) {
return const Padding(
padding: EdgeInsets.only(top: 32),
child: MainPageBanner(
isFirst: false,
),
);
}
if (index > 3) {
index--;
}
final list = state.content.lists[index];
return _MainPageSection(
list: list,
isLast: index == state.content.lists.length - 1,
);
},
itemCount: state.content.lists.length + 2,
),
);
}
}
class _MainPageSection extends StatelessWidget {
final MainPageList list;
final bool isLast;
const _MainPageSection({required this.list, required this.isLast});
void _moreHandler(BuildContext context) {
if (list.link.startsWith('http')) {
launchUrlString(
'${list.link}?accessToken=${RequestService.token}',
mode: LaunchMode.inAppWebView,
);
return;
}
Navigator.of(context).pushNamed(list.link);
}
IconData? _generateIcon() {
switch (list.type) {
case 'news':
return DidvanIcons.foolad_solid;
case 'radar':
return DidvanIcons.scanning_solid;
case 'video':
return DidvanIcons.video_solid;
case 'podcast':
return DidvanIcons.podcast_solid;
default:
return null;
}
}
int _maxSublistCount() {
int max = 1;
for (var i = 0; i < list.contents.length; i++) {
if (list.contents[i].subtitles.length > max) {
max = list.contents[i].subtitles.length;
}
}
return max - 1;
}
@override
Widget build(BuildContext context) {
final icon = _generateIcon();
return Column(
children: [
Padding(
padding: const EdgeInsets.only(
left: 16,
right: 16,
bottom: 16,
top: 28,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
if (icon != null) Icon(icon),
const SizedBox(width: 4),
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,
)
],
),
)
],
),
),
if (list.type != 'podcast')
DidvanSlider(
height: 260 +
(_maxSublistCount() - (list.type == 'radar' ? 1 : 0)) * 20,
itemCount: list.contents.length,
viewportFraction: 0.65,
itemBuilder: (context, index, realIndex) => Padding(
padding: const EdgeInsets.symmetric(horizontal: 4),
child: MainPageGeneralItem(
content: list.contents[index],
type: list.type,
),
),
),
// if (list.type == 'radar')
// DidvanSlider(
// height: 260,
// itemCount: list.contents.length,
// viewportFraction: 0.65,
// itemBuilder: (context, index, realIndex) => Padding(
// padding: const EdgeInsets.symmetric(horizontal: 4),
// child: MainPageGeneralItem(
// content: list.contents[index],
// ),
// ),
// ),
// if (list.type == 'video')
// DidvanSlider(
// height: 260,
// itemCount: list.contents.length,
// viewportFraction: 0.65,
// itemBuilder: (context, index, realIndex) => Padding(
// padding: const EdgeInsets.symmetric(horizontal: 4),
// child: MainPageGeneralItem(
// content: list.contents[index],
// ),
// ),
// ),
if (list.type == 'podcast')
Padding(
padding: const EdgeInsets.only(top: 28),
child: Column(
children: list.contents
.map(
(e) => Padding(
padding: const EdgeInsets.only(
bottom: 12,
left: 28,
right: 28,
),
child: MainPagePodcastItem(
content: e,
),
),
)
.toList(),
),
),
// if (list.type != 'news' &&
// list.type != 'radar' &&
// list.type != 'video' &&
// list.type != 'podcast')
// DidvanSlider(
// itemBuilder: (context, index, realIndex) => Padding(
// padding: const EdgeInsets.symmetric(horizontal: 4),
// child: MainPageGeneralItem(
// content: list.contents[index],
// ),
// ),
// itemCount: list.contents.length,
// viewportFraction: 0.65,
// height: 260 + _maxSublistCount() * 20,
// ),
// if (!isLast) const _MainPageDivider(),
],
);
}
}
// class _MainPageDivider extends StatelessWidget {
// const _MainPageDivider();
// @override
// Widget build(BuildContext context) {
// return Container(
// height: 2,
// margin: const EdgeInsets.only(
// top: 8,
// left: 20,
// right: 20,
// ),
// width: double.infinity,
// decoration: BoxDecoration(
// borderRadius: DesignConfig.highBorderRadius,
// color: Theme.of(context).colorScheme.border,
// ),
// );
// }
// }