fix: 用药模块重做 + 运动计划不限7天 + 打卡可切换 + 删除修复

- 用药: 重写列表页(标签筛选+详情弹窗+打卡切换+滑动删除)
- 用药: 重写编辑页(选择器替代输入+同列布局+频率改为每天几次)
- 用药: 加Notes字段+DELETE端点+修复重复端点
- 运动: 不限7天, startDate+索引推算当天
- 打卡: 药/运动打卡可切换(点✓取消)
- 删除: 修复滑动删除热区, 一次点击即删除
- 侧边栏: 一键清理历史对话
- 饮食/运动/用药/问诊 API路径加/api/前缀
- 通知时机修正: 新建计划不再提前弹窗
This commit is contained in:
MingNian
2026-06-04 21:15:23 +08:00
parent b944a31983
commit cd65bc4d65
11 changed files with 1069 additions and 1242 deletions

View File

@@ -187,8 +187,14 @@ class HealthDrawer extends ConsumerWidget {
),
const Spacer(),
GestureDetector(
onTap: () => ref.invalidate(conversationListProvider),
child: const Padding(padding: EdgeInsets.all(4), child: Icon(Icons.refresh, size: 15, color: Color(0xFFAAAAAA))),
onTap: () async {
final api = ref.read(apiClientProvider);
for (final c in conversations.value ?? []) {
try { await api.delete('/api/ai/conversations/${c.id}'); } catch (_) {}
}
ref.invalidate(conversationListProvider);
},
child: const Padding(padding: EdgeInsets.all(4), child: Text('清理', style: TextStyle(fontSize: 11, color: Color(0xFFAAAAAA)))),
),
]),
),
@@ -268,7 +274,13 @@ class HealthDrawer extends ConsumerWidget {
item: item,
onTap: () {
ref.read(chatProvider.notifier).loadConversation(item.id);
Navigator.of(context).pop(); // 关闭抽屉
Navigator.of(context).pop();
},
onDelete: () async {
try {
await ref.read(apiClientProvider).delete('/api/ai/conversations/${item.id}');
ref.invalidate(conversationListProvider);
} catch (_) {}
},
)).toList(),
),
@@ -424,8 +436,9 @@ class _FeatureChip extends StatelessWidget {
class _ConversationItem extends StatelessWidget {
final ConversationItem item;
final VoidCallback? onTap;
final VoidCallback? onDelete;
const _ConversationItem({required this.item, this.onTap});
const _ConversationItem({required this.item, this.onTap, this.onDelete});
@override
Widget build(BuildContext context) {
@@ -449,14 +462,12 @@ class _ConversationItem extends StatelessWidget {
),
title: Text(item.title, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: Color(0xFF333333))),
subtitle: Text(item.lastMessage, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 11, color: Colors.grey[500])),
trailing: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Text(_formatTime(item.updatedAt), style: TextStyle(fontSize: 9, color: Colors.grey[400])),
const SizedBox(height: 2),
Icon(Icons.chevron_right, size: 12, color: Colors.grey[300]),
],
trailing: GestureDetector(
onTap: onDelete,
child: const Padding(
padding: EdgeInsets.all(8),
child: Icon(Icons.close, size: 16, color: Color(0xFFBBBBBB)),
),
),
dense: true,
visualDensity: VisualDensity.compact,