didvan-app/lib/views/home/search/widgets/search_result_item.dart

194 lines
6.1 KiB
Dart

import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/overview_data.dart';
import 'package:didvan/models/requests/news.dart';
import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/services/media/media.dart';
import 'package:didvan/services/network/request.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';
import 'package:didvan/views/widgets/skeleton_image.dart';
import 'package:flutter/material.dart';
import 'package:persian_number_utility/persian_number_utility.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher_string.dart';
class SearchResultItem extends StatelessWidget {
final OverviewData item;
const SearchResultItem({
Key? key,
required this.item,
}) : super(key: key);
get _targetPageArgs {
if (item.type == 'radar') {
return const RadarRequestArgs(page: 0);
}
if (item.type == 'news') {
return const NewsRequestArgs(page: 0);
}
return StudioRequestArgs(page: 0, type: item.type);
}
String? get _targetPageRouteName {
if (item.type == 'radar') {
return Routes.radarDetails;
}
if (item.type == 'news') {
return Routes.newsDetails;
}
if (item.type == 'podcast') {
return Routes.podcasts;
}
if (item.type == 'video') {
return Routes.videocasts;
}
return null;
}
IconData get _icon {
if (item.type == 'radar') {
return DidvanIcons.scanning_light;
}
if (item.type == 'news') {
return DidvanIcons.foolad_light;
}
if (item.type == 'video') {
return DidvanIcons.video_light;
}
if (item.type == 'podcast') {
return DidvanIcons.podcast_light;
}
if (item.type == 'delphi') {
return DidvanIcons.saha_light;
}
return DidvanIcons.radar_light;
}
@override
Widget build(BuildContext context) {
return DidvanCard(
onTap: () async {
if (item.type == 'podcast') {
final state = context.read<StudioDetailsState>();
await state.getStudioDetails(
item.id,
args: const StudioRequestArgs(page: 0, type: 'podcast'),
);
MediaService.currentPodcast = state.studio;
MediaService.handleAudioPlayback(
audioSource: item.link,
id: item.id,
isNetworkAudio: true,
isVoiceMessage: false,
);
return;
}
if (_targetPageRouteName == null && item.link != null) {
launchUrlString(
'${item.link!}?accessToken=${RequestService.token}',
mode: LaunchMode.inAppWebView,
);
return;
}
Navigator.of(context).pushNamed(
_targetPageRouteName!,
arguments: {
'id': item.id,
'args': _targetPageArgs,
},
);
},
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Stack(
children: [
SkeletonImage(imageUrl: item.image, height: 80, width: 80),
Container(
padding:
const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.secondary,
borderRadius: const BorderRadius.horizontal(
left: Radius.circular(10),
),
),
child: Icon(
_icon,
color: Theme.of(context).colorScheme.white,
size: 18,
),
),
],
),
const SizedBox(width: 8),
Expanded(
child: SizedBox(
height: 80,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
DidvanText(
item.title,
style: Theme.of(context).textTheme.bodyLarge,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
Row(
children: [
const Icon(
DidvanIcons.calendar_day_light,
size: 18,
),
const SizedBox(width: 4),
DidvanText(
DateTime.parse(item.createdAt).toPersianDateStr(),
style: Theme.of(context).textTheme.labelSmall,
),
const Spacer(),
],
),
],
),
),
),
],
),
],
),
);
}
static Widget get placeholder => const DidvanCard(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ShimmerPlaceholder(height: 80, width: 80),
SizedBox(width: 8),
SizedBox(
height: 80,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ShimmerPlaceholder(height: 18, width: 150),
SizedBox(height: 8),
ShimmerPlaceholder(height: 18, width: 100),
Spacer(),
ShimmerPlaceholder(height: 14, width: 80),
],
),
),
],
),
);
}