Files
food_health_flutter/lib/page/profile/my/my_page.dart
2025-08-28 16:27:56 +08:00

156 lines
4.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:food_health/api/dto/user_profile_dto.dart';
import 'package:food_health/api/endpoints/profile_api.dart';
import 'package:food_health/config/theme/custom_colors.dart';
import 'package:go_router/go_router.dart';
import 'package:remixicon/remixicon.dart';
import '../../../router/config/route_paths.dart';
import 'widget/title_card.dart';
import 'widget/user_card.dart';
class MyPage extends StatefulWidget {
const MyPage({super.key});
@override
State<MyPage> createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> with AutomaticKeepAliveClientMixin {
UserProfileDto _userProfile = UserProfileDto();
@override
void initState() {
super.initState();
_init();
}
void _init() async {
var res = await getUserProfileApi();
setState(() {
_userProfile = res;
});
}
void _goEdit() async {
await context.push(RoutePaths.myEdit, extra: _userProfile);
_init();
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: ListView(
padding: EdgeInsets.all(15),
children: [
UserCard(
detail: _userProfile,
onEdit: _goEdit,
),
Column(
children: [
TitleCard(
title: "Food Allergies",
icon: Icon(
RemixIcons.shield_line,
color: Theme.of(context).colorScheme.danger,
),
child: buildTagList(
emptyText: "No food allergies reported",
tags: _userProfile.foodAllergiesList,
color: Theme.of(context).colorScheme.danger,
),
),
TitleCard(
title: "No preferences",
icon: Icon(
RemixIcons.heart_line,
color: Theme.of(context).colorScheme.success,
),
child: buildTagList(
emptyText: "No dietary preferences reported",
tags: _userProfile.dietaryPreferencesList,
color: Theme.of(context).colorScheme.success,
),
),
TitleCard(
title: "Medical Information",
icon: Icon(
RemixIcons.user_line,
color: Theme.of(context).colorScheme.primary,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
margin: EdgeInsets.only(bottom: 10),
child: Text("Medical Conditions"),
),
Container(
margin: EdgeInsets.only(bottom: 10),
child: buildTagList(
emptyText: "No medical conditions reported",
tags: _userProfile.medicalInformationList,
color: Theme.of(context).colorScheme.primary,
),
),
Container(
margin: EdgeInsets.only(bottom: 10),
child: Text("Current Medications"),
),
buildTagList(
emptyText: "No medications reported",
tags: _userProfile.currentMedicationsList,
color: Theme.of(context).colorScheme.primary,
),
],
),
),
],
),
],
),
);
}
Widget buildTagList({
required String emptyText,
required List<String> tags,
required Color color,
}) {
if (tags.isEmpty) {
return Text(
emptyText,
style: TextStyle(
color: Theme.of(context).colorScheme.success,
),
);
} else {
return Wrap(
spacing: 15,
runSpacing: 15,
children: tags.map((item) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
decoration: BoxDecoration(
color: color.withValues(alpha: 0.2),
borderRadius: BorderRadius.circular(20),
),
child: Text(
item,
style: TextStyle(
color: color,
fontSize: 14,
fontWeight: FontWeight.w700,
),
),
);
}).toList(),
);
}
}
@override
bool get wantKeepAlive => true;
}