feat: 通知推送/免打扰偏好 + 饮食记录侧滑删除修复 + 聊天交互优化
- 通知: 新增推送开关/免打扰时段偏好持久化 + EF 迁移; 通知管线支持免打扰过滤 - 饮食: 侧滑删除 confirmDismiss 按方向放行(修复删不掉); 新增 diet_nutrition_widgets; 饮食录入页重构 - 聊天: 智能体胶囊点击锁防误触; 流式状态 select 优化; 卡片入场动画 - 主页: 消息列表提取 _HomeMessages + 侧滑手势打开抽屉 - 其他: api_client IP 适配; 通知/用药/饮食端点微调; 测试更新
This commit is contained in:
@@ -17,7 +17,7 @@ void main() {
|
||||
expect(messages, isEmpty);
|
||||
});
|
||||
|
||||
test('agent capsule inserts welcome when session is unchanged', () async {
|
||||
test('agent capsule inserts welcome immediately', () {
|
||||
final container = ProviderContainer();
|
||||
addTearDown(container.dispose);
|
||||
|
||||
@@ -25,8 +25,6 @@ void main() {
|
||||
.read(chatProvider.notifier)
|
||||
.triggerAgent(ActiveAgent.diet, '营养助手');
|
||||
|
||||
await Future<void>.delayed(const Duration(milliseconds: 450));
|
||||
|
||||
final messages = container.read(chatProvider).messages;
|
||||
expect(messages.map((m) => m.type), contains(MessageType.agentWelcome));
|
||||
expect(container.read(chatProvider).activeAgent, ActiveAgent.diet);
|
||||
@@ -40,11 +38,8 @@ void main() {
|
||||
|
||||
final notifier = container.read(chatProvider.notifier);
|
||||
notifier.triggerAgent(ActiveAgent.diet, '营养助手');
|
||||
await Future<void>.delayed(const Duration(milliseconds: 120));
|
||||
notifier.triggerAgent(ActiveAgent.medication, '药管家');
|
||||
|
||||
await Future<void>.delayed(const Duration(milliseconds: 450));
|
||||
|
||||
final welcomeAgents = container
|
||||
.read(chatProvider)
|
||||
.messages
|
||||
@@ -56,4 +51,44 @@ void main() {
|
||||
expect(container.read(chatProvider).activeAgent, ActiveAgent.diet);
|
||||
},
|
||||
);
|
||||
|
||||
test('repeated tap on the same agent does not add another card', () async {
|
||||
final container = ProviderContainer();
|
||||
addTearDown(container.dispose);
|
||||
|
||||
final notifier = container.read(chatProvider.notifier);
|
||||
notifier.triggerAgent(ActiveAgent.diet, '营养助手');
|
||||
notifier.triggerAgent(ActiveAgent.diet, '营养助手');
|
||||
|
||||
expect(
|
||||
container
|
||||
.read(chatProvider)
|
||||
.messages
|
||||
.where((message) => message.type == MessageType.agentWelcome)
|
||||
.length,
|
||||
1,
|
||||
);
|
||||
});
|
||||
|
||||
test(
|
||||
'different agent is accepted after the previous welcome appears',
|
||||
() async {
|
||||
final container = ProviderContainer();
|
||||
addTearDown(container.dispose);
|
||||
|
||||
final notifier = container.read(chatProvider.notifier);
|
||||
notifier.triggerAgent(ActiveAgent.diet, '营养助手');
|
||||
await Future<void>.delayed(const Duration(milliseconds: 320));
|
||||
notifier.triggerAgent(ActiveAgent.medication, '药管家');
|
||||
|
||||
expect(
|
||||
container
|
||||
.read(chatProvider)
|
||||
.messages
|
||||
.where((message) => message.type == MessageType.agentWelcome)
|
||||
.map((message) => message.metadata?['agent']),
|
||||
['diet', 'medication'],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user