Frontend first draft

This commit is contained in:
Arseni
2025-11-13 15:06:15 +03:00
parent e47f343afb
commit ddb54ddfdc
504 changed files with 25498 additions and 1 deletions

View File

@@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pweb/models/wallet.dart';
import 'package:pweb/pages/dashboard/buttons/balance/amount.dart';
import 'package:pweb/providers/wallets.dart';
import 'package:pweb/utils/currency.dart';
class WalletCard extends StatelessWidget {
final Wallet wallet;
final VoidCallback onTap;
const WalletCard({super.key, required this.wallet, required this.onTap});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Card(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
elevation: theme.cardTheme.elevation ?? 4,
color: theme.colorScheme.onSecondary,
child: InkWell(
borderRadius: BorderRadius.circular(12),
onTap: onTap,
child: Container(
padding: const EdgeInsets.only(left: 50, top: 16, bottom: 16),
child: Row(
spacing: 3,
children: [
CircleAvatar(
radius: 24,
child: Icon(iconForCurrencyType(wallet.currency), size: 28),
),
const SizedBox(width: 16),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
BalanceAmount(
wallet: wallet,
onToggleVisibility: () {
context.read<WalletsProvider>().toggleVisibility(wallet.id);
},
),
Text(
wallet.name,
style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w500),
),
],
),
),
],
),
),
),
);
}
}

View File

@@ -0,0 +1,51 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pweb/pages/payment_page/wallet/edit/buttons/send.dart';
import 'package:pweb/pages/payment_page/wallet/edit/buttons/top_up.dart';
import 'package:pweb/providers/wallets.dart';
import 'package:pweb/utils/dimensions.dart';
class ButtonsWalletWidget extends StatelessWidget {
const ButtonsWalletWidget({super.key});
@override
Widget build(BuildContext context) {
final provider = context.watch<WalletsProvider>();
final wallet = provider.wallets?.first;
if (wallet == null) return const SizedBox.shrink();
final dimensions = AppDimensions();
return Container(
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surfaceBright,
borderRadius: BorderRadius.circular(dimensions.borderRadiusSmall),
boxShadow: [
BoxShadow(
color: Theme.of(context).colorScheme.primary.withAlpha(50),
blurRadius: 4,
offset: const Offset(0, 2),
),
],
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Expanded(
child: SendPayoutButton(),
),
VerticalDivider(
color: Theme.of(context).colorScheme.primary,
thickness: 1,
width: 10,
),
Expanded(
child: TopUpButton(),
),
],
),
);
}
}

View File

@@ -0,0 +1,52 @@
import 'package:flutter/material.dart';
import 'package:pweb/models/wallet.dart';
import 'package:pweb/utils/dimensions.dart';
class SaveWalletButton extends StatelessWidget {
final Wallet wallet;
final TextEditingController nameController;
final TextEditingController balanceController;
final VoidCallback onSave; // Changed to VoidCallback
const SaveWalletButton({
super.key,
required this.wallet,
required this.nameController,
required this.balanceController,
required this.onSave, // Now matches _saveWallet signature
});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final dimensions = AppDimensions();
return Center(
child: SizedBox(
width: dimensions.buttonWidth,
height: dimensions.buttonHeight,
child: InkWell(
borderRadius: BorderRadius.circular(dimensions.borderRadiusSmall),
onTap: onSave, // Directly use onSave now
child: Container(
decoration: BoxDecoration(
color: theme.colorScheme.primary,
borderRadius: BorderRadius.circular(dimensions.borderRadiusSmall),
),
child: Center(
child: Text(
'Save',
style: theme.textTheme.bodyLarge?.copyWith(
color: theme.colorScheme.onSecondary,
fontWeight: FontWeight.w600,
),
),
),
),
),
),
);
}
}

View File

@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pweb/models/wallet.dart';
import 'package:pweb/providers/wallets.dart';
class SendPayoutButton extends StatelessWidget {
const SendPayoutButton({
super.key,
});
@override
Widget build(BuildContext context) {
return ElevatedButton(
style: ElevatedButton.styleFrom(
shadowColor: null,
elevation: 0,
),
onPressed: () => ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Add functionality')),
),
child: Text('Send Payout'),
);
}
}

View File

@@ -0,0 +1,22 @@
import 'package:flutter/material.dart';
class TopUpButton extends StatelessWidget{
const TopUpButton({super.key});
@override
Widget build(BuildContext context) {
return ElevatedButton(
style: ElevatedButton.styleFrom(
shadowColor: null,
elevation: 0,
),
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Add functionality')),
);
},
child: Text('Top Up Balance'),
);
}
}

View File

@@ -0,0 +1,50 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:pweb/pages/dashboard/buttons/balance/amount.dart';
import 'package:pweb/providers/wallets.dart';
import 'package:pweb/utils/currency.dart';
class WalletEditFields extends StatelessWidget {
const WalletEditFields({super.key});
@override
Widget build(BuildContext context) {
final wallet = context.watch<WalletsProvider>().wallets?.first;
if (wallet == null) {
return const SizedBox.shrink();
}
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
BalanceAmount(
wallet: wallet,
onToggleVisibility: () {
context.read<WalletsProvider>().toggleVisibility(wallet.id);
},
),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(wallet.walletUserID, style: Theme.of(context).textTheme.bodyLarge),
IconButton(
icon: Icon(Icons.copy),
iconSize: 18,
onPressed: () => Clipboard.setData(ClipboardData(text: wallet.walletUserID)),
),
],
),
],
);
}
}

