haveno-app/lib/screens/my_offer_detail_screen.dart
2024-08-19 21:35:24 +01:00

148 lines
5.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
import 'package:provider/provider.dart';
import 'package:haveno_flutter_app/providers/offers_provider.dart';
class MyOfferDetailScreen extends StatefulWidget {
final String offerId;
MyOfferDetailScreen({required this.offerId});
@override
_MyOfferDetailScreenState createState() => _MyOfferDetailScreenState();
}
class _MyOfferDetailScreenState extends State<MyOfferDetailScreen> {
final _formKey = GlobalKey<FormState>();
final TextEditingController _payController = TextEditingController();
final TextEditingController _receiveController = TextEditingController();
bool _isLoading = true;
OfferInfo? _offer;
@override
void initState() {
super.initState();
_loadOffer();
}
void _loadOffer() async {
final offersProvider = Provider.of<OffersProvider>(context, listen: false);
await offersProvider.getMyOffers();
setState(() {
_offer = offersProvider.offers
?.firstWhere((offer) => offer.id == widget.offerId);
_isLoading = false;
});
}
void _cancelOffer() async {
if (_formKey.currentState?.validate() ?? false) {
final tradesProvider =
Provider.of<OffersProvider>(context, listen: false);
await tradesProvider.cancelOffer(widget.offerId);
// Handle success or navigate to another screen
}
}
@override
void dispose() {
_payController.dispose();
_receiveController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('My Offer View'),
),
body: _isLoading
? const Center(child: CircularProgressIndicator())
: _offer == null
? const Center(child: Text('Offer not found'))
: Padding(
padding: const EdgeInsets.all(16.0),
child: SingleChildScrollView(
child: Form(
key: _formKey,
child: Column(
children: <Widget>[
const SizedBox(height: 16.0),
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text('Your Offer',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold)),
const SizedBox(height: 16.0),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
const Text('Your Rate'),
Text(_isFiatCurrency(
_offer!.counterCurrencyCode)
? '${double.parse(_offer!.price).toStringAsFixed(2)} ${_offer!.counterCurrencyCode}/${_offer!.baseCurrencyCode}'
: _offer!.price),
],
),
const SizedBox(height: 16.0),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
const Text('Buy Limits'),
Text(
'${_offer!.minVolume} - ${_offer!.volume} ${_offer!.counterCurrencyCode}'),
],
),
const SizedBox(height: 16.0),
const Text('Offer ID'),
Text(_offer!.id),
const SizedBox(height: 16.0),
const Text('Payment Method'),
Text(_offer!.paymentMethodShortName),
],
),
),
),
],
),
),
),
),
bottomNavigationBar: Padding(
padding: const EdgeInsets.all(16.0),
child: ElevatedButton(
onPressed: _cancelOffer,
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 16.0),
backgroundColor: Theme.of(context).colorScheme.primary,
),
child: const Text('Cancel Offer'),
),
),
);
}
bool _isFiatCurrency(String currencyCode) {
const fiatCurrencies = {
'GBP',
'USD',
'EUR',
'JPY',
'AUD',
'CAD',
'CHF',
'CNY',
'SEK',
'NZD'
};
return fiatCurrencies.contains(currencyCode);
}
}