rwadurian/frontend/mining-app/lib/presentation/pages/asset/receive_shares_page.dart

331 lines
10 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:qr_flutter/qr_flutter.dart';
import '../../../core/router/routes.dart';
import '../../providers/user_providers.dart';
import '../../../data/models/capability_model.dart';
class ReceiveSharesPage extends ConsumerWidget {
const ReceiveSharesPage({super.key});
static const Color _orange = Color(0xFFFF6B00);
static const Color _green = Color(0xFF10B981);
static const Color _darkText = Color(0xFF1F2937);
static const Color _grayText = Color(0xFF6B7280);
static const Color _bgGray = Color(0xFFF3F4F6);
@override
Widget build(BuildContext context, WidgetRef ref) {
final user = ref.watch(userNotifierProvider);
final phone = user.phone ?? '';
final nickname = user.nickname ?? user.realName ?? '股行用户';
final capabilities = ref.watch(capabilitiesProvider).valueOrNull ?? CapabilityMap.defaultAll();
final p2pReceiveEnabled = capabilities.p2pReceiveEnabled;
return Scaffold(
backgroundColor: _bgGray,
appBar: AppBar(
backgroundColor: Colors.white,
elevation: 0,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: _darkText),
onPressed: () => context.pop(),
),
title: const Text(
'接收积分值',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: _darkText,
),
),
centerTitle: true,
actions: [
TextButton(
onPressed: () => context.push(
'${Routes.p2pTransferRecords}?filter=receive',
),
child: const Text(
'接收记录',
style: TextStyle(
fontSize: 14,
color: _orange,
),
),
),
],
),
body: SingleChildScrollView(
child: Column(
children: [
if (!p2pReceiveEnabled)
Container(
margin: const EdgeInsets.fromLTRB(16, 16, 16, 0),
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: const Color(0xFFEF4444).withOpacity(0.1),
borderRadius: BorderRadius.circular(8),
),
child: const Row(
children: [
Icon(Icons.block, color: Color(0xFFEF4444), size: 20),
SizedBox(width: 8),
Expanded(
child: Text(
'您的P2P收款功能已被限制当前无法接收转账',
style: TextStyle(fontSize: 13, color: Color(0xFFEF4444)),
),
),
],
),
),
const SizedBox(height: 32),
// 二维码卡片
_buildQrCodeCard(context, phone, nickname),
const SizedBox(height: 24),
// 手机号显示
_buildPhoneCard(context, phone),
const SizedBox(height: 24),
// 使用说明
_buildInstructions(),
],
),
),
);
}
Widget _buildQrCodeCard(BuildContext context, String phone, String nickname) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 32),
padding: const EdgeInsets.all(24),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.05),
blurRadius: 20,
offset: const Offset(0, 4),
),
],
),
child: Column(
children: [
// 顶部渐变条
Container(
height: 4,
margin: const EdgeInsets.only(bottom: 20),
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xFFFF6B00), Color(0xFFFDBA74)],
),
borderRadius: BorderRadius.circular(2),
),
),
// 用户信息
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
width: 48,
height: 48,
decoration: BoxDecoration(
shape: BoxShape.circle,
gradient: LinearGradient(
colors: [_orange.withOpacity(0.8), _orange],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
),
child: Center(
child: Text(
nickname.isNotEmpty ? nickname[0].toUpperCase() : 'U',
style: const TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
),
const SizedBox(width: 12),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
nickname,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: _darkText,
),
),
const SizedBox(height: 2),
const Text(
'扫码向我转账',
style: TextStyle(
fontSize: 12,
color: _grayText,
),
),
],
),
],
),
const SizedBox(height: 24),
// 二维码
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: _orange.withOpacity(0.2),
width: 2,
),
),
child: QrImageView(
data: 'durian://transfer/?phone=$phone',
version: QrVersions.auto,
size: 200,
backgroundColor: Colors.white,
eyeStyle: const QrEyeStyle(
eyeShape: QrEyeShape.square,
color: _darkText,
),
dataModuleStyle: const QrDataModuleStyle(
dataModuleShape: QrDataModuleShape.square,
color: _darkText,
),
embeddedImage: null,
embeddedImageStyle: null,
),
),
const SizedBox(height: 16),
// 提示文字
const Text(
'让对方扫描二维码向您转账',
style: TextStyle(
fontSize: 14,
color: _grayText,
),
),
],
),
);
}
Widget _buildPhoneCard(BuildContext context, String phone) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 32),
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
),
child: Column(
children: [
const Text(
'或告诉对方您的账号',
style: TextStyle(
fontSize: 14,
color: _grayText,
),
),
const SizedBox(height: 12),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
phone,
style: const TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: _darkText,
letterSpacing: 2,
),
),
const SizedBox(width: 12),
IconButton(
onPressed: () {
Clipboard.setData(ClipboardData(text: phone));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('手机号已复制'),
backgroundColor: _green,
duration: Duration(seconds: 1),
),
);
},
icon: Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: _orange.withOpacity(0.1),
borderRadius: BorderRadius.circular(8),
),
child: const Icon(
Icons.copy,
color: _orange,
size: 20,
),
),
),
],
),
],
),
);
}
Widget _buildInstructions() {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 32),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: _orange.withOpacity(0.05),
borderRadius: BorderRadius.circular(12),
),
child: const Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(Icons.info_outline, size: 16, color: _orange),
SizedBox(width: 8),
Text(
'使用说明',
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
color: _orange,
),
),
],
),
SizedBox(height: 8),
Text(
'1. 让对方使用股行APP扫描二维码\n2. 或者将您的手机号告诉对方\n3. 对方可以通过手机号向您转账',
style: TextStyle(
fontSize: 12,
color: _grayText,
height: 1.5,
),
),
],
),
);
}
}