adding CityWallet functionality

This commit is contained in:
Prince
2026-06-11 16:33:22 +02:00
parent b10d233428
commit ad79bf2af8
7 changed files with 301 additions and 84 deletions

View File

@@ -306,8 +306,38 @@ class _PayScreenState extends State<PayScreen> with TickerProviderStateMixin {
const SizedBox(height: 7),
_buildAmountField(),
const SizedBox(height: 20),
...controller.model.paymentProcessors.map(
(e) => _buildPaymentProcessorItem(e, context),
LayoutBuilder(
builder: (context, wrapConstraints) {
final effectiveWidth =
constraints.maxWidth >
ResponsivePolicy.md
? ResponsivePolicy.md.toDouble()
: constraints.maxWidth;
final columns =
effectiveWidth > ResponsivePolicy.sm
? 2
: 1;
final itemWidth =
(effectiveWidth - (columns - 1) * 10) /
columns;
return Wrap(
spacing: 10,
runSpacing: 10,
children: controller
.model
.paymentProcessors
.map(
(e) => SizedBox(
width: itemWidth,
child: _buildPaymentProcessorItem(
e,
context,
),
),
)
.toList(),
);
},
),
],
),
@@ -716,77 +746,73 @@ class _PayScreenState extends State<PayScreen> with TickerProviderStateMixin {
}
Widget _buildPaymentProcessorItem(PaymentProcessor e, BuildContext context) {
return Column(
children: [
Skeletonizer(
enabled: controller.model.isLoading,
child: SlideTransition(
position:
_animations[controller.model.paymentProcessors.indexOf(e)],
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.black87.withAlpha(20)),
borderRadius: BorderRadius.circular(12),
gradient: LinearGradient(
colors: [
Theme.of(
context,
).colorScheme.primary.withValues(alpha: 0.1),
Theme.of(
context,
).colorScheme.tertiary.withValues(alpha: 0.05),
],
stops: const [0.3, 0.7],
begin: Alignment.topRight,
end: Alignment.bottomLeft,
),
),
child: InkWell(
customBorder: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
onTap: () async {
if (_formKey.currentState!.validate()) {
if (controller.model.isLoading) return;
final rawIndex = controller.model.paymentProcessors.indexOf(e);
final animation = rawIndex < _animations.length
? _animations[rawIndex]
: _animations.isNotEmpty
? _animations.last
: Tween<Offset>(
begin: Offset.zero,
end: Offset.zero,
).animate(_controller);
return Skeletonizer(
enabled: controller.model.isLoading,
child: SlideTransition(
position: animation,
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.black87.withAlpha(20)),
borderRadius: BorderRadius.circular(12),
gradient: LinearGradient(
colors: [
Theme.of(context).colorScheme.primary.withValues(alpha: 0.1),
Theme.of(context).colorScheme.tertiary.withValues(alpha: 0.05),
],
stops: const [0.3, 0.7],
begin: Alignment.topRight,
end: Alignment.bottomLeft,
),
),
child: InkWell(
customBorder: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
onTap: () async {
if (_formKey.currentState!.validate()) {
if (controller.model.isLoading) return;
await _submitPayment(e, context);
}
},
child: ListTile(
leading: Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Theme.of(
context,
).colorScheme.primary.withValues(alpha: 0.1),
shape: BoxShape.circle,
),
child: Image(image: AssetImage("assets/${e.image}")),
),
title: Text(
e.name,
style: TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Text(
e.description,
style: TextStyle(
fontWeight: FontWeight.normal,
fontSize: 10,
),
),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(
context,
).colorScheme.secondary.withValues(alpha: 0.7),
),
await _submitPayment(e, context);
}
},
child: ListTile(
leading: Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Theme.of(
context,
).colorScheme.primary.withValues(alpha: 0.1),
shape: BoxShape.circle,
),
child: Image(image: AssetImage("assets/${e.image}")),
),
title: Text(
e.name,
style: TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Text(
e.description,
style: TextStyle(fontWeight: FontWeight.normal, fontSize: 10),
),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(
context,
).colorScheme.secondary.withValues(alpha: 0.7),
),
),
),
),
SizedBox(height: 10),
],
),
);
}
}