198 lines
6.0 KiB
Dart
198 lines
6.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import '../../data/api/report_data_source.dart';
|
|
import '../../theme/app_icons.dart';
|
|
import '../../theme/yanting_text.dart';
|
|
import '../../theme/yanting_tokens.dart';
|
|
import '../../theme/wise_tokens.dart';
|
|
import '../../widgets/app_buttons.dart';
|
|
import '../../widgets/app_card.dart';
|
|
import '../../widgets/page_header.dart';
|
|
import '../../widgets/sheets.dart';
|
|
import '../../widgets/states.dart';
|
|
|
|
class ProfilePage extends StatelessWidget {
|
|
const ProfilePage({required this.dataSource, super.key});
|
|
|
|
final ReportDataSource dataSource;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return ListView(
|
|
padding: const EdgeInsets.fromLTRB(WiseSpacing.x4, 4, WiseSpacing.x4, 16),
|
|
children: [
|
|
const PageHeader(title: '我的'),
|
|
AppCard(
|
|
color: YantingColors.secondary,
|
|
child: Row(
|
|
children: [
|
|
CircleAvatar(
|
|
radius: 27,
|
|
backgroundColor: YantingColors.background,
|
|
foregroundColor: YantingColors.mutedForeground,
|
|
child: const Icon(AppIcons.user, size: 28),
|
|
),
|
|
const SizedBox(width: 15),
|
|
Expanded(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
'未登录',
|
|
style: YantingText.cardTitle.copyWith(fontSize: 18),
|
|
),
|
|
const SizedBox(height: 5),
|
|
Text(
|
|
'登录后同步收藏、历史和听单',
|
|
style: YantingText.meta.copyWith(height: 1.5),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
const SizedBox(height: WiseSpacing.x3),
|
|
AppButton(
|
|
label: '登录 / 注册',
|
|
expand: true,
|
|
onPressed: () => showLoginSheet(context),
|
|
),
|
|
const SizedBox(height: 18),
|
|
_MenuGroup(
|
|
children: [
|
|
_MenuRow(
|
|
icon: AppIcons.history,
|
|
title: '本地浏览记录',
|
|
trailing: '0 条 · 本地临时',
|
|
onTap: () => showAppToast(context, '历史同步接口待接入'),
|
|
),
|
|
],
|
|
),
|
|
const SizedBox(height: WiseSpacing.x3),
|
|
_MenuGroup(
|
|
children: [
|
|
_MenuRow(
|
|
icon: AppIcons.settings,
|
|
title: '设置',
|
|
onTap: () => showAppToast(context, '设置待接入'),
|
|
),
|
|
_MenuRow(
|
|
icon: AppIcons.fileList,
|
|
title: '用户协议',
|
|
onTap: () => showOutboundSheet(context, title: '用户协议'),
|
|
),
|
|
_MenuRow(
|
|
icon: AppIcons.shield,
|
|
title: '隐私政策',
|
|
onTap: () => showOutboundSheet(context, title: '隐私政策'),
|
|
),
|
|
],
|
|
),
|
|
const SizedBox(height: WiseSpacing.x3),
|
|
AppCard(
|
|
color: YantingColors.secondary,
|
|
onTap: () => showOutboundSheet(context, title: '相关服务'),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
children: [
|
|
Text(
|
|
'了解相关服务',
|
|
style: YantingText.body.copyWith(
|
|
color: YantingColors.foreground,
|
|
fontWeight: FontWeight.w600,
|
|
),
|
|
),
|
|
const SizedBox(width: 3),
|
|
const Icon(AppIcons.arrowRight, size: 18),
|
|
],
|
|
),
|
|
const SizedBox(height: 6),
|
|
Text(
|
|
'与你关注主题相关的延伸服务,内容不构成投资建议。',
|
|
style: YantingText.meta.copyWith(height: 1.5),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
const SizedBox(height: 22),
|
|
Text(
|
|
'研听 · 全球机构研报中文解读\n登录不阻断游客完整收听第一期 · 内容不构成投资建议',
|
|
textAlign: TextAlign.center,
|
|
style: YantingText.meta.copyWith(fontSize: 12, height: 1.7),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
class _MenuGroup extends StatelessWidget {
|
|
const _MenuGroup({required this.children});
|
|
|
|
final List<Widget> children;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return AppCard(
|
|
padding: EdgeInsets.zero,
|
|
child: Column(children: children),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _MenuRow extends StatelessWidget {
|
|
const _MenuRow({
|
|
required this.icon,
|
|
required this.title,
|
|
required this.onTap,
|
|
this.trailing,
|
|
});
|
|
|
|
final IconData icon;
|
|
final String title;
|
|
final String? trailing;
|
|
final VoidCallback onTap;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return InkWell(
|
|
onTap: onTap,
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 15),
|
|
child: Row(
|
|
children: [
|
|
Icon(icon, size: 20, color: YantingColors.foreground),
|
|
const SizedBox(width: 13),
|
|
Expanded(child: Text(title, style: YantingText.body)),
|
|
if (trailing != null)
|
|
DecoratedBox(
|
|
decoration: BoxDecoration(
|
|
color: YantingColors.secondary,
|
|
borderRadius: BorderRadius.circular(YantingRadius.pill),
|
|
),
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 10,
|
|
vertical: 3,
|
|
),
|
|
child: Text(
|
|
trailing!,
|
|
style: YantingText.meta.copyWith(fontSize: 11.5),
|
|
),
|
|
),
|
|
)
|
|
else
|
|
const Icon(
|
|
AppIcons.arrowRight,
|
|
color: YantingColors.mutedForeground,
|
|
size: 20,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|