Rumahjo-Android-APP/lib/Ui/screens/subscription/widget/current_package_card.dart

359 lines
12 KiB
Dart
Raw Normal View History

2024-09-07 00:58:50 +00:00
// ignore_for_file: public_member_api_docs, sort_constructors_firstutils/Extensions/extensions.dart';
import 'package:ebroker/Ui/screens/subscription/widget/package_tile.dart';
import 'package:ebroker/utils/Extensions/extensions.dart';
import 'package:ebroker/utils/constant.dart';
import 'package:ebroker/utils/responsiveSize.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import '../../../../data/model/subscription_pacakage_model.dart';
import '../../../../utils/AppIcon.dart';
import '../../../../utils/LiquidIndicator/src/liquid_circular_progress_indicator.dart';
import '../../../../utils/ui_utils.dart';
class CurrentPackageTileCard extends StatefulWidget {
final SubscriptionPackageModel package;
const CurrentPackageTileCard({
super.key,
required this.package,
});
@override
State<CurrentPackageTileCard> createState() => _CurrentPackageTileCardState();
}
class _CurrentPackageTileCardState extends State<CurrentPackageTileCard> {
String endDate = "";
bool isLifeTimeValidity = false;
String endDay = "";
// int? getDaysRemining() {
// if (widget.endDate != null) {
// DateTime currentDate = DateTime.now();
// Duration remainingDuration =
// DateTime.parse(widget.endDate).difference(currentDate);
// int daysLeft = remainingDuration.inDays;
// return daysLeft;
// }
// return null;
// }
@override
Widget build(BuildContext context) {
// if (widget.package / endDate != null) {
// endDate = widget.endDate.toString().formatDate(format: "d MMM yyyy");
// endDay = widget.endDate.toString().formatDate(format: "EEEE");
// }
// isLifeTimeValidity = widget.endDate == null;
return Container(
decoration: BoxDecoration(
color: context.color.secondaryColor,
borderRadius: BorderRadius.circular(18)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
buildCurvePatternWidget(context),
const SizedBox(
height: 5,
),
buildPriceAndTitleWidget(context),
buildValidityWidget(context),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: widget.package.type == "premium_user"
? CrossAxisAlignment.end
: CrossAxisAlignment.center,
children: [
if (widget.package.type == "premium_user")
Expanded(child: ViewOnlyPackageCard()),
if (widget.package.type != "premium_user")
LiquidProgressContainer(
title: "property".translate(context),
countUsed: widget.package.usedLimitForProperty ?? 0,
countLimit: widget.package.propertyLimit),
// LiquidProgressContainer(
// title: "property".translate(context),
// countRemining: widget.propertyRemining,
// countLimit: widget.propertyLimit,
// ),
if (widget.package.type != "premium_user")
LiquidProgressContainer(
title: "advertisement".translate(context),
countUsed: widget.package.usedLimitForAdvertisement ?? 0,
countLimit: widget.package.advertisementLimit),
// LiquidProgressContainer(
// title: "advertisement".translate(context),
// countRemining: widget.advertismentRemining,
// countLimit: widget.advertismentLimit,
// ),
LiquidProgressContainer(
title: "daysRemining".translate(context),
countUsed: widget.package.remainingDays!,
isValidity: true,
countLimit: widget.package.duration!),
// LiquidProgressContainer(
// title: "daysRemining".translate(context),
// countRemining: (getDaysRemining() ?? 0).toString(),
// countLimit: widget.duration,
// isValidity: true,
// validityCount: widget.duration.toString(),
// ),
],
),
),
if (isLifeTimeValidity)
const SizedBox(
height: 6,
),
if (!isLifeTimeValidity)
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(16.0, 5, 16, 16),
child: Row(
children: [
Expanded(
child: DateCard(
title: "startedOn".translate(context),
day: widget.package.startDate!.formatDate(format: "EEEE"),
date: widget.package.startDate ?? "",
)),
const SizedBox(
width: 16,
),
Expanded(
child: DateCard(
day: widget.package.endDate!.formatDate(format: "EEEE"),
title: "willEndOn".translate(context),
date: widget.package.endDate ?? "",
),
),
],
),
)
],
),
);
}
Stack buildCurvePatternWidget(BuildContext context) {
return Stack(
children: [
SizedBox(
width: context.screenWidth,
child: UiUtils.getSvg(AppIcons.headerCurve,
color: context.color.tertiaryColor, fit: BoxFit.fitWidth),
),
PositionedDirectional(
start: 10.rw(context),
top: 8.rh(context),
child: Text(UiUtils.translate(context, "currentPackage"))
.size(context.font.larger)
.color(context.color.secondaryColor)
.bold(weight: FontWeight.w600),
)
],
);
}
Padding buildPriceAndTitleWidget(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5),
child: Row(
children: [
Expanded(
flex: 2,
child: SizedBox(
child: Text(widget.package.name!)
.size(context.font.larger)
.color(context.color.textColorDark)
.bold(weight: FontWeight.w600),
),
),
const SizedBox(
width: 5,
),
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(
"price".translate(context),
style: const TextStyle(
textBaseline: TextBaseline.alphabetic),
).size(context.font.small).bold(weight: FontWeight.w300),
const SizedBox(
height: 5,
),
buildPriceWidget(context)
],
),
],
),
)
],
),
);
}
Widget buildPriceWidget(BuildContext context) {
return Row(
children: [
if (widget.package.price != 0)
Text(
Constant.currencySymbol,
style: const TextStyle(
height: 0.6,
),
).color(context.color.tertiaryColor).size(context.font.larger),
Text(
(widget.package.price == 0 ? "Free" : widget.package.price)
.toString(),
style: const TextStyle(
height: 0.6,
),
).size(context.font.larger).bold(weight: FontWeight.w500)
],
);
}
Widget buildValidityWidget(BuildContext context) {
return Padding(
padding: EdgeInsetsDirectional.fromSTEB(
16, 0, 16, widget.package.type == "premium_user" ? 0 : 10),
child: Text(
"${"packageValidity".translate(context)} ${widget.package.duration} ${"Days".translate(context)}")
.size(context.font.large),
);
}
}
class DateCard extends StatelessWidget {
final String title;
final String date;
final String day;
const DateCard(
{super.key, required this.title, required this.date, required this.day});
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(title),
Container(
height: 53,
decoration: BoxDecoration(
color: context.color.tertiaryColor,
borderRadius: BorderRadius.circular(4),
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SvgPicture.asset(
AppIcons.calender,
width: 26,
height: 26,
color: context.color.buttonColor,
),
const SizedBox(
width: 10,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(day).color(context.color.buttonColor),
Text(
date,
style: const TextStyle(
fontWeight: FontWeight.w200,
),
).color(context.color.buttonColor)
],
),
)
],
),
),
),
],
);
}
}
class LiquidProgressContainer extends StatelessWidget {
final String title;
final int countUsed;
final dynamic countLimit;
final bool? isValidity;
final String? validityCount;
const LiquidProgressContainer(
{super.key,
required this.title,
required this.countUsed,
required this.countLimit,
this.isValidity,
this.validityCount});
@override
Widget build(BuildContext context) {
return Column(
children: [
Text(title).size(context.font.normal),
const SizedBox(
height: 7,
),
getLiquidProgress(
context,
)
],
);
}
Widget getLiquidProgress(BuildContext context) {
double persontage = 0;
String value = "";
if (countLimit == "not_available" || countLimit == null) {
value = "X";
} else if (countLimit == "unlimited") {
value = "unlimited".translate(context);
} else {
value = "$countUsed/$countLimit";
persontage = (countUsed / countLimit);
}
if (isValidity == true) {
value = "$countUsed ${"Days".translate(context)}";
}
return SizedBox(
width: 60,
height: 60,
child: LiquidCircularProgressIndicator(
value: persontage,
valueColor: AlwaysStoppedAnimation(
context.color.tertiaryColor.withOpacity(0.3),
),
backgroundColor: context.color.secondaryColor,
borderColor: context.color.tertiaryColor,
borderWidth: 3.0,
direction: Axis.vertical,
center: Padding(
padding: const EdgeInsets.all(5.0),
child: FittedBox(
fit: BoxFit.fitWidth,
child: Text(value).size(context.font.small)),
),
),
);
}
}