View File

@@ -0,0 +1,122 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pweb/utils/currency.dart';
import 'package:pweb/utils/dimensions.dart';
import 'package:pweb/providers/wallets.dart';
// class WalletEditHeader extends StatefulWidget {
// const WalletEditHeader({super.key});
// @override
// State<WalletEditHeader> createState() => _WalletEditHeaderState();
// }
// class _WalletEditHeaderState extends State<WalletEditHeader> {
// bool _isEditing = false;
// late TextEditingController _controller;
// @override
// void initState() {
// super.initState();
// _controller = TextEditingController();
// }
// @override
// void dispose() {
// _controller.dispose();
// super.dispose();
// }
// @override
// Widget build(BuildContext context) {
// final provider = context.watch<WalletsProvider>();
// final currentWallet = provider.getWalletById(provider.wallets!.id);
// if (wallet == null) {
// return const SizedBox.shrink();
// }
// final theme = Theme.of(context);
// final dimensions = AppDimensions();
// if (!_isEditing) {
// _controller.text = wallet.name;
// }
// return Row(
// spacing: 8,
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Icon(
// iconForCurrencyType(wallet.currency),
// color: theme.colorScheme.primary,
// size: dimensions.iconSizeLarge,
// ),
// Expanded(
// child: !_isEditing
// ? Row(
// children: [
// Expanded(
// child: Text(
// wallet.name,
// style: theme.textTheme.headlineMedium!.copyWith(
// fontWeight: FontWeight.bold,),
// ),
// ),
// IconButton(
// icon: const Icon(Icons.edit),
// onPressed: () {
// setState(() {
// _isEditing = true;
// });
// },
// ),
// ],
// )
// : Row(
// children: [
// Expanded(
// child: TextFormField(
// controller: _controller,
// decoration: const InputDecoration(
// border: OutlineInputBorder(),
// isDense: true,
// hintText: 'Wallet name',
// ),
// ),
// ),
// IconButton(
// icon: const Icon(Icons.check),
// color: theme.colorScheme.primary,
// onPressed: () async {
// provider.updateName(wallet.id, _controller.text);
// await provider.updateWallet(wallet.copyWith(name: _controller.text));
// ScaffoldMessenger.of(context).showSnackBar(
// const SnackBar(content: Text('Wallet name saved')),
// );
// setState(() {
// _isEditing = false;
// });
// },
// ),
// IconButton(
// icon: const Icon(Icons.close),
// onPressed: () {
// _controller.text = wallet.name;
// setState(() {
// _isEditing = false;
// });
// },
// ),
// ],
// ),
// ),
// ],
// );
// }
// }

View File

@@ -0,0 +1,55 @@
import 'package:flutter/material.dart';
import 'package:pweb/models/wallet.dart';
import 'package:pweb/pages/payment_page/wallet/edit/buttons/buttons.dart';
import 'package:pweb/pages/payment_page/wallet/edit/fields.dart';
import 'package:pweb/utils/dimensions.dart';
class WalletEditPage extends StatelessWidget {
final Wallet wallet;
final VoidCallback onBack;
const WalletEditPage({super.key, required this.wallet, required this.onBack});
@override
Widget build(BuildContext context) {
final dimensions = AppDimensions();
return Align(
alignment: Alignment.topCenter,
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: dimensions.maxContentWidth),
child: Material(
elevation: dimensions.elevationSmall,
color: Theme.of(context).colorScheme.onSecondary,
borderRadius: BorderRadius.circular(dimensions.borderRadiusMedium),
child: Padding(
padding: EdgeInsets.all(dimensions.paddingLarge),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: onBack,
),
// WalletEditHeader(),
WalletEditFields(),
const SizedBox(height: 24),
ButtonsWalletWidget(),
const SizedBox(height: 24),
],
),
),
),
),
),
);
}
}

View File

@@ -0,0 +1,49 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pweb/models/wallet.dart';
import 'package:pweb/pages/payment_page/wallet/card.dart';
import 'package:pweb/providers/wallets.dart';
class WalletWidgets extends StatelessWidget {
final Function(Wallet) onWalletTap;
const WalletWidgets({super.key, required this.onWalletTap});
@override
Widget build(BuildContext context) {
final provider = context.watch<WalletsProvider>();
final wallets = provider.wallets;
if (wallets == null) {
return const Center(child: CircularProgressIndicator());
}
return GridView.builder(
scrollDirection: Axis.vertical,
physics: AlwaysScrollableScrollPhysics(),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 12,
crossAxisSpacing: 12,
childAspectRatio: 3,
),
itemCount: wallets.length,
itemBuilder: (context, index) {
final wallet = wallets[index];
return Padding(
padding: const EdgeInsets.symmetric(vertical: 6.0),
child: WalletCard(
wallet: wallet,
onTap: () {
onWalletTap(wallet);
},
),
);
},
);
}
}