stack_wallet/lib/pages/token_view/token_contract_details_view.dart

193 lines
5.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/custom_buttons/simple_copy_button.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart';
class TokenContractDetailsView extends ConsumerStatefulWidget {
const TokenContractDetailsView({
Key? key,
required this.contractAddress,
required this.walletId,
}) : super(key: key);
static const String routeName = "/tokenContractDetailsView";
final String contractAddress;
final String walletId;
@override
ConsumerState<TokenContractDetailsView> createState() =>
_TokenContractDetailsViewState();
}
class _TokenContractDetailsViewState
extends ConsumerState<TokenContractDetailsView> {
final isDesktop = Util.isDesktop;
late EthContract contract;
@override
void initState() {
contract = MainDB.instance.isar.ethContracts
.where()
.addressEqualTo(widget.contractAddress)
.findFirstSync()!;
super.initState();
}
@override
Widget build(BuildContext context) {
return ConditionalParent(
condition: !isDesktop,
builder: (child) => Background(
child: Scaffold(
backgroundColor:
Theme.of(context).extension<StackColors>()!.background,
appBar: AppBar(
backgroundColor:
Theme.of(context).extension<StackColors>()!.backgroundAppBar,
leading: AppBarBackButton(
onPressed: () {
Navigator.of(context).pop();
},
),
titleSpacing: 0,
title: Text(
"Contract details",
style: STextStyles.navBarTitle(context),
),
),
body: SafeArea(
child: LayoutBuilder(
builder: (builderContext, constraints) {
return SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(
minHeight: constraints.maxHeight,
),
child: Padding(
padding: const EdgeInsets.all(16),
child: child,
),
),
);
},
),
),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_Item(
title: "Contract address",
data: contract.address,
button: SimpleCopyButton(
data: contract.address,
),
),
const SizedBox(
height: 12,
),
_Item(
title: "Name",
data: contract.name,
button: SimpleCopyButton(
data: contract.name,
),
),
const SizedBox(
height: 12,
),
_Item(
title: "Symbol",
data: contract.symbol,
button: SimpleCopyButton(
data: contract.symbol,
),
),
const SizedBox(
height: 12,
),
_Item(
title: "Type",
data: contract.type.name,
button: SimpleCopyButton(
data: contract.type.name,
),
),
const SizedBox(
height: 12,
),
_Item(
title: "Decimals",
data: contract.decimals.toString(),
button: SimpleCopyButton(
data: contract.decimals.toString(),
),
),
],
),
);
}
}
class _Item extends StatelessWidget {
const _Item({
Key? key,
required this.title,
required this.data,
required this.button,
}) : super(key: key);
final String title;
final String data;
final Widget button;
@override
Widget build(BuildContext context) {
return RoundedWhiteContainer(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
title,
style: STextStyles.itemSubtitle(context),
),
button,
],
),
const SizedBox(
height: 5,
),
data.isNotEmpty
? SelectableText(
data,
style: STextStyles.w500_14(context),
)
: Text(
"$title will appear here",
style: STextStyles.w500_14(context).copyWith(
color: Theme.of(context)
.extension<StackColors>()!
.textSubtitle3,
),
),
],
),
);
}
}