import Foundation import Observation /// 「身体档案」里的快捷问答:点一下把一句常用问题填进输入框。 /// 内置 3 条(不可删),用户可自定义追加(可删)。 struct QuickPrompt: Identifiable, Codable, Equatable { let id: UUID var title: String // chip 上显示的短标签 var prompt: String // 点击后填入输入框的完整问题 var isBuiltin: Bool init(id: UUID = UUID(), title: String, prompt: String, isBuiltin: Bool) { self.id = id self.title = title self.prompt = prompt self.isBuiltin = isBuiltin } } /// 快捷问答存储:内置常量 + 自定义条目(UserDefaults JSON,无 SwiftData schema 迁移风险)。 /// 自定义条目只是 UI 便利项、不是健康记录,故不进 SwiftData。 @Observable final class QuickPromptStore { static let shared = QuickPromptStore() private let defaults = UserDefaults.standard private let storageKey = "kk.quickPrompts.custom.v1" private(set) var custom: [QuickPrompt] private init() { if let data = defaults.data(forKey: storageKey), let decoded = try? JSONDecoder().decode([QuickPrompt].self, from: data) { custom = decoded } else { custom = [] } } /// 内置在前、自定义在后,供 chip 行展示。 var all: [QuickPrompt] { Self.builtins + custom } /// 追加一条自定义问答。空白忽略;标签自动取问题前几个字。 func add(prompt rawPrompt: String) { let trimmed = rawPrompt.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return } custom.append(QuickPrompt(title: Self.deriveTitle(trimmed), prompt: trimmed, isBuiltin: false)) persist() } /// 删除一条自定义问答(内置不可删)。 func delete(_ p: QuickPrompt) { guard !p.isBuiltin else { return } custom.removeAll { $0.id == p.id } persist() } private func persist() { if let data = try? JSONEncoder().encode(custom) { defaults.set(data, forKey: storageKey) } } /// 自定义条目的短标签:压成单行,取前 8 个字,超出补省略号。 static func deriveTitle(_ prompt: String) -> String { let oneLine = prompt.replacingOccurrences(of: "\n", with: " ") .trimmingCharacters(in: .whitespaces) let head = oneLine.prefix(8) return oneLine.count > 8 ? "\(head)…" : String(head) } /// 内置 3 条(首屏):覆盖「就诊 / 解读 / 速查」三类,数据依赖稳、不碰诊断红线。 static let builtins: [QuickPrompt] = [ QuickPrompt( title: "就诊摘要", prompt: "根据我最近的身体症状,结合历史指标,整理一份让门诊医生快速了解我情况的就诊摘要。", isBuiltin: true ), QuickPrompt( title: "趋势解读", prompt: "把我血压最近半年的变化讲清楚:是变好还是变差、要注意什么。", isBuiltin: true ), QuickPrompt( title: "速答清单", prompt: "把我的过敏史、正在吃的药、慢性病整理成一句话清单,方便就诊时快速回答医生。", isBuiltin: true ), ] }