didvan-app/lib/views/home/explore/explore.dart

1172 lines
43 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/main.dart';
import 'package:didvan/models/home_page_content/home_page_list.dart';
import 'package:didvan/models/home_page_content/swot.dart';
import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/views/home/main/main_page_state.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:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart';
import 'package:didvan/services/network/request.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:didvan/views/home/main/widgets/swot_item_card.dart';
import 'package:flutter/foundation.dart' show kIsWeb, defaultTargetPlatform;
import 'package:universal_html/html.dart' as html;
import 'package:didvan/views/widgets/home_app_bar.dart';
import 'package:didvan/views/widgets/skeleton_image.dart';
import 'package:persian_number_utility/persian_number_utility.dart';
import 'package:didvan/views/widgets/text_divider.dart';
bool isAnyMobile() {
if (kIsWeb) {
final userAgent = html.window.navigator.userAgent.toLowerCase();
return userAgent.contains('mobile') ||
userAgent.contains('android') ||
userAgent.contains('ios');
}
return defaultTargetPlatform == TargetPlatform.android ||
defaultTargetPlatform == TargetPlatform.iOS;
}
class ExplorePage extends StatelessWidget {
const ExplorePage({super.key});
@override
Widget build(BuildContext context) {
return Consumer<MainPageState>(
builder: (context, state, child) {
return StateHandler<MainPageState>(
onRetry: () => context.read<MainPageState>().init(),
state: state,
builder: (context, state) {
final List<Widget> pageContent = [];
pageContent.add(const StaggeredEntry(
index: 0,
child: HomeAppBar(
showSearchField: true,
),
));
if (state.content != null && state.content!.lists.isNotEmpty) {
final List<MainPageList> lists = List.from(state.content!.lists);
MainPageList? trendItem, riskItem, startupItem, techItem;
try {
trendItem = lists.firstWhere((e) => e.type == 'trend');
} catch (_) {}
try {
riskItem = lists.firstWhere((e) => e.type == 'risk');
} catch (_) {}
try {
startupItem = lists.firstWhere((e) => e.type == 'startup');
} catch (_) {}
try {
techItem = lists.firstWhere((e) => e.type == 'technology');
} catch (_) {}
if (trendItem != null) {
lists.removeWhere((e) =>
e.type == 'risk' ||
e.type == 'startup' ||
e.type == 'technology');
final newTrendIndex = lists.indexOf(trendItem);
final itemsToInsert = <MainPageList>[];
if (riskItem != null) itemsToInsert.add(riskItem);
if (startupItem != null) itemsToInsert.add(startupItem);
if (techItem != null) itemsToInsert.add(techItem);
if (newTrendIndex != -1) {
lists.insertAll(newTrendIndex + 1, itemsToInsert);
}
}
for (int i = 0; i < lists.length; i++) {
final currentList = lists[i];
if (currentList.type == 'video' ||
currentList.type == 'podcast') {
continue;
}
pageContent.add(StaggeredEntry(
index: pageContent.length,
child: MainPageSection(
list: currentList,
isLast: i == lists.length - 1,
),
));
if (currentList.type == 'radar') {
pageContent.add(StaggeredEntry(
index: pageContent.length,
child: const Column(
children: [
SizedBox(
height: 10,
),
TextDivider(text: 'رادارهای استراتژیک'),
],
),
));
}
if (currentList.type == 'technology') {
pageContent.add(StaggeredEntry(
index: pageContent.length,
child: SwotSection(swotItems: state.swotItems),
));
if (lists.any((e) => e.type == 'survey')) {
pageContent.add(StaggeredEntry(
index: pageContent.length,
child: const Column(
children: [
SizedBox(height: 10),
TextDivider(text: 'سامانه هم‌اندیشی آنلاین'),
],
),
));
}
} else if (currentList.type == 'startup' && techItem == null) {
pageContent.add(StaggeredEntry(
index: pageContent.length,
child: SwotSection(swotItems: state.swotItems),
));
if (lists.any((e) => e.type == 'survey')) {
pageContent.add(StaggeredEntry(
index: pageContent.length,
child: const Column(
children: [
SizedBox(height: 10),
TextDivider(text: 'سامانه هم‌اندیشی آنلاین'),
],
),
));
}
}
}
}
return ListView(
padding: const EdgeInsets.only(bottom: 30),
children: pageContent,
);
},
);
},
);
}
}
class StaggeredEntry extends StatefulWidget {
final Widget child;
final int index;
final Duration duration;
final double verticalOffset;
const StaggeredEntry({
super.key,
required this.child,
required this.index,
this.duration = const Duration(milliseconds: 500),
this.verticalOffset = 50.0,
});
@override
State<StaggeredEntry> createState() => _StaggeredEntryState();
}
class _StaggeredEntryState extends State<StaggeredEntry>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _fadeAnimation;
late Animation<Offset> _slideAnimation;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: widget.duration,
);
_fadeAnimation = CurvedAnimation(
parent: _controller,
curve: Curves.easeOut,
);
_slideAnimation = Tween<Offset>(
begin: Offset(0, widget.verticalOffset / 100),
end: Offset.zero,
).animate(CurvedAnimation(
parent: _controller,
curve: Curves.easeOutCubic,
));
final delay = (widget.index * 100).clamp(0, 1000);
Future.delayed(Duration(milliseconds: delay), () {
if (mounted) {
_controller.forward();
}
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return FadeTransition(
opacity: _fadeAnimation,
child: SlideTransition(
position: _slideAnimation,
child: widget.child,
),
);
}
}
class SwotSection extends StatelessWidget {
final List<SwotItem> swotItems;
const SwotSection({super.key, required this.swotItems});
@override
Widget build(BuildContext context) {
if (swotItems.isEmpty) {
return const SizedBox.shrink();
}
return Padding(
padding: const EdgeInsets.all(0.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
/// Title Row
Padding(
padding: const EdgeInsets.only(right: 20, top: 30),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
SvgPicture.asset(
"lib/assets/images/features/Saha Solid.svg",
color: Theme.of(context).colorScheme.title,
),
const SizedBox(width: 5),
DidvanText(
"باید ها و نباید ها",
style: Theme.of(context).textTheme.titleSmall,
color: const Color.fromARGB(255, 0, 89, 119),
),
],
),
GestureDetector(
onTap: () {
AppInitializer.openWebLink(
navigatorKey.currentContext!,
'http://opportunity-threat.didvan.com/?accessToken=${RequestService.token}',
mode: LaunchMode.inAppWebView,
);
},
child: Padding(
padding: const EdgeInsets.only(left: 20),
child: Row(
children: [
DidvanText(
"مشاهده همه",
color: Theme.of(context).colorScheme.primary,
fontWeight: FontWeight.bold,
),
],
),
),
),
],
),
),
const SizedBox(height: 16),
/// Swot Items Slider
DidvanSlider(
height: 200,
itemCount: swotItems.length,
viewportFraction: isAnyMobile() ? 0.80 : 0.75,
itemBuilder: (context, index, realIndex) => Padding(
padding: const EdgeInsets.symmetric(horizontal: 0.0),
child: Padding(
padding: const EdgeInsets.all(5.0),
child: SwotItemCard(item: swotItems[index]),
),
),
),
const SizedBox(height: 16),
],
),
);
}
}
class MainPageSection extends StatelessWidget {
final MainPageList list;
final bool isLast;
const MainPageSection({super.key, required this.list, required this.isLast});
void _moreHandler(BuildContext context) {
if (list.link.startsWith('http')) {
AppInitializer.openWebLink(
context,
'${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;
case 'trend':
return DidvanIcons.chart_solid;
case 'technology':
return DidvanIcons.technology_solid;
case 'risk':
return DidvanIcons.exclamation_triangle_solid;
case 'startup':
return DidvanIcons.startup_solid;
case 'survey':
return DidvanIcons.saha_solid;
default:
return null;
}
}
double _calculateSliderHeight() {
switch (list.type) {
case 'news':
return 225;
case 'radar':
return 225;
case 'trend':
return 150;
case 'technology':
return 230;
case 'risk':
return 225;
case 'startup':
return 145;
case 'delphi':
return 220;
default:
return 220;
}
}
double _calculateFixedViewportFraction(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
double targetWidth;
switch (list.type) {
case 'news':
targetWidth = 265.0;
break;
case 'radar':
targetWidth = 310.0;
break;
case 'trend':
targetWidth = 350.0;
break;
case 'technology':
targetWidth = 250.0;
break;
case 'risk':
targetWidth = 310.0;
break;
case 'startup':
targetWidth = 360.0;
break;
case 'delphi':
targetWidth = 250.0;
break;
default:
targetWidth = 250.0;
}
return (targetWidth / screenWidth).clamp(0.1, 1.0);
}
@override
Widget build(BuildContext context) {
final icon = _generateIcon();
if (list.contents.isEmpty) {
return const SizedBox();
}
return Column(
children: [
_buildSectionHeader(context, icon),
_buildSectionSlider(context),
],
);
}
Padding _buildSectionHeader(BuildContext context, IconData? icon) {
String headerText = list.header;
if (list.type == 'news') {
headerText = 'دنیای فولاد';
}
if (list.type == 'radar') {
headerText = 'پویش افق';
}
if (list.type == 'survey') {
headerText = 'سها';
}
return 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,
color: Theme.of(context).colorScheme.title,
),
const SizedBox(width: 4),
DidvanText(
headerText,
style:
const TextStyle(fontSize: 17, fontWeight: FontWeight.w500),
color: const Color.fromARGB(255, 0, 89, 119),
),
],
),
GestureDetector(
onTap: () => _moreHandler(context),
child: Row(
children: [
DidvanText(
"مشاهده همه",
color: Theme.of(context).colorScheme.primary,
fontWeight: FontWeight.bold,
),
],
),
)
],
),
);
}
Widget _buildSectionSlider(BuildContext context) {
if (list.type == 'podcast') {
return 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(),
),
);
}
return DidvanSlider(
key: ValueKey('${list.type}_slider'),
height: _calculateSliderHeight(),
viewportFraction: _calculateFixedViewportFraction(context),
itemCount: list.contents.length,
itemBuilder: (context, index, realIndex) {
Widget cardContent;
final item = list.contents[index];
switch (list.type) {
case 'news':
cardContent = GestureDetector(
key: ValueKey('news_$index'),
onTap: () => context.read<MainPageState>().navigationHandler(
list.type,
item.id,
item.link,
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 4),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: const Color.fromARGB(255, 184, 184, 184),
width: 1),
),
clipBehavior: Clip.antiAlias,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SkeletonImage(
imageUrl: item.image,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(12),
topRight: Radius.circular(12),
bottomLeft: Radius.circular(0),
bottomRight: Radius.circular(0)),
height: 120,
),
Padding(
padding: const EdgeInsets.fromLTRB(12, 20, 12, 10),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.title,
textAlign: TextAlign.start,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
const SizedBox(
height: 15,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SvgPicture.asset(
'lib/assets/icons/calendar.svg'),
const SizedBox(
width: 5,
),
Text(
DateTime.parse(item.subtitles.first)
.toPersianDateStr(),
style: const TextStyle(
color: Color.fromARGB(255, 102, 102, 102),
fontSize: 12),
),
],
)
],
),
),
],
),
),
),
);
break;
case 'radar':
cardContent = GestureDetector(
key: ValueKey('radar_$index'),
onTap: () => context.read<MainPageState>().navigationHandler(
list.type,
item.id,
item.link,
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 4),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
border: Border.all(
color: const Color.fromARGB(255, 184, 184, 184))),
clipBehavior: Clip.antiAlias,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Padding(
padding: const EdgeInsets.all(9.5),
child: Column(
children: [
Row(
children: [
SvgPicture.asset(
'lib/assets/icons/Pouyesh Ofogh.svg'),
const SizedBox(
width: 5,
),
Expanded(
child: Text(
item.title,
textAlign: TextAlign.start,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
],
),
const SizedBox(
height: 12,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SvgPicture.asset(
'lib/assets/icons/calendar.svg'),
const SizedBox(
width: 5,
),
Text(
DateTime.parse(item.subtitles.first)
.toPersianDateStr(),
style: const TextStyle(
color: Color.fromARGB(255, 102, 102, 102),
fontSize: 12),
),
],
),
],
),
),
const SizedBox(
height: 5,
),
SkeletonImage(
imageUrl: item.image,
height: 130,
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(16),
bottomRight: Radius.circular(16),
topRight: Radius.circular(0),
topLeft: Radius.circular(0)),
),
],
),
),
),
);
break;
case 'trend':
cardContent = GestureDetector(
key: ValueKey('trend_$index'),
onTap: () {
if (item.link.startsWith('http')) {
AppInitializer.openWebLink(
context,
'${item.link}?accessToken=${RequestService.token}',
mode: LaunchMode.inAppWebView,
);
} else {
context.read<MainPageState>().navigationHandler(
list.type,
item.id,
item.link,
);
}
},
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 4),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: const Color.fromARGB(255, 184, 184, 184),
width: 1),
),
clipBehavior: Clip.antiAlias,
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
item.title,
textAlign: TextAlign.start,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold),
maxLines: 3,
overflow: TextOverflow.ellipsis,
),
const SizedBox(
height: 10,
),
Row(
children: [
SvgPicture.asset(
'lib/assets/icons/ion_extension-puzzle-outline.svg'),
const SizedBox(
width: 5,
),
Text(
item.subtitles.last,
style: const TextStyle(
color:
Color.fromARGB(255, 102, 102, 102)),
),
],
)
],
),
),
),
SizedBox(
width: 150,
child: SkeletonImage(
imageUrl: item.image,
height: 10,
width: 150,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16),
bottomLeft: Radius.circular(16),
topRight: Radius.circular(0),
bottomRight: Radius.circular(0)),
),
),
],
),
),
);
break;
case 'technology':
cardContent = GestureDetector(
key: ValueKey('technology_$index'),
onTap: () {
if (item.link.startsWith('http')) {
AppInitializer.openWebLink(
context,
'${item.link}?accessToken=${RequestService.token}',
mode: LaunchMode.inAppWebView,
);
} else {
context.read<MainPageState>().navigationHandler(
list.type,
item.id,
item.link,
);
}
},
child: Padding(
padding: const EdgeInsets.all(5.0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 4),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: const Color.fromARGB(255, 184, 184, 184),
width: 1),
),
clipBehavior: Clip.antiAlias,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SkeletonImage(
imageUrl: item.image,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(12),
topRight: Radius.circular(12),
bottomLeft: Radius.circular(0),
bottomRight: Radius.circular(0)),
height: 110,
),
Padding(
padding: const EdgeInsets.fromLTRB(12, 20, 12, 10),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.title,
textAlign: TextAlign.start,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
const SizedBox(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SvgPicture.asset(
'lib/assets/icons/ion_extension-puzzle-outline.svg'),
const SizedBox(
width: 5,
),
Text(item.subtitles.first)
],
)
],
),
),
],
),
),
),
);
break;
case 'risk':
cardContent = GestureDetector(
key: ValueKey('risk_$index'),
onTap: () {
if (item.link.startsWith('http')) {
AppInitializer.openWebLink(
context,
'${item.link}?accessToken=${RequestService.token}',
mode: LaunchMode.inAppWebView,
);
} else {
context.read<MainPageState>().navigationHandler(
list.type,
item.id,
item.link,
);
}
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 4),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
border: Border.all(
color: const Color.fromARGB(255, 184, 184, 184))),
clipBehavior: Clip.antiAlias,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Padding(
padding: const EdgeInsets.all(9.5),
child: Column(
children: [
Row(
children: [
Expanded(
child: Text(
item.title,
textAlign: TextAlign.start,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
],
),
const SizedBox(
height: 13,
),
const Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: 19,
)
],
),
],
),
),
const SizedBox(
height: 5,
),
SkeletonImage(
imageUrl: item.image,
height: 130,
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(16),
bottomRight: Radius.circular(16),
topRight: Radius.circular(0),
topLeft: Radius.circular(0)),
),
],
),
),
));
break;
case 'startup':
cardContent = GestureDetector(
key: ValueKey('startup_$index'),
onTap: () {
if (item.link.startsWith('http')) {
AppInitializer.openWebLink(
context,
'${item.link}?accessToken=${RequestService.token}',
mode: LaunchMode.inAppWebView,
);
} else {
context.read<MainPageState>().navigationHandler(
list.type,
item.id,
item.link,
);
}
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 4),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: const Color.fromARGB(255, 184, 184, 184),
width: 1),
),
clipBehavior: Clip.antiAlias,
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SizedBox(
width: 150,
child: SkeletonImage(
imageUrl: item.image,
height: 10,
width: 150,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(0),
bottomLeft: Radius.circular(0),
topRight: Radius.circular(16),
bottomRight: Radius.circular(16)),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
item.title,
textAlign: TextAlign.start,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold),
maxLines: 3,
overflow: TextOverflow.ellipsis,
),
const SizedBox(
height: 10,
),
Column(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
SvgPicture.asset(
'lib/assets/icons/location.svg'),
const SizedBox(
width: 5,
),
Text(
item.subtitles.first,
style: const TextStyle(
color: Color.fromARGB(
255, 102, 102, 102)),
),
],
),
const SizedBox(
height: 10,
),
Container(
decoration: const BoxDecoration(
color: Color.fromARGB(255, 235, 235, 235),
borderRadius:
BorderRadius.all(Radius.circular(8)),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
item.subtitles.last,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
color: Color.fromARGB(
255, 102, 102, 102),
fontSize: 12),
),
),
)
],
)
],
),
),
),
],
),
),
),
);
break;
case 'delphi':
cardContent = GestureDetector(
key: ValueKey('delphi_$index'),
onTap: () {
if (item.link.startsWith('http')) {
AppInitializer.openWebLink(
context,
'${item.link}?accessToken=${RequestService.token}',
mode: LaunchMode.inAppWebView,
);
} else {
context.read<MainPageState>().navigationHandler(
list.type,
item.id,
item.link,
);
}
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 4),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: const Color.fromARGB(255, 184, 184, 184),
width: 1),
),
clipBehavior: Clip.antiAlias,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SkeletonImage(
imageUrl: item.image,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(12),
topRight: Radius.circular(12),
bottomLeft: Radius.circular(0),
bottomRight: Radius.circular(0)),
height: 135,
),
Padding(
padding: const EdgeInsets.fromLTRB(12, 15, 12, 15),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.title,
textAlign: TextAlign.start,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
],
),
),
],
),
),
),
);
break;
default:
cardContent = GestureDetector(
key: ValueKey('survey_$index'),
onTap: () => context.read<MainPageState>().navigationHandler(
list.type,
item.id,
item.link,
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 0),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 27, 60, 89),
borderRadius: BorderRadius.circular(12),
),
clipBehavior: Clip.antiAlias,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SkeletonImage(
imageUrl: item.image,
height: 165,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(12),
topRight: Radius.circular(12),
bottomLeft: Radius.circular(0),
bottomRight: Radius.circular(0)),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
item.title,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.white, fontWeight: FontWeight.bold),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
],
),
),
),
);
}
return cardContent;
},
);
}
}