/* * This file is part of Stack Wallet. * * Copyright (c) 2023 Cypher Stack * All Rights Reserved. * The code is distributed under GPLv3 license, see LICENSE file for details. * Generated by Cypher Stack on 2023-05-26 * */ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; import '../app_config.dart'; import '../models/isar/stack_theme.dart'; import '../models/notification_model.dart'; import '../themes/coin_icon_provider.dart'; import '../themes/stack_colors.dart'; import '../themes/theme_providers.dart'; import '../utilities/format.dart'; import '../utilities/text_styles.dart'; import '../utilities/util.dart'; import '../widgets/conditional_parent.dart'; import '../widgets/rounded_container.dart'; import '../widgets/rounded_white_container.dart'; class NotificationCard extends ConsumerWidget { const NotificationCard({ super.key, required this.notification, }); final NotificationModel notification; String extractPrettyDateString(DateTime date) { // TODO: format this differently to better match the design return Format.extractDateFrom(date.millisecondsSinceEpoch ~/ 1000); } static const double mobileIconSize = 24; static const double desktopIconSize = 30; String coinIconPath(IThemeAssets assets, WidgetRef ref) { try { final coin = AppConfig.getCryptoCurrencyByPrettyName(notification.coinName); return ref.read(coinIconProvider(coin)); } catch (_) { return notification.iconAssetName; } } @override Widget build(BuildContext context, WidgetRef ref) { final isDesktop = Util.isDesktop; return Stack( children: [ RoundedWhiteContainer( padding: isDesktop ? const EdgeInsets.symmetric( horizontal: 20, vertical: 10, ) : const EdgeInsets.all(12), child: Row( children: [ notification.changeNowId == null ? SvgPicture.file( File( coinIconPath( ref.watch( themeAssetsProvider, ), ref, ), ), width: isDesktop ? desktopIconSize : mobileIconSize, height: isDesktop ? desktopIconSize : mobileIconSize, ) : Container( width: isDesktop ? desktopIconSize : mobileIconSize, height: isDesktop ? desktopIconSize : mobileIconSize, decoration: BoxDecoration( color: Colors.transparent, borderRadius: BorderRadius.circular(24), ), child: SvgPicture.file( File( coinIconPath( ref.watch( themeAssetsProvider, ), ref, ), ), color: Theme.of(context) .extension()! .accentColorDark, width: isDesktop ? desktopIconSize : mobileIconSize, height: isDesktop ? desktopIconSize : mobileIconSize, ), ), const SizedBox( width: 12, ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ ConditionalParent( condition: isDesktop && !notification.read, builder: (child) => Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ child, Text( "New", style: STextStyles.desktopTextExtraExtraSmall(context) .copyWith( color: Theme.of(context) .extension()! .accentColorGreen, ), ), ], ), child: Text( notification.title, style: isDesktop ? STextStyles.desktopTextExtraExtraSmall(context) .copyWith( color: Theme.of(context) .extension()! .textDark, ) : STextStyles.titleBold12(context), ), ), const SizedBox( height: 2, ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( notification.description, style: isDesktop ? STextStyles.desktopTextExtraExtraSmall(context) .copyWith( color: Theme.of(context) .extension()! .textSubtitle1, ) : STextStyles.label(context), ), Text( extractPrettyDateString(notification.date), style: isDesktop ? STextStyles.desktopTextExtraExtraSmall(context) .copyWith( color: Theme.of(context) .extension()! .textSubtitle1, ) : STextStyles.label(context), ), ], ), ], ), ), ], ), ), if (notification.read) Positioned.fill( child: RoundedContainer( color: Theme.of(context) .extension()! .background .withOpacity(0.5), ), ), ], ); } }