stack_wallet/lib/notifications/notification_card.dart

193 lines
6.8 KiB
Dart
Raw Normal View History

2023-05-26 21:21:16 +00:00
/*
* 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';
2022-08-26 08:11:35 +00:00
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
2022-08-26 08:11:35 +00:00
import 'package:flutter_svg/svg.dart';
2024-05-27 23:56:22 +00:00
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';
2022-08-26 08:11:35 +00:00
class NotificationCard extends ConsumerWidget {
2022-08-26 08:11:35 +00:00
const NotificationCard({
2024-05-27 23:56:22 +00:00
super.key,
2022-08-26 08:11:35 +00:00
required this.notification,
2024-05-27 23:56:22 +00:00
});
2022-08-26 08:11:35 +00:00
final NotificationModel notification;
String extractPrettyDateString(DateTime date) {
// TODO: format this differently to better match the design
return Format.extractDateFrom(date.millisecondsSinceEpoch ~/ 1000);
}
2022-11-14 16:40:31 +00:00
static const double mobileIconSize = 24;
static const double desktopIconSize = 30;
2023-05-18 18:52:48 +00:00
String coinIconPath(IThemeAssets assets, WidgetRef ref) {
try {
final coin =
AppConfig.getCryptoCurrencyByPrettyName(notification.coinName);
return ref.read(coinIconProvider(coin));
} catch (_) {
return notification.iconAssetName;
}
}
2022-08-26 08:11:35 +00:00
@override
Widget build(BuildContext context, WidgetRef ref) {
2022-11-14 16:40:31 +00:00
final isDesktop = Util.isDesktop;
2022-08-26 08:11:35 +00:00
return Stack(
children: [
RoundedWhiteContainer(
2022-11-14 16:40:31 +00:00
padding: isDesktop
? const EdgeInsets.symmetric(
horizontal: 20,
vertical: 10,
)
: const EdgeInsets.all(12),
2022-08-26 08:11:35 +00:00
child: Row(
children: [
notification.changeNowId == null
? SvgPicture.file(
File(
coinIconPath(
2024-05-27 23:56:22 +00:00
ref.watch(
themeAssetsProvider,
),
ref,
),
),
2022-11-14 16:40:31 +00:00
width: isDesktop ? desktopIconSize : mobileIconSize,
height: isDesktop ? desktopIconSize : mobileIconSize,
2022-08-26 08:11:35 +00:00
)
: Container(
2022-11-14 16:40:31 +00:00
width: isDesktop ? desktopIconSize : mobileIconSize,
height: isDesktop ? desktopIconSize : mobileIconSize,
2022-08-26 08:11:35 +00:00
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(24),
),
child: SvgPicture.file(
File(
coinIconPath(
2024-05-27 23:56:22 +00:00
ref.watch(
themeAssetsProvider,
),
ref,
),
),
color: Theme.of(context)
.extension<StackColors>()!
.accentColorDark,
2022-11-14 16:40:31 +00:00
width: isDesktop ? desktopIconSize : mobileIconSize,
height: isDesktop ? desktopIconSize : mobileIconSize,
2022-08-26 08:11:35 +00:00
),
),
const SizedBox(
width: 12,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
2022-11-14 16:40:31 +00:00
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<StackColors>()!
.accentColorGreen,
),
2024-05-27 23:56:22 +00:00
),
2022-11-14 16:40:31 +00:00
],
),
child: Text(
notification.title,
style: isDesktop
? STextStyles.desktopTextExtraExtraSmall(context)
.copyWith(
color: Theme.of(context)
.extension<StackColors>()!
.textDark,
)
: STextStyles.titleBold12(context),
),
2022-08-26 08:11:35 +00:00
),
const SizedBox(
height: 2,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
notification.description,
2022-11-14 16:40:31 +00:00
style: isDesktop
? STextStyles.desktopTextExtraExtraSmall(context)
.copyWith(
color: Theme.of(context)
.extension<StackColors>()!
.textSubtitle1,
)
: STextStyles.label(context),
2022-08-26 08:11:35 +00:00
),
Text(
extractPrettyDateString(notification.date),
2022-11-14 16:40:31 +00:00
style: isDesktop
? STextStyles.desktopTextExtraExtraSmall(context)
.copyWith(
color: Theme.of(context)
.extension<StackColors>()!
.textSubtitle1,
)
: STextStyles.label(context),
2022-08-26 08:11:35 +00:00
),
],
),
],
),
),
],
),
),
if (notification.read)
Positioned.fill(
child: RoundedContainer(
color: Theme.of(context)
.extension<StackColors>()!
.background
.withOpacity(0.5),
2022-08-26 08:11:35 +00:00
),
),
],
);
}
}