mnemo_cards/lib/widgets/card_pack/buy_pack_page.dart

244 lines
7.6 KiB
Dart
Raw Normal View History

2024-05-22 20:48:44 +00:00
import 'dart:convert';
2024-05-28 21:25:51 +00:00
import 'dart:developer';
2024-07-18 21:45:04 +00:00
import 'package:mnemo_cards/flags.dart';
2024-05-22 20:48:44 +00:00
import 'package:mnemo_cards/utils/string_helper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
2024-05-28 21:25:51 +00:00
import '../../features/analytics/analytics.dart';
import '../../main.dart';
2024-05-22 20:48:44 +00:00
import '../items/builder.dart';
import '../../di/locator.dart';
import '../../domain/router/app_router.dart';
import '../../theme/themes.dart';
import 'card_pack_header.dart';
class BuyPack extends StatelessWidget {
final CardPackBuyDto dto;
const BuyPack(this.dto);
@override
Widget build(BuildContext context) {
2024-05-28 21:25:51 +00:00
bool loading = false;
Analytics.buyPackOpened(dto);
2024-05-22 20:48:44 +00:00
return Container(
// color: dto.color?.asColor,
2024-05-28 21:25:51 +00:00
child: StatefulBuilder(builder: (context, setState) {
if (loading) {
return _Loading(dto);
}
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
CardPackHeader(dto.title, dto.subtitle, dto.color?.asColor),
Expanded(
child: Column(
children: [
Padding(
padding: EdgeInsets.symmetric(
horizontal: 10.0.w, vertical: 18.h),
child: LayoutBuilder(builder: (context, constraints) {
final cardWidth = constraints.maxWidth / 3;
final imageWidth = cardWidth * 0.9;
return SizedBox(
height: 150.h,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: dto.cards.length,
itemExtent: cardWidth,
itemBuilder: (BuildContext context, int index) {
final card = dto.cards[index];
if (card.image != null) {
return Container(
alignment: Alignment.center,
width: imageWidth,
margin: EdgeInsets.symmetric(
horizontal: cardWidth - imageWidth - 1,
vertical: 1,
),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.0),
border: Border.all(
color: borderGray,
),
),
child: Image.memory(base64Decode(card.image!)),
);
}
return SizedBox.shrink();
},
),
);
}),
),
SizedBox(
height: 32.h,
),
...?dto.items?.build(),
],
),
),
_BuyButton(dto, (v) {
setState(() {
loading = v;
});
}),
SizedBox(
height: 16.h,
),
],
);
}),
);
}
}
class _Loading extends StatelessWidget {
final CardPackBuyDto dto;
_Loading(this.dto);
@override
Widget build(BuildContext context) {
final memoryImage = locator.imagesHolder.get('pack_${dto.id}');
return Column(
children: [
CardPackHeader(dto.title, dto.subtitle, dto.color?.asColor),
Expanded(
child: Center(
2024-05-22 20:48:44 +00:00
child: Column(
2024-05-28 21:25:51 +00:00
mainAxisAlignment: MainAxisAlignment.center,
2024-05-22 20:48:44 +00:00
children: [
2024-05-28 21:25:51 +00:00
if (memoryImage != null)
Padding(
padding: const EdgeInsets.all(8.0),
child: Image(
image: memoryImage,
width: 100,
),
),
Text('Загрузка...'),
2024-05-22 20:48:44 +00:00
],
),
),
2024-05-28 21:25:51 +00:00
),
],
2024-05-22 20:48:44 +00:00
);
}
}
class _BuyButton extends StatelessWidget {
final CardPackBuyDto dto;
2024-05-28 21:25:51 +00:00
final Function(bool) callback;
_BuyButton(this.dto, this.callback);
2024-05-22 20:48:44 +00:00
2024-05-28 21:25:51 +00:00
Future<void> _updatePack() async {
try {
callback(true);
await locator.packUpdater.updatePackAndSaveImages(dto.id);
await locator.packCacheManager.loadPackFromCache(dto.id);
} catch (e, s) {
log(
'Updating from buy pack',
error: e,
stackTrace: s,
);
appRouter.maybePop();
}
}
2024-05-22 20:48:44 +00:00
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(
vertical: 5.0.h,
horizontal: 10.w,
),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
children: [
InkWell(
onTap: () async {
if (locator.userManager.hasUser) {
2024-07-18 21:45:04 +00:00
Analytics.buyPackPressed(dto, androidPaymentSystem);
2024-05-28 21:25:51 +00:00
final result = await locator.purchaseService.buyPack(dto);
if (result) {
_updatePack();
}
2024-05-22 20:48:44 +00:00
} else {
AppRouter.openAuth();
}
},
child: Container(
height: 120.h,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: borderGray),
borderRadius: BorderRadius.circular(16.0),
),
padding: EdgeInsets.all(10.0.w),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Купить',
style: TextStyle(
fontSize: 25.sp,
2024-06-22 12:29:18 +00:00
fontWeight: FontWeight.w700,
2024-05-22 20:48:44 +00:00
height: 0.85,
),
),
SizedBox(
height: 8.0.h,
),
if (dto.price != null)
Text(
dto.price!,
style: TextStyle(
fontSize: 17.sp,
fontWeight: FontWeight.w400,
height: 1.0,
),
),
],
),
),
),
TextButton(
style: ButtonStyle(
overlayColor:
2024-05-28 21:25:51 +00:00
WidgetStateColor.resolveWith((states) => Colors.white),
2024-05-22 20:48:44 +00:00
),
onPressed: () async {
if (locator.userManager.hasUser) {
2024-05-28 21:25:51 +00:00
Analytics.buyPackPressed(dto, PaymentSystem.yookassa);
if (await locator.purchaseService
.buyPackWithYooMoney(dto, context)) {
_updatePack();
}
2024-05-22 20:48:44 +00:00
} else {
AppRouter.openAuth();
}
},
child: Text(
'Оплатить через YooMoney',
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w400,
decoration: TextDecoration.underline,
color: borderGray,
),
),
),
],
),
);
}
}