import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/models/new_statistic/new_statistics_model.dart'; import 'package:didvan/providers/theme.dart'; import 'package:didvan/providers/user.dart'; import 'package:didvan/routes/routes.dart'; import 'package:didvan/views/home/new_statistic/new_statistics_state.dart'; import 'package:didvan/views/home/new_statistic/widgets/statistic_cat.dart'; import 'package:didvan/views/widgets/didvan/card.dart'; import 'package:didvan/views/widgets/didvan/divider.dart'; import 'package:didvan/views/widgets/didvan/text.dart'; import 'package:didvan/views/widgets/shimmer_placeholder.dart'; import 'package:didvan/views/widgets/state_handlers/state_handler.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class NewStatistic extends StatefulWidget { const NewStatistic({super.key}); @override State createState() => _NewStatisticState(); } class _NewStatisticState extends State { @override void initState() { final state = context.read(); state.init(); context.read().addListener(state.refresh); super.initState(); } void _reset() { final state = context.read(); state.getStatistic(); } @override Widget build(BuildContext context) { return SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Center( child: Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16), color: Theme.of(context).colorScheme.background, child: DidvanText( 'دسته‌بندی‌های کلان', color: Theme.of(context).colorScheme.title, style: Theme.of(context).textTheme.titleMedium, ), ), ), const Padding( padding: EdgeInsets.symmetric( horizontal: 20, ), child: NewStatisticCategories(), ), const DidvanDivider( verticalPadding: 4, ), StateHandler( enableEmptyState: false, onRetry: context.read().init, state: context.watch(), placeholder: Padding( padding: const EdgeInsets.only(top: 48.0), child: Column( children: [ placeholder, const SizedBox( height: 46, ), placeholder, const SizedBox( height: 46, ), placeholder, const SizedBox( height: 46, ), placeholder, ], ), ), builder: (context, state) => Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ itemsInStatics( context, state, 0, DidvanIcons.star_circle_solid), itemsInStatics(context, state, 1, DidvanIcons.currency_solid), itemsInStatics(context, state, 2, DidvanIcons.bitcoin_solid), itemsInStatics(context, state, 3, DidvanIcons.metal_solid), itemsInStatics(context, state, 4, DidvanIcons.commodity_solid), itemsInStatics(context, state, 5, DidvanIcons.industry_solid, hasDivider: false), const SizedBox( height: 24, ), ], ), ), ], ), ); } Widget itemsInStatics( BuildContext context, NewStatisticState state, int id, IconData icon, {final bool? hasDivider}) { bool d = hasDivider ?? true; return state.contents[id].contents.isEmpty ? const SizedBox() : Padding( padding: const EdgeInsets.only(top: 12.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ GestureDetector( onTap: () => Future.delayed(Duration.zero, () { Navigator.of(context) .pushNamed(Routes.statGeneral, arguments: { "id": id == 0 ? 7 : id, "title": state.contents[id].header, }).then((value) => _reset()); }), child: StatHeader( header: state.contents[id].header, icon: icon, )), SizedBox( height: 100, width: 80, child: ListView.builder( scrollDirection: Axis.horizontal, shrinkWrap: true, physics: const BouncingScrollPhysics(), itemCount: state.contents[id].contents.length, itemBuilder: (context, index) => StatMainCard( id: id, statistic: state.contents[id].contents[index], ), ), ), const SizedBox( height: 4, ), if (d) const DidvanDivider( verticalPadding: 4, ), ], ), ); } static Widget get placeholder => const Column( children: [ Padding( padding: EdgeInsets.symmetric(horizontal: 8.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ ShimmerPlaceholder( height: 16, width: 100, ), ShimmerPlaceholder( height: 16, width: 50, ) ], ), ), SizedBox( height: 18, ), Flex( direction: Axis.horizontal, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Flexible( flex: 1, child: Padding( padding: EdgeInsets.symmetric(horizontal: 8.0), child: DidvanCard( child: ShimmerPlaceholder( height: 60, ), ), ), ), Flexible( flex: 1, child: Padding( padding: EdgeInsets.symmetric(horizontal: 8.0), child: DidvanCard( child: ShimmerPlaceholder( height: 60, ), ), ), ), Flexible( flex: 1, child: Padding( padding: EdgeInsets.symmetric(horizontal: 8.0), child: DidvanCard( child: ShimmerPlaceholder( height: 60, ), ), ), ), ], ), ], ); } class StatMainCard extends StatelessWidget { final Content statistic; final int? id; const StatMainCard({super.key, required this.statistic, this.id}); Color _diffColor(context) => statistic.data.dt == 'high' ? Theme.of(context).colorScheme.success : Theme.of(context).colorScheme.error; bool get _hasDiff => statistic.data.dp != 0; @override Widget build(BuildContext context) { final state = context.read(); return GestureDetector( onTap: () => id != 5 ? Navigator.of(context) .pushNamed(Routes.statisticDetails, arguments: { 'onMarkChanged': (value) => onMarkChanged(statistic.id, value), 'label': statistic.label, 'title': statistic.title, 'marked': statistic.marked, }).then( (value) => state.getStatistic(), ) : null, child: Padding( padding: const EdgeInsets.all(4.0), child: DidvanCard( padding: const EdgeInsets.symmetric(horizontal: 24), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ if (statistic.marked) Icon( Icons.star, color: Theme.of(context).colorScheme.yellow, size: 18, ), const SizedBox(width: 8), DidvanText( statistic.title, style: Theme.of(context).textTheme.bodyLarge, ), ], ), const SizedBox(height: 4), Row( children: [ DidvanText( statistic.data.p, style: Theme.of(context).textTheme.bodySmall, ), ], ), if (_hasDiff) const SizedBox(height: 4), if (_hasDiff) Row( children: [ if (_hasDiff) Icon( statistic.data.dt == 'high' ? DidvanIcons.angle_up_regular : DidvanIcons.angle_down_regular, size: 18, color: _diffColor(context), ), if (_hasDiff) const SizedBox(width: 4), if (_hasDiff) DidvanText( '${statistic.data.dp}%', style: Theme.of(context).textTheme.bodySmall, color: _diffColor(context), ), ], ), ], ), ), ), ); } onMarkChanged(int id, bool value) { UserProvider.changeStatisticMark(id, value); } } class StatHeader extends StatelessWidget { final String header; final IconData icon; const StatHeader({super.key, required this.header, required this.icon}); @override Widget build(BuildContext context) { return Column(children: [ Padding( padding: const EdgeInsets.only( left: 16, right: 16, bottom: 8, top: 8, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ Icon(icon), const SizedBox(width: 4), DidvanText( header, style: Theme.of(context).textTheme.titleMedium, color: Theme.of(context).colorScheme.title, ), ], ), Row( children: [ DidvanText( "همه", color: Theme.of(context).colorScheme.primary, ), Icon( DidvanIcons.angle_left_light, color: Theme.of(context).colorScheme.primary, ) ], ) ], ), ) ]); } }