156 lines
4.5 KiB
Dart
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;
|
|
}
